octech このページをアンテナに追加 RSSフィード

2007-06-08 頭の体操8

[][]FizzBuzz.py, short code #1 16:37 FizzBuzz.py, short code #1 - octech を含むブックマーク

FizzBuzzpythonでやってみた。

pythonってほとんど使ったことないのですが、Blenderのちょっとしたプラグインを書いたときにテストで環境は作っていたので、"python hoge.py"で実行は出来るようになっていました。

まずループはどうしようか?というところからググってみたりしたら、pythonにもrangeという組み込み関数があって、これをforループで回せばとりあえずのコードは書けそうだとわかった。

驚いたのが、pythonには三項演算子がないということ!

2.5で実装されているらしいけど、これを見てみても、なんか納得いかない。確かに三項演算子だけどねー。

そんなことを思いつつ書いたのが下記のコード。

f:id:octech:20070608163713j:image

anarchy golf - FizzBuzz

LF改行で91Byte。


for i in range(1,101):
 s=""
 if i%3<1:s+='Fizz'
 if i%5<1:s+='Buzz'
 if s=="":s=i
 print s

三項演算子を使えないとなると、、if-elseを駆使しないといけないのかな?

しばらくショートコーディングやってると、"else"って4Byteか、長いなー、とか思ってしまう・・・。

2007-06-06 頭の体操7

[][]Smileys Triangle, short code #1 04:10 Smileys Triangle, short code #1 - octech を含むブックマーク

なんだか寝付けないので、ショートコード。

しかも新しい問題に手をつけてみる。

anarchy golf - Smileys Triangle

あれこれ考えて42Byte。

f:id:octech:20070606040726j:image

うーん、トップの39Byteまで、あと3バイト。

どうやればいいんだろ・・。

:-)))))))))))))


42Byteのコードを以下に載せておきます。


LF改行で、保存します。

puts":
:-"
0.upto(31){|i|puts':-)'+'))'*i}

putsを2回やってるのが無駄っぽいよなー。

もしくは、文字列の加算部分だよなー。

意外なところで、|i|というイテレータ定義?(==ループ表現?)

2007-05-31 頭の体操6

[][]Dancing Kids, short code #3 14:39 Dancing Kids, short code #3 - octech を含むブックマーク

ちょっと気分転換にcode golf

105Byteまで短くすることが出来ました。

anarchy golf - Dancing Kids

f:id:octech:20070531143606j:image

これでもまだまだトップのコードの1.5倍!!!

ここまで短くならないとちょっとショックですねー。

↓以下にコードを載せておきます。


LF改行で。

a="\\";b="/";c=" ";d=""
(/&/=~i=gets)?i:(/r/=~i)?(b=d;d=a):(a=c;c=b)
$><<a+"('-')#{b}
 #{c}|_|#{d}
  | |"

ポイントを載せておきます。

  • LF改行 で \n を短縮.
  • 3項演算子の使用
  • テストの条件が絞れているので、/l/とのチェックを削除

2007-05-30 はてブ

[][]Dancing Kids, short code #1 15:35 Dancing Kids, short code #1 - octech を含むブックマーク

昨日の Dancing Kids のショートコードの最初のsubmitをしてみた。

これが意外に難しくて、全然短くならない!!

でもビリはヤダー、と思ってなんとかギリギリびりにはならないような長さまで縮めて、133Byte。。マジで70Byteまでいけるのか??

anarchy golf - Dancing Kids

f:id:octech:20070530153518j:image

↓に現在のコードを載せておきます。LFのみの改行でアップしました。

i=gets;a="\\";b="/";c=" ";d=""
((b="";d="\\") if i=~/r/;(a=" ";c="/") if i=~/l/)unless i=~/&/
puts a+"('-')#{b}\n #{c}|_|#{d}\n  | |"

[][]Dancing Kids, short code #2 16:12 Dancing Kids, short code #2 - octech を含むブックマーク

ちょっと思いついたことをあれこれやっていたら115Byteまで短くなりました。

主に、出力部分、変数の使いまわしなどを考えて短くしました。

anarchy golf - Dancing Kids

f:id:octech:20070530160843j:image

今日はこれが限界かな。

↓に現在のコードを載せておきます。これもLF改行で。

a="\\";b="/";c=" ";d=""
(/&/=~i=gets)||((b=d;d=a)if/r/=~i;(a=c;c=b)if/l/=~i)
$><<a+"('-')#{b}\n #{c}|_|#{d}\n  | |"

本当は112Byteかと思ってたコードがあって、以下のようにしていました。これ、見た目的にはOKだったのですが、改行前に空白があるとダメらしくFailedとケられました・・。

a="\\";b="/";d=c=" "

2007-05-29 頭の体操5

[][]google, short code 13:22 google, short code - octech を含むブックマーク

ちょっと頭の体操がてらコードゴルフ

今回試してみるのは、"google"という問題。

anarchy golf - google

stdinからの入力の数だけ'o'を含む"google"という文字列を出力するのです。

ほとんどそのままのはずのコードで28Byte。

で、現在の最短コードが26Byte。いきなりギリギリのところまできました。

まぁー、そんなに多様性もないからねー。

f:id:octech:20070529132150j:image

ふと思ったのだけど、新しく言語を勉強するときにコードゴルフはいいんじゃないかと思った。というか、サンプル集をまとめておいて、それを全て書き換えるところからはじめる、という勉強法。

たとえば、

  • ファイルを読み込み、それを全て標準出力に出力する
  • ファイルを読み込み、それを全て新規ファイルに出力する
  • ファイルを読み込み、行を正規表現でチェックして書き換える
  • 標準入力を読み、全て標準出力に出力する
  • 標準入力を読み、全てファイルに出力する
  • 特定の計算を行う

等。

そうすれば、そのあとはそれをベースにコピペして書きやすくなるし、一通りの言語の特長とか見えてくると思うし。

ちょっと時間をとって考えてみようかな。


以下は28Byteのgoogle Rubyコード。

puts 'g'+'o'*gets.to_i+'gle'

[][]Dancing Kids, short code #0 02:18 Dancing Kids, short code #0 - octech を含むブックマーク

なんか面白そうなcode golfないかな、と思い、「anarchy golf」を眺めていて見つけたのが、この ”Dancing Kids”

完了したときのビジュアルとかが楽しげでいい感じだし、最短コードを出しているのが一人、というのがなんか可能性を感じてしまう。

問題タイトル"Dancing Kids" とか説明文 "Let's dancing"の英語を見ると、これを考えたのは日本人??変な英語だよね?

とか考えつつ、とりあえず改行ありで短くしようという意識を持たずに書いた普通のコードが以下のような感じ。

i=gets.chomp
if i=='left'
  puts " ('-')/\n /|_|\n  | |"
elsif i=='right'
  puts "\\('-')\n  |_|\\\n  | |"
elsif i=='right&left'
  puts "\\('-')/\n  |_|\n  | |"
end

入力の判定部分と出力の最適化がポイントかな。

今日はもう眠いので、短くするのは明日以降。

shinichiro_hshinichiro_h 2007/06/05 14:48 おさっしの通り、 Dancing Kids は日本人作です。プログラマですらなかったりします。 Smiley とかも同じ人です。それなのに大勢のプログラマが楽しめる問題というのは面白いなぁと。

octechoctech 2007/06/06 03:04 非プログラマさんの問題とは思えない面白さですね!Smileys Triangleは試してないですが、)が二つずつ増えていくところが、プログラマ思考じゃないというか、悩みどころ?:-)))