Upload
kaoru-maeda
View
1.016
Download
7
Embed Size (px)
DESCRIPTION
CodeIQのコードゴルフに参加しました。 https://codeiq.jp/ace/ozy4dm/q335 どうやってコードを縮めていったかを紹介します 出題者Ozyさんの解説とランキング発表はこちら http://codeiq.hatenablog.com/entry/2013/06/10/165837
Citation preview
Rubyコードゴルフ
ぐるぐる渦巻きに参加してみた
前田 薫 @mad_p
shibuya.rb 2013/7/17
• 前田 薫
• @mad_p
• Tokyo.pm
• リコー• http://www.slideshare.net/KaoruMaeda/
• 「Perlの国へようこそ」(1993, 1996)
• 日本で最初のLTスピーカー (2001)
自己紹介
CodeIQ
• https://codeiq.jp/ace/ozy4dm/q335
ぐるぐるを出力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
アルゴリズム• まん中からスタート• 右に曲がれるところで曲がる• 曲がれなかったら直進する
21 22 23 24 2520 7 8 9 1019 6 1 2 1118 5 4 3 1217 16 15 14 13
最初の案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的な
右折=虚数単位をかける曲がれるなら
第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]}*' '}
テキスト
桁合わせを工夫
前進部分をまとめた
第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次元データを持つ
右折
第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気づいた
最終案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 と文字数は変わらなかった
コードゴルフテク• ループ each ! map (結果は捨てる)
• エイリアス活用 .join ! Array * Str
• 特殊変数活用• ARGV!$*、STDOUT!$>、"\n"!$/• 1文字の文字列 ?a
• x==0 ! x<1• 多重代入 x,y,*a=2,3
まとめ• コードゴルフとは• 言語仕様のすみずみまで調べられる• もう縮まない! と思ってからが勝負• 小手先のテクニックよりアルゴリズム• よりよいアルゴリズムは
ozy4dmさんの記事参照• http://codeiq.hatenablog.com/entry/
2013/06/10/165837
! !