新規ドキュメント


忘れていく脳のための備忘録
by w_l_s
プロフィールを見る
画像一覧

FizzBuzzに挑戦してみたよ

コードゴルフなんてのがあるんだって。
そのなかに、有名?なFizzBuzz問題があって、懐かしかったからやってみたよ。

読みやすいように、改行とか入っているけど、投稿するときは一行にします。
これで166バイトでした。
処理にまだ工夫できそうな気がするんだけどなー。


#include <stdio.h>
int c;
void main()
{
while(c++^100){
if(c%3==0){
printf("Fizz");
if(c%5==0)
printf("Buzz");
}else if(c%5==0)
printf("Buzz");
else
printf("%d",c);
puts("");
}
}


////////////////////////////////

もっと工夫してみたら143バイトまで減らせたよ。
#include <stdio.h>
int c;
void main()
{
while(c++^100){
if(c%3&&c%5){
printf("%d",c);
}
if(c%3==0){
printf("Fizz");
}
if(c%5==0){
printf("Buzz");
}
puts("");
}
}


////////////////////////////////
さらにもっと減らしてみたよ。136バイトに減量成功だよ。

どんなことをやっているか書いておかないと忘れそうだ。

int main()にすると戻り値を書かないといけないからvoidへ。さらに、main関数には型を書かなくてもエラーにならないので消してみた。警告がうるさい。
if文は、一行の式しかないのであれば{}がいらないから消す。ぶら下がり構文とか言われているみたい。
while文の条件式 c++^100 は、c が100になると、排他的論理和ってやつで0になるよ。ようは同じ数字になったら終了ってこと。
if文の条件式 c%3&&c%5 は、3でも5でも15でも割り切れない場合に真になるよ。
そのときは数字を表示すればいいね。
わざわざ15で割り切れたときのことを考えなくても、3で割り切れたときにFizz,5で割り切れたときにBuzzを画面に出せば、自然と15で割り切れるときにFizzBuzzになってくれる。


#include <stdio.h>
int c;
main()
{
while(c++^100){
if(c%3&&c%5)printf("%d",c);
if(c%3==0)printf("Fizz");
if(c%5==0)printf("Buzz");
puts("");
}
}

[PR]
by w_l_s | 2009-09-17 00:30 | c言語

fgetsでgetsを再現する

gets。
バッファ・オーバーフローが起きるから使うなと言われる。
代わりにfgetsを使えと。
取得するサイズを決められるから、バッファ・オーバーフローが起きにくい。

でも動作がちょっと違う。
改行を含むのがfgets、含まないのがgets。
取得し切れなかった文字列がストリームに残るのがfgets、残らないのがgets。

株式会社きじねこさんのページを見て、簡単に置き換えられるものじゃないことを知った。
改行云々については前に悩まされたことがあったけど、ストリームに残ることについては
気にしたことなかったな。

きじねこさんのページには、getsをfgetsで再現するコードが載っている。
関数にすれば便利かも知れないので、まとめてみることにした。
初心者にはちょうどいい練習になりました。

/**********************************************************************/
/*
_getsヘッダ
*/

#ifndef _GETS
#define _GETS

#include <stdio.h>
#include <string.h>

extern char *_gets(char *s, size_t bytes);

#endif

/*
_getsソースコード
*/

#include "_gets.h"

#define ERROR 1
#define CORRECT 0

static int clear_buffer(void);

// getsをfgetsで再現
char *_gets(char *s, size_t bytes)
{
size_t length = 0;

fgets(s, bytes, stdin);
length = strlen(s);

if(s[length - 1] == '\n') {
s[length - 1] = '\0';
} else {
clear_buffer();
}
return s;
}

// バッファに残った文字列を消す
static int clear_buffer()
{
int letter;
int state = ERROR;

do {
letter = getchar();
if(letter == EOF) {
if(feof(stdin)) {
state = CORRECT;
break;
} else {
/*エラー処理を入れる*/
break;
}
}
} while(letter != '\n');

return state;
}

/**********************************************************************/

clear_buffer()のエラー処理は、単純にエラーコードを返すだけにした。
バッファに入りきらずにストリームに残った入力はすべて捨てている。
feof()なんて使ったことないな…。本によっては、この関数も絶対使うなと書いてあるけど、今回の例ではどうなんだろうか。
[PR]
by w_l_s | 2009-01-12 01:37 | c言語

カテゴリ

全体
erlang
Python
c言語
作って遊ぼう
シェルスクリプト
OS
javascript
jQuery
反省
vim
未分類

お気に入りブログ

メモ帳

最新のトラックバック

ライフログ

検索

タグ

ファン

記事ランキング

ブログジャンル

画像一覧