Randall Munroe的书“ xkcd,第0卷”对页码使用了一个相当奇数的系统。前几个页码是
1, 2, 10, 11, 12, 20, 100, 101, 102, 110, 111, 112, 120, 200, 1000, 1001, ...
这看起来有点像三元,但是请注意,他从跳过20
直100
,从120
到200
从200
到1000
。定义此序列的一种方法是说,它枚举了最多包含一个2
且1
之后不包含的所有三进制数2
。您可以在OEIS的条目A169683中找到它。这个数字系统被称为偏斜二进制。
您的任务是找到N
此数字系统中给定正整数的表示形式。
您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行参数或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。
输出可能是字符串,带有十进制表示形式的数字(等于偏斜二进制表示形式)或数字列表(整数或字符/字符串)。您不得返回前导零。
这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。
有趣的事实:这个数字系统实际上有一些优点。当增加一个数字时,您将始终最多更改两个相邻的数字-您将不必在整个数字中进行更改。使用正确的表示形式,可以递增O(1)。
测试用例
1 => 1
2 => 2
3 => 10
6 => 20
7 => 100
50 => 11011
100 => 110020
200 => 1100110
1000 => 111110120
10000 => 1001110001012
100000 => 1100001101010020
1000000 => 1111010000100100100
1048576 => 10000000000000000001
1000000000000000000 => 11011110000010110110101100111010011101100100000000000001102
我会悬赏于最短的答案,它可以在不到一秒钟的时间内解决最后一个测试用例(以及任何其他类似大小的输入,因此不要考虑对其进行硬编码)。
排行榜
这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。
为确保您的答案显示出来,请使用以下Markdown模板以标题开头。
# Language Name, N bytes
N
您提交的文件大小在哪里。如果您提高了分数,则可以将旧分数保留在标题中,方法是将它们打掉。例如:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 51517</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
59->60
,并109->110
与额外的0