Desafio
Dado um número binário como entrada por qualquer meio, "simplifique" o número usando um programa ou uma função completa.
Entrada
[binary]
binary
é um número no binário acima de 0.
Saída
Pegue a entrada, converta-a na base 10 sem usar um built-in; em seguida, se esse número contiver apenas 1s e 0s, converta-o em um número base 10 como se fosse outro número binário. Repita o processo até que o número não possa ser lido em binário e emita esse número.
Outra informação
Se a entrada for 1, basta emitir
1
. Seu programa não deve continuar infinitamente simplificando 1.Isso é código de golfe, então a resposta mais curta em bytes até terça-feira (17 de novembro) vence.
Se algo estiver confuso, deixe um comentário especificando o que eu preciso esclarecer e eu o editarei de acordo.
Builtins para conversão de base não são permitidos.
Exemplos
Input | Output
1 | 1
1010 | 2
1011 | 3
1100100 | 4
1100101 | 5
1111110011 | 3
code-golf
base-conversion
binary
The_Basset_Hound
fonte
fonte
Respostas:
Pitão,
2016 bytes4 bytes graças a Jakube
Metade do código (
u+yNsTG0
) é simplesmente o código de conversão base.Suíte de teste
A entrada
1
é manipulada pelo fato deu
notar que o valor parou de mudar.fonte
CJam,
2423 bytesExperimente online no intérprete CJam .
Como funciona
fonte
"10"
cordaslength-1
ou pode pular o decremento?"10"
em""
se o número inteiro tiver um único dígito. Isso garante que o código não entre em um loop infinito.Pip,
2827 bytesRecebe entrada como um argumento de linha de comando. Queremos fazer um loop até
a=1
oua
conter alguns caracteres além dos zeros e zeros. Essa última condição é testadaRM
inserindo todos os caracteres emt
=10
froma
. Se sobrar alguma coisa, a condição é verdadeira.Dentro do loop, a conversão funciona da seguinte maneira:
Colocar
a
no final imprime automaticamente.Uma solução recursiva em 28 bytes:
fonte
Python 2, 52
É mais fácil pensar nisso como duas funções recursivas:
A função
g
converte um valor decimal em binário e a funçãof
se aplicag
repetidamente, desde que seu argumento seja composto pelos dígitos 0 e 1 ('2'>max(`n`)
) e não o seja1
. O código golfed os recolhe em uma única função, inserindo a definição deg(n)
forf(n)
, substituindo a chamada recursiva porg
withf
. O caso basen=0
deg
é tratado automaticamente pela verificaçãon>1
.fonte
L
derepr
...Prolog,
220212 bytesA explicação
p é a função principal e executa as seguintes etapas (com a ajuda de b, x, y):
Editar: salvou 8 bytes unificando as cláusulas p com OR.
fonte
Mathematica
107106Com um byte salvo pelo DLosc.
Divida a entrada em seus dígitos. Se a entrada for 1, a saída 1.
Se a entrada for um número composto por 0 e 1, converta-o em decimal e execute-o novamente.
Caso contrário, retorne a entrada.
O primeiro passo produz 1011, que por sua vez produz 3.
Aqui testamos começando com 1011.
fonte
Javascript,
132, 123 bytesBem, não é a melhor resposta, mas ..
Para sua informação, se uma entrada inválida for fornecida, ela será exibida para o usuário.
fonte
for
vez dewhile
e definindo valores diretamente na instrução (isso também reduz alguns{}
), descartando alguns;
, usando a descrição da função ES6, incrementando emi
linha. Vai ficar assim:c=x=>{for(r=0;x&&!/[2-9]/.test(x);x=r)for(i=0;x>0;r+=x%10*Math.pow(2,i++),x=parseInt(x/10));alert(x)};c(prompt())
.function c(x){while(x^0&&!/[2-9]/.test(x)){for(i=r=0;x;i++)r+=x%10*Math.pow(2,i),x=0|x/10;x=r}alert(x)}c(prompt())
c=x=>
no início, não funcionava no console do Chrome ou Firefox. :( @ ן nɟuɐɯɹɐ ן oɯ, não poderia envolver minha cabeça em torno da condição XOR eax=0|x/10
vez deparseInt
, eu incorporei o resto das mudanças Thanks ...c=x=>{for(r=0;x!=0&&!/[2-9]/.test(x);x=r)for(i=r=0;x;)r+=x%10*Math.pow(2,i++),x=parseInt(x/10);alert(x)};c(prompt())
. Ele definitivamente roda no Firefox 42, tente este violino . Observe que esta versão mais elaborada e também o seu código original não funcionam1
e serão executados em um loop infinito.c=x=>
é comofunction c(x){}
ver " Funções das setas ".JavaScript ES6, 52
Como uma função. O argumento da função deve ser uma sequência de dígitos binários ou um número cuja representação decimal contenha apenas 1 e 0.
Teste a execução do snippet abaixo em um navegador compatível com EcmaScript 6 - implementando funções de seta, seqüências de caracteres de modelo e operador de propagação (eu uso o Firefox)
fonte
n+=+c+n
da conversão binária. Tão elegante ...Mathematica,
62595548 bytesEconomizou 7 bytes graças a Martin Büttner.
fonte
Javascript (ES7)
8780787774 bytesDemonstração de trechos para oferecer suporte a navegadores (atualmente apenas o Firefox noturno suporta o operador exponencial)
Javascript (ES6) 81 bytes
Demonstração de trechos para suportar navegadores
fonte
, 37 caracteres / 54 bytes
Try it here (Firefox only).
Não tenho certeza se o
+
operador conta como um built-in para conversão binária ...fonte
Perl 6 , 67 bytes
fonte
PHP,
210204 bytesÉ a minha primeira vez postando aqui, então espero que vocês gostem! Mesmo que obviamente não seja a melhor maneira de escrevê-lo, ainda fico feliz em mostrá-lo aqui!
O código
Eu criei uma função recursiva "j" que primeiro verifica se a entrada é igual a 1. Nesse caso, a função retorna 1 conforme o esperado, caso contrário, dividirá o número em uma matriz para calcular o valor decimal, mas apenas se o número for binário. Caso contrário, retornará o número como está.
Código ungolfed
Eu usei uma instrução "foreach" em vez da minha inicial "for", permitindo um ganho de 6 bytes, mas tenho certeza de que há muito mais a fazer.
fonte
PHP,
114112 bytestambém trabalha para
0
. Corra com-r
.count_chars($s,3)
retorna uma string contendo todos os caracteres da string (comoarray_unique
faz para matrizes). Para números binários, este será0
,1
ou01
. Para outros números, ele conterá um dígito maior que1
, portanto<2
, retornará verdadeiro apenas para números binários.&$s>1
é necessário para o caso especial1
.O resto é direto: faça um loop pelos bits alterando o valor e adicionando o bit atual e, finalmente, copie o número (convertido em string) para $ s para o teste de loop externo.
fonte
CoffeeScript,
9289 bytesJavaScript (ES6),
10510190 bytesDemo
Funciona apenas em navegadores compatíveis com ES6, como Firefox e Microsoft Edge
fonte
1
. porque ele não entra no loop, eu assumoScala, 128 bytes
fonte
Matlab (115)
bin2dec
)fonte