{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/7-ways-learning-from-ruby-code-golf/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"b7e97433-006d-5c9f-94f0-79b0a27e997c","excerpt":"久々に、CodeIQのコードゴルフをやりました。 数カ月ぶりに素のRubyを触ったので色々と忘れていました。 しかもRubyでコードゴルフは初めてだったので、 Google先生に聞きながら書いているうちに知った、7つのことをメモします。 注意 小ネタが多めです。 Ruby初心者なので、Rubyist…","html":"<p>久々に、<a href=\"https://codeiq.jp/ace/ozy4dm/q335\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CodeIQのコードゴルフ</a>をやりました。</p>\n<p>数カ月ぶりに素のRubyを触ったので色々と忘れていました。<br>\nしかもRubyでコードゴルフは初めてだったので、<br>\nGoogle先生に聞きながら書いているうちに知った、7つのことをメモします。</p>\n<!--more-->\n<h2 id=\"注意\" style=\"position:relative;\"><a href=\"#%E6%B3%A8%E6%84%8F\" aria-label=\"注意 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>注意</h2>\n<p>小ネタが多めです。<br>\nRuby初心者なので、Rubyistにとっては当たり前のことを知りません。 Rubyistの方なら知ってる内容が多かも知れませんが、ご容赦下さい。</p>\n<p>なお、手元のRubyのバージョンは、1.9.2です。</p>\n<h2 id=\"多重代入\" style=\"position:relative;\"><a href=\"#%E5%A4%9A%E9%87%8D%E4%BB%A3%E5%85%A5\" aria-label=\"多重代入 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>多重代入</h2>\n<p>1行ずつ代入するのと文字列長は変わらないけどやってみた。<br>\n今回は使わなかったけどtmpを使わないswapにも使えるそう。</p>\n<p>a,b..と順番に宣言していけば、aの値が必要なbの初期化も出来るかと思いましたが、<br>\nそれはエラーになりました。少し不便。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\">a<span class=\"token punctuation\">,</span> b <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span> <span class=\"token comment\">#=> a = 1, b = 2</span>\na<span class=\"token punctuation\">,</span> b <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> a <span class=\"token operator\">+</span> <span class=\"token number\">2</span> <span class=\"token comment\">#=> エラー</span></code></pre></div>\n<h2 id=\"配列の宣言\" style=\"position:relative;\"><a href=\"#%E9%85%8D%E5%88%97%E3%81%AE%E5%AE%A3%E8%A8%80\" aria-label=\"配列の宣言 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>配列の宣言</h2>\n<p><code>[]</code>を抜かしても、左辺の変数が1つなら、配列として入るようです。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\">a <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span> <span class=\"token comment\">#=> [0, 1, 2, 3]</span></code></pre></div>\n<p>これを応用して、右辺側に代入を混ぜてみました。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\"><span class=\"token constant\">M</span> <span class=\"token operator\">=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> v <span class=\"token operator\">=</span> y <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span> <span class=\"token comment\">#=> M = [-1, 0, 1, 0], v = 0, y = 0</span></code></pre></div>\n<h2 id=\"２次元配列の初期化\" style=\"position:relative;\"><a href=\"#%EF%BC%92%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96\" aria-label=\"２次元配列の初期化 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>２次元配列の初期化</h2>\n<p>縦のサイズが決まっている場合に有効そうです。<br>\nこれはコードゴルフじゃなくても使えそうなイディオムです。</p>\n<p>横のサイズも決まっていて、<br>\n内側の配列も初期化したいなら、内側のArray.newのあとにmapを続けて書けば行けます。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\">a <span class=\"token operator\">=</span> <span class=\"token builtin\">Array</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>map<span class=\"token punctuation\">{</span><span class=\"token builtin\">Array</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">new</span><span class=\"token punctuation\">}</span> <span class=\"token comment\">#=> [[],[]]</span></code></pre></div>\n<h2 id=\"文字列のフォーマット指定幅\" style=\"position:relative;\"><a href=\"#%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E6%8C%87%E5%AE%9A%E5%B9%85\" aria-label=\"文字列のフォーマット指定幅 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>文字列のフォーマット指定(幅)</h2>\n<p>文字列の<code>%</code>メソッドを使います。<br>\nC言語のsprintf()とかとほぼ同様のフォーマットが使えます。<br>\n扱えるフォーマットについては、<span class=\"removed_link\" title=\"http://doc.ruby-lang.org/ja/1.9.2/class/String.html\">こちら</span>を参照。</p>\n<p>その書式で出力するわけではなく、<strong>その書式の文字列が返る</strong>ことに注意です。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\">a <span class=\"token operator\">=</span> <span class=\"token string\">\"%3d\"</span> <span class=\"token operator\">%</span> <span class=\"token number\">1</span> <span class=\"token comment\">#=> \" 1\"(手前に足りない幅分のスペースが入る)</span></code></pre></div>\n<h2 id=\"数値の桁数を取得する\" style=\"position:relative;\"><a href=\"#%E6%95%B0%E5%80%A4%E3%81%AE%E6%A1%81%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B\" aria-label=\"数値の桁数を取得する permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>数値の桁数を取得する</h2>\n<p>文字列化して、長さを取得。</p>\n<p>桁数取得に悩んでたら思いつきました。<br>\n分かってみれば「知ってるよ」となりますが、盲点だった。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\">a <span class=\"token operator\">=</span> <span class=\"token number\">1000.</span>to_s<span class=\"token punctuation\">.</span>size <span class=\"token comment\">#=> 4</span></code></pre></div>\n<h2 id=\"rangeは降順にできない\" style=\"position:relative;\"><a href=\"#range%E3%81%AF%E9%99%8D%E9%A0%86%E3%81%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84\" aria-label=\"rangeは降順にできない permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Rangeは降順にできない</h2>\n<p>Rangeは、<code>N…M</code>の書き方でN>Mにすれば<br>\n逆順になるのかと思ってましたが、ならないようです。</p>\n<p>降順の連番をループで使いたいときは、<br>\nIntegerクラスにdownto()というメソッドがあるそうです。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\"><span class=\"token number\">10.</span>downto<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token operator\">|</span>i<span class=\"token operator\">|</span> <span class=\"token comment\">#=> 10, 9, 8, ,7, 6, 5, 4, 3, 2, 1と順にアクセスできる }</span></code></pre></div>\n<h2 id=\"配列のjoin\" style=\"position:relative;\"><a href=\"#%E9%85%8D%E5%88%97%E3%81%AEjoin\" aria-label=\"配列のjoin permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>配列のjoin()</h2>\n<p>なんだこの奇妙な挙動は…<br>\n配列の<code>*</code>メソッドに文字列を渡すと、joinと同じ結果になるようです。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\">a <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span> a<span class=\"token punctuation\">.</span>join<span class=\"token punctuation\">(</span><span class=\"token string\">\"|\"</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">#=> \"1|2|3|4\" a*\"|\" #=> \"1|2|3|4\"</span></code></pre></div>","timeToRead":4,"frontmatter":{"title":"Rubyでコードゴルフする過程で知った7つの書き方","tags":["Ruby"],"date":"June 10, 2013","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='143'%20viewBox='0%200%20400%20143'%20preserveAspectRatio='none'%3e%3cpath%20d='M104%2022v4h1c-1%201%201%203%204%206l4%204-4%202h-4c-2-1-7%2018-6%2023v5h-5c-4%200-5%200-15%209-7%205-11%2010-12%2012-1%204-1%204-8%205-16%202-15%203-17-3-4-8-5-7-6%206-2%2022%203%2028%2023%2028l73-5%202-16%203-33V32c-2-4-7-9-12-10h-21m-23%204c-15%207-33%2025-40%2040-3%208-3%2010%202%2016%203%205%204%205%208%205%2014%200%2040-22%2049-41%208-18-1-27-19-20m91%2033l-3%205c0%202%200%202%201%201%200-2%201-2%201-1%200%200%202%203%206%204%204%203%205%205%205%206%200%202%200%202-1%201l-1-2v2l-2%204c-2%200-1-7%200-7l-4-3v5c0%205-1%207-2%203-1-2-4-3-4%200h2c-1%202%202%205%203%203l1%202h3l3-2c5-3%205-8%200-11l-3-4c0-2%200-2-1%200-1%201-1%201-1-1%200-3%200-3-1-1%200%202-2%202-2-1%200-2%203-3%204-1h1c0-2%200-2%201-1h4l-1-1-3-2h-3l-3%202m61%209c0%2012%201%2014%202%2012h4c2%201%203%201%206-1%205-4%203-12-3-12-3%200-3%200-1%201l3%201c1%200%200%209-2%2010-3%203-7-6-4-10v-1l-1-5-1-5-1%2010v11l-1-10-1-11v10m66%201c-2%202-3%203-3%205v4l1-3%201-3v5c-1%201%200%201%202%202%207%204%2014-1%2011-8-3-4-8-5-12-2'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":2.783333333333333,"src":"/static/9a3388915e45b7ca4bb8c38d30cdce64/f32f2/featured-image.jpg","srcSet":"/static/9a3388915e45b7ca4bb8c38d30cdce64/466a3/featured-image.jpg 334w,\n/static/9a3388915e45b7ca4bb8c38d30cdce64/f32f2/featured-image.jpg 569w","srcWebp":"/static/9a3388915e45b7ca4bb8c38d30cdce64/3d427/featured-image.webp","srcSetWebp":"/static/9a3388915e45b7ca4bb8c38d30cdce64/cd98f/featured-image.webp 334w,\n/static/9a3388915e45b7ca4bb8c38d30cdce64/3d427/featured-image.webp 569w","sizes":"(max-width: 569px) 100vw, 569px"}}}}}},"pageContext":{"slug":"/7-ways-learning-from-ruby-code-golf/","previous":{"fields":{"slug":"/aoj-0023-circles-intersection/"},"frontmatter":{"title":"[AOJ] 0023 Circles Intersection","tags":["AOJ","C++"]}},"next":{"fields":{"slug":"/aoj-1130-red-and-black/"},"frontmatter":{"title":"[AOJ] 1130 Red and Black","tags":["AOJ","C++"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}