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