"Números aptos"
¡Sam tiene una idea "brillante" para la compresión! ¿Puede usted ayudar?
Aquí hay un resumen del esquema de compresión de Sam. Primero tome una representación de base 10 de cualquier número natural estrictamente menor que 2 ^ 16, y escríbala como una cadena binaria sin ceros a la izquierda.
1 -> 1 9 -> 1001 15 -> 1111 13 -> 1101 16 -> 10000 17 -> 10001 65535 -> 111111111111111
Ahora reemplace cualquier grupo de uno o más ceros con un solo cero. Esto se debe a que el número se ha vuelto más delgado. Su cadena binaria ahora se verá así.
1 -> 1 -> 1 9 -> 1001 -> 101 15 -> 1111 -> 1111 13 -> 1101 -> 1101 16 -> 10000 -> 10 17 -> 10001 -> 101 65535 -> 111111111111111 -> 111111111111111
Ahora convierte la cadena binaria de nuevo a una representación de base 10 y la genera en cualquier formato aceptable. Aquí están tus casos de prueba. El primer entero representa una entrada, y el último entero representa una salida. Tenga en cuenta que algunos números no cambian y, por lo tanto, pueden denominarse "ajuste"
1 -> 1 -> 1 -> 1 9 -> 1001 -> 101 -> 5 15 -> 1111 -> 1111 -> 15 13 -> 1101 -> 1101 -> 13 16 -> 10000 -> 10 -> 2 17 -> 10001 -> 101 -> 5 65535 -> 1111111111111111 -> 1111111111111111 -> 65535 65000 -> 1111110111101000 -> 11111101111010 -> 16250
Puede usar cualquier idioma, pero tenga en cuenta que Sam odia las lagunas estándar. Este es el código de golf, por lo que el código puede ser lo más corto posible para dejar espacio para los números "comprimidos".
Nota: Este NO es un esquema de compresión aceptable. Usar esto lo despedirá rápidamente.
Cita requerida: No tomo crédito por este concepto. Esto viene del blog de @Conor O 'Brien aquí, vea este OEIS de números de ajuste. https://oeis.org/A090078
10000
?Respuestas:
05AB1E ,
86 bytesExplicación
Pruébalo en línea
Guardado 2 bytes gracias a Adnan
fuente
„00'0
por00¬
:).Bash + GNU utilidades, 27
Entrada leída desde STDIN.
fuente
dc
:)JavaScript (ES6), 41 bytes
fuente
Medusa , 20 bytes
Pruébalo en línea!
Explicación
i
es entrada.b
lo convierte a binario (lista de dígitos)\d
con argumentos2
y la lista de dígitos se aplicad
(dígitos binarios al número) a cada subcadena de longitud 2 de la lista de dígitos.*
toma el signo de los resultados: 00 va a 0, todo lo demás a 1.,1
agrega un 1 al final, por lo que el último dígito no se pierde.# S
selecciona debi
esos dígitos que tienen un 1 en la lista calculada anteriormente: aquellos que no son las mitades izquierdas de 00.d
convierte de nuevo a número ep
imprime el resultado.fuente
Python 2, 36 bytes
Una implementación recursiva directa sin operaciones integradas de conversión de base u operaciones de cadena. Menos golfizado:
Cuando
n
es un múltiplo de 4, termina en dos ceros en binario, por lo que cortamos uno dividiendo el piso por 2. De lo contrario, nos dividimosn
en(n%2) + 2*(n/2)
, dejamos solo el último dígito binarion%2
y volvemos a los otros dígitosn/2
.fuente
n%2
redundante?|n
da resultados incorrectos.(n%4>0)|n%2
con(n%4>0)
.(f(n/2)<<(n%4>0)) | n%2
.Bash (sed + bc),
605543 byteseditar:
sed -E 's/0+
ased 's/00*
y modificado echo y pipe utilizado para pasar el valor a bc con<<<
.ejemplo:
fuente
echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bc
es 2 bytes más cortoecho $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]
. Perodc
ytr
hazlo mucho más corto .bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
tr -s 0
lugar de sed, puede bajar a 36 bytesPerl 6 ,
3127 bytesExplicación:
Ejemplo:
fuente
MATL
1198 bytesEsta versión funciona solo en MATLAB ya que
strrep
en MATLAB puede manejar entradas lógicas. Aquí hay una versión que funcionará en Octave (9 bytes) (y, por lo tanto, el intérprete en línea) que explícitamente emite las entradas lógicas para escribirdouble
.Pruébalo en línea
Explicación
fuente
Python 3,
55, 50 bytes.Guardado 4 bytes gracias a Sp3000.
Solución bastante sencilla.
fuente
0b
y solo en sueval
lugar?lambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
Javascript (ES6), 40 bytes
fuente
console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0)))
.N=>
que lo convertiría en una presentación de función válida.En realidad, 14 bytes (no competitivos)
Pruébalo en línea!
Esta presentación no es competitiva porque se realizó una corrección de errores
Æ
después de que se publicó este desafío.Explicación:
fuente
Ruby,
3531 bytes-2 bytes gracias a @Doorknob
Véalo en repl.it: https://repl.it/CnnQ/2
fuente
Jalea ,
137 bytes6 bytes gracias a Zgarb por su algoritmo .
Pruébalo en línea!
fuente
PHP,
5351 bytesToma un argumento de la consola.
Gracias a:
@manatwork reemplaza "0" con 0
fuente
"0"
y0
se manejan de la misma manera.Perl, 38 + 1 (
-p
) = 39 bytesNecesita
-p
que se ejecute el indicador (agregué el-l
indicador para hacerlo más legible, pero de lo contrario no es necesario):Tenga en cuenta mucho que decir sobre el código: convierte el número en binario (
sprintf"%b"
), luego reemplaza los bloques de ceros por solo un cero y convierte el resultado en decimal (oct"0b".
).fuente
C #,
11291 bytes-8 bytes gracias a TuukkaX
fuente
int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}
- 94 bytes usando expresiones regulares. He visto muchas soluciones de C # no incluidas, ¿System.Text.RegularExpressions
tal vez también está permitido aquí ...?int f(int x){return Convert.ToInt32(Regex.Replace(Convert.ToString(x,2),"0+","0"),2);}
86 bytes.Java, 75
Programa de prueba:
fuente
PARI / GP ,
5443 bytesfuente
PowerShell v2 +, 69 bytes
( solicitud de características Una forma más corta de convertir a / desde binario en PowerShell )
Toma entrada
$args[0]
, usa el .NET incorporado[convert]::ToString(int,base)
para convertir el entero de entrada en una cadena base binaria. Eso se filtra a través del-replace
para eliminar cualquier ejecución de uno o más ceros a solo0
. Esa cadena resultante se envía de vuelta a través de la otra dirección[convert]::ToInt32(string,base)
para convertir el binario en un entero. Ese entero se deja en la tubería y la salida es implícita.Casos de prueba
fuente
Implementación de referencia en SILOS "solo" 417 bytes
Golfed
Aquí está la implementación de referencia totalmente sin golf. Como característica adicional, muestra los pasos necesarios para llegar a una respuesta.
Por solicitud, la transpilación ha sido eliminada. Siéntase libre de ver el historial de edición para recuperarlo, de lo contrario vaya a este repositorio para obtener un intérprete.
Salida de muestra para 65000
fuente
Pyth, 12
En línea.
fuente
Retina , 30 bytes
Pruébalo en línea!
Y aquí pensé que Retina estaría entre las primeras respuestas ...
fuente
Java,
152143138 bytesfuente
Integer i;
parte es simple y fantástica!Dyalog APL , 19 bytes
TryAPL en línea!
Esta función es realmente una "cima" de dos funciones, la primera función es:
2∘⊥⍣¯1
la inversa de binary- a conversión -decimal, es decir binary- de conversión -decimaldos
2
está obligado∘
a -to-decimal⊥
de repetición de la operación
⍣
uno negativo tiempo¯1
(es decir, una vez, pero invertida)En la segunda función, el resultado binario anterior está representado por
⍵
:{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵
Booleano para donde {0, 0} comienza en ⍵ Negación~
booleana, por lo que ahora tenemos ᴛʀᴜᴇ en todas partes, pero en los primeros ceros en las ejecuciones cero,⍵/⍨
use eso para filtrar ⍵, por lo que esto elimina nuestros ceros no deseados2⊥
convertir binario a decimalfuente
TSQL, 143 bytes
No usar build ins para convertir desde y hacia binario.
Golfizado:
Sin golf:
Violín
fuente
CJam, 16
Pruébalo en línea
Es bastante largo debido a la falta de expresiones regulares.
Explicación:
fuente
Java, 64 bytes
Programa de prueba
fuente
CJam , 23 bytes
Pruébalo en línea!
Explicación
fuente
Ruby,
3735 bytesGuardado dos bytes gracias a manatwork.
El enfoque ingenuo. (:
fuente
"0"
, ver el segundo punto en el sepp2k 's punta . En cuanto a.to_i(2)
, donde no hay ambigüedad sobre dónde pertenece un parámetro, los paréntesis son opcionales.C, 37 bytes
fuente