Книга Рэндалла Манро «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
Я дам вознаграждение за самый короткий ответ, который может решить последний контрольный пример (и любой другой ввод аналогичной величины, поэтому не думайте о его жестком кодировании) менее чем за секунду.
Leaderboards
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# 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.