SlideShare una empresa de Scribd logo
1 de 12
Descargar para leer sin conexión
ちょっと詳しくJavaScript 特別編【そして伝説へ…】
~FizzBuzz問題に見るfor文の挙動~
2011年11月11日




                          株式会社ランチェスター
                          TEL: 03-5775-3395 Fax:03-5775-3396
                          URL: http://www.lanches.co.jp/
それは一通のメールから始まった

以下の問題を何の言語でもいいので実装してください。
回答時間は10分です

問題
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数
の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍
数の場合には「FizzBuzz」とプリントすること。



---------------ここからはプログラマーの基本素養をみるって話--------------
上の「FizzBuzz問題」は知ってる人は知ってる、
プログラマーの素養を見るための簡単な問題です。
上の例題を出して実際に作ってもったコードを見て、
この人に素養があるかどうかを判断します。

実際問題これの回答を出せない人が居たりするみたいです。
(業務ではちゃんとプログラミングしてる人ですよ?)

この問題を解くのに10分以上かかったら……ヤバイかもしれませんよ?w

                   Proprietary and Confidential to Lanchester Co.,LTD.   Page 1
最終的に出来上がったコード




for(i=0;i++<100;document.write(i%5?s||i:s+"Buzz","<br>"))s=i%3?"":"Fizz";




                       Proprietary and Confidential to Lanchester Co.,LTD.   Page 2
ちょっとだけ見やすく




for(i=0; i++<100; document.write(i%5 ? s || i : s+"Buzz", "<br>")) {
          s = i%3 ? "" : "Fizz";
}




                          Proprietary and Confidential to Lanchester Co.,LTD.   Page 3
ちょっとだけ見やすく




わかんねぇよ!!
         Proprietary and Confidential to Lanchester Co.,LTD.   Page 4
まずはfor文の動作について
1~100まで表示

for(i=1; i<=100; i++) {
       document.write(i, "<br>");
}

このコードの評価は
i=1
i<=100
document.write(i, "<br>")
i++
の順序で行われます。



                     Proprietary and Confidential to Lanchester Co.,LTD.   Page 5
まずはfor文の動作について - 2
各エリアごとに注目すると
for(1; 2; 4) {
       3;
}
の順序で実行され、2がfalseの時にループを抜けます。

なので先ほどのコードを短縮化すると
for(i=0; i++<100; document.write(i, "<br>")) {
       ;
}
となります。




                     Proprietary and Confidential to Lanchester Co.,LTD.   Page 6
まずはfor文の動作について - 3
つまり
for(i=0; i++<100; document.write(i, "<br>")) {
       ;
}
は
i=0
i++<100       (iが100未満か?、の評価後にiをインクリメント)
document.write(i, "<br>")
;             (何もしない)
となる。
最終的に、スペースやブロック宣言などをなくしてしまえば
for(i=0;i++<100;document.write(i,"<br>"));
こうなる。


                Proprietary and Confidential to Lanchester Co.,LTD.   Page 7
つぎはFizzの番
ここまでを踏まえると、
for(i=0; i++<100; document.write(i%5 ? s || i : s+"Buzz", "<br>")) {
          s = i%3 ? "" : "Fizz";
}
これは
i=0
i++<100
s = i%3 ? "" : "Fizz"
document.write(i%5 ? s || i : s+"Buzz", "<br>")
の順序になるので、1~100までのループをしつつ、iが3で割り切れな
いときには空文字列、割り切れたときは"Fizz"を変数sにセットする。
s = i%3 ? "" : "Fizz"
ちなみに歴史的理由によりfalseは0や空文字列、trueは非0や文字列
で代用でき、それを利用した三項演算子の使用法ですがややこしいの
で普段は使っちゃダメですよ?
                          Proprietary and Confidential to Lanchester Co.,LTD.   Page 8
さいごにBuzzの番
最後にBuzzを処理するけど
i%5 ? s || i : s+"Buzz"
iが5で割り切れたときにsに"Buzz"を足す方はいいとして、5で割り切れ
なかったときの
s || i
これは何かというとif文で使われる||(or)です。

つまり変数を展開すると
"" || i     (3で割り切れなかったとき)
"Fizz" || i (3で割り切れてたとき)
のどちらかになります。
論理演算の値は「最終的に評価した値」を返しますので、前者は空文
字列なので値的にはfalseとなりorの次のiが最終的な値、後者は"Fizz"
が値的にはtrueなので"Fizz"が最終的な値となります。

             Proprietary and Confidential to Lanchester Co.,LTD.   Page 9
まとめ
for(i=0; i++<100; ) {
           if( i % 3 != 0 ) {
                      s = "";
           } else {
                      s = "Fizz";
           }

          if( i % 5 != 0 ) {
                     if( s != "" ) {
                                 document.write( s, "<br>" );
                     } else {
                                 document.write( i, "<br>" );
                     }
          } else {
                     document.write( s + "Buzz", "<br>" );
          }
}


for(i=0;i++<100;document.write(i%5?s||i:s+"Buzz","<br>"))s=i%3?"":"Fizz";
                                Proprietary and Confidential to Lanchester Co.,LTD.   Page 10
株式会社ランチェスター
TEL: 03-5775-3395 Fax:03-5775-3396
URL: http://www.lanches.co.jp/

Más contenido relacionado

Más de 株式会社ランチェスター

【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)株式会社ランチェスター
 
【書籍紹介】こころを動かすマーケティング
【書籍紹介】こころを動かすマーケティング【書籍紹介】こころを動かすマーケティング
【書籍紹介】こころを動かすマーケティング株式会社ランチェスター
 
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!株式会社ランチェスター
 
【書籍紹介】ノンプログラマのためのJavaScript
【書籍紹介】ノンプログラマのためのJavaScript【書籍紹介】ノンプログラマのためのJavaScript
【書籍紹介】ノンプログラマのためのJavaScript株式会社ランチェスター
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】株式会社ランチェスター
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】株式会社ランチェスター
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】株式会社ランチェスター
 
ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】株式会社ランチェスター
 

Más de 株式会社ランチェスター (20)

【書籍紹介】伝え方が9割
【書籍紹介】伝え方が9割【書籍紹介】伝え方が9割
【書籍紹介】伝え方が9割
 
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
 
【書籍紹介】こころを動かすマーケティング
【書籍紹介】こころを動かすマーケティング【書籍紹介】こころを動かすマーケティング
【書籍紹介】こころを動かすマーケティング
 
【Web es sense】MultipeerConnectivityについて
【Web es sense】MultipeerConnectivityについて【Web es sense】MultipeerConnectivityについて
【Web es sense】MultipeerConnectivityについて
 
【書籍紹介】勝ち続ける意志力
【書籍紹介】勝ち続ける意志力【書籍紹介】勝ち続ける意志力
【書籍紹介】勝ち続ける意志力
 
【書籍紹介】ドメイン駆動設計
【書籍紹介】ドメイン駆動設計【書籍紹介】ドメイン駆動設計
【書籍紹介】ドメイン駆動設計
 
【Web essense】KPIはじめました
【Web essense】KPIはじめました【Web essense】KPIはじめました
【Web essense】KPIはじめました
 
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
 
【書籍紹介】ノンプログラマのためのJavaScript
【書籍紹介】ノンプログラマのためのJavaScript【書籍紹介】ノンプログラマのためのJavaScript
【書籍紹介】ノンプログラマのためのJavaScript
 
【書籍紹介】ゆるす力
【書籍紹介】ゆるす力【書籍紹介】ゆるす力
【書籍紹介】ゆるす力
 
【Web esSense】KPIって何だ??
【Web esSense】KPIって何だ??【Web esSense】KPIって何だ??
【Web esSense】KPIって何だ??
 
【書籍紹介】よくわかるJavaScriptの教科書
【書籍紹介】よくわかるJavaScriptの教科書【書籍紹介】よくわかるJavaScriptの教科書
【書籍紹介】よくわかるJavaScriptの教科書
 
Passbookとは_株式会社ランチェスター
Passbookとは_株式会社ランチェスターPassbookとは_株式会社ランチェスター
Passbookとは_株式会社ランチェスター
 
エンジニア的pinterest考察
エンジニア的pinterest考察エンジニア的pinterest考察
エンジニア的pinterest考察
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
 
ちょっと詳しくJavaScript 第3回【prototype】
ちょっと詳しくJavaScript 第3回【prototype】ちょっと詳しくJavaScript 第3回【prototype】
ちょっと詳しくJavaScript 第3回【prototype】
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 
ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】
 
HTML Forms
HTML FormsHTML Forms
HTML Forms
 

Último

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 

Último (10)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 

ちょっと詳しくJavaScript 特別編【そして伝説へ…】