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

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

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

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

Q&A

解決済

5回答

2288閲覧

関数型JavaScriptのFizzBazz問題の最適化

HiiragYukina

総合スコア12

JavaScript

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

0グッド

0クリップ

投稿2018/05/08 04:25

判定するdecision関数を最適化したいです。
いい方法はないですか?

javaScript

1 2const min = 1 3const max = 100 4 5//計算式 6let remainder = function(array,f) { 7 return array.map(f) 8} 9 10//判定 11let decision = function(s){ 12 13 if (s % 15 == 0) { 14 return "FizzBuzz" 15 } else if (s % 3 == 0) { 16 return "Fizz" 17 } else if (s % 5 == 0) { 18 return "Buzz" 19 } else { 20 return s 21 } 22} 23 24//数値の生成 25let renge = function(min,max) { 26 return [...Array(max - min + 1).keys()].map(x => x + min) 27 28} 29 30//物質化 31let answer = remainder(renge(min,max),decision) 32 33//出力 34console.log(answer) 35 36

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

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

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

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

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

guest

回答5

0

JavaScript

1 if (s % 15 === 0) return "FizzBuzz"; 2 if (s % 3 === 0) return "Fizz"; 3 if (s % 5 === 0) return "Buzz"; 4 return s

投稿2018/05/08 04:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

なにをもって最適化なのですか?
速度?可読性?コードの量?

もし速度なら質問文のコードより速くする手段はありません。
精々JITコンパイラに働きかける小細工を施すくらいです。

可読性ならte2jiさんのコードかswitchの2択ですが、
さほど質問文のコードから変わったように思えません。

最後のコード量を減らす案ですが、FizzとBuzzの文字列を別々に作成するテクニックがあります。
手慰みに作った私の記事があるのでそちらを共有します。
FizzBuzz関数の選択肢 - ES2015でFizzBuzz

投稿2018/05/08 04:42

miyabi-sun

総合スコア21158

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

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

退会済みユーザー

退会済みユーザー

2018/05/08 04:45

オレの回答主旨は `===` だよん。
miyabi-sun

2018/05/08 05:00 編集

他の場面で変なバグ出さない為にNull比較以外は全部`===`にする癖を付けた方が良いというのは同意見です。 今回のケース限定で言えば`s % 15`が先に入るので確実にNumber型にキャストされます。 「遊戯の奴…そこまで考えて…」いたのであれば`==`でも別に良いんじゃないかな?と思って別に指摘しませんでした。
guest

0

何をもって「最適化」というのかにもよりますが、こんな方法もあります。

javascript

1const remainderTable = [ 2 'FizzBuzz', null, null, 'Fizz', null, 'Buzz', 'Fizz', null, null, 3 'Fizz', 'Buzz', null, 'Fizz' // 13・14はundefinedでいいので略 4]; 5 6const decision = s => remainderTable[s % 15] || s;

投稿2018/05/08 04:36

maisumakun

総合スコア145184

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

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

HiiragYukina

2018/05/08 04:40

返答ありがとうございます。 最適化したいのは処理速度と判定( if )の数を減らせないかです。
guest

0

もうクローズしてるけど、楽しそうなので。

js

1let decision = function(x) { 2 const m3 = !(x % 3); 3 const m5 = !(x % 5); 4 return !(m3 + m5) * x || 'FizzBuzz'.slice(!m3 * 4, m5 * 4 + 4); 5}

投稿2018/05/08 07:12

編集2018/05/08 07:27
Lhankor_Mhy

総合スコア36113

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

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

Lhankor_Mhy

2018/05/08 07:51

miyabi-sun さんのリンクをあとから発見してしょんぼりした。 でもほら、三項演算子使ってないし? 短絡評価使って文字列生成を減らしてるし?
guest

0

たとえばこう

javascript

1var min = 1 2var max = 100 3 4var answer=Array(max-min+1).fill(null).map(function(x,y){ 5 var s=y+min; 6 return s%15==0?"FizzBuzz":s%3==0?"Fizz":s%5==0?"Buzz":s; 7 //return s%15==0?"FizzBuzz":(s%3==0?"Fizz":(s%5==0?"Buzz":s)); 8}); 9console.log(answer)

「三項演算子はネストするな!」の原則からいうとコメントアウトした
論理節でわける方がよいかもしれません

投稿2018/05/08 05:09

yambejp

総合スコア114833

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問