"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'0por00¬:).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
ies entrada.blo convierte a binario (lista de dígitos)\dcon argumentos2y 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.,1agrega un 1 al final, por lo que el último dígito no se pierde.# Sselecciona debiesos dígitos que tienen un 1 en la lista calculada anteriormente: aquellos que no son las mitades izquierdas de 00.dconvierte de nuevo a número epimprime 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
nes 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 dividimosnen(n%2) + 2*(n/2), dejamos solo el último dígito binarion%2y volvemos a los otros dígitosn/2.fuente
n%2redundante?|nda resultados incorrectos.(n%4>0)|n%2con(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;/'|bces 2 bytes más cortoecho $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]. Perodcytrhazlo mucho más corto .bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bctr -s 0lugar de sed, puede bajar a 36 bytesPerl 6 ,
3127 bytesExplicación:
Ejemplo:
fuente
MATL
1198 bytesEsta versión funciona solo en MATLAB ya que
strrepen 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
0by solo en suevallugar?lambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import reJavascript (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"y0se manejan de la misma manera.Perl, 38 + 1 (
-p) = 39 bytesNecesita
-pque se ejecute el indicador (agregué el-lindicador 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.RegularExpressionstal 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-replacepara 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∘⊥⍣¯1la inversa de binary- a conversión -decimal, es decir binary- de conversión -decimaldos
2está 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