はてなキーワード: BUZZとは
まぁ、今時は32Bitだし 100までしかFizzBuzzは回さないだろうから、動くんだろうな。
どうでもいいけど
cout 書いたなら、strstreamだろうし sprintf使うならprintfだろうなぁと
int main(void){
int i;
for(i = 1 ; i <= 100 ; i++){
printf("%d \0Fizz \0FizzBuzz "+(i%5?(i%3?0:4):(i%3?14:10)),i);
}
printf("\n");
return 0;
}
ちなみにFizzBuzzを短くするなら、こう。printfの""はポインタである。というのをつかって\0を文字列に入れ込み、数値の演算結果で文字列をシフトする。
Buzz単体を表示したい時にはFizzBuzz+4相当で表示できる というのがさらにポイント。
もちろん
if(!i%15){ std::cout << "fizzbuzz" << std::endl; }else if(!i%5){ std::cout << "buzz" << std::endl; }else if(!i%3){ std::cout << "fizz" << std::endl; }else{ std::cout << i << std::endl; }
とか書くことはできますが、見やすさとかそういう話はいいかと思って短くしてみました。
あと3項演算子の:の左右で違う型を受け付けてくれないので、intを文字列に変換する必要がありました。
sprintfを使わないで変換する方法がわからなかったもので。
「ヤバい」と書かれた方でしょうか?
if も 3項演算子も for も do whileすらもない ifなしの Fizz Buzz
#include "stdio.h" #include "stdlib.h" int cnumber=0; void fizz(){ printf("fizz"); cnumber++; }; void nonfizz(){ }; void buzz(){ printf("buzz"); cnumber++; }; void nonbuzz(){ }; void number(int i){ printf("%d",i); cnumber = 0; } void nonnumber(int i){ cnumber = 0; } void myexit(void){ printf("\n Hit return key to exit\n"); getchar(); exit(1); } void noexit(void){ } void (*pfizz[3])() = {fizz,nonfizz,nonfizz}; void (*pbuzz[5])() = {buzz,nonbuzz,nonbuzz,nonbuzz,nonbuzz}; void (*pnumber[3])(int) = {number,nonnumber,nonnumber}; void (*pmyexit[2])() = {noexit,myexit}; int main(int argc, char* argv[]) { int loopmax = (111+222+333)*10; int i = 1; head: (*pfizz[i%3])(); (*pbuzz[i%5])(); (*pnumber[cnumber])(i); (*pmyexit[!(loopmax-i)])(); printf(","); i++; goto head; return 0; }
includeが<>を使ってないので必要ならパスは各自で通してねw
FizzBuzz が面接でのエピソードの典型としてネタに良く取り上げられる理由は
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
これを読むとわかると思います。
ここにあるように、まともな面接官なら
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
と仕様を説明してするでしょうね。知ってるか知ってないかはあまり問題ではないです。
つ http://revilog.com/2010/08/c-fizzbuzz-printf.html
#include <stdio.h> int main(void){ int i; for(i = 1 ; i <= 100 ; i++){ printf("%d \0Fizz \0FizzBuzz "+(i%5?(i%3?0:4):(i%3?14:10)),i); } printf("\n"); return 0; }
有効行数的{}を取るとか 以外で、これよりもFizz Buzzを短く出来る?
かっけぇ。w
つか、そのレベルを求めるなら、いっそGoogleやMicrosoftばりの試験すりゃいんじゃね?
もちろん試験する側の才覚も問われるが。
どっかで読んだけど、課題を出して数時間放置、結果をプレゼンさせるみたいな試験があるそうな。
問題が何処にあって、どういう解決が必要で、そのためのアプローチをどうするか、居並ぶ技術屋を納得させなきゃ駄目なんさ。
Fizz Buzzなら30分以内だな。
動けば良いだけの適正を見るだけのテトリスなら8時間もあれば対外の奴はくみ終わるだろ。実質時間制限がないのと同じだ。
ちなみに、俺は高校時代でテトリスはくめる。大学時代暇だったので、授業時間にテトリス組見始めて、授業終わる前に遊んでた。
ただ、アニメーションやゲーム程度は小学校時代にも組めたので、テトリスが小学校時代にあったら組んでたかもな。
だいたいそういう奴はどこの大学にも100人~1000人に一人ぐらいの割合でいる。そういう奴を見つけ出すためのテスト。
Fizz Buzzにしろ、16進ダンプにしろ出来て当たり前すぎて、テストにならん。(※自称プログラマーの現実はおいておいて)
ちなみに動くだけテトリスはあほみたいに簡単な分類。
ああ、google buzz やっぱりこんな展開に・・・
昔の彼女がメアドが設定されすぐに切りました。 RT @***: やばいよねRT @***: お節介なグーグルが勝手にBuzz友達を設定…あなたが誰とメールをやり取りしたかが別の関係ない人にわかってしまう。
class FizzBuzzProgram{ public static void main(String args[]){ for (int i = 0; i++ < 100; ) { System.out.println(new Number(i).checkMod3().checkMod5()); } } } interface Mod3Mod5Unchecked extends Mod5Unchecked { public Mod5Unchecked checkMod3(); } interface Mod5Unchecked { public Object checkMod5(); } class Number implements Mod3Mod5Unchecked{ private int no; public Number (int no) { this.no = no; } public Mod5Unchecked checkMod3() { return no % 3 == 0 ? new Fizz(no) : this; } public Object checkMod5() { return no % 5 == 0 ? new Buzz() : this; } public String toString() { return Integer.toString(no); } } class Fizz implements Mod5Unchecked{ private int no; public Fizz (int no) { this.no = no; } public Object checkMod5() { return no % 5 == 0 ? new FizzBuzz() : this; } public String toString() { return "Fizz"; } } class Buzz { public String toString() { return "Buzz"; } } class FizzBuzz { public String toString() { return "FizzBuzz"; } }
1 名前:以下、名無しにかわりましてVIPがお送りします[] 投稿日:2009/09/25(金) 13:35:12.60 ID:+TARyGqc0
一生童貞だろうか
84 名前:以下、名無しにかわりましてVIPがお送りします[] 投稿日:2009/09/25(金) 15:52:07.44 ID:LOkx6/No0
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
86 名前:以下、名無しにかわりましてVIPがお送りします[] 投稿日:2009/09/25(金) 15:55:18.62 ID:+TARyGqc0
sub function main
for i as integer = 1 to 100
if
87 名前:以下、名無しにかわりましてVIPがお送りします[] 投稿日:2009/09/25(金) 15:58:55.18 ID:+TARyGqc0
書いてる途中で送ったからやる気がなくなったすまん。
本当に書けないのかよ…
参考:http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
引用元:http://yutori7.2ch.net/test/read.cgi/news4vip/1253853312/
大変だったね。元増田乙。
まあ、他人がどうするかに期待するよりも、自分で対策取る方が安全・確実だ、というのは間違いないんじゃないの。
(もちろん、それは対策をとらなかった元増田が責められるべき、って話じゃないけど。為念)
相手がこちら側の期待した能力を持っていることは「あるべき理想」であっても「当然・必然」ではないから・・・。
既にブコメでも似たような指摘付いてるけど、そういうの、わかんない人にはそれこそ一生わかんないよ。
それを「社会人として当たり前」という風に怒ることは正しいとしても、あまり合理的ではないと思う。
社会人であっても、「職務上の要請で人と変わりなく接する」ことを要求される立場にない人は、
増田が言うような「社会人として当たり前」の意識持ってないこと多いよ。いちいち腹を立てたり、
不快感を覚えたりするのも疲れるだろうし、そういうもんだと思って割り切った方が楽。
何回誘われたのかは分からないけど、この人は婉曲に言ってもわからないのだな、と思える閾値を超えるようなら、
直接伝えちゃった方が確実だね。「嫌なことははっきり嫌と言う」文化の人だったら、
「嫌」ってはっきり言うとあっけないぐらいあっさり引いたりすることもあるし。
不快に思ったら出来るだけ失礼のないように直接的表現で伝えた方がいいかも。
あと、「社会人として当たり前」と言うのは、人によって定義も扱いもまるで変わってくるbuzzワードなので、
あまり自明の前提として使わない方がいいと思う。場合によってはそれこそ正に元増田が「加害者のように扱われそう」。
・・・まあ、正直おれもあんまり「当たり前」じゃない方の人です。なんか仲間がご迷惑を掛けたようですみませんでした・・・。
3Kだの7Kだの言われるプログラマー1年目のオレが
プログラミング言語の種類にはC、VB、JAVA、Delphi、PHP、Perlとか無数にあるが
どれでもいいからひとつ好きなの選んで学べ。
どれにしようかと迷うぐらいならCかJAVAやっとけ。
いきなり難しいことしようとは考えず、入門書通りに文字を表示したり
掛け算したりそういうのを確実にやれ。
FizzBuzzっていう基礎さえできてれば屁をこく方が難しいプログラミングがある。
1からどんどん数を増やしていくプログラミングだ。
3の倍数になった場合は数字の変わりに「Fizz」と表示させて
5の倍数になった場合は数字の変わりに「Buzz」と表示させる。
3と5の公倍数になった場合は数字の変わりに「FizzBuzz」と表示させるシンプルなプログラムだ。
プログラミングできるって言っておいてこれもできない奴が結構いるわけだ。
とりあえず入門書買って順々に進んで行け。
大抵のサイトはやり方と簡単な説明だけで詳細な説明が載ってないから本は買え。
そして一気にやろうとするな。先週やったことを30分でもいいから今週にもしろ。
あと、目標を立てろ。1日10ページとか1章とかそんなんでいいから
そして最後の5分は今日やったことをノートでもブログにでも書け。
本とかの練習問題では目標タイムとか書いてあるからそれを守るように解いていけ。
時間を多めにとってある入門書の練習問題程度で目標タイムに届かなかったら前の章からやり直せ。
仕事は生産性が非常に大切だ。 仕事遅いのにできる人より残業して給料貰ってる汚い大人にはなるなよ。
とりあえず基礎だ基礎。
普通なら応用に進むのが普通だろうと思うが、これからプログラマになるわけだから
環境を変えてやってみるのもいいと思う。基礎さえ確実にマスターしておけば
応用的なものはその都度調べることの繰り返しで結構覚えれるもの。
ここからはメモ帳からサクラエディタや秀丸エディタに変えてプログラミングしてみたり
EclipseやVisual Studioを使ってこういったツールが非常に便利であることを体験しろ。
仕事はこういったツールがないとやっていけない。
そして意外とこういったツールを使いこなせていないプログラマが沢山いる。
使いこなすことによって仕事量が増えるだけでなく、ミスも減らすことができる。
ん?ん?
なんだ・・・?
そんなの計算するまでもなく
writeln("Fizz");
writeln("Buzz");
とか記述していけばいいだけの話で、改行コードもあわせて出力しちゃえば1行でいけるぜ!
みたいなことに、なってないか?
それはちょっと違うような気がする。
いやさ、確かに仕様は満たすんだけどさ。
いまさらだがFizzBuzz。
1から100まで、3の倍数5の倍数云々って、全部定数の計算じゃね?
というところに気付き、自称メタプログラマー(略してメタグラマー)俺の血が騒いだ。
定数計算なら、それは実行時ではなくコンパイル時に行なわれるべきだ……。
#include <iostream> const int FIZZ_NUM = 3; const int BUZZ_NUM = 5; const int BEGIN_NUM = 1; const int END_NUM = 101; template<int N> struct Fizz { enum {PRINT = 0, NEXT = N + 1}; static void print() {} }; template<int N> struct Buzz { enum {PRINT = 0, NEXT = N + 1}; static void print() {} }; template<int N, bool ForB> struct Number {static void print() {std::cout << N;}}; template<> struct Fizz<FIZZ_NUM> { enum {PRINT = 1, NEXT = 1}; static void print() {std::cout << "Fizz";} }; template<> struct Buzz<BUZZ_NUM> { enum {PRINT = 1, NEXT = 1}; static void print() {std::cout << "Buzz";} }; template<int N> struct Number<N, true> {static void print() {}}; template<int N, int F, int B> struct FizzBuzz { static void print() { typedef ::Fizz<F> Fizz; typedef ::Buzz<B> Buzz; Fizz::print(); Buzz::print(); Number<N, Fizz::PRINT || Buzz::PRINT>::print(); std::cout << std::endl; FizzBuzz<N + 1, Fizz::NEXT, Buzz::NEXT>::print(); } }; template<int F, int B> struct FizzBuzz<END_NUM, F, B> {static void print() {}}; int main(int argc, char **argv) { FizzBuzz<BEGIN_NUM, 1, 1>::print(); return 0; }
ifなし%なしループ系なし、しかも実行時オーバーヘッドなし!(多分)
ああ、久しぶりにC++を触ったけど、やっぱC++のテンプレートってダメダメだな。20世紀の遺物といわざるを得ない。
君がもし21世紀のモテ系イケメンメタグラマーなら、21世紀のプログラミング言語、D言語を使うべきだ!
驚くべきことに、D言語はコンパイル時に関数が実行でき、その結果をソースコードとして取り込める!
ただし実行できるのは簡単な関数だけだけど……。
import std.stdio; // これでFizzBuzzを全部出力するコードを作るぜ! string makeFizzBuzzCode() { string code; for(int i = 1; i <= 100; ++i) { // 効率? コンパイル時にそんな配慮は要らん! if(i % 3 == 0 && i % 5 == 0) { code ~= "writefln(\"FizzBuzz\");\n"; } else if(i % 3 == 0) { code ~= "writefln(\"Fizz\");\n"; } else if(i % 5 == 0) { code ~= "writefln(\"Buzz\");\n"; } else { code ~= "writefln(" ~ static_itoa(i) ~ ");\n"; } } return code; } int main(string[] args) { // おまけで生成されたコードも見せるよ。 pragma(msg, makeFizzBuzzCode()); // 生成したコードを埋め込む。コピペみたいな感覚。 mixin(makeFizzBuzzCode); return 0; } // 以下ユーティリティ。このぐらい標準で欲しいな……。 /// 整数→文字列変換(コンパイル時) string static_itoa(int n) { if(n == 0) { return "0"; } // 10で割りながら余りを文字にして追加。桁が逆転した文字列になる。 string s; for(; n; n /= 10) { s ~= ("0123456789")[n % 10]; } // 桁位置を正常にする。相変わらず効率無視。 return static_reverse(s); } /// 配列リバース(コンパイル時) /// 実行時ならarray.reverseが使えるんだけどね……。 T[] static_reverse(T)(T[] s) { T[] result; foreach_reverse(c; s) { result ~= c; } return result; } // 心配なので静的ユニットテスト(笑) unittest { static assert(static_itoa(0) == "0"); static assert(static_itoa(10) == "10"); static assert(static_itoa(999) == "999"); static assert(static_itoa(9999) == "9999"); static assert(static_itoa(12345) == "12345"); static assert(static_itoa(314159265) == "314159265"); }
コンパイル結果
$ dmd -unittest fizz_buzz.d writefln(1); writefln(2); writefln("Fizz"); writefln(4); writefln("Buzz"); writefln("Fizz"); writefln(7); writefln(8); writefln("Fizz"); writefln("Buzz"); writefln(11); writefln("Fizz"); writefln(13); writefln(14); writefln("FizzBu(ry
出力結果は略。
さすがD言語!C++やJavaやC#にできない事を平然とやってのけるッ
そこにシビれる!あこがれるゥ!
というか、
writefln(1); writefln(2); writefln("Fizz"); writefln(4);
もうwritefln(出力関数)要らなくね?
修正。
// これでFizzBuzzを全部出力するぜ! string makeFizzBuzzCode() { string code; for(int i = 1; i <= 100; ++i) { // 効率? コンパイル時にそんな配慮は要らん! if(i % 3 == 0 && i % 5 == 0) { code ~= "FizzBuzz\n"; } else if(i % 3 == 0) { code ~= "Fizz\n"; } else if(i % 5 == 0) { code ~= "Buzz\n"; } else { code ~= static_itoa(i) ~ "\n"; } } return code; } int main(string[] args) { // もうコンパイル時のメッセージしか出さない。(笑) pragma(msg, makeFizzBuzzCode()); return 0; }
コンパイル結果。
$ dmd -unittest fizz_buzz.d 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBu(ry
実行するまでもなく結果が出力された。つまり実行時間ゼロ、ということは……
世 界 最 速
みんな使おうD言語!
http://www.kmonos.net/alang/d/1.0/index.html(1.0。こっちの方が安定してる?)
じゃ、少しだけ本気出してみたよ。要求仕様にかなうといいんだけど。
#include <stdio.h> int main(void) { puts("1"); puts("2"); puts("Fizz"); puts("4"); puts("Buzz"); puts("Fizz"); puts("7"); puts("8"); puts("Fizz"); puts("Buzz"); puts("11"); puts("Fizz"); puts("13"); puts("14"); puts("FizzBuzz"); puts("16"); puts("17"); puts("Fizz"); puts("19"); puts("Buzz"); puts("Fizz"); puts("22"); puts("23"); puts("Fizz"); puts("Buzz"); puts("26"); puts("Fizz"); puts("28"); puts("29"); puts("FizzBuzz"); puts("31"); puts("32"); puts("Fizz"); puts("34"); puts("Buzz"); puts("Fizz"); puts("37"); puts("38"); puts("Fizz"); puts("Buzz"); puts("41"); puts("Fizz"); puts("43"); puts("44"); puts("FizzBuzz"); puts("46"); puts("47"); puts("Fizz"); puts("49"); puts("Buzz"); puts("Fizz"); puts("52"); puts("53"); puts("Fizz"); puts("Buzz"); puts("56"); puts("Fizz"); puts("58"); puts("59"); puts("FizzBuzz"); puts("61"); puts("62"); puts("Fizz"); puts("64"); puts("Buzz"); puts("Fizz"); puts("67"); puts("68"); puts("Fizz"); puts("Buzz"); puts("71"); puts("Fizz"); puts("73"); puts("74"); puts("FizzBuzz"); puts("76"); puts("77"); puts("Fizz"); puts("79"); puts("Buzz"); puts("Fizz"); puts("82"); puts("83"); puts("Fizz"); puts("Buzz"); puts("86"); puts("Fizz"); puts("88"); puts("89"); puts("FizzBuzz"); puts("91"); puts("92"); puts("Fizz"); puts("94"); puts("Buzz"); puts("Fizz"); puts("97"); puts("98"); puts("Fizz"); puts("Buzz"); return 0; }
FizzBuzz続き
Cにもlambdaがあればいいのに
#include <stdio.h> #include <unistd.h> #define FALSE 0 #define TRUE !FALSE typedef struct state_t { int state; int num; int max; int outputted; } state_t; typedef struct fsm_t { state_t *(*func)(struct fsm_t *, state_t *); int divider; char *str; } fsm_t; static state_t *fizzbuzz(fsm_t *, state_t *); static state_t *end_of_line(fsm_t *, state_t *); static state_t *cond(fsm_t *, state_t *); static state_t *succ(fsm_t *, state_t *); static fsm_t fsm[] = { { fizzbuzz, 3, "Fizz" }, { fizzbuzz, 5, "Buzz" }, { end_of_line, 0, NULL }, { cond, 0, NULL }, { NULL, 0, NULL }, }; static state_t *fizzbuzz(fsm_t *fsm, state_t *cur) { if ((cur->num % fsm[cur->state].divider) == 0) { printf("%s", fsm[cur->state].str); cur->outputted = TRUE; } return succ(fsm, cur); } static state_t *end_of_line(fsm_t *fsm, state_t *cur) { if (!cur->outputted) printf("%d", cur->num); puts(""); cur->outputted = FALSE; return succ(fsm, cur); } static state_t *cond(fsm_t *fsm, state_t *cur) { if (++cur->num > cur->max) return NULL; return succ(fsm, cur); } static state_t *succ(fsm_t *fsm, state_t *cur) { if (fsm[++cur->state].func == NULL) cur->state = 0; return cur; } int main(void) { state_t state = { 0, 1, 100, FALSE }; state_t *cur = &state; while ((cur = (*fsm[cur->state].func)(fsm, cur)) != NULL) ; return 0; }
http://anond.hatelabo.jp/20081026002746
ステートマシン大好きっ子としては書かずにいられない
もう少しがんばればforも無くせるな
fsmの中身ってDRYなの?的な話もあるだろうが,こんなもの他のプログラムで自動生成すればいいんだよ!(開き直り)
#include <stdio.h> static int process(unsigned char *str, int c) { if (str != NULL) puts(str); else printf("%d\n", c); return ++c % (3 * 5); } static int iter(int c) { return process(NULL, c); } static int fizz(int c) { return process("Fizz", c); } static int buzz(int c) { return process("Buzz", c); } static int fizzbuzz(int c) { return process("FizzBuzz", c); } static int (*fsm[])(int) = { fizzbuzz, iter, iter, fizz, iter, buzz, fizz, iter, iter, fizz, buzz, iter, fizz, iter, iter }; int main(void) { int i, state; for (i = state = 1; i <= 100; i++) { state = (*fsm[state])(i); } return 0; }
Thanks. 確かにそうなんだけど、putsだと勝手に改行が出力されてしまうので一ヶ所しか使えなかった。DRY、forなし、ifなし(:?使ってるのでインチキだけど)、main以外に関数なし風味。これで完成ということにして寝ます。
int main() { int fizz_buzz(int i, int limit) { int do_fizz_buzz(int num, int divisor, const char* str, int print) { return num % divisor == 0 ? do_fizz_buzz(num / divisor, divisor, str, 1) : (printf("%s", print ? str : ""), num); } do_fizz_buzz(do_fizz_buzz(i, 3, "Fizz", 0), 5, "Buzz", 0) == i ? printf("%d\n", i) : puts(""); return i++ == limit ? 0 : fizz_buzz(i, limit); } return fizz_buzz(1, 100); }
移植性の話は厳禁でw