【Scala】Anarchy Golf

http://golf.shinh.org/

出来るだけ少ない文字数(byte)でお題をクリアするプログラマの遊びらしいです
プログラミングに慣れよう、と勧められたのでやってみました
英語ですが決して怪しいサイトではないですのでご安心を。

また、ブログに解答の一例を記載していますのでチャレンジする方は注意してください。
反転などの処理も行っていませんのであしからず。


The list of all problems から問題集に飛べます。
まずは1番上の簡単な問題から

1. hello world

Problem

say "Hello, world!"

「「Hello, world!」と言え!!」とのことです。
プログラミングを学ぶとき大体最初にやりますね
という訳でささっとコードを書いて提出
(Use Formを押して、言語を選択してから送信しましょう)

正解するとランキングに乗ります

http://puu.sh/5u95f.png

最小byteなのでよし。

一応コード

print("Hello, world!")

次はFizzBuzzという問題。


34.FizzBuzz

Problem

Print integers 1 to 100, but replace multiples of 3 with "Fizz" and multiples of 5 with "Buzz" and multiples of both with "FizzBuzz"
For longer description, see: http://tickletux.wordpress.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding

ざっくり言うと3の倍数で"Fizz",5の倍数で"Buzz",15の倍数で"FizzBuzz"と出力せよ
ってことらしいです
ちなみにフィズバズと読みます。結構有名な問題で、面接で書かされることもあるそうです


まずは文字数を気にせずやってみよう ということで



for(x<-1 to 100)if(x%15==0)println("FizzBuzz")else if(x%3==0)println("Fizz")else if(x%5==0)println("Buzz")else println(x)


http://puu.sh/5ubXB.png

ひゃ、121byte...(最小byteは66)
これでは面接じゃキツイ。
というよりこの半分程度の文字数で同じ結果が出せるって恐ろしい


とりあえず、形は出来たのでこれを削っていきます
コツとしては、「冗長(重複している)な部分を削る」とのことなので
上の文だと"println"が4回出てきてしまっています。
という訳で、「If文の中にprintln」ではなく「printlnの中にIf文」にしていきます。





for(x<-1 to 100)println(if(x%15==0)"FizzBuzz"else if(x%3==0)"Fizz"else if(x%5==0)"Buzz"else x)

94byte。一気に100を切りました。
printlnを3つ減らせたのはとても大きいですね
更に工夫して文字数を減らしていきます。
今度は計算式に着目します






for(x<-1 to 100)println(if(x%15>0)if(x%5>0)if(x%3>0)x else"Fizz"else"Buzz"else"FizzBuzz")

xを15で割って余りが出た(15の倍数ではなかった)ら5で割り、余りが出たら・・・
という風にやるやり方。==が>になるところで短縮、さらにelseの後の空白を埋められるのでそこも短縮できています。
このレベルまでできればゴールらしいです(89byte) 僕は無理でした


という訳で、同じ結果を出すプログラムでも、記述方法を工夫すればグンとデータ容量も大きな違いが出てきます。
こういった頭の使い方も、少しずつ鍛えていきたいところです。


おまけ 73byteのコード





for(i<-1 to 100)println(if(i%3*i%5>0)i else"Fizz"*(1-i%3)+"Buzz"*(1-i%5))

文字を0で掛けると文字が消えるらしいです。なんということだ・・・
それによりFizzとBuzzの重複を消しています。if文も1つ。
こういう発想、出来るようになりたいですね。


あと、66byteの答えが見つかった方はぜひ教えてください