Rubyコードゴルフ「ぐるぐる渦巻き」に参加してみた
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

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

  • 1,358 views
Uploaded on

CodeIQのコードゴルフに参加しました。 ...

CodeIQのコードゴルフに参加しました。
https://codeiq.jp/ace/ozy4dm/q335

どうやってコードを縮めていったかを紹介します

出題者Ozyさんの解説とランキング発表はこちら
http://codeiq.hatenablog.com/entry/2013/06/10/165837

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,358
On Slideshare
1,345
From Embeds
13
Number of Embeds
1

Actions

Shares
Downloads
1
Comments
0
Likes
0

Embeds 13

https://twitter.com 13

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Rubyコードゴルフ ぐるぐる渦巻き に参加してみた 前田 薫 @mad_p shibuya.rb 2013/7/17
  • 2. • 前田 薫 • @mad_p • Tokyo.pm • リコー • http://www.slideshare.net/KaoruMaeda/ • 「Perlの国へようこそ」(1993, 1996) • 日本で最初のLTスピーカー (2001) 自己紹介
  • 3. CodeIQ • https://codeiq.jp/ace/ozy4dm/q335
  • 4. ぐるぐるを出力 111 112 113 114 115 116 117 118 119 120 121 110 73 74 75 76 77 78 79 80 81 82 109 72 43 44 45 46 47 48 49 50 83 108 71 42 21 22 23 24 25 26 51 84 107 70 41 20 7 8 9 10 27 52 85 106 69 40 19 6 1 2 11 28 53 86 105 68 39 18 5 4 3 12 29 54 87 104 67 38 17 16 15 14 13 30 55 88 103 66 37 36 35 34 33 32 31 56 89 102 65 64 63 62 61 60 59 58 57 90 101 100 99 98 97 96 95 94 93 92 91
  • 5. アルゴリズム • まん中からスタート • 右に曲がれるところで曲がる • 曲がれなかったら直進する 21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13
  • 6. 最初の案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的な 右折=虚数単位をかける曲がれるなら
  • 7. 第2案156B(-39) n=eval$<.gets a={} f=-­‐1 r=1.i p=c=-­‐r k=0 (n*n).times{a[p+r]||(f=r;r*=c);a[p+=f]=k+=1} b=n/2 i=-­‐b..b i.map{|y|puts  i.map{|x|"%#{k.to_s.size}d"%a[x-­‐y.i]}*'  '} テキスト 桁合わせを工夫 前進部分をまとめた
  • 8. 第4案 138B(-18) n=r=eval$<.gets a=[] m=n*n p=m/2-­‐n f=-­‐1 1.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次元データを持つ 右折
  • 9. 第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気づいた
  • 10. 最終案121B(-4) n=gets.to_i;m=n*n;p=m/2+n;f=-­‐1;r=-­‐n 1.upto(m){|k|$*[p+r]||(f,r=r,-­‐f);$*[p+=f]=k} $><<(["%#{/$/=~"#{m}"}d"]*n*'  '+$/)*n%$* 全行まとめてフォーマット (1次元配列だったので可能) putsより$><< (空白ひとつ分得) 正規表現で末尾位置を調べてみたが m.to_i.size と文字数は変わらなかった
  • 11. コードゴルフテク • ループ each ! map (結果は捨てる) • エイリアス活用 .join ! Array * Str • 特殊変数活用 • ARGV!$*、STDOUT!$>、"n"!$/ • 1文字の文字列 ?a • x==0 ! x<1 • 多重代入 x,y,*a=2,3
  • 12. まとめ • コードゴルフとは • 言語仕様のすみずみまで調べられる • もう縮まない! と思ってからが勝負 • 小手先のテクニックよりアルゴリズム • よりよいアルゴリズムは ozy4dmさんの記事参照 • http://codeiq.hatenablog.com/entry/ 2013/06/10/165837 ! !