O livro de Randall Munroe "xkcd, volume 0" usa um sistema de números bastante ímpar para os números de página. Os primeiros números de página são
1, 2, 10, 11, 12, 20, 100, 101, 102, 110, 111, 112, 120, 200, 1000, 1001, ...
Este parece um pouco com ternária, mas noto que ele ignora a partir 20
direto para 100
, a partir 120
de 200
e para 200
a 1000
. Uma maneira de definir essa sequência é dizer que ela enumera todos os números ternários que contêm no máximo um 2
e não 1
depois disso 2
. Você pode encontrar isso no OEIS na entrada A169683 . Esse sistema numérico é conhecido como binário inclinado .
Sua tarefa é encontrar a representação de um número inteiro positivo N
nesse sistema numérico.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
A saída pode ser uma sequência, um número com uma representação decimal igual à representação binária inclinada ou uma lista de dígitos (como números inteiros ou caracteres / sequências). Você não deve retornar zeros à esquerda.
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Curiosidade: Na verdade, há algum mérito nesse sistema numérico. Ao incrementar um número, você sempre alterará no máximo dois dígitos adjacentes - nunca precisará realizar a alteração no número inteiro. Com a representação correta que permite incrementar em O (1).
Casos de teste
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
Darei uma recompensa à resposta mais curta que possa resolver o último caso de teste (e qualquer outra entrada de magnitude semelhante, por isso não pense em codificá-la) em menos de um segundo.
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# 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
e 109->110
, com o 0. extra.