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>
fonte
59->60
e109->110
, com o 0. extra.Respostas:
Pitão, 17 bytes
Isso é ridiculamente lento -
O(output^log_2(3))
. É exponencial no comprimento da entrada, mas não duplamente exponencial, como algumas das respostas na página. Algumas idéias retiradas da resposta de @ Dennis, aqui .Demonstração.
Ele utiliza a
.f
função "loop" de Pyth até que n correspondências sejam encontradas ".fonte
CJam,
2423222119 bytesEssa é uma abordagem O (log n) , em que n é a entrada, que conclui o último caso de teste instantaneamente. Ele converte n diretamente em binário inclinado, usando a divisão modular pelos valores do dígito 1 .
Esse código termina com um erro que vai para STDERR com o interpretador Java, o que é permitido de acordo com o consenso no Meta .
Se você tentar esse código no interpretador CJam , ignore tudo, menos a última linha de saída.
O erro pode ser eliminado, ao custo de 2 bytes, acrescentando-o
2>
aW%
.Obrigado a @ MartinBüttner por jogar um byte.
fundo
A representação binária inclinada a k ... a 0 corresponde ao número inteiro n = (2 k + 1 -1) a k + ... + (2 1 -1) a 0 .
Dado que ambos (2 k -1) + ... + (2 1 -1) = 2 k + 1 - (k + 2) e (2 k -1) + ... + 2 (2 j -1) = 2 k + 1 - (2 j + 1 - 2 j + k + 1) é inferior a 2 k + 1 -1 , os valores de um K para um 0 pode ser recuperado por divisão modular sucessiva por duas k + 1 -1 , 2 k -1 etc.
Para começar, temos que encontrar o valor de 2 k + 1 -1 primeiro. Como n é no máximo 2 (2 k + 1 -1) , o número inteiro n + 1 deve ser estritamente menor que 2 k + 2 .
Assim, assumir a parte inteira do logaritmo binário de n + 1 produz k + 1 .
Finalmente, observamos que o número inteiro n + 1 possui ⌊log 2 (n + 1) ⌋ dígitos na base 2.
Como funciona
Nas duas últimas iterações, realizamos a divisão modular por 1 e 0 . O primeiro coloca um 0 indesejado na pilha. As últimas tentativas para executar
0 0 md
, que aparece tanto indesejados 0 s da pilha, sai imediatamente em vez de empurrar qualquer coisa e despeja a pilha para STDOUT.fonte
Python 2, 67 bytes
Parece funcionar para os casos de teste fornecidos. Se eu entendi direito, isso deve ser sobre
O(place values set in output)
, então o último caso é fácil.Ligue como
f(100)
. Retorna uma representação decimal igual ao binário de inclinação.Python 3, 65 bytes
Um pouco menos eficiente, mas ainda logarítmico, portanto, o último caso é quase instantâneo.
Ligue como
g(100)
. Retorna uma lista de dígitos.fonte
2and
compilar em 3? Estou em 2 e2and2
lança um erro de sintaxe2and2
não iria funcionar porque iria ter analisado como2 and2
- tente2and 2
, que deve funcionar se a sua versão Python é novo o suficiente (testado em Python 2.7.10)CJam,
222120 bytesEssa é uma abordagem O (e n n) , em que n é a entrada. Ele lista os primeiro ⌊e n ⌋ inteiros não negativos em 3 de base, elimina aqueles que têm 2 s ou 1 s após o primeiro 2 (se houver) e selecciona o n + 1 th .
Experimente online no intérprete CJam .
Como funciona
fonte
Pitão, 20 bytes
É executado em O (log (input ())), bem menos de um segundo para o caso de teste final. Baseado em uma execução até o loop de erro. Nenhuma nova linha à direita.
Demonstração.
Explicação:
J é inicializado com o valor da menor posição do dígito binário inclinado que é maior que a entrada. Então, sempre que fizermos o loop, fazemos o seguinte:
J
deQ
com=%QJ
. Por exemplo, seQ=10
eJ=7
,Q
torna-se3
, o que corresponde ao binário inclinado que muda de110
para10
. Isso não tem efeito na primeira iteração.J
para o próximo valor base binário de inclinação menor com=/J2
. Esta é a divisão com piso por 2, mudandoJ=7
paraJ=3
, por exemplo. Como isso acontece antes da saída do primeiro dígito,J
é inicializada uma posição de um dígito acima do necessário./QJ
(efetivamente).p
, em vez da impressão padrão de Pyth, para evitar a nova linha à direita.Esse loop será repetido até que
J
se torne zero; nesse ponto, será gerado um erro de divisão por zero e o loop será encerrado.fonte
ES6, 105 bytes
O uso é:
f(1048576)
=> `" 10000000000000000001 "Teste o último argumento por sua própria conta e risco. Desisti após 5 segundos.
E bonita impressão com comentários!
fonte
f=
.f=n=>{for(o=0;~n--;o+=c?Math.pow(3,s.length+c):1)s=o.toString(3),c=~s.search(2);return s}
Math.pow(3,s.length+c)
por3**(s.length+c)
.Retina, 55 bytes
Recebe entrada em unário.
Cada linha deve ir para seu próprio arquivo, mas você pode executar o código como um arquivo com o
-s
sinalizador. Por exemplo:Método: Executa incremento em um número de entrada de sequência vezes, a partir da sequência
0
.Usamos as seguintes regras de incremento:
2
:^2 -> ^12
;02 -> 12
;12 -> 20
2
:0$ -> 1$
;1$ -> 2$
(Pode haver no máximo uma
2
na string;^
e$
marca o início e o fim da string nas regras.)Mais informações sobre Retina.
fonte
Java,
154148Esta resposta assume a forma de uma única função anônima que recebe um argumento inteiro e retorna a resposta como uma String. Abaixo está uma classe completa para testar esta solução.
fonte
Bash + coreutils, 52
Este é um forçador bruto, por isso é bastante lento para números maiores.
Resultado:
fonte
Java,
337335253246244 bytesUm método que recebe o índice como a
long
e retorna o resultado como uma sequênciaUsa um
long
para o índice, portanto, teoricamente, podemos lidar com o último caso de teste, mas eu realmente não o sugeriria.fonte
if(j == 0)
instrução (quatro bytes). Você não precisa declarark
; você pode simplesmente usarj
novamente (mais quatro). Você pode usar a inferência de tipos genéricos (em Java 7) na sua declaração List (new ArrayList<>();
) (outro 4)Haskell,
7372Obrigado a @nimi por 1 byte!
Essa solução não ganhará nenhuma recompensa, os últimos dois testes demoram muito tempo para serem executados, mas acho que joguei bastante bem.
Esta solução é uma abordagem bastante ingênua que calcula o número binário inclinado
n
incrementando 0n
vezes.fonte
CJam, 24 bytes
Essa é uma abordagem O (n log n) , em que n é a entrada. Começa com a representação binária inclinada de 0 e incrementa o número inteiro correspondente n vezes.
Experimente online no intérprete CJam .
fundo
O incremento de um número no binário inclinado pode ser feito seguindo duas etapas fáceis:
Substitua um 2 eventual por um 0 .
Se um 2 foi substituído, aumente o dígito para a esquerda.
Caso contrário, aumente o último dígito.
Como funciona
fonte
VBA,
209147142 bytesMinha matemática é ineficiente e meu golfe pode funcionar. Mas é a minha primeira tentativa no PoG e pensei em experimentar este. Tipo de uma maneira Brute Force embora.
É apenas contar 1, a menos que o último dígito seja 2, depois recue 2 e pule para a frente 10. Mais os zeros à direita.
Isso deixa de funcionar em 65534 porque o VBA insiste em fornecer saída em notação científica, mas a lógica deve funcionar bem para números ainda mais altos
Ansioso por sugestões de golfe, o VBA não é muito favorável ao golfe, mas nem sempre é representado, e acho que ele pode superar o Java.
Edit1: Obrigado Manu por ajudar a remover 62 bytes
Edit2: Trocado
debug.print
pormsgbox
como saída. Salvo 5 bytesfonte
Debug.Print (q)
. Além disso, você pode remover a maior parte do espaço em branco (o editor os colocará de volta, mas eles não são necessários). Você não precisa declarark as Long
, basta escreverk
. Será uma variável do tipo Variant e o código ainda funcionará. Com essas dicas, você deve descer para ~ 165 bytes.InStr
, eles são opcionais.Trim()
não é necessário, pois você não possui espaço em branco. Aplicado corretamente, chego a 147 bytes .debug.print q
seria a saída padrão?msgbox q
é mais curto, mas novamente parece que não é exatamente a saída padrão.Sheet1.cells(1,1)
parece a saída típica, mas assume sua execução no excel. Não tenho muita certeza de quão rigoroso é o código-golfe sobre esse tipo de coisa.MsgBox
, se alguém reclamar, você ainda pode alterá-la novamente.Javascript ES6,
9986787672 caracteresTeste:
Obrigado pelo fato - é a base da minha solução :)
fonte
Oitava,
107101 bytesDeve ser O (log n) se eu estiver pensando nisso direito ...
Pretty-print:
Fiquei um pouco frustrado ao enfrentar o desafio final, já que o Octave, por padrão, trata tudo como números de ponto flutuante e não tinha a precisão necessária para calcular o último. Eu consegui contornar isso gastando bytes preciosos para forçar tudo a ser um número inteiro não assinado. O resultado do último foi grande demais para ser tratado como um número; portanto, o resultado é uma sequência.
Saída (estou incluindo
1e18 - 1
mostrar que posso fazer isso com precisão, e o último conjunto de saídas mostra quanto tempo leva para calcular esse valor):fonte
T-SQL,
221189177 bytesEDIT: As versões originais deste código produziriam saída incorreta para alguns números, isso foi corrigido.
Em todas as consultas aqui, basta adicionar o número a calcular antes da primeira vírgula.
Todos sabem que o T-SQL é a melhor linguagem de golfe. Aqui está uma versão que calculará até o último caso de teste. Na máquina em que a testei, ela foi executada em menos de um segundo, eu estaria interessado em ver como funciona para todos os outros.
E aqui está novamente, mas legível:
Se eu usar apenas ints, isso pode ser um pouco menor, saindo em 157 bytes:
E mais uma vez, mais legível:
fonte
@
- se de que é um identificador válido no sql e você provavelmente pode se safar doChar(8000)
que ainda é mais barato que o nvarchar (max). Você também pode converter para emchar
vez devarchar
ou usar astr
função@
, bobo eu. OCHAR(8000)
conselho é muito bom, vou tentar isso. Eu sempre pareço esquecer a existência deSTR()
agradecimento pelo aviso.select @t=concat(@t,@/i)
que deve ser menor. Requer sql2012 embora.CONCAT
, Estou em 2008. Portanto, não posso testá-lo sem usar um violino de SQL no momento. Boa ligação embora.Código da Máquina de Turing,
333293 bytesEstou usando uma codificação usada aqui .
Esta máquina usa 9 estados e 11 cores.
Se a entrada binária for permitida, isso poderá ser reduzido para meras 4 cores, economizando algumas dezenas de bytes no processo.
Se o link acima não estiver funcionando (às vezes funciona para mim, outras vezes a página se recusa a carregar), você também pode testar isso usando esta implementação java.
fonte
Perl, 66 bytes
O número deve ser inserido através do STDIN.
fonte
(.?)
em$2
uma vez(.*)
no$1
deve ser ganancioso e obter esse caráter em primeiro lugar. Mas se for removido, o código não produzirá mais os resultados corretos! A propósito, você não precisa da final;
.$c=<>;s/(.*)2(.*)/$1+1 .$2.0/e||$_++while($c--);print
. Eu estava certo, o(.?)
nunca capturou nada.$_=1;$c=<>;s/(.?)2/1+$1.0/e||$_++while(--$c);print
, que é de 50 bytes..*
no início ou no final, pode ser otimizado, se você apenas o substituir pelo texto original. Além disso, não há razão para adicionar o 0 no final, pois sempre existem apenas zeros no original$3
.Pitão, 19 bytes
Complexidade logarítmica. Termina facilmente na quantidade de tempo necessária. Saída na forma de uma lista de dígitos.
Demonstração .
fonte
Perl,
847067 bytesNão é muito golfista, estáficando melhor, mas funciona muito rapidamente!A sugestão de Dennis reduz para 51 (50 bytes + -p switch)
Ele deve ser chamado como
perl -p skew_binary.pl num_list.txt
ondenum_list.txt
contém uma única linha com o número para codificar nele.fonte
Mathematica, 65
Deve ser rápido o suficiente, embora eu deva admitir que espiei as outras submissões antes de fazer isso.
Uso:
Resultado:
Começa a transmitir mensagens de erro MaxExtraPrecision em algum lugar após 10 ^ 228 (para o qual calcula o resultado em 0,03 segundos na minha máquina)
Depois de remover o limite MaxExtraPrecision, ele manipulará números de até 10 ^ 8000 em um segundo.
Entrada:
Resultado:
fonte
C, 95 bytes
Isso aceita um número inteiro e um buffer no qual retornar os dígitos. Os resultados são armazenados
b
, finalizados com valor3
(que não pode ocorrer na saída). Não precisamos manipular a entrada de0
(como a pergunta especifica apenas números inteiros positivos); portanto, não existe uma caixa especial para evitar saída vazia.Código expandido
Operamos por subtração sucessiva, começando com o dígito mais significativo. A única complicação é que usamos a variável
m
para evitar a impressão de zeros à esquerda. Uma extensão naturalunsigned long long
pode ser feita, se desejado, ao custo de 10 bytes.Programa de teste
Passe números a serem convertidos como argumentos de comando. Ele converte o
int
buffer da matriz em uma sequência de dígitos imprimível. O tempo de execução é menor que um milissegundo para entrada1000000000000000000
.Resultado dos testes
fonte
auto a=~0ull
para uma ligeira vantagem ...JavaScript (Node.js) , 40 bytes
Experimente online!
Esta solução não funciona no último testcase. Apenas causa excesso de pilha.
fonte
CoffeeScript,
9269 bytesBaseado nas respostas e atualizações de Qwertiy :
fonte
Japonês , 31 bytes
Experimente online!
Porta quase direta desta solução JS . Não faço ideia se há uma maneira melhor.
Descompactado e como funciona
fonte
Stax , 16 bytes
Execute e depure
Não sei exatamente qual é a classe de complexidade formal, mas é rápida o suficiente para executar todos os casos de teste em um décimo de segundo nesta máquina.
Descompactado, não jogado e comentado, parece com isso. Neste programa, o registro x originalmente contém a entrada.
Execute este
fonte