Parece uma tarefa impossível, certo? Bem, na verdade não é tão difícil. Se escrevermos a palavra Infinity
como código ASCII binário de 8 bits, obteremos:
01001001 01101110 01100110 01101001 01101110 01101001 01110100 01111001
Isso pode ser concatenado e convertido no valor decimal 5291279215216915577
. Agora é com esse número que podemos trabalhar ...
A maneira como você fará a contagem regressiva é:
- Saída da string original como um número decimal (como mostrado acima)
- Remova os 0s iniciais em sua representação binária (se houver)
- Alterne os bits na representação binária (1-> 0, 0-> 1)
- Emita o número em decimal
- Repita as etapas 2 a 4 como até atingir 0.
Desafio:
Crie um programa ou função que use uma string como entrada e produza (em qualquer formato adequado) os números que você obterá ao executar o procedimento acima.
Caso de teste:
Acho que o desafio será fácil de entender, mesmo que seja apenas um caso de teste. Vou usar em Inf
vez de Infinity
manter isso bastante curto.
Inf
4812390 (10010010110111001100110)
3576217 ( 1101101001000110011001)
618086 ( 10010110111001100110)
430489 ( 1101001000110011001)
93798 ( 10110111001100110)
37273 ( 1001000110011001)
28262 ( 110111001100110)
4505 ( 1000110011001)
3686 ( 111001100110)
409 ( 110011001)
102 ( 1100110)
25 ( 11001)
6 ( 110)
1 ( 1)
0 ( 0)
Input: Inf
Output:
4812390, 3576217, 618086, 430489, 93798, 37273, 28262, 4505, 3686, 409, 102, 25, 6, 1, 0
Input: Infinity
Output:
5291279215216915577, 3932092821637860230, 679593196789527673, 473328307817319302, 103132444486104185, 40982743589751686, 31074850448176249, 4953946570787718, 4053252683953273, 450346943417222, 112603010004089, 28134478351238, 7049893737593, 1746199284614, 452823970937, 96931842950, 40507110521, 28212366214, 6147372153, 2442562438, 1852404857, 295078790, 241792121, 26643334, 6911097, 1477510, 619641, 428934, 95353, 35718, 29817, 2950, 1145, 902, 121, 6, 1, 0
Seu código deve suportar seqüências de caracteres que podem ser representadas como um número binário até o limite do seu idioma. Todas as seqüências conterão apenas caracteres ASCII imprimíveis de 32 a 126 (espaço para til).
Entre os melhores
var QUESTION_ID=98274,OVERRIDE_USER=31516;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Inf:-1:0
∞..0
Respostas:
Geléia ,
1510 bytes-5 bytes graças a @Dennis (converta diretamente da base 256 após o lançamento ordinal)
TryItOnline!
Quão?
fonte
Oḅ⁹
.Python 2,
8982777675 bytesTeste em Ideone .
Como funciona
Depois de inicializar n para 0 , a segunda linha executa a conversão de seqüência de caracteres em número inteiro especificada nos desafios da seguinte maneira.
Em cada etapa, n é deslocado 8 unidades para a esquerda e, em seguida, OR- bit bit com o ponto de código do próximo caractere c . Para entrada Inf , é o seguinte.
Agora estamos prontos para gerar a saída. Para inverter os bits de n , procedemos da seguinte maneira.
Primeiro, calculamos os bits na representação binária de n sem zeros à esquerda. Vamos chamar o resultado k . Em seguida, calculamos a potência k k de 2 , que possui k + 1 dígito binário: um único 1 , seguido por k 0 's. Subtraímos 1 do resultado, produzindo um número composto por k ones, que depois XOR com n para inverter seus bits. Para entrada inf, é o seguinte.
Um obstáculo adicional na implementação é que precisamos imprimir n antes da primeira etapa, após a última etapa e em todas as etapas intermediárias. O Python não possui loops do-while e uma única instrução de impressão custa 8 bytes, portanto, fazemos o seguinte.
Na implementação direta da etapa de atualização, ou seja,
substituímos o loop por um infinito (
while 1
) e calculamos1
o loop comon/n
. Isso é equivalente a n> 0 .Uma vez que n = 0 , nós ficar no loop, imprimir o estado mais uma vez, em seguida, tentar atualizá-lo. No entanto,
0/0
dispara um ZeroDivisionError , interrompendo o loop e saindo com um erro. Observe que isso causa saída dispersa para STDERR, que é permitido por padrão .fonte
-n/n
truque :-)n/n
truque? Provavelmente já foi explicado em outra resposta em algum lugar, mas não a encontrei. O que faz aqui?JavaScript, 82 bytes
Guardou um byte graças a @Arnuald
Uma das poucas vezes em que um programa completo supera uma função (e o ES6 não supera o ES5) ...
O texto acima suporta palavras de até 4 letras. Adicione 4 bytes para suportar palavras de até 6 letras:
fonte
g=a=>a[0]?a.pop().charCodeAt()+g(a)*256:0
(-1)n<<8|y.charCodeAt()
deve salvar um byte.for(;n;)for(i=!alert(n);i<=n;i*=2)n^=i
salvaria outro byte, mas você não exibirá0
, o que provavelmente é necessário.n<<8
mais cedo, mas decidi que não iria funcionar, porque seria interrompido por n com mais de 31 bits. Suponho que não importa agora que já o dividi entre uma versão de 31 bits e uma versão de 53 bits ... E, infelizmente, acho que não posso salvar nada no alerta enquanto alerta os dois primeiros iteração e a última.Na verdade , 14 bytes
Experimente online!
Explicação:
fonte
05AB1E , 18 bytes
Usa a codificação CP-1252 .
Experimente online!
Explicação
fonte
MATL , 13 bytes
Experimente online!
Explicação
fonte
Mathematica, 99 bytes
Função anônima. Pega uma string como entrada e retorna uma lista de números como saída.
fonte
Haskell,
10912311810297 bytesObrigado a @nimi por salvar 5 bytes!
Uso:
(++[0]).fst.span(>0).iterate c.foldl((+).(256*))0.map fromEnum $ "Infinity"
Garantido para trabalhar com números de até 29 bits pelo idioma, geralmente trabalha com números de até 63 bits em sistemas de 64 bits. Use
map(fromIntegral.fromEnum)
(+14 bytes) para suportar números arbitrariamente grandes.Funciona para o intervalo unicode
[0..255]
. Vira recursivamente os bits.fonte
takeWhile(>0)
porfst.span(>0)
. Se você ficar sem ponto, poderá soltar o nomef
, então sua função principal é(++[0]) ... map fromEnum
.f
.fromIntegral
? Do desafio: "deve suportar ... até 63 bits ... ou o limite do seu idioma", então tudoInt
bem. Se você deseja mantê-lo, mova-o paramap
, ou seja, sua versão antiga defoldl1
emap(fromIntegral.fromEnum)
.PHP,
132126123120108107 bytesunpack
em vez destr_split
tornarord()
obsoleto -> -3 bytes_
como o separador salva 3.bindec
em vez deltrim
remover os zeros à esquerda: -12echo
no corpo do loop economiza 1 byteprint
na cabeça do loop.fonte
$n=$n*256+$i;for(print$n;$n;)
ser escrito comofor(print$n=$n*256+$i;$n;)
? Como a parte da atribuição será executada uma vez, isso deve funcionar. E, em vez deecho _.$n=[...]
, você deve usarecho _,$n=[...]
. Ele não salvará nenhum byte, mas acelerará o código um pouquinho minúsculo e separará as instruções. Isso significa que, por exemplo,echo _,$a?5:6;
pode ser escrito em vez deecho _.($a?5:6);
. Isso pode ser útil no futuro.print
neste caso. Sozinho, não vale a pena editar; mas obrigado.foreach(unpack("C*",$argv[1])as$i)
... Parvo eu ... E sim, mudar um período para que uma vírgula tenha o mesmo efeito não vale a pena.Perl, 65 bytes
Código de 53 bytes + 12 para
-Mbigint -p
.Obrigado a @ Dada por me salvar 13 bytes!
Uma abordagem bastante direta, apenas diferente da maioria deles, é que o número é armazenado como binário e impresso em decimal. Tenho certeza de que pode ser aprimorado, talvez com o armazenamento de detalhes em uma matriz.
-Mbigint
é um pouco inconveniente, mas necessário.Uso
fonte
perl -Mbigint -lpE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'
(Eu não tenho nenhuma idéia de como usar descompactar normalmente, eu só tenho sorte quando pesquisando como converter uma string para binário ;-))unpack
a sintaxe sempre me impressiona! Vou atualizar, obrigado!echo -n
é a única outra mudança.Pitão, 12 bytes
Um programa que recebe a entrada de uma string entre aspas e imprime o resultado como uma lista de números inteiros.
Verifique todos os casos de teste
Como funciona
fonte
Python 3,
9995 bytesA idéia principal é converter a string em bytes em número. Cada iteração imprime a saída e o XOR com todos os 1s para avançar para zero.
fonte
2**x.bit_length()-1
. A ordem das operações de potência e subtração é superior a xor. Além disso, issowhile
pode estar em uma única linha.P=print
e, em seguida, usando emP()
vez deprint()
Python 2,
117115 bytesEconomizando 2 bytes graças ao Cyoce.
Assume a entrada entre aspas, por exemplo
"Inf"
m
conta até o dígito mais alto, assimm-1
como uma máscara XOR para executar a operação desejada. A parte mais longa é converter a entrada na sequência de bits inicial.Exemplo:
fonte
-i-1
por~i
Ruby,
104101100818065 bytes19 bytes salvos graças a @WayneConrad!
15 bytes salvos graças ao @philomory!
1 byte salvo graças a @LeeW!
Recebe entrada por meio de argumentos de linha de comando.
Inspirado na resposta Python de @ JimmyJohnson
fonte
i.to_s(2).rjust 8,'0'
por"%08b"%i
inject(:+)
pode ser substituído porjoin
unpack
seguido por, em[0]
vez de mexergsub
, economizará 11 bytes. Mudar para em$*[0]
vez degets.chop
(usando um argumento de linha de comando em vez de entrada do console) salvará outros 9, a primeira linha se tornaráp n=$*[0].unpack('B*')[0].to_i(2)
.Labirinto ,
104103 bytesExperimente Online!
Explicação:
O ponteiro de instruções começa com o caractere que não é de parede, no canto superior esquerdo (as paredes incluem espaços e qualquer letra, exceto
v
).Laranja:
Esse loop obtém a entrada um caractere de cada vez como um código ASCII, adicionando-o ao valor atual e multiplicando o valor atual por 256.
'
No-op,
Empurre o código ascii do próximo caractere de entrada para o topo da pilha ou -1 se EOF. Nesse ponto, se a entrada foi recebida, o código vira à direita (movendo-se para baixo) porque a parte superior da pilha é potente. Caso contrário, ele ficará à esquerda, porque a parte superior da pilha é negativa.|
Retire os dois itens principais da pilha e empurre o resultado de um OR bit a bit._
Empurre zero256
Cada dígito visto aparecex
e pressionax*10+digit
. Portanto, isso combinado com o push zero do push anterior 256 para o topo da pilha.*
Popy
, popx
, empurrex*y
. Nesse ponto, como a parte superior da pilha é positiva, o código vira à direita para continuar no loop.Azul:
)
Incremente o topo da pilha. Quando o final da entrada é alcançado, o código vira à esquerda para chegar a esse ponto com um -1 na pilha, que será incrementado para zero.256
Ter o topo da pilha 0 nos permite empurrar esse 256./
Popy
, popx
pushx/y
(divisão inteira). Como multiplicamos a entrada por 256 em cada loop, precisamos reverter a última multiplicação.:
Duplique a parte superior da pilha para ter uma cópia do valor atual para mais tarde.!
Coloque a parte superior da pilha e imprima o valor inteiro em STDOUT.\
Imprima uma nova linha._2
Empurre dois para o topo da pilha.}
Mova a parte superior da pilha para a parte superior da pilha auxiliar.Vermelho:
Esse loop inverte os bits do valor atual por XOR com um valor específico calculado no loop interno (verde). Em seguida, gera o valor atual e sai do programa se o valor atual for zero.
_
Pressione zero (fluxo de controle).;
Descarte a parte superior da pilha (fluxo de controle).:
Duplique o valor atual. A cópia será usada para calcular o XOR._
Pressione zero (fluxo de controle).$
Popy
, popx
, Pushx XOR y
.:!
Duplique o valor atual e imprima a representação inteira.@
e terminamos.\
Imprima uma nova linha._2}
Pressione 2 e vá para a pilha auxiliar._1
Pressione 1 (fluxo de controle).Verde:
Este loop calcula o valor pelo qual precisamos XOR o valor atual. Isso é feito duplicando repetidamente a parte superior da pilha auxiliar enquanto reduz pela metade uma cópia do valor atual na parada da pilha principal até atingir 0.
_
Pressione zero (fluxo de controle).;
Descarte o valor atual que é usado apenas para impor o fluxo de controle._2
Pressione 2 para reduzir pela metade o valor atual./
Dividir{
Mova a parte superior da pilha auxiliar para a parte superior da pilha principal._2*
Dobrar o topo da pilha}
Mova a parte superior da pilha principal de volta para a pilha auxiliar._1
Pressione um para o fluxo de controle.;
Descarte a esquerda acima de zero do cálculo do XOR.{
Mova o XOR calculado para a pilha principal.(
Subtrair um do valor XOR.fonte
PowerShell v2 +, 158 bytes
Sim, portanto, converter bases no PowerShell é realmente péssimo . E conseguimos fazer isso duas vezes aqui.
OK, então isso é apenas um
for
loop ativado$a
- ou seja, rodamos enquanto$a
existir. Eventualmente, alcançaremos uma string vazia (que é falsey), e é assim que terminaremos.A configuração do loop,
$a=-join([char[]]$args[0]|%{([int][convert]::ToString(+$_,2)).ToString('0'*8)})
pega a entrada$args[0]
, lança como umchar
array e percorre cada caractere. Usamos o .NET[convert]::ToString(int,base)
para converter cada um em uma string binária. No entanto, isso não inclui zeros à esquerda, portanto, precisamos relançar essa sequência como[int]
e chamar seu.ToString()
método com8
zeros como máscara. Em seguida, essas seqüências são encapsuladas em parênteses e edificadas-join
juntas, e então salvas em$a
.Dentro do loop,
[convert]::ToInt64(string,base)
convertemos o número binário em um número decimal. Isso fica no pipeline e é liberado posteriormente quando o loop é redefinido (e, portanto, implicitamente impresso). A próxima seção executa os cálculos -.TrimStart()
removeremos quaisquer zeros-split0
à esquerda, dividir em zeros e obter umastring
matriz de1
s,-replace
aqueles com zeros, e finalmente-join
a matriz de volta com1
s. Então, o loop começa novamente.fonte
CJam ,
171618 bytesExperimente online!
NOTA: A versão antiga de 16 bytes não se comportava corretamente com cadeias de caracteres vazias:
Além disso, obrigado a Dennis por sugerir
p
que economiza 1 byte aoN\
colocar novas linhas na pilha.fonte
_p2b:!2b
salva um byte. Além disso, você deve usarl
;r
falhará se a entrada contiver espaços.q
funcionará corretamente com cadeias vazias.J, 24 bytes
A explicação virá mais tarde!
fonte
Retina, 116 bytes
A contagem de bytes assume a codificação ISO 8859-1. A linha 5 contém bytes não imprimíveis. É
T`\x00-\xFF
.Experimente online
Não tente fazer isso com entrada com mais de dois caracteres. (É atingido o tempo limite usando o intérprete on-line.) Temos que converter o binário em unário antes do decimal. : D
Infelizmente, há um zero e avanço de linha, mas decidi assumir que estava tudo bem, porque a saída ainda está correta.
Explicação
fonte
Ruby - 70 bytes
O programa é encerrado com uma exceção após a conclusão, mas meu entendimento é que isso é bom, desde que a saída de erro vá para STDERR em vez de STDOUT (o que ocorre).
fonte
C,
147135133125122121117115103 bytesGuardado 5 bytes graças a @Cyoce!
Economizou 2 bytes graças a @Cyoce e @cleblanc!
Guardado 12 bytes graças a @ceilingcat
Ungolfed:
fonte
int
declaraçõeswhile
loop em umfor
loopwhile(1)
parafor(;;)
int
declarações em todos os lugares e obtivegcc -std=89
erros. Mas obrigado pelafor(;;)
dica. Vou continuar tentando remover asint
declarações :)))i;main(c,v)char**v;{...}
). Em certo móvel agora, então eu não posso ter certezaC,
129120117110107105 BytesTestado com
resultado
fonte
i=0
para a declaraçãoi
e deixar a seção de inicialização dofor
loop em brancoi
está implícita global int, precisa ser inicializada toda vez que f (...) é chamada.i
seja zero novamente, portanto ainda é reutilizável.C #,
360359 bytesPrograma completo:
fonte
var t="";var f="";
servar t="",f=""
? Salva 5 bytes.