プログラマーなら「FizzBuzz問題」解けるよな?at PROG
プログラマーなら「FizzBuzz問題」解けるよな? - 暇つぶし2ch336:仕様書無しさん
11/03/07 11:10:02.94
なつかしい話題発見。
全セル分のワークと若干のキューが確保できればいいんだから
そんなにメモリ圧迫するってほどでもないような。
といっても対象フィールドの広さにもよるだろうが、
例の出題程度の広さだったら破綻の心配はまずしなくていいでしょう。
各セルごとにゴール、スタート、障害物、未踏地、
既に歩いた地(「来た方向」の保持兼用)の区別がつけばいいので
ワークは各セルごとに1バイト(最低4ビット)あれば十分足りるし。
でも深さ優先探索しか知らなかった(書いたことがなかった)ので
試しに解いてみた時にはちょっと手こずってしまった。
ちなみに件の例題では深さ優先探索でも実用時間内に解けてしまう。
これって結構ワナかもな、と思った。

337:仕様書無しさん
11/03/18 10:49:36.47
空気読まずにCLOSでfizzbuzz,

(defgeneric fbzz (%3 %5 n)
(:method (%3 %5 n) (print n))
(:method ((%3 fixnum) %5 n) (print 'fizz))
(:method (%3 (%5 fixnum) n) (print 'buzz))
(:method ((%3 fixnum) (%5 fixnum) n) (print 'fizzbuzz)))

(defun fizz-buzz (n) (fbzz (/ n 3) (/ n 5) n))

(loop for i from 1 to 100 do (fizz-buzz i))

338:プログラマ志望の経済学部4年生
11/06/10 16:54:07.54
プログラミング始めて3週間です、どうですか?
#include <stdio.h>

int main(void)
{
int a;

for (a = 1; a <= 100; a++)
{
if (a % 3 == 0 && a % 5 == 0)
printf ("FizzBuzz\n");

else if (a % 3 == 0)
printf("Fizz\n");

else if (a % 5 == 0)
printf("Buzz\n");

else
printf("%d\n", a);
}

return 0;
}


339:仕様書無しさん
11/06/11 00:06:20.06
どうですかって言われても
まぁいいんじゃね
あえて言えば平凡すぎて面白みがなくてつまらん

340:仕様書無しさん
11/06/11 03:43:41.34
いい機会なんで?演算子を使ってみよう

341:仕様書無しさん
11/06/11 10:56:59.64
まいど = まいど?まいどぉ:まいどぅ

342:仕様書無しさん
11/06/11 11:19:06.80
こうかな
int main(void){
char *s[4] = { "  ","Fizz","Buzz","FizzBuzz"};
int i;
for (i=1;1<=100;i++){
sprintf(s[0],"%d",i)
puts(s[(i%5==0)<<1+(i%3==0)]);
}
}
確認してないからわからんがかなり速の筈
sprintf部分を自分で書けばもっと速くなる

343:仕様書無しさん
11/06/11 11:31:36.95
こうすればもっと早いな
int main(void){
char *s[4] = { "  ","Fizz","Buzz","FizzBuzz"};
int i, j;
for (i=1;1<=100;i++){
j=(i%5==0)<<1+(i%3==0);
if(j==0)
sprintf(s[0],"%d",i);
puts(s[j]);
}
}

344:仕様書無しさん
11/06/11 17:32:44.94
無限ループするじゃん。

345:仕様書無しさん
11/06/11 18:10:12.16
1<=100はともかく、<<演算子の優先順位が+より低いのにハマってるよ。
*2にしても多分同じオブジェクトが出るとは思うけどね。

↓結果
int main(void){
 char *s[4] = { " %d¥n","Fizz¥n","Buzz¥n","FizzBuzz¥n"};
 int i;
 for (i=1;i<=100;i++)printf(s[(!(i%5)<<1)+!(i%3)],i);
}


346:仕様書無しさん
11/06/11 21:04:59.44
確認してないからわからんがかなり速の筈


347:仕様書無しさん
11/06/11 21:07:23.93
Link: URLリンク(codepad.org)

int main(void){
char *s[4] = { "  ","Fizz","Buzz","FizzBuzz"};
int i;
for (i=1;1<=100;i++){
sprintf(s[0],"%d",i)
puts(s[(i%5==0)<<1+(i%3==0)]);
}
}

In function 'main':
Line 6: error: expected ';' before 'puts'

348:仕様書無しさん
11/06/11 21:09:13.71
Link: URLリンク(codepad.org)

int main(void){
char *s[4] = { "  ","Fizz","Buzz","FizzBuzz"};
int i, j;
for (i=1;1<=100;i++){
j=(i%5==0)<<1+(i%3==0);
if(j==0)
sprintf(s[0],"%d",i);
puts(s[j]);
}
}


Output:
Segmentation fault

349:仕様書無しさん
11/06/12 02:55:39.33
FizzBuzzはできて当たり前、がんばるもんじゃないんだけどな。
「どうだっ」みたいな人が会社にいて困った。

350:仕様書無しさん
11/06/12 12:27:40.95
int main(void){
char *p, c[] = " ";
char *s[] = { "","Fizz","Buzz","FizzBuzz"};
int i, j, k;

s[0] = c;
for (i=1;i<=100;i++){
j = ((i%5 == 0)<<1) + (i%3 == 0);
if(j==0) {
p = c;
k = i;
if(k >= 100) {
*p++ =k/100 +'0';
k =k%100;
}
if(k >= 10) {
*p++ =k/10 +'0';
k =k%10;
}
*p++ =k +'0';
*p = NULL;
}
puts(s[j]);
}
return 0;
}
動くようにするとこうだな
sprintfはよくわからんのではずしたわ


351:仕様書無しさん
11/06/12 18:18:48.82
平凡

use strict ;

my $m3 = 3 ;
my $m5 = 5 ;
for( my $n = 1 ; $n <= 100 ; ++$n ) {
if( $m3 == $n ) {
$m3 += 3 ;
if( $m5 == $n ) {
$m5 += 5 ;
print STDOUT "FizzBuzz\n" ;
} else {
print STDOUT "Fizz\n" ;
}
next ;
}
if( $m5 == $n ) {
$m5 += 5 ;
print STDOUT "Buzz\n" ;
next ;
}
print STDOUT $n, "\n" ;
}
exit(0) ;
__END__


352:仕様書無しさん
11/06/13 23:12:21.79
1.可変性
  このプログラムが実用になった場合、標準出力以外のものに出すよう変更の必要があると思われるが、簡単にできるよう考慮されているか
  倍数が3のみで5なしになったら?逆に両方残したまま7が増えたら?条件変わってもすぐに変更できるか
2.動作速度
  十分速いかあるいは速度アップの必要が生じた場合、どこをいじればよいか?具体的に内部でどういう動作が 行われているかわかっているか

 等をワシなら気にするな
最初黙っててできた後から上記のような質問してもすぐに対応したら、かなりできる奴だと思うわ

353:仕様書無しさん
11/06/14 01:46:04.12
いや、そもそも「かなりできる」奴か見るためのテストじゃないし。
がんばるもんじゃないったらスレ終わりじゃん。ここマ板だし。
こんな書き方もある、ってお遊びだよ?言わせんな恥ずかしいw

354:仕様書無しさん
11/06/15 00:34:09.43
♪フィズバズフィズバズよよいがよい
♪フィズバズフィズバズどどんがどん
♪三の倍数の時はフィズ
♪五の倍数の時はバズ
♪三と五の三と五の
♪公倍数ではフィズバズ印字
♪フィズバズ音頭でどどんがどん


















そこのズブズブの日本人のあなた
自然にメロディが浮かんで来たでしょ


355:uy ◆yyC0rYWEq2
11/06/16 22:02:56.19
メタでかけよ

356:仕様書無しさん
11/06/17 00:03:58.61
>>355
お手本プリーズ


357:仕様書無しさん
11/06/17 10:22:50.20
メタと付く言語はMLとmetafontしか知らんな…


358:仕様書無しさん
11/06/17 16:55:18.24
メタで書けば3や5プリントしてもいいのかw

359:仕様書無しさん
11/07/07 21:47:26.61
haskellとcで!!と思ったら、すでに書かれてた。。。Orz
haskellの内包表記で書けないか考えてみる


360:仕様書無しさん
11/07/08 12:32:30.06
using System;

class FizzBuzz
{
    static void Main()
    {
        for (var n = 1; n <= 100; n++) {
            var f = (n % 3 == 0 ? "Fizz" : "")
                + (n % 5 == 0 ? "Buzz" : "");
            Console.WriteLine(f == "" ? "{0}" : f, n);
        }
    }
}

361:仕様書無しさん
11/07/08 20:37:40.13



これがどう問題なのか
誰か詳しく教えてくれ

913 :名無しさん@12周年 :sage :2011/07/02(土) 21:53:57.61 ID:vEYqWa5o0
>>871
アメリカで例えると
オバマ大統領がアルカイダにいる、ビンラディンの家族に資金援助していたという事で騒ぎになってる。

オバマがこっそり9.11実行犯の釈放嘆願書に署名
         ↓
オバマ「私ははめられた!!うっかり署名してしまった!  私は卑怯で残忍なテロリストを絶対許さない!!」
         ↓
オバマはイスラム原理主義の団体から多額の寄付を受け取っていた←追加分
         ↓
オバマがこっそりビンラディンの家族に毎年、計6250万円献金
         ↓
クリントンもこっそりビンラディンの家族に1000万円献金 ←ここが鳩山分★
         ↓
アメリカのメディアは全く報じず
ねーよwww






362:仕様書無しさん
11/07/17 17:04:57.69
repeat 99
mes n+cnt
if n\15=0 : mes "FizzBuzz": else {
if n\3=0 : mes "Fizz"
if n\5=0 : mes "Buzz"
}
loop

;未RUN

363:仕様書無しさん
11/07/21 01:29:31.99
ホットスーププロセッサなら

for n,1,100:s="":if n\3=0{s="Fizz"}if n\5=0{s+"Buzz"}if s=""{s=n}mes s:next

364:仕様書無しさん
11/07/21 12:30:50.58
using System;
class FizzBuzz
{
    static void Main()
    {
        int m3 = 0, m5 = 0;
        for (int i = 1; i <= 100; i++) {
            if (++m3 == 3) {
                Console.Write("Fizz");
                m3 = 0;
            }
            if (++m5 == 5) {
                Console.Write("Buzz");
                m5 = 0;
            }
            if (m3 != 0 && m5 != 0)
                Console.WriteLine(i);
            else
                Console.WriteLine();
        }
    }
}

365:362
11/07/21 23:31:27.81
>>363
そんなかんたんにいくのね・・・

366:仕様書無しさん
11/08/01 10:21:21.51
クソコードを書きたくなったから書いてみる
print ':'.join('FizzBuzz' if n % 15 == 0 else 'Fizz' if n % 3 == 0 else 'Buzz' if n % 5 == 0 else str(n) for n in xrange(1, 101))

367:仕様書無しさん
11/08/01 10:23:28.39
\nに直すの忘れてたが多分どうでもいいな

368:仕様書無しさん
11/08/07 04:17:05.04
#include <stdio.h>

main(void){
int i = 0,flag = 0;
while(i < 101){
if(i % 3 == 0){
printf("Fizz");
flag = 1;
}
if(i % 5 == 0){
printf("Buzz");
flag = 1;
}
if(flag == 1){
printf("%d\n",i);
}else{
printf("\n");
}
flag = 0;
i ++;
}
}

完全独学+初心者+ゲームしか作った事ねぇ・・・
俺ダメダメかのぉ?orz

369:仕様書無しさん
11/08/07 04:20:51.13
見返したら色々間違えてる。なんかカオス。
俺赤面。こんな時間に眠い目こするからいけなかったんだ(言い訳

もう寝る。お休み

370:仕様書無しさん
11/08/07 07:29:01.96
本物のマなら、寝ずにデバッグする。

371:仕様書無しさん
11/08/07 17:07:39.64
真のマなら、寝て起きてからデバッグする。

372:仕様書無しさん
11/08/07 18:05:59.34
>>371
それは正しい

373:仕様書無しさん
11/08/07 18:50:41.19
俺ぐらいになると寝てる間にデバッグするね

374:仕様書無しさん
11/08/07 20:10:30.23
>>368
関数の型をうろ覚えで済ますな、ぐぐれ

ループの範囲が1から100までなんだから、素直に1と100をコードに入れられるならそうした方が見やすい
つーかループ変数の初期化とか更新とかはforを使えばもっと見やすいし、見やすければバグりにくい
最近のC/C++のforならスコープも付くしな

375:仕様書無しさん
11/08/25 17:49:38.05
>>352

#include <stdio.h>

int disp(int num, int flag, int sizeofarray, char *s[] ) {

if (flag == sizeofarray-1)

printf("%d\n", num) ;

else

printf("%s\n",s[flag]) ;

return 0;

}



376:仕様書無しさん
11/08/25 17:52:39.16
(続き)

int main(void) {

int num1 = 1 ;
int num2 = 100 ;
int sizeofarray = 4 ;
int a[] = {15,5,3,1} ;
char *s[] = { "FizzBuzz","Buzz","Fizz","  "};

int i,j ;

for (i = num1 ; i <= num2 ; i++) {

for (j = 0 ; j < sizeofarray ; j++){

if (i % a[j] == 0 ) {

break ;

}

}

disp(i,j,sizeofarray,*s[]) ;

}

return 0;

}

377:仕様書無しさん
11/08/25 17:58:22.94
>>352

1 可変性

標準出力以外に出力する必要が生じたときは、disp()を修正する。
また、項目を追加する必要が生じたときは、変数の初期値を変える。

2 実行速度

可変性を重視すると、その分実行速度が落ちる。


378:仕様書無しさん
11/08/25 19:01:16.31
>>375-376まで行くと、可変性を無駄に重視しすぎだろ
要求が変更されたら、コードを書き換えて対応するのは当たり前なんだから、ほどほどに書き換えが
やりやすくなってりゃいいのよ
実行効率どころか可読性まで大きく落として、まだ見ぬ要求変更の可能性に幅広く対応するのは無駄

379:仕様書無しさん
11/08/26 15:09:14.82
ユーザー様から、仕様の大幅変更の要求が来た。
3で割り切れたときはFizz、5で割り切れたときはBuzz、
3と5で割り切れたときはFizzBuzzでいいんだけど、
それに加えて、7のときはGizz、13のときはKizz、
3と7のときはFizzGizz、3と13のときはFizzKizz、
5と7のときはBuzzGizz、5と13のときはBuzzKizz、
7と13のときはGizzKizzだ。
それから、計算の範囲は、1から100ではなく、100から1000までね。
修正作業をすぐにやってくれ。締め切りは明日ね。

380:仕様書無しさん
11/08/26 15:17:48.71
int num1 = 100 ;
int num2 = 1000 ;
int sizeofarray = 11 ;
int a[] = {91,65,39,35,21,15,13,7,5,3,1} ;
char *s[] = { "GizzKizz","BuzzKizz","FizzKizz","BuzzGizz","FizzGizz","FizzBuzz","Kizz","Gizz","Buzz","Fizz","  "};

よかった。
実行効率どころか可読性まで大きく犠牲にして、
まだ見ぬ要求変更の可能性に幅広く対応したコードを書いておいて…

381:仕様書無しさん
11/08/26 17:24:33.68
そんなピンポイントな仕変出す客おるかいw

382:仕様書無しさん
11/08/26 17:42:45.50
105(3,5,7で割れる)とかどうするんだろ、って思ったけどたぶんBuzzGizzなんだろうなぁ

直接"FizzBuzz"とか書かず、割れた数から出力すれば楽だと思ったんだが、そうするとFizzBuzzGizzになっちゃうんだよなぁ
Fizz,Buzz,…の数だけフラグ用意して、立てたり立てなかったりしつつ、その後3本以上になったら小さいほうを折って…って面倒だわ

383:仕様書無しさん
11/08/26 19:36:59.46
その前にギャラの話をしようじゃないか…

384:仕様書無しさん
11/08/26 21:33:38.93
つーかその程度の変更なら、丸々書き換えても30分も要らんだろw

385:仕様書無しさん
11/08/27 00:02:00.57
面倒なだけで興味をひかないネタだな
こういうところにもその人のスキルって出るよな
よって>>379は低スキルのバカグラマー

386:仕様書無しさん
11/08/27 02:50:52.15
明らかに>>375-376に都合のいいように考えただけの仕様だもんな

387:仕様書無しさん
11/08/27 02:55:14.40
3で割り切れる時は3倍、5で割り切れる時は5倍にして表示してね、という簡単な変更要求が来た途端、
可変性が高いつもりでただ重いだけの無駄コードと化すしな

388:仕様書無しさん
11/08/27 02:55:56.16
可読性が落ちてることが一番問題じゃね?

389:仕様書無しさん
11/08/27 15:09:54.05
この程度の規模のコードで、コードの再利用を考慮しすぎるのはムダ。
仕様変更に伴って書き直した方が早い。

>>1のリンク先には
> ちゃんとしたプログラマであれば、これを実行するプログラムを
> 2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい?
> コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。
> 自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。
とある。

2分とかからずに書き出せる程度の規模のコードで再利用とかムダムダ。
仕様変更があったら数分かけて書き直せ。

390:仕様書無しさん
11/08/27 21:59:59.72
int sizeofarray = sizeof(a) / sizeof(a[0]);
くらい書け(もちろん宣言の順序も入れ替えて)、と思ったけど、どっちにしろ配列サイズが一致しないバグ
を抱える可能性が気持ち悪いから、本気でやるなら三次元配列かstruct/classの配列にすべきか
あと、末尾のダミー文字列が気持ち悪すぎるけど、これ無くても鼻から悪魔出ないよね?

でも実際問題としては>>389に完全同意

391:仕様書無しさん
11/08/27 22:08:29.33
unsignedも付けろ

392:仕様書無しさん
11/08/27 23:12:30.03
>>391
追加料金が1人月発生しますが良いですか?

393:仕様書無しさん
12/02/09 02:03:42.02
さあ、忘れたころにやってくる。


394:仕様書無しさん
12/02/12 22:03:06.96
ひよこグミを参考にしながらOpenCOBOLでショートコーディングに挑戦してみました

IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZBUZZ.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 N PIC 999.
PROCEDURE DIVISION.
RU-PU.
  ADD 1 TO N
  IF 0 = N(3:) OR 5 = N(3:)
    IF N = N / 3 * 3
      DISPLAY "FizzBuzz"
    ELSE
      DISPLAY "Buzz"
    END-IF
  ELSE
    IF N = N / 3 * 3
      DISPLAY "Fizz"
    ELSE
      DISPLAY N(3 - 0 ^ (9 / N):)
    END-IF
  END-IF
  IF N < 100
    GO RU-PU
  END-IF
  STOP RUN.


395:仕様書無しさん
12/02/13 22:10:32.70
RU-PU. がいいね。

396:仕様書無しさん
12/02/14 01:26:49.30
これでいいのかな?VB.net

Dim fizz As String = "Fizz"
Dim buzz As String = "Buzz"
Dim i As Integer

For i = 1 To 100

Dim fl As Boolean = True

If i Mod 3 = 0 Then
rtAnswer.Text &= fizz
fl = False
End If

If i Mod 5 = 0 Then
rtAnswer.Text &= buzz
fl = False
End If

If fl Then
rtAnswer.Text &= i
End If

rtAnswer.Text &= " "

If i Mod 10 = 0 Then
rtAnswer.Text &= vbCrLf
End If

Next

397:仕様書無しさん
12/02/14 20:47:20.57
>If i Mod 10 = 0 Then
???

398:仕様書無しさん
12/02/14 21:31:53.79
>>397
10個ごとに改行入れるってことだろ?見やすくするために

399:仕様書無しさん
12/02/14 21:53:06.43
引用のおっさんここにもいるのか

400:仕様書無しさん
12/02/16 03:14:53.62
なんだ 引用のおっさん て?

401:仕様書無しさん
12/04/09 23:59:48.08
FizzBuzzクイズ

1.fizz.buzz #=> 1
3.fizz.buzz #=> "Fizz"
5.fizz.buzz #=> "Buzz"
15.fizz.buzz #=> "FizzBuzz"

となるようなメソッドfizz、buzzは定義可能か?
可能である場合、同様にgizzを追加定義し、
7.fizz.buzz.gizz #=> "Gizz"
21.fizz.buzz.gizz #=> "FizzGizz"
35.fizz.buzz.gizz #=> "BuzzGizz"
105.fizz.buzz.gizz #=> "FizzBuzzGizz"
105.fizz.gizz.buzz #=> "FizzGizzBuzz" と拡張・応用ができるか?

メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。
オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch