質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1866閲覧

自力でRPN電卓:2桁以上の足し算ができない

siranui

総合スコア54

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/10/28 03:32

###したいこと
僕の持ってる知識を使って、適当なとこからコピペ等をせずにRPN電卓を作ろうとしました!

  • RPN電卓とは

自分は説明が下手なので、ここを参照にしてください!とてもわかりやすい説明でした

###起きてしまう挙動
6,8+といった一桁の足し算は、
テスト1:成功
テスト2:成功
14
と返してくれるのですが、

345,34+といった二桁以上の数字になると
テスト1:成功
としか返してくれません。
###問題のプログラム

js

1for (var ioi = 2; ioi <= 99999; ioi++) 2 for (var iooi = 2; iooi <= 99999; iooi++) 3 if (message.content.match(/\d+,\d+(?=([-+*/]))/)) { 4 message.channel.send('テスト1:成功') 5 if (message.content.match(/\d+,\d+(?=+)/)) { 6 if(message.content.slice(2,3).match(/\,/)) { 7 if(message.content.slice(4,5).match(/+/)) { 8 var ree = parseInt(message.content.slice(1,2), 10); 9 var raa = parseInt(message.content.slice(3,4), 10); 10 message.channel.send('テスト2:成功') 11 message.channel.send(ree+raa) 12 return; 13 } 14 } else if(message.content.slice(ioi,ioi+1).match(/\,/)) { 15 if(message.content.slice(iooi,ioi+1).match(/+/)) { 16 var ree = parseInt(message.content.slice(1,ioi-1), 10); 17 var raa = parseInt(message.content.slice(ioi+1,iooi), 10); 18 message.channel.send('テスト2:成功') 19 message.channel.send(ree+raa) 20 return; 21 } 22 } 23 } 24 return; 25 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/28 03:52

利用しているライブラリとか、ほかにhtmlがあれば書いといたほうがいいですよ。message.contentってなんだ?ってなりますし。
oikashinoa

2018/10/28 04:05

最近投稿が多いdiscardですかね?ppnさんが書いている通り、きちんと書いたほうがいいですよ。
siranui

2018/10/28 05:12

なるほど。申し訳ないです。oikashinoaさんの言っていた、Discordというものです。
guest

回答3

0

ベストアンサー

テスト X をもっとたくさん作り、ループ変数や slice の結果なども出力してみてください。
そうすればどこでどのように失敗しているか自力で確かめられます。

ところで逆ポーランド記法のパースはもっと簡単です。
こんなにネストは要りませんし、逆にスタックが必要です。

まず、入力をトークンに分けます。
ここではトークンは数値と二項演算子の二種類です。

例えば 345,34+ は [345,34,+] という 3 つのトークンに分けます。
, は区切り文字なのでトークンにはしません。

次にその配列を前から順に見ていきます。
トークンが数値ならスタックに入れ、二項演算子ならスタックから 2 つ取り出し、演算して結果をスタックに入れます。

最初は 345 なので、スタックに 345 を入れます。次は 34 なのでスタックに 34 を入れます。次は + なので、スタックから 345 と 34 を取り出し、足した結果の 379 をスタックに入れます。

このようにして、最終的にスタックに残った値が答えです。

投稿2018/10/28 04:32

Zuishin

総合スコア28662

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siranui

2018/10/28 05:16

なるほど... n個のトークンに分ける方法は、どうすれば良いのでしょうか? 自分は、「,」や「+」がどこにあるかで判断しようとしたのですが...
Zuishin

2018/10/28 05:26 編集

const src = "20,315+5*"; const re = /(\d+|[-+*/])/g; let result = src.match(re); これで result にトークンの配列が入ります。 この場合は ["20","315","+","5","*"] となります。 すべて文字列なので、スタックに入れるときに数値になおしてください。
siranui

2018/10/29 11:29

なんとかうまいこといきそうです。ありがとうございました!
guest

0

js

1 if (message.content.match(/\d+,\d+(?=+)/)) { 2 if(message.content.slice(2,3).match(/\,/)) { 3 if(message.content.slice(4,5).match(/+/)) {

他にも該当する箇所が有りますが。
.match(/\d+,…で1文字以上の数値にマッチさせときながら
.slice(2,3)とかで1文字と限定しているところがありませんか?

ざっと見なんでどこか調べてませんが、可変長の箇所が有るべきはずですがそれらしい部分が無いです。

投稿2018/10/28 04:13

oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siranui

2018/10/28 05:34

なんだそれはと思い調べてきました argumentsなんて素晴らしいものがあったんですね... 頑張って組み込んでみます
guest

0

Javascriptなど不要。そう、シェル芸ならね!

bash

1$ cat test 26,8+ 3345,34+ 412,23+,5/,4* 518,-11+ 6$ cat test|tr , ' '|sed -E 's|([0-9])([*/+-])|\1 \2|g'|(f(){ a=$(($1 $3 $2));shift 3;while [ $# -gt 0 ];do a=$((a $2 $1));shift 2;done;echo $a;};export -f f;xargs -I@ sh -fc 'f @') 714 8379 928 107

投稿2018/10/28 04:35

編集2018/10/28 05:07
hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siranui

2018/10/28 05:35

JSでお願いしたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問