🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

4回答

3619閲覧

AtCoder で、入力例と出力例が同じなのに、提出でエラーが出ます。。 あと、AtCoderはjsで挑むべきか。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

2グッド

3クリップ

投稿2019/12/26 12:57

編集2019/12/26 13:49

#例文は全部通ったけど、提出するときにエラーが出ます。。

JavaScript

1function Main (input) { 2 input = input.split("\n"); //入力を切り分ける 3 var N = parseInt(input, 10); //入力を切り分ける 4 var a = input[1].split(" ").map(inp => parseInt(inp ,10)); //入力を切り分ける 5 a = a.sort((a, b) => a < b); //入力aを大きい順に並び変える 6 7 var Alice = 0; //Aliceの得点カウント 8 var Bob = 0; //Bonの得点カウント 9 var turn = true; //繰り返し処理で使う変数 10 11 for (var i = 0;i < N;i++) { 12 if (turn == true) { 13 Alice += a[i]; 14 turn = false; 15 /* 16 デバッグで使った 17 console.log(11 + "aaa"); 18 console.log(Alice); 19 console.log(a[i]); 20 console.log("========"); 21 */ 22 } 23 else if (turn == false) { 24 Bob += a[i] 25 turn = true; 26 /* 27 デバッグで使った 28 console.log(22 + "bbb"); 29 console.log(Bob); 30 console.log(a[i]); 31 console.log("========"); 32 */ 33 } 34 } 35 console.log(Alice - Bob); //差を計算した結果を出力 36 //console.log(a); 37} 38 39Main(require("fs").readFileSync("/dev/stdin", "utf8")); //jsで処理を書くときは、必ずこれを書かなければならない

問題文のページにあるすべての入力例と出力例が同じでした。
ですが、提出すると"WA(不正解)"が出ます。。

問題はこちらです。
僕が提出した問題はこちらです。
#AtCoderはJavaScriptで挑むべきか
いま、完全にマスターしている言語はjsのみで、C言語を勉強中です。
AtCoder公式ではC++を推奨していますが、C++を使うとなんのメリットがありますが?

いま、jsばかりやってるので、もう愛着が湧いてしまいましたw
#つまり、

  • 僕の書いたコードになんの間違いがありますか?
  • C++で書くとなんのメリットがありますか?
DrqYuto, set0gut1👍を押しています

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

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

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

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

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

miyabi_takatsuk

2019/12/26 13:08

提出した時のエラーになんて出てますか?? それ見ればヒントになるような気がしますが。
退会済みユーザー

退会済みユーザー

2019/12/26 13:45

何もエラーは出ていません。 普通に"WA(不正解)"って出ました
kyoya0819

2019/12/27 00:37

何もエラーが出ていないのではなくてコンテストなので表示されないだけです。
退会済みユーザー

退会済みユーザー

2019/12/27 06:17

>asuchi0819 コードテストを使ってテストをしてから、提出しています。 コードテストでは普通にエラーは出ますよ。
guest

回答4

0

コンテストの手助けを気が引けるのでとりあえず、チェック通ったコード載せておきます。(仕様書あんまり見てなくて、何回か不具合になったのは秘密)

JS

1 2var Func = function(text){ 3 var text = text.split("\n"); 4 var point = text[1].split(" "); 5 var Alice = 0; 6 var Bob = 0; 7 function change(a, b) { 8 return b - a; 9 } 10 point.sort(change); 11 for(i=0;i<point.length;i++){ 12 if(i%2==0){ 13 Alice += Number(point[i]); 14 }else{ 15 Bob += Number(point[i]); 16 } 17 } 18 var result = Alice - Bob; 19 console.log(result); 20}; 21 22Func(require("fs").readFileSync("/dev/stdin", "utf8")); 23/*Func(`3 242 1 4 2`);*/ 25

別に勝手に使ってもらっても構いませんがそれによって起こりうる損害は一切、知りませんので悪しからず。

あと、全く別のアルゴリズムを使っているのでそこもご承知おきを(というよりコード読む気がしない)

投稿2019/12/26 15:13

編集2019/12/27 06:48
kyoya0819

総合スコア10429

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

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

退会済みユーザー

退会済みユーザー

2019/12/27 00:11

分かりました、参考にします。 でも、基本的なアルゴリズムは同じなので、多少は参考になりました。 ありがとうございました。
set0gut1

2019/12/27 06:37

これ正解にならないですよ。質問者さんとおなじバグを含んでいます。
kyoya0819

2019/12/27 06:48

失礼、最終修正と別のを投稿してしまいした。 ご指摘ありがとうございます。
guest

0

いろいろツッコミどころ満載ですが。

javascript

1function Main (input) { 2 // 再代入するのはいいが、後のinputの使用に多大な影響が出ている。新たなローカル変数に代入した方がいい。 3 // この時点でinputには、配列が入る 4 input = input.split("\n"); //入力を切り分ける 5 // parseIntの第一引数に配列を入れてる時点で使い方間違っている。 6 var N = parseInt(input, 10); //入力を切り分ける 7 var a = input[1].split(" ").map(inp => parseInt(inp ,10)); //入力を切り分ける 8 // sortは破壊的なので、再代入の必要無し 9 a = a.sort((a, b) => a < b); //入力aを大きい順に並び変える 10 11 var Alice = 0; //Aliceの得点カウント 12 var Bob = 0; //Bonの得点カウント 13 var turn = true; //繰り返し処理で使う変数 14 // 配列を第一引数に入れたparseIntの返却値のNはちゃんと数値が入っていますか? 15 for (var i = 0;i < N;i++) { 16 // turnには論理値元々入ってるから、 == trueいらない 17 if (turn == true) { 18 Alice += a[i]; 19 turn = false; 20 /* 21 デバッグで使った 22 console.log(11 + "aaa"); 23 console.log(Alice); 24 console.log(a[i]); 25 console.log("========"); 26 */ 27 } 28 // 既にturnの偽で通るので、 if (turn == false)は余計 29 else if (turn == false) { 30 Bob += a[i] 31 turn = true; 32 /* 33 デバッグで使った 34 console.log(22 + "bbb"); 35 console.log(Bob); 36 console.log(a[i]); 37 console.log("========"); 38 */ 39 } 40 } 41 console.log(Alice - Bob); //差を計算した結果を出力 42 //console.log(a); 43} 44 45Main(require("fs").readFileSync("/dev/stdin", "utf8")); //jsで処理を書くときは、必ずこれを書かなければならない

まず、マスターしてると言うならばもう少し基本に忠実に書かれてはいかがかと。
せめてletとconst使いましょう。
問題が合ってないと言われるのは、計算、構文が間違ってるからじゃないですか?
単純に。
問題自体は、頑張って解いてください。

投稿2019/12/26 14:27

miyabi_takatsuk

総合スコア9555

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

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

退会済みユーザー

退会済みユーザー

2019/12/27 00:09

ご返信ありがとうございます。 まず、 input = input.split("\n"); についてのご指摘ですが、僕はこっちの方が好みです。 あと、 var N = parseInt(input, 10); についてですが、正しくは var N = parseInt(input[0], 10); でした。 そして、 a = a.sort((a, b) => a < b); についてのご指摘ですが、こちらも直しておきました。 あと、for文の中にあった //turnには論理値元々入ってるから、 == trueいらない についてですが、 (turn == true)の条件文の中にはturn = falseという処理、 (turn == false)の条件文の中にはturn = trueという処理が for文の中に書いてあります。 なので、if文のifの中の処理をAとして、 else ifの中の処理をBとすると、 A => B => A => ・・・ になります。 構文は、僕から見ればなんのありませんでした。 入力例はすべて問題なく通りました。 僕、マスターしていると自称していますが、ぼく中1です。 周りにもプログラミングに関わっている人なんていません。 なので、比較対象がないから正直、自分のことがよくわかっていません。 ご指摘の部分をすべて直しましたが、やっぱり不正解です。 ありがとうございました。
kyoya0819

2019/12/27 00:34

横から失礼します。 中学一年生とおっしゃりますが、その年でプログラミング等をやるなら自分の力で調べる能力や組む能力も必須です。(私も小学四年生からやっていますのでその気持ちは痛いほどわかります) 「中学一年生だから許してね」「投げやりするね」というのはお門違いです。 「自分のことがよくわかっていない」なら、年齢ではなく、何年間プログラミングをやってきてどのくらいのコードをかけるかというものを比較対象にしたほうがよろしいと思います。 入力例がすべてではありません。 もっと多くの比較対象を入れて試してどこが違うのかを調べてみるとよいかもしれません。 私自身プログラミングで最も大事なことは「間違えたところを見つける力」「ググる力」だと思っています。 具体的にどのような入力例で実際と異なるかを調べてみるとよろしいかもしれません。 また、仕様書をもう一度読み直してお良いかもしれません。 長文・乱文失礼しました。
miyabi_takatsuk

2019/12/27 04:24 編集

> input = input.split("\n"); >についてのご指摘ですが、僕はこっちの方が好みです。 あなたの好みなんて関係ありませんよ。 動作に不具合が起きるか起きないかの問題です。 引数は、そのスコープ内で値が保証されているからこそ真価を発揮するものです。 また、引数がオブジェクトの場合は、再代入すると、循環参照を引き起こし、メモリーリークを起こす可能性があります。 その危険性も考慮できているなら、お好きにどうぞ。 あと、JSは規制緩いのでエラー起きませんが、言語によってはエラー起きます。 (つまり本来的にプログラムとしてやるべきではない処理ということ) > 僕、マスターしていると自称していますが、ぼく中1です。 そうですか。 では、大人からのアドバイスです。 できてないもの、できないことは、できるって言わない方がいいですよ。 プログラムの仕事やっていきたいなら特に、仕事は常にリスクヘッジとの戦いなので、下手にできると言ってしまうのは、ただの無責任です。 ただ、やれないかもしれないことに挑戦することは大事です。 つまり、大言壮語するのではなく、まず謙虚に、やってみます、と言って挑戦していくのが大事ってことです。 > ご指摘の部分をすべて直しましたが、やっぱり不正解です。 でしょうね。 構文自体全く変えてませんから。 書き方的にここはおかしい、ってところを突っ込んだだけなので。
miyabi_takatsuk

2019/12/27 04:31 編集

> (turn == false)の条件文の中にはturn = trueという処理が > for文の中に書いてあります。 ん? 再代入の値も結局論理値だから、 結局turn == trueとかいらないですよね? falseかどうかみたいなら、 !turnで比較すりゃいいですよね。 まぁ、明記するのは好みというか、状況に合わせてでいいとは思いますけどね。 特に型推論する言語はね。 "論理値以外が入る場合もある時は"、って意味です。 論理値に関しても勉強しましょう。 また、代入式も値を返すってことも勉強されるとよいかと。
think49

2019/12/27 05:11

@miyabi_takatsuk さん > また、引数がオブジェクトの場合は、再代入すると、循環参照を引き起こし、メモリーリークを起こす可能性があります。 こちら初耳ですが、情報源はどこでしょうか。 --- 個人的に変数名 input で気になったのは、「input = 入力」の意で変数の中身を表す変数名ではない事です。 https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options 返り値を確認する限りでは、入力文字列(inputString)or入力バッファ(inputBuffer)が妥当でしょう。 > input = input.split("\n"); これは再代入がNGなのではなくて、split する事で変数の中身(意味)が変わるので、意味の変更に伴って、変数名も変わるべきという意味で問題です。 inputTokens = inputString.split('\n'); 良い変数名の定義は様々ですが、単数形/複数形を区別できて、変数の中身を想像できるものが望ましいでしょう。
think49

2019/12/27 05:22

@ws1560234564016 さん > input = input.split("\n"); > についてのご指摘ですが、僕はこっちの方が好みです。 あなたが一人でコードを保守していて、他人にコードを見せる機会がないなら、その主義を貫いても良いと思います。 ただ、現実として質問の為に、他人にコードを見せているわけですから、他人にとっても読みやすいコードを書く配慮があると、より良いでしょう。 https://www.amazon.co.jp/dp/4873115655
miyabi_takatsuk

2019/12/27 06:00

> こちら初耳ですが、情報源はどこでしょうか。 すみません、情報ソースはございません。 勘違いや認識違いがあったようです。 ws1560234564016 さん > この循環参照の件は、逆にこちらの勉強不足でした。 再代入であれば、新たな値で参照となるので、オブジェクトであっても循環参照にはなりません。 誤解を生む発言で申し訳ございません。 引数に再代入自体は、think49さんのご意見をご参考下さい。 また、 過去にも引数に再代入の是非に関して質問があったようですね。 https://teratail.com/questions/173485 (こちらの回答にもthink49さんの回答ございますね)
退会済みユーザー

退会済みユーザー

2019/12/27 06:32

>think49 >これは再代入がNGなのではなくて、split する事で変数の中身(意味)が変わるので、意味の変更に伴って、変数名も変わるべきという意味で問題です。 inputは、もう使わないのでそのまま上書きしてもいいと個人的に思ってます。 あと、小規模なプログラムなので、ごちゃることはないと思います。
kyoya0819

2019/12/27 06:38

> あと、小規模なプログラムなので、ごちゃることはないと思います。 って言う人が大体ゴチャってここに来る。
miyabi_takatsuk

2019/12/27 06:58

> inputは、もう使わないのでそのまま上書きしてもいいと個人的に思ってます。 > あと、小規模なプログラムなので、ごちゃることはないと思います。 様々認識違いがあった私が言うのも恐縮ですが、 そう言うなら、なぜここに質問したのか・・・。 「個人的にこう思う、それでいい」とするなら、「僕のコード間違ってますか?」って質問しなくてもよいのではないですかね。 「質問の趣旨が違う、問題を解くに当たって間違ってる部分がどこ?って質問だ」、と仰るなら、尚更teratailで質問すべきでない気が・・・。 だって、その間違ってる部分を自分で探すのも含めてのAtCoderの問題でしょうからね。
think49

2019/12/27 13:21 編集

@ws1560234564016 最大の問題は「@ws1560234564016のコードを組むまでの考え」が回答者に伝わっていない事です。 「僕はこっちの方が好みです」ではinputを使うといっていますが、私が問題点を指摘すると「inputは、もう使わないのでそのまま上書きしてもいい」にいつのまにか転じています。 その理由は私には知る由も有りませんし、こちらの説明がどのように伝わったか分からないので、問題点を指摘しようがありません。 (ニュアンス的に私が指摘した時点では既に「inputは使っていない」とされているのも心外でした。コメントを書く時間がもったいないので、考えを変えた時点で示してほしかったのですが。) こういう状況で回答者が出来ることは二つあります。 (A) 根気強く質問者に質問して意見を確認し、間違いを正す (B) 問題点を指摘することは不可能なので、一つの正解例(コード)を書いて、説明を諦める(作業依頼とみなす) (A) を採用したのが@miyabi_takatsukさん、(B) を採用したのが@asuchi0819さんですね。 しかし、@ws1560234564016はコミュニケーションをとる意志がないようなので、「僕の書いたコードになんの間違いがありますか?」に回答しようがなく、(B)しか選択肢がありません。 こういう場合、コードからその人の考えを読み取れる場合がありますが、上述の理由から、@ws1560234564016の考えは読み取れないのが実情です。 質問や受け答えの側面、コードの書き方の側面、両方ともコミュニケーション不足のように思いました。 「C++で書くとなんのメリットがありますか?」についても、@ws1560234564016が目指すべきゴールや考えが示されていないので、(A)は難しいと思います。
think49

2019/12/27 13:19 編集

> 僕の書いたコードになんの間違いがありますか? 正誤の判断基準は当人の価値観に依存するので、「あなたが正しいと思うのなら正しい」が正解なのかもしれませんね。 回答させてから、正しさの基準を「後出し」されるのが問題で、それは回答者側には回避しようがないので、未出の条件がある時点で下手な事はいえません。
kyoya0819

2019/12/27 13:37

think49さんの(A)と(B)を使わせていただいて少々。 自分の場合は完全に(B)です。 コード内容によっては(A)をしますが、コード中に不必要なもの(コメント)を放置、必要な情報が足りない、丸投げだったら確実に(B)を選びます。 私たちは無料で回答をしています。 「だからなんだ」と言うつもりは全くありませんが、最低限の情報は出していただきたく思います。 加えて「中1だから」というワードで逃げる質問者さんに非常に強い嫌悪感を抱いています。 そんな質問者さんのコードを読み、文法的に間違った点を指摘されているmiyabi_takatsukさんは尊敬しかないです。 あと、一つ。これが重要です。 「自分で試した。だから問題ない。」 これが1番危険です。余程の経験があれば別ですが質問者さんの技量からして非常に危ないです。もし、質問者さんがそのように思っていなかったとしたらすみません。 最後にもう一つ。 我々は今、質問者さんにどんどん後出しジャンケンをされています。 そのような行動が果たして自らのためになるのか今一度ご再考ください。
miyabi_takatsuk

2019/12/28 07:08 編集

think49さん、asuchi0819さん、フォローなど大変にありがとうございます。 私は、誰かれ状況問わず(A)を選んでしまうので、状況によっては、(B)も選ぶべきだなーと思いました。汗 @ws1560234564016さん、どうか、コミュニケーションも含め学んで吸収していただければと思います。 ここまでいろいろな人が様々突っ込んでくれるのも、teratailの良さだと個人的に思っています。
guest

0

ソートの仕方が間違ってました。
実例を見つけられてないですが、正しくソートできないケースがあるようです。
以下、デバッグ例(入力処理のところも一箇所気になりました)。

diff

1 function Main (input) { 2 input = input.split("n"); 3- var N = parseInt(input, 10); 4+ var N = parseInt(input[0], 10); 5 var a = input[1].split(" ").map(inp => parseInt(inp ,10)); 6- a = a.sort((a, b) => a < b); 7+ a = a.sort((a, b) => b - a); 8 9 var Alice = 0; 10 var Bob = 0; 11 var turn = true; 12 13 for (var i = 0;i < N;i++) { 14 if (turn == true) { 15 Alice += a[i]; 16 turn = false; 17 } 18 else if (turn == false) { 19 Bob += a[i] 20 turn = true; 21 } 22 } 23 console.log(Alice - Bob); 24 } 25 26 Main(require("fs").readFileSync("/dev/stdin", "utf8"));

投稿2019/12/27 06:39

set0gut1

総合スコア2413

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

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

退会済みユーザー

退会済みユーザー

2019/12/27 08:46

ありがとうございます。 ソートは、僕が確認した限り、問題はなかったです。 入力処理も直しておきました。
guest

0

C++で書くとなんのメリットがありますか?

NodeJS のモジュールは C++ でも書けますよ。
公式 C++アドオン

投稿2019/12/27 00:47

AkitoshiManabe

総合スコア5434

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問