おお、すばらしい。
buf[0] = '\0';
がトリッキーで面白いですね。
3を法にして……ってのは、まったくそのとおりで、念のため説明しますと、ある数Nの10進展開を、
N = Σ10n an
のようにあらわすと、10≡1 (mod 3)だから、10n≡1で、
N ≡ Σ an (mod 3)
となって各桁の合計の剰余と等しくなるわけですね。
「コンピュータに詳しい」が何を意味するのかによりますが、プログラミング全般のスキルと、CPU をある程度理解してるっていうのと、アドレスがどうこうとか言いながらアセンブラでプログラムを書けるっていうのは多少重なってはいても現代においては別々の話です。 C言語はほぼアセンブラのようなものなので、特殊な C++ とか C を書く場合にメモリ上でデータがどう保持されてるかみたいな知識は必要ですが、「今日はちょっと気分転換でアセンブラで書いてみよう」なんていう話は少なくともアプリケーションを書いてるプログラマでは無いと思います。組み込みとか OS とかもっとハードに近い所だと話は別。 CPU が内部で何やってるのかっていう知識は一応必要だけども、それよりもオブジェクトをちゃんと設計できたり、客の言ってることを理解してシステムを設計できたり、データベース、言語設計、ネットワーク、セキュリティ、グラフィックスその他の分野をかじってる方がプログラマの知識として役に立つと思います。 二次キャッシュの仕組みとか、マイクロインストラクションとかパイプラインを熟知してる方が「コンピュータに詳しい」のか、ネットワークや既存のフレームワークその他の知識を駆使してアプリケーションを書ける方が「コンピュータに詳しい」かというと、別分野としか言いようが無い。
ついでに (スコア:0)
#★★★とか?
情報処理技術者 (スコア:0)
Re:情報処理技術者 (スコア:1, 参考になる)
ITだけじゃなくて有資格者って事だけじゃ判断付かないから、資格そのものが無意味になってきていると思う。
資格より職歴やサークル活動歴、オタク歴などの方がよほど参考になるよ。
Re:情報処理技術者 (スコア:5, 興味深い)
個人的には『SEなら資格取るのなんて楽勝 [yahoo.co.jp]』にて、
| あ、でも試験会場に行くと、現場で働いてる人かそうでないかはひと目でわかります。
| 午前が終わると暗い顔してるのが現場の人で、午後が終わると暗い顔してるのが学生さん。
| 現場の人は「筆記は苦手だけど、午後のプログラム試験なんか試験にもならん。
と書いてあるのはかなり驚きなんですが。学生のときにソフトウェア開発技術者試験を受験しましたが、むしろ、午後試験が終わった後の方が受かったという思いが強かったですね。きたみさんの接する学生はプログラムが書けないということなんでしょうけれど、午後試験の問題をすらすら解けない人がプログラミングの演習の単位を取るのは講義の先生が甘過ぎなんじゃないかと思ってしまいます。
『どうしてプログラマに・・・プログラムが書けないのか? [aoky.net]』によると、情報系の学生の過半数がFizzBuzzというトイプログラムすら書けないとのことですので、『お前みたいな情報系学生が情報系の全てだと思ったら大間違いなんだよ!』といえば、ごもっともですが。でも、そんな人は設計や営業も含めてプログラミングに関係ないところに行って欲しいですね。プログラムが書けない人にはコーディングの手間を予想することができないでしょうからそんな人に仕様書を書かれたり、営業されたりするとデスマーチ確定プロジェクトができてしまいます。現場から無能な人というレッテルを貼られるのは必至なので本人にとってもプログラムに関わらない職場の方が幸せなのではないかなと。
Re:情報処理技術者 (スコア:1)
おそらく、その専門学校では資格試験対策の勉強に時間の大半を費やしてるのではないでしょうかね。資格試験合格ってのは、プログラミングの技術レベルよりも客観的な数値として対外的に主張しやすいですから。
#海外の状況はしりませんが…
Re:情報処理技術者 (スコア:1)
すみません。 って書いてこうとしたら2分じゃ書けそうになかったので、こんな風に書いたのですが、3分ぐらい掛かっちゃいました。
Re:情報処理技術者 (スコア:1)
いりません。あと、FizzとBuzzの印字で改行はいりません。
で、ループ直前に改行をする。
perlは知らんので文法は間違ってたらごめん。
#4年前にやめた業界だけど、文字通り目隠ししても作れました。
Re:情報処理技術者 (スコア:0)
3分でちょっと色気出そうとしたら全然面白くなかった。
print <<'FizzBuzz';
#!/usr/local/bin/perl
local $\ = "\n";
for my $i (1 .. 100) {
$_ = $i;
s/\d*$/Fizz/ unless $i % 3;
s/\d*$/Buzz/ unless $i % 5;
print;
};
FizzBuzz
Re:情報処理技術者 (スコア:0)
Re:情報処理技術者 (スコア:0)
Pythonだとワンライナーで
for x in ['FizzBuzz' if x==x/15*15 else 'Fizz' if x==x/3*3 else 'Buzz' if x==x/5 else x for x in range(1,101)]:print x
ですかね
Re:情報処理技術者 (スコア:2, すばらしい洞察)
「剰余を使ってはいけない」という条件の記述はなかったんだけど,有名なんですかこれ
------------
二次以外おことわり
FizzBuzz by Scheme (スコア:1)
(define (fizzbuzz-iter cnt cnt3 cnt5 result-list)
(cond
((= cnt 0) result-list)
((and (= cnt3 0) (= cnt5 0)) (fizzbuzz-iter (- cnt 1) 2 4 (cons 'Fizzbuzz result-list)))
((= cnt3 0) (fizzbuzz-iter (- cnt 1) 2 (- cnt5 1) (cons 'Fizz result-list)))
((= cnt5 0) (fizzbuzz-iter (- cnt 1) (- cnt3 1) 4 (cons 'Buzz result-list)))
(else (fizzbuzz-iter (- cnt 1) (- cnt3 1) (- cnt5 1) (cons cnt result-list)))))
(define (fizzbuzz)
(fizzbuzz-iter 100 1 0 '()))
(fizzbuzz)
# 求む Scheme programmer
剰余禁止なら整数型のかけ算、割り算も禁止しないとあまり意味が無いと思う。
ここで示したカウンターを使う方法の他には足し算を使って地道に表を作る方法と配列に上書きする方法、予め計算した結果を表示するずるい方法しか剰余禁止ルールの解法は知らないけど、他になんかあるんだろうか。
文字列操作 (スコア:1)
十進で書いた場合、
・3の倍数は"0" "3" "6" "9"が任意個、"1" "4" "7"の個数の合計と"2" "5" "8"の個数の合計が等しい。
・5の倍数は下の桁が"0" "5"。
ってことを使うとか?
# Cでかけたけど、あんまり綺麗にならなかったので。
# スキルが足りん……。
勘違い (スコア:1)
本当は「各桁の合計が3の倍数」なので「個数が等しい」ではないですね。失礼しました。
Re:勘違い (スコア:1)
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
int i, j, chk3;
char c, buf[10];
for (i = 1; i = 100; i++) {
snprintf(buf, sizeof(buf), "%03d", i);
for (j = 0, chk3 = 0; j 3; j++) {
c = buf[j];
if (c == '1' || c == '4' || c == '7')
chk3 += 1;
if (c == '2' || c == '5' || c == '8')
chk3 += 2;
}
if (chk3 == 0 || chk3 == 3 || chk3 == 6) {
printf("Fizz");
buf[0] = '\0';
}
c = buf[2];
if (c == '0' || c == '5') {
printf("Buzz");
buf[0] = '\0';
}
printf("%s ", buf);
}
printf("\n");
return EXIT_SUCCESS;
}
あまり急いで作るつもりがなかったのでちんたらやっていたら構想から実装まで10分程度使ってしまいました。
これでは自称上級プログラマーじゃん。(--;
Re:FizzBuzz by Scheme (スコア:0)
Re:勘違い (スコア:2)
誤:
| for (i = 1; i = 100; i++) {
正
| for (i = 1; i <= 100; i++) {
誤
| for (j = 0, chk3 = 0; j 3; j++) {
正
| for (j = 0, chk3 = 0; j < 3; j++) {
Re:勘違い (スコア:1)
N = Σ10n an
のようにあらわすと、10≡1 (mod 3)だから、10n≡1で、
N ≡ Σ an (mod 3)
となって各桁の合計の剰余と等しくなるわけですね。
Re:勘違い (スコア:0)
Re:勘違い (スコア:0)
プログラマ失格 (スコア:1)
FizzBuzzなんて簡単なプログラムのはずだけど、これを紙に書きだすとなると40分は貰いたいところ。
# 少なくともプログラムを書ける紙を自部屋から探し出すのに30分はかかりそうだもん。(笑
vyama 「バグ取れワンワン」
Re:情報処理技術者 (スコア:0)
Re:情報処理技術者 (スコア:0)
そういうのを採用してくる営業や人事に、エスカレーションしてあげたほうが良いですよ。
プログラマ職ではなく、プログラミングのスキルはないがコンピュータに詳しい人が
サーバの構築設計・テストといった職で入って、テスト用データの作成や抽出のために
プログラミング言語でツールを作成しなければならないような現場に配属される人はどうしたら良いですかね?
プログラミングはあくまで副産物なので、出来なくても人力で必死にやれば良いのは分かってますが、
ツールでやらないと仕事にならないそうで…。
最終的にはやる気の問題。
素朴な疑問 (スコア:0)
アセンブラでコード書けない人が
果たしてコンピュータに詳しいと
言えるかどうか…
CPUに詳しくなくても
コンピュータに詳しいってのは
ありなんすかね?
Re:素朴な疑問 (スコア:2, 参考になる)
C言語はほぼアセンブラのようなものなので、特殊な C++ とか C を書く場合にメモリ上でデータがどう保持されてるかみたいな知識は必要ですが、「今日はちょっと気分転換でアセンブラで書いてみよう」なんていう話は少なくともアプリケーションを書いてるプログラマでは無いと思います。組み込みとか OS とかもっとハードに近い所だと話は別。
CPU が内部で何やってるのかっていう知識は一応必要だけども、それよりもオブジェクトをちゃんと設計できたり、客の言ってることを理解してシステムを設計できたり、データベース、言語設計、ネットワーク、セキュリティ、グラフィックスその他の分野をかじってる方がプログラマの知識として役に立つと思います。
二次キャッシュの仕組みとか、マイクロインストラクションとかパイプラインを熟知してる方が「コンピュータに詳しい」のか、ネットワークや既存のフレームワークその他の知識を駆使してアプリケーションを書ける方が「コンピュータに詳しい」かというと、別分野としか言いようが無い。