{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/aoj-1137-numeral-system/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"af339879-51e8-5c58-b477-5626d3951196","excerpt":"AOJの1137、Numeral SystemをJavaScriptで解きました。 入力の処理に時間を取られ、35分強かかってしまいました。 問題文はこちら 文字列操作の問題ですね。 replace＋eval…","html":"<p>AOJの1137、Numeral SystemをJavaScriptで解きました。<br>\n入力の処理に時間を取られ、35分強かかってしまいました。</p>\n<p>問題文は<a href=\"http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1137&#x26;lang=jp\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">こちら</a></p>\n<!--more-->\n<p>文字列操作の問題ですね。</p>\n<p>replace＋evalというゴリ押しを真っ先に思いついたのですが、<br>\n前置詞の扱いが面倒 + ゴルフではないので真っ当に解くことに。</p>\n<p>どれだけ重複が来るか不明でしたが、<br>\nメモ化の練習がてらキャッシュを使ってみました。</p>\n<h2 id=\"コード\" style=\"position:relative;\"><a href=\"#%E3%82%B3%E3%83%BC%E3%83%89\" 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<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">input</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">var</span> <span class=\"token function-variable function\">decodeMCXI</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">var</span> cache <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n            table <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token string\">\"m\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"c\"</span><span class=\"token operator\">:</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"x\"</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"i\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">str</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// 文字列はこの順番で来ると仮定</span>\n            <span class=\"token keyword\">var</span> keywords <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n                    <span class=\"token string\">\"m\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"c\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"x\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"i\"</span>\n                <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                sum <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n            keywords<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">k</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">var</span> index <span class=\"token operator\">=</span> str<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    s<span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span> index <span class=\"token operator\">>=</span> <span class=\"token number\">0</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    <span class=\"token comment\">// 先頭から一致したキーワードまで取り出す</span>\n                    s <span class=\"token operator\">=</span> str<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> index <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    <span class=\"token comment\">// キャッシュがあれば利用</span>\n                    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span> <span class=\"token operator\">!</span>cache<span class=\"token punctuation\">[</span>s<span class=\"token punctuation\">]</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                        <span class=\"token comment\">// 前置詞付きなら</span>\n                        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span> s<span class=\"token punctuation\">.</span>length <span class=\"token operator\">==</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token keyword\">var</span> placeholder <span class=\"token operator\">=</span> <span class=\"token function\">parseInt</span><span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                                n <span class=\"token operator\">=</span> table<span class=\"token punctuation\">[</span>s<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token keyword\">var</span> placeholder <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n                                n <span class=\"token operator\">=</span> table<span class=\"token punctuation\">[</span>s<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                        <span class=\"token punctuation\">}</span>\n                        cache<span class=\"token punctuation\">[</span>s<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> placeholder <span class=\"token operator\">*</span> n<span class=\"token punctuation\">;</span>\n                    <span class=\"token punctuation\">}</span>\n                    sum <span class=\"token operator\">+=</span> cache<span class=\"token punctuation\">[</span>s<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                    str <span class=\"token operator\">=</span> str<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">,</span> <span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>   <span class=\"token comment\">// 取得した文を削除</span>\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">return</span> sum<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> <span class=\"token function-variable function\">encodeMCXI</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">var</span> cache <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">num</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">var</span> tmp <span class=\"token operator\">=</span> num<span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span> <span class=\"token operator\">!</span>cache<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">var</span> placeholder<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">,</span> result <span class=\"token operator\">=</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span> tmp <span class=\"token operator\">>=</span> <span class=\"token number\">1000</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    placeholder <span class=\"token operator\">=</span> <span class=\"token operator\">~</span><span class=\"token operator\">~</span><span class=\"token punctuation\">(</span>tmp <span class=\"token operator\">/</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    result <span class=\"token operator\">+=</span> <span class=\"token punctuation\">(</span> placeholder <span class=\"token operator\">></span> <span class=\"token number\">1</span> <span class=\"token operator\">?</span> placeholder <span class=\"token operator\">:</span> <span class=\"token string\">''</span> <span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">'m'</span><span class=\"token punctuation\">;</span>\n                    tmp <span class=\"token operator\">%=</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span> tmp <span class=\"token operator\">>=</span> <span class=\"token number\">100</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    placeholder <span class=\"token operator\">=</span> <span class=\"token operator\">~</span><span class=\"token operator\">~</span><span class=\"token punctuation\">(</span>tmp <span class=\"token operator\">/</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    result <span class=\"token operator\">+=</span> <span class=\"token punctuation\">(</span> placeholder <span class=\"token operator\">></span> <span class=\"token number\">1</span> <span class=\"token operator\">?</span> placeholder <span class=\"token operator\">:</span> <span class=\"token string\">''</span> <span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">'c'</span><span class=\"token punctuation\">;</span>\n                    tmp <span class=\"token operator\">%=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span> tmp <span class=\"token operator\">>=</span> <span class=\"token number\">10</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    placeholder <span class=\"token operator\">=</span> <span class=\"token operator\">~</span><span class=\"token operator\">~</span><span class=\"token punctuation\">(</span>tmp <span class=\"token operator\">/</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    result <span class=\"token operator\">+=</span> <span class=\"token punctuation\">(</span> placeholder <span class=\"token operator\">></span> <span class=\"token number\">1</span> <span class=\"token operator\">?</span> placeholder <span class=\"token operator\">:</span> <span class=\"token string\">''</span> <span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">'x'</span><span class=\"token punctuation\">;</span>\n                    tmp <span class=\"token operator\">%=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span> tmp <span class=\"token operator\">></span> <span class=\"token number\">0</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    result <span class=\"token operator\">+=</span> <span class=\"token punctuation\">(</span> tmp <span class=\"token operator\">></span> <span class=\"token number\">1</span> <span class=\"token operator\">?</span> tmp <span class=\"token operator\">:</span> <span class=\"token string\">''</span> <span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">'i'</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n                cache<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> result<span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n            <span class=\"token keyword\">return</span> cache<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token keyword\">var</span> inputs <span class=\"token operator\">=</span> input<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">r</span><span class=\"token regex-delimiter\">/</span><span class=\"token regex-flags\">g</span></span><span class=\"token punctuation\">,</span> <span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        n<span class=\"token punctuation\">;</span>  \n    n <span class=\"token operator\">=</span> <span class=\"token function\">parseInt</span><span class=\"token punctuation\">(</span>inputs<span class=\"token punctuation\">.</span><span class=\"token function\">shift</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span> <span class=\"token keyword\">var</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> n<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">var</span> line <span class=\"token operator\">=</span> inputs<span class=\"token punctuation\">.</span><span class=\"token function\">shift</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">' '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            a <span class=\"token operator\">=</span> <span class=\"token function\">decodeMCXI</span><span class=\"token punctuation\">(</span>line<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            b <span class=\"token operator\">=</span> <span class=\"token function\">decodeMCXI</span><span class=\"token punctuation\">(</span>line<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">encodeMCXI</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">+</span>b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>  \n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fs\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">readFileSync</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/dev/stdin\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"utf8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>","timeToRead":2,"frontmatter":{"title":"[AOJ] 1137 Numeral System","tags":["AOJ","JavaScript"],"date":"May 13, 2013","featuredImage":null}}},"pageContext":{"slug":"/aoj-1137-numeral-system/","previous":{"fields":{"slug":"/learn-inherit-pattern-from-coffeescript-and-typescript/"},"frontmatter":{"title":"CoffeescriptとTypescriptから学ぶjsでのクラス・継承パターン","tags":["JavaScript"]}},"next":{"fields":{"slug":"/aoj-1135-ohgas-fortune/"},"frontmatter":{"title":"[AOJ] 1135 Ohgas' Fortune","tags":["AOJ","JavaScript"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}