はてなキーワード: FizzBuzz問題とは
http://anond.hatelabo.jp/20070508170219
もっと上手いやり方があるんだろうなぁ。
$i3=1; $i5=1; $flag=0; for($n=1;$n<101;$n++){ if($i3==3 && $i5==5){ echo "FizzBuzz¥n"; $i3=1; $i5=1; }else{ if($i3==3){ echo "Fizz¥n"; $i3=1; $flag=1; }else{ $i3++; } if($i5==5){ echo "Buzz¥n"; $i5=1; $flag = 1; }else{ $i5++; } if($flag==0){ echo $n."¥n"; } $flag = 0; } }
※一部全角化(&¥<)
なんか色々レスがついて嬉しいですねw
FizzBuzz問題って一般的に、3の倍数と5の倍数以外の場合は数字を表示しないと駄目だよ
それは知りませんでした。
後、def文の中で再帰してるけど、これ、馬鹿でかい数入れたらメモリ使い切らないか?
Phythonは詳しくないから、嘘言ってるかも知れないけど
他には、何も15で場合分けしなくても、改行しなければ3の倍数と5の倍数とそれ以外で済むから
剰余演算の回数が減る
この辺はいかにも興味が無い領域ですねw
メモリは多分使い切ると思いますが、使い切った場合とかめんどくさくて考えたくないです。
他には、何も15で場合分けしなくても、改行しなければ3の倍数と5の倍数とそれ以外で済むから
剰余演算の回数が減る
これも興味ないですね…。計算回数って、数学(数理モデル)を計算機に乗せたから出てきた問題で、実用上は重要だけど数学としてはどうでもいいなあって思っちゃいます。
これひらめいた人はえらい。
文系でもその気になれば身につくの?
情報科学って
何とかなると思うよ。
wikipediaの情報工学の「基礎的な理論」とか「ソフトウェア技術」とかを一通り読んで、
「そういうものがあるんだ」と引き出しに確保しておく。理解するのは年単位の後回しでも十分。
何かプログラム言語を使って、Fizzbuzz問題とかの簡単な課題を解く。
手っ取り早く仕事にしたいなら、JavaでDBを使ったWEB掲示板でも作ってみてもいい。
入門サイトなんて世の中にあふれてるから、学習コストは低いお!!
http://www.itmedia.co.jp/bizid/articles/0711/07/news012.html
"田口元の「ひとりで作るネットサービス」探訪「twitterMobile」はどうやって生まれたのか"を読んでいて湧き出た感情を発露したくなった。
素晴らしいソフトウェアを生み出せるプログラマはそれ相応の評価を受けるべきだが、WEBプログラマというのはレベルと評価が噛み合っていなくて気持ちが悪い。
あくまでリンク先は対象者が絶賛されているようなものではなく、どっちかというとamachang氏やmala氏との絡みで取り上げられていることはわかる。それでも、ただのHTMLの下請け作業を"マークアップエンジニア"といい、真剣に半年も勉強すれば到達出来るレベルで"サービス開発者"として持ち上げる土壌があることが、どう考えてもおかしい業界だと感じる。もちろん、そういう段階を経て有能なプログラマが生まれることは大いにあるだろうが、WEBプログラマの敷居は低い分だけに、業界直結のネット上にレベルの低い人間が取り上げられやすすぎだろ。そしてはてブを見ると、それを仲間内で持ち上げてる。こんな状態では、レベルの低い馴れ合いでしかない。
自分は別業種においてプログラミングは道具の1つとして使っているレベルであるが、本当に評価されるべきプログラマというのは、そんな自分程度ではどうやっているのかわからない事を魔法のようにやってのける連中の事だ。こういう人間は誰でもは真似できない技術の持ち主だから、プロと言える。
その一方で、身につく期間も技術の交代も早いインターネット上で、小手先だけのWEBプログラマが表に出てくる現状。FizzBuzz問題を必死に解いて、さも簡単な事のように振る舞っている連中とかいるんじゃないのか?
いくつか考えてみた
(問1)高階関数と再帰関数を必ず使って数値を要素とするリストの要素の総和を求める関数を書け。ただし高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。
(問2)二つの引数をとり二つのうち大きいほうを返す関数と高階関数、再帰関数をつかって数値のリストの最大値を求める関数を書け。ただし高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。
というのは簡単すぎるか?簡単すぎるなら
(問3)高階関数と再帰関数を必ず使ってある数値に5を足し、10かけて2で割った数を求める関数を書け。ただし高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。
こっちの方がいいかな。でもトリッキーすぎる気もする。
一応問題を出したので、SchemeとPythonで自分で想定している答えを書いておいた。はてなではSchemeが人気のようなので、あまり知らなかったけど関数言語ではSchemeで書いておいた。Pythonで書くのはSchemeだけだとわかりにくいので、なにかスクリプト言語で書いておこうと思ったから。Rubyの方が人気なので、はじめはRubyで書こうと思ったけど挫折した。だれかRubyで書いてくれないかな・・・。コードオブジェクトってなによ。というか関数はオブジェクトなのに引数にできないの?なんで?(以下疑問と愚痴の嵐なので略)Perlは古株が多くてユーザー数も多そうだけど、・・・その・・・無理です・・・。あの言語仕様はやる気がしない。ぶっちゃけ理解できない。Pythonを知らないひとは多そうだけど、知らなくてもSchemeよりは感じは掴めると思うのでPythonでも書いておくことにした。
http://anond.hatelabo.jp/20071110215936
http://anond.hatelabo.jp/20071110220132
これで大部分のひとがこの問題に興味をもたなくて解答するひとがいなくても、興味を持ったひとは安心だね!
追記:
問3で次のは無しとしておきたい。
(define continuous-apply
(lambda (lst obj)
(cond
((null? lst)
obj)
(else
(continuous-apply (cdr lst) ((car lst) obj))))))
(define plus5
(lambda (num)
(+ num 5)))
(define times10
(lambda (num)
(* num 10)))
(define divide2
(lambda (num)
(/ num 2)))
(define plus5-times10-divide2
(lambda (num)
(continuous-apply (list plus5 times10 divide2) num)))
(plus5-times10-divide2 2)
def continuousApply(lst, obj): if lst: return continuousApply(lst[1:], lst[0](obj)) else: return obj def plus5(num): return num + 5 def times10(num): return num * 10 def divide2(num): return num / 2 def plus5_times10_divide2(num): return continuousApply([plus5, times10, divide2], 2) plus5_times10_divide2(2)
http://blogs.wankuma.com/episteme/archive/2007/11/08/106927.aspx
かなりテキトー。エラー処理とかしない。
package Animal; sub new { bless { cnt => 1 } , $_[0] } sub Sound { printf "%s\n", $_[0]->{voice} x $_[0]->{cnt} } sub SetCount { $_[0]->{cnt} = $_[1]; $_[0] } sub SetVoice { $_[0]->{voice} = $_[1]; $_[0] } package Dog; use base qw/Animal/; sub new { $_[0]->SUPER::new->SetVoice('Wan') } package Cat; use base qw/Animal/; sub new { $_[0]->SUPER::new->SetVoice('Nya-') } my $animal; $animal = Dog->new; $animal->Sound; $animal->SetCount(3); $animal->Sound; $animal = Cat->new; $animal->Sound;