Desafío
Dado un número binario como entrada por cualquier medio, "simplifique" el número usando un programa completo o una función.
Entrada
[binary]
binary
es un número en binario que está por encima de 0.
Salida
Tome la entrada, conviértala en base 10 sin usar un incorporado, luego, si ese número contiene solo 1s y 0s, conviértalo en un número base 10 como si fuera otro número binario. Repita el proceso hasta que el número no se pueda leer en binario y envíe ese número.
Otra información
Si la entrada es 1, simplemente salga
1
. Su programa no debe continuar simplificando infinitamente 1.Este es el código de golf, por lo que la respuesta más corta en bytes para el martes (17 de noviembre) gana.
Si algo es confuso, deje un comentario que especifique lo que necesito aclarar y lo editaré en consecuencia.
No se permiten construcciones para la conversión de bases.
Ejemplos
Input | Output
1 | 1
1010 | 2
1011 | 3
1100100 | 4
1100101 | 5
1111110011 | 3
fuente
Respuestas:
Pyth,
2016 bytes4 bytes gracias a Jakube
La mitad del código (
u+yNsTG0
) es simplemente el código de conversión base.Banco de pruebas
La entrada
1
se maneja por el hecho de que seu
da cuenta de que el valor ha dejado de cambiar.fuente
CJam,
2423 bytesPruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
"10"
cadenalength-1
, o podría omitir la disminución?"10"
en""
si el entero tiene un solo dígito. Esto asegura que el código no entre en un bucle infinito.Pip,
2827 bytesToma entrada como argumento de línea de comando. Queremos hacer un bucle hasta
a=1
o quea
contenga algunos caracteres además de 0 y 1. Esta última condición se pruebaRM
'ing todos los caracteres ent
=10
froma
. Si queda algo, la condición es verdadera.Dentro del bucle, la conversión funciona de la siguiente manera:
Poner
a
al final lo imprime automáticamente.Una solución recursiva en 28 bytes:
fuente
Pitón 2, 52
Es más fácil pensar en esto como dos funciones recursivas:
La función
g
convierte un valor decimal a binario, y la función sef
aplicag
repetidamente mientras su argumento esté formado por los dígitos 0 y 1 ('2'>max(`n`)
) y no lo sea1
. El código de golf los contrae en una sola función insertando la definición deg(n)
forf(n)
, reemplazando la llamada recursiva ag
conf
. El caso base den=0
deg
es manejado automáticamente por el chequen>1
.fuente
L
repr
Prolog,
220212 bytesLa explicación
p es la función principal y realiza los siguientes pasos (con ayuda de b, x, y):
Editar: se guardaron 8 bytes al unificar las cláusulas p con OR.
fuente
Mathematica
107106Con un byte guardado por DLosc.
Divide la entrada en sus dígitos. Si la entrada es 1, salida 1.
Si la entrada es un número que consiste en 0 y 1, conviértalo a decimal y ejecútelo nuevamente.
De lo contrario, devuelva la entrada.
El primer paso produce 1011 que a su vez produce 3.
Aquí probamos comenzando con 1011.
fuente
Javascript,
132, 123 bytesBueno, no es la mejor respuesta, pero ...
Para su información, si se proporciona una entrada no válida, se muestra lo mismo al usuario.
fuente
for
lugar dewhile
y estableciendo valores directamente en la declaración (esto también reduce algunos{}
), descartando algunos;
, usando la descripción de la función ES6, incremente eni
línea. Se verá así: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 funcionaba en la consola Chrome o Firefox. :( @ ן nɟuɐɯɹɐ ן oɯ, no pude entender la condición XOR y en sux=0|x/10
lugarparseInt
, he incorporado el resto de los cambios. Gracias ..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())
. Definitivamente se ejecuta en Firefox 42, prueba este violín . Tenga en cuenta que esta versión más golfizada y también su código original no funcionan1
y se ejecutarán en un bucle sin fin.c=x=>
es comofunction c(x){}
ver " Funciones de flecha ".JavaScript ES6, 52
Como una función. El argumento de la función debe ser una cadena de dígitos binarios o un número cuya representación decimal contenga solo 1 y 0.
Pruebe ejecutar el fragmento a continuación en un navegador compatible con EcmaScript 6 - implementando funciones de flecha, cadenas de plantilla y operador de propagación (uso Firefox)
fuente
n+=+c+n
la conversión binaria. Tan elegante ...Mathematica,
62595548 bytesGuardado 7 bytes gracias a Martin Büttner.
fuente
Javascript (ES7)
8780787774 bytesDemostración de fragmentos para admitir navegadores (actualmente solo Firefox admite todas las noches el operador exponencial)
Javascript (ES6) 81 bytes
Fragmento de demostración para admitir navegadores
fuente
𝔼𝕊𝕄𝕚𝕟, 37 caracteres / 54 bytes
Try it here (Firefox only).
No estoy seguro si el
+
operador cuenta como una función para la conversión binaria ...fuente
Perl 6 , 67 bytes
fuente
PHP,
210204 bytesEs la primera vez que publico aquí, ¡espero que les guste! Incluso si obviamente no es la mejor manera de escribirlo, ¡todavía estoy feliz de mostrarlo aquí!
El código
Hice una función recursiva "j" que primero verificará si la entrada es igual a 1. Si es así, la función devuelve 1 como se esperaba, de lo contrario dividirá el número en una matriz para calcular el valor decimal, pero solo si el número es binario Si no es así, devolverá el número tal como está.
Código sin golf
He usado una declaración "foreach" en lugar de mi "for" inicial, lo que me permite una ganancia de 6 bytes, pero estoy bastante seguro de que hay mucho más por hacer.
fuente
PHP,
114112 bytesTambién funciona para
0
. Corre con-r
.count_chars($s,3)
devuelve una cadena que contiene todos los caracteres de la cadena (como loarray_unique
hace para las matrices). Para números binarios, esto será0
,1
o01
. Para otros números, este contendrá un dígito más grande que1
, por lo<2
lo que solo será verdadero para los números binarios.&$s>1
es necesario para el caso especial1
.El resto es sencillo: recorra los bits cambiando el valor y agregando el bit actual, finalmente copie el número (convertir en cadena) a $ s para la prueba del bucle externo.
fuente
CoffeeScript,
9289 bytesJavaScript (ES6),
10510190 bytesManifestación
Solo funciona en navegadores compatibles con ES6 como Firefox y Microsoft Edge
fuente
1
. porque no entra en el bucle, supongoScala, 128 bytes
fuente
Matlab (115)
bin2dec
)fuente