12
Rubyコードゴルフ ぐるぐる渦巻き に参加してみた 前田 @mad_p shibuya.rb 2013/7/17

Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

Embed Size (px)

DESCRIPTION

CodeIQのコードゴルフに参加しました。 https://codeiq.jp/ace/ozy4dm/q335 どうやってコードを縮めていったかを紹介します 出題者Ozyさんの解説とランキング発表はこちら http://codeiq.hatenablog.com/entry/2013/06/10/165837

Citation preview

Page 1: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

Rubyコードゴルフ

ぐるぐる渦巻きに参加してみた

前田 薫 @mad_p

shibuya.rb 2013/7/17

Page 2: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

• 前田 薫

• @mad_p

• Tokyo.pm

• リコー• http://www.slideshare.net/KaoruMaeda/

• 「Perlの国へようこそ」(1993, 1996)

• 日本で最初のLTスピーカー (2001)

自己紹介

Page 3: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

CodeIQ

• https://codeiq.jp/ace/ozy4dm/q335

Page 4: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

ぐるぐるを出力111 112 113 114 115 116 117 118 119 120 121110 73 74 75 76 77 78 79 80 81 82109 72 43 44 45 46 47 48 49 50 83108 71 42 21 22 23 24 25 26 51 84107 70 41 20 7 8 9 10 27 52 85106 69 40 19 6 1 2 11 28 53 86105 68 39 18 5 4 3 12 29 54 87104 67 38 17 16 15 14 13 30 55 88103 66 37 36 35 34 33 32 31 56 89102 65 64 63 62 61 60 59 58 57 90101 100 99 98 97 96 95 94 93 92 91

Page 5: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

アルゴリズム• まん中からスタート• 右に曲がれるところで曲がる• 曲がれなかったら直進する

21 22 23 24 2520 7 8 9 1019 6 1 2 1118 5 4 3 1217 16 15 14 13

Page 6: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

最初の案195B

 n=$<.gets.to_i  b=(n-­‐1)/2  a={}  p=c=(f=-­‐1).i  r=1.i  k=0  (n*n).times{a[a[p+r]?(p+=f):(f=r;r*=c;p+=f)]=k+=1}  d=k.to_s.size  (-­‐b..b).each{|y|(-­‐b..b).each  {|x|print"      #{a[x-­‐y.i]}"[-­‐d,d],x==b  ?"\n":"  "}}

2次元なら複素数だろw的な

右折=虚数単位をかける曲がれるなら

Page 7: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

第2案156B(-39)

n=eval$<.getsa={}f=-­‐1r=1.ip=c=-­‐rk=0(n*n).times{a[p+r]||(f=r;r*=c);a[p+=f]=k+=1}b=n/2i=-­‐b..bi.map{|y|puts  i.map{|x|"%#{k.to_s.size}d"%a[x-­‐y.i]}*'  '}

テキスト

桁合わせを工夫

前進部分をまとめた

Page 8: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

第4案 138B(-18)

n=r=eval$<.getsa=[]m=n*np=m/2-­‐nf=-­‐11.upto(m){|k|a[p+r]||(f,r=r,-­‐f);a[p+=f]=k}n.times{puts  a.pop(n).map{|v|"%#{m.to_s.size}d"%v}*'  '}

1次元配列で2次元データを持つ

右折

Page 9: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

第7案125B(-13)

 n=r=gets.to_i  m="#{n*n}"  p=n*n/2-­‐n  f=-­‐1  ?1.upto(m){|k|$*[p+r]||(f,r=r,-­‐f);  $*[p+=f]=k.rjust  m.size}  n.times{puts$*.pop(n)*'  '}

文字列で生成rjustで桁合わせ

Kernel.getsの存在にやっとw気づいた

Page 10: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

最終案121B(-4)

n=gets.to_i;m=n*n;p=m/2+n;f=-­‐1;r=-­‐n1.upto(m){|k|$*[p+r]||(f,r=r,-­‐f);$*[p+=f]=k}$><<(["%#{/$/=~"#{m}"}d"]*n*'  '+$/)*n%$*

全行まとめてフォーマット(1次元配列だったので可能)

putsより$><< (空白ひとつ分得)

正規表現で末尾位置を調べてみたがm.to_i.size と文字数は変わらなかった

Page 11: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

コードゴルフテク• ループ each ! map (結果は捨てる)

• エイリアス活用 .join ! Array * Str

• 特殊変数活用• ARGV!$*、STDOUT!$>、"\n"!$/• 1文字の文字列 ?a

• x==0 ! x<1• 多重代入 x,y,*a=2,3

Page 12: Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた

まとめ• コードゴルフとは• 言語仕様のすみずみまで調べられる• もう縮まない! と思ってからが勝負• 小手先のテクニックよりアルゴリズム• よりよいアルゴリズムは

ozy4dmさんの記事参照• http://codeiq.hatenablog.com/entry/

2013/06/10/165837

! !