はてなキーワード: Fizzとは
ワイ:
#include<stdio.h> int main(){ for(int i = 1;i <= 100;i++){ if(i%15 == 0){ printf("FizzBuzz\n"); }else if(i%3 == 0){ printf("Fizz\n"); }else if(i%5 == 0){ printf("Buzz\n"); }else{ printf("%d\n",i); } } return 0; }
ワイ:考えるのが面倒くさいから
Boi:ここまとめられるでしょ
#include<stdio.h> int main(){ for(int i = 1;i <= 100;i++){ if(i%3 == 0)printf("Fizz"); if(i%5 == 0)printf("Buzz"); if(i%3 != 0 || i%5 != 0)printf("%d",i); printf("\n"); } return 0; }
Boi:ああっ
ワイ:ww
色々縁が合って学部名に情報が入る大学3―4年生の面倒を見てるんだけど,驚くほど英語が出来ない
一応授業である程度習ったらしいけどコーディング能力は低い.具体的にはFizzBuzz問題解けないくらい
しかしそれ以上に問題があるのは英語と基本的な知識で,例えば次の2つのエラー文がどちらからも何が問題なのかわからない
NameError: name 'Fizz' is not defined
IndentationError: unexpected indent
defineもIndentも単語として知らない以前に,変数と文字列リテラルやインデントを理解できてないからエラーコードでググっても解決できないんだよね
同じ理由でDeepL等で訳しても無理.ただ,ChatGPTとかに説明してもらうとわかるらしい
5人中2人がこのレベルなんだけど,本人の希望通りの業界に就職したら0から叩きこまれるんだろうなって思って子牛を見ている気分になったよ
P-221-B:ドライブスルー薬局(東京都)
✅待ち時間は同等でも、ドライブスルー利用者の方が「待たされている」と感じる人が多い
・・・"実際の待ち時間"と"待たされている感"、実は全然別物なんですよねぇ(´・ω・`)#日本薬局学会— Fizz-DI@比較と使い分け-Yushi Kojima (@Fizz_DI) November 6, 2021
なんか書いとけ
テキストの説明が理解できないとき、学習者がすべきなのは自身の理解を正すことであって、自己流の解釈を思い付くことではない。つまり、
といったことをすべきなのであって、自分の腑に落ちるQiitaの記事とかを探すことは、全く理解に近づいていない。むしろ遠ざかっている。
というか、「明らかに分からない用語などがあるのに、そこを回避して全体を理解しようとする」のは、プログラミングに限らず勉強法として根本的に間違っている。
かつて、どうしても「コメント」の意味が理解できない新人がいた。
要するに彼は、プログラムの処理に関係の無い機構が存在する意味が理解できなかったらしい。
「コメントは、コードでは表現できない実装の意図をソースコード中に記述するときに用います」
などと説明してみても、
... // 15の倍数を先に判定しないと、たとえば15がFizzになってしまう if (n % 15 == 0) { return "FizzBuzz"; } else if (n % 3 == 0) { return "Fizz"; ...
「コメントは、処理をコメントアウトしてデバッグするための機構である」
と言う結論に達したようだった。勿論、普通のプログラマなら誰でも知ってるように、そういう使い方は良くない。
「プログラミング言語のあらゆる機能が、プログラムの何らかの処理と対応している」
という誤ったメンタルモデルを正すことである。それを放棄して、自分にとって都合の良い出典不明の情報を鵜呑みにしたのが、そもそもの間違いである。
こういうことは、何も新人に限った話ではない。自分では一丁前のつもりのプログラマにも、ライブラリ等の全く見当違いな使い方をしてくる奴がよくいるのである。
そういうのは、自分の経験のある別の言語の○○という機能に対応している、と勝手に思い込んでいたり、あるいは、実装とセマンティクスの区別ができず、インタフェースのような処理と直接関係ない機能が理解できなかったりする。
要するに、不明点を正しく理解することを放棄して、自分に都合の良い解釈を得て早合点しているのである。
そういう人はプログラマには向いていない。
コピペチンパンジーはFizzBuzzを知らないしたぶん解けない。
この知らないというのが本当にヤバくて、普通プログラマとして飯を食ってたらFizzBuzzくらい知ってるじゃん?
解いたことはなくてもなにかしらの技術記事で触れたりするじゃん?
知らない。
コピペチンパンジーなんだから人間よりググってるはずなのになぜ…?
0から100までの数字を表示する。3で割り切れるならFizzと表示する。5で割り切れるならBuzzと表示する。3と5で割り切れるならFizzBuzzと表示する。
と言われたらたぶん実装してくるし、それで動くからOKを出してもらえる。コピペできるから。
でもこうだと実装できない。
1から999までの数字を表示する。5で割り切れるならDogと表示する。7で割り切れるならCatと表示する。5と7で割り切れるならBirdと表示する。
「自分で考えて作ってみる」ことが、コピペチンパンジーは、マジで、できない。
コピペしてからキーボードを叩くので、猿が書くシェイクスピアより人間が書いたっぽいものに仕上がっているだけなのだ。
プログラミングで何かを作る際には、当然だけど厄介で難しい部分があって、所謂「自分しかメンテできない」状態のコードがどうしても出来上がってくる。
それじゃ困るので、コメントもひときわ丁寧に書いているし引き継ぎ資料も作っている。
たまにマンツーマンで教える必要があったりもするが、ちょっとイケてるプログラマが相手ならばバトンを手渡すことができる。
彼は「誰でもその箇所を引き継げる」ことを、努力目標じゃなくて達成すべき項目と考えている。
いや、無理でしょ…。
厄介で難しい箇所は、どう噛み砕いたところで、厄介で難しいから、厄介で難しいのである。
突破するために必要なのは「知っているか、知らないか」ではなくて「考えられるか、考えられないか」なので、
いくら知識を残したところで、人間にはできるがコピペチンパンジーにはできない。
ましてや普通レベルのプログラマでは手に負えない箇所を、どうしてFizzBuzzを知らないコピペチンパンジーが…。
「いや、無理でしょ…」が今のPLには不誠実な態度に見えているようだ。自分しか知らない情報を独占している、と受け取られている。
他の人に教えているのはノーカンらしい。
コピペチンパンジーを差別していると言われてしまえばそうかもしれないが、でも、コピペチンパンジーはマジでコピペチンパンジーなのでマジでどうやって教えてもいや、無理でしょ…コピペチンパンジーだから…。
use strict; use warnings; use feature 'say'; sub fz { my @pattern = @_; return sub { $pattern[(shift() - 1) % @pattern] }; } my $fizz = fz("", "", "fizz"); my $buzz = fz("", "", "", "", "buzz"); foreach my $i (1..100) { say ($fizz->($i) . $buzz->($i) || $i); }
# use 5.xxxが使えない罠。
具体的に1から15までの例で考えてみる。
集合で考えるとして、集合Aを3の倍数、集合Bを5の倍数とする。
U = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }
A = { 3, 6, 9, 12, 15 }
B = { 5, 10, 15 }
A∩B = { 15 }
¬(A∪B) = { 1, 2, 4, 7, 8, 11, 13, 14 }
ベン図は次のようになる。
+-----------U----------+ | | | +---A------+ | | | 3 6 | | | | 9 12 +--+---B---+ | | | |15| | | | +-------+--+ 5 10 | | | | | | | +----------+ | | | | 1 2 4 7 8 11 13 14 | +----------------------+
¬(A∪B) = ¬A∩¬B
よって、FizzBuzz問題は次のように読み替えられる。
表にしてみる。
5の倍数 | 5の倍数ではない | |
---|---|---|
3の倍数 | "FizzBuzz" | "Fizz" |
3の倍数ではない | "Buzz" | 元の数字 |
よくあるコードのスタイルをWikipediaから借りることにして、使用する言語をCとする。
https://ja.wikipedia.org/wiki/Fizz_Buzz
#include <stdio.h> int main(void) { int i; for (i = 1; i <= 100; i++) { if (i % 3 == 0 &amp;&amp; i % 5 == 0) { printf("FizzBuzz92;n"); } if (i % 3 == 0 &amp;&amp; i % 5 != 0) { printf("Fizz92;n"); } if (i % 3 != 0 &amp;&amp; i % 5 == 0) { printf("Buzz92;n"); } if (i % 3 != 0 &amp;&amp; i % 5 != 0) { printf("%d92;n", i); } } return 0; }
ここで、元増田が発想したような「3の倍数の後に5の倍数を判定させて"Fizz"と"Buzz"を連続出力すれば"FizzBuzz"の段は要らないんじゃね?」作戦を発動する。
"FizzBuzz"の判定をごっそり削り、"Fizz"と"Buzz"の条件が同時に起こることを考慮する。
forの終わりに改行するようにする。
#include <stdio.h> int main(void) { int i; for (i = 1; i <= 100; i++) { if (i % 3 == 0) { printf("Fizz"); } if (i % 5 == 0) { printf("Buzz"); } if (i % 3 != 0 &amp;&amp; i % 5 != 0) { printf("%d", i); } printf("92;n"); } return 0; }
プログラミングの問題だけど高校一年生までの数学の考え方で解決できる。嬉しい。
1 から順に数を数えていく。但し、その数が 3 で割り切れるならば数字の代わりに Fizz と、5 で割り切れるなら Buzz と言うゲーム。3 でも 5 でも割り切れる場合は、FizzBuzz の順に言う。
これをプログラミングするのがFizzBuzz問題です。
1から15までの例を考えてみる。
入力 | 出力 |
---|---|
1 | 1 |
2 | 2 |
3 | Fizz |
4 | 4 |
5 | Buzz |
6 | Fizz |
7 | 7 |
8 | 8 |
9 | Fizz |
10 | Buzz |
11 | 11 |
12 | Fizz |
13 | 13 |
14 | 14 |
15 | FizzBuzz |
入力と出力の関係を考えると、入力が定まれば、出力も一意に定まることが分かる。つまり、入力と出力の関係を関数にすることができる。この関数をf(x)とする。
関数f(x)は、入力が3の倍数なら"Fizz"、5の倍数なら"Buzz"、3と5の公倍数なら"FizzBuzz"、その他は入力値を返す。
公倍数は最小公倍数を整数倍した値なので、ある値が公倍数であるかどうか判断するには、最小公倍数で割ってみて、割り切れるかを調べることにする。
3と5の最小公倍数は15なので、15で試しに割ってみて、割り切れるかどうかを見る。
3と5の倍数の判定も、それぞれ、3と5で割り切れるかどうかを見る。
Perlは、上から順に命令を実行する命令型言語なので、3や5の倍数の判定の前に、15の倍数の判定を持ってくる。
逆にすると、15の倍数は3の倍数であり、5の倍数でもあるため、"FizzBuzz"が必要な所が"Fizz"や"Buzz"だけになってしまう。
use 5.024; use warnings; sub f { my ($x) = @_; if (($x % 15) == 0) { return "FizzBuzz"; } if (($x % 5) == 0) { return "Buzz"; } if (($x % 3) == 0) { return "Fizz"; } return $x; } foreach my $i (1..100) { say f($i); }
2021/04/25用
%:include <stdio.h> %:include <stdlib.h> %:define 三つ子と五つ子の協奏曲 main %:define ☯ ; %:define 環 while %:define 異名 typedef %:define 終焉 101 %:define 伝承(詩) printf(_Generic((詩), int: "%d\n", char *: "%s\n"), 詩) %:define 純白を漆黒に漆黒を純白に(色) (色 = 終焉 - 色) %:define 終わりは、斯く示された。 return 0 異名 int 無限整数の幻想を維持せぬ整数 ☯ 異名 char 世界の言葉を扱うには不十分な箱 ☯ 異名 void 虚無 ☯ 無限整数の幻想を維持せぬ整数 破滅の刻 = 終焉 ☯ 虚無 三つ子と五つ子の協奏曲(栞, 慈悲深き終身独裁者の注文) 無限整数の幻想を維持せぬ整数 栞 ☯ 世界の言葉を扱うには不十分な箱 **慈悲深き終身独裁者の注文 ☯ { 環 (0 <-- 破滅の刻 && 純白を漆黒に漆黒を純白に(破滅の刻) && ((破滅の刻 % 3) * (破滅の刻 % 5) ? 伝承(破滅の刻) : 伝承(破滅の刻 % 15 ? 破滅の刻 % 5 ? "Fizz" : "Buzz" :"FizzBuzz")) && 純白を漆黒に漆黒を純白に(破滅の刻)) ☯ 終わりは、斯く示された。 ☯ }
プログラマの実力図るのに、コードを書かせる流れが最近あってそれはとてもいいことだと思うんです。
ただ、すごいぼんやりしてるなと思って違和感を感じます。コードを書かせるって具体的に何ですかね?Fizz Buzzみたいなのですかね。
たしかにプログラマがコード書けないのは論外だと思いますけど、そんなの書かせてもやっぱり実力はわからないと思います。
話をweb系に限らせて書くと、そもそもそういうアルゴリズムが必要なコードを書く機会ってそんなになかったりしませんか?
開発環境作ることから始まって、DBも使うし、当然フロントの知識も必須だし、他にもチームで仕事するための技術だったり
結構横断的に覚えることが多いわけで、実はコードを書くのはほんの一部だったりするんです。
心配なのは、コード書くのは得意だけどサーバもフロントも全くできなくて、最終的なプロダクトは作りきれないって人が評価されて
アルゴリズム的なのは苦手だけど、きちんとプロダクトは作って仕上げて納品までできるって人が評価されなくなることです。
実際働きだしたら後者が評価されるに決まってますが、採用試験で後者の採用を逃すことはありうるのかなと思っています。
1時間か2時間の面接の間にそういうコード書かせるよりは、面接前に何か作ったもの提出させる方がいいんじゃないですかね。
簡単なサイトだったりアプリも作りきれない人って案外多いし、そこで足きりしちゃっていいと思います。
でもそれだと応募の敷居が高すぎて、人が来なかったりするんでしょうか。難しいところですね。