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

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

詳細はこちら
JavaScript

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

Q&A

解決済

4回答

4046閲覧

文字列の奇数番目の文字を出力

Dokumoot

総合スコア11

JavaScript

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

0グッド

0クリップ

投稿2019/11/07 15:39

###与えられた文字列の、奇数番目の文字だけを出力

某プログラミング学習サイトの問題を解いていて、不正解の原因がわからないのでこちらで質問させていただきます。(公開されている解答はpythonのみ)

問題:入力される文字列の奇数番目の文字だけを出力する
例:入力 → aXaXaXaXaX   出力 → aaaaa
※最後に改行の出力指定は無し

発生している問題・エラーメッセージ

// エディタでテストしてもエラーにならず、正しく出力されているように見えます。

該当のソースコード

Nodejs

1process.stdin.resume(); 2process.stdin.setEncoding('utf8'); 3 4const reader = require('readline').createInterface( { 5 input: process.stdin, 6 output: process.stdout 7}); 8 9var lines; 10var result; 11 12reader.on('line', (line) => { 13 lines = line.split(''); 14}); 15reader.on('close', () => { 16 result = lines.filter(item => (lines.indexOf(item) + 1) % 2 === 1); 17 console.log(result.join('')); 18});

試したこと

closeイベントの中を以下のようにfor ifで書いたら正解と判定されました

reader.on('close', () => { for (var i = 0; i < lines.length; i++) { if ((i + 1) % 2 === 1) { process.stdout.write(lines[i]); } } });

補足

初めて質問させて頂きます。
filterforで出力される内容は同じように見えますが、違いがあれば教えて頂きたいです(改行有無以外で)。
質問の仕方についても不備があればご指摘ください。
よろしくお願い致します。

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

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

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

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

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

y_waiwai

2019/11/07 16:04

その提示のコードではどういう動作になるんでしょうか
guest

回答4

0

ベストアンサー

テストケース次第ですが、例えばテストケースが"abbcd"のとき、正解は"abd"のはずですがindexOfで位置を求めているために"ad"と出力されるのではないでしょうか。また"aaa"だと"aa"が正解のところおそらく"aaa"となると思います。

filter((_,index) => (index+1) % 2 === 1 )のように、配列のインデクスで確認したほうがよいように思います。

投稿2019/11/07 23:51

編集2019/11/07 23:51
papinianus

総合スコア12705

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

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

Dokumoot

2019/11/08 10:09

大変わかりやすい回答をありがとうございます。仰る通りでした。 indexOfの仕様をしっかり理解していませんでした。勉強になりました。
guest

0

filterとforで出力される内容は同じように見えますが、違いがあれば教えて頂きたいです

ざっくりでよければ。
昔の javascript には Array の各要素を走査する関数が無かったんですよ。
それまでは for 文で様々な走査用のコードが書かれていました。

現在の forEache(), map(), filter(), ... etc は
「こういうのあると、可読性の高いコードで走査できるよね」ってことで、追加されました。

同じように見えますが走査の目的が違うため、これらのメソッド(関数)を使うと
どのような結果になるのか?仕様を理解して使う必要があります。


因みに、papinian us さんの発展:
filter((_,index)=> ~index&1) のような(ビット演算)も使えます。

正解と判定された理由は stdout への出力というumejiさんの採点基準の考察も十分に頷けます。
ですので、次のように書いても正解だったかもしれませんね。

javascript

1// 1文字ずつ出力ストリーム(stdout)に書き出す。 2reader.on('close', () => { 3 lines.filter((_,index)=> ~index&1) 4 .forEach( char => process.stdout.write(char) ); 5});

投稿2019/11/08 02:48

編集2019/11/08 03:20
AkitoshiManabe

総合スコア5434

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

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

Dokumoot

2019/11/08 10:13

詳しくご説明頂きありがとうございます。 ビット演算についても勉強したいと思います。
guest

0

lines.filter(item => (lines.indexOf(item) + 1) % 2 === 1)

だと、abcabcがうまくいかなくない?4つ目のaも検知してしまうやん?

lines.filter((_, i) => i % 2 === 0)

だな!答え言ってしまうと

投稿2019/11/08 01:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/11/08 01:23

すんません、オレンジの人と回答どっかぶりでした。。。
Dokumoot

2019/11/08 10:16

回答頂きありがとうございます。 同じ内容ではありますが、「4つ目のaも検知してまう」とのご指摘を頂けたおかげで理解が早まりました。
guest

0

不正解となったものはconsole.log()で、正解となったものはprocess.stdout.write()で出力されてますね。そのプログラミング学習サイトではprocess.stdout.write()で出力したものしか採点しない仕様になっているのではないでしょうか。

投稿2019/11/07 22:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Dokumoot

2019/11/08 10:17

回答ありがとうございます。 今回は出力方法による採点判断はありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問