Esto se inspiró en el problema 13: binario no repetido de la reciente competencia de HP CodeWars.
Tomemos un número decimal aleatorio, digamos
727429805944311
y mira su representación binaria:
10100101011001011111110011001011101010110111110111
Ahora dividir esa representación binaria en subsecuencias donde los dígitos 0y 1alternos.
1010 010101 10 0101 1 1 1 1 1 10 01 10 0101 1 1010101 101 1 1 1 101 1 1
Y convertir cada subsecuencia nuevamente en decimal.
10 21 2 5 1 1 1 1 1 2 1 2 5 1 85 5 1 1 1 5 1 1
La tarea
Tome un solo entero positivo como entrada y salida de la secuencia de enteros positivos obtenida por el proceso anterior.
Detalles
- La entrada y la salida deben estar en decimal o unario.
- Los números en la salida deben estar separados de manera sensible y legible para los humanos, y deben estar en decimal o unario. No hay restricción en el espacio en blanco. Estilos de salida válidos:
[1,2,3],1 2 3,1\n2\n3donde\nson literales saltos de línea, etc.
Casos de prueba
Input | Output
0 | 0
1 | 1
2 | 2
3 | 1 1
4 | 2 0
5 | 5
6 | 1 2
7 | 1 1 1
8 | 2 0 0
9 | 2 1
10 | 10
50 | 1 2 2
100 | 1 2 2 0
1000 | 1 1 1 1 10 0 0
10000 | 2 1 1 2 0 2 0 0 0
12914 | 1 2 2 1 1 2 2
371017 | 5 42 10 2 1
Nota adicional: todos los números en la salida deben ser de la forma (2^k-1)/3o 2*(2^k-1)/3. Es decir, 0 1 2 5 10 21, 42, 85, 170, ...que es A000975 en el OEIS.
code-golf
sequence
base-conversion
binary
subsequence
El'endia Starman
fuente
fuente

|tacpermanecerá en mi respuesta entonces :)Respuestas:
Pyth,
1716 bytes1 byte gracias a Jakube
Demostración
Una buena solución inteligente. Utiliza algunas características menos conocidas de Pyth, como
x<int><list>yc<str><list>.fuente
tJpor+dJpuede eliminarhM.Mathematica, 47 bytes
Sin golf:
Split[list,f]divide una lista en varias listas, rompiendo en la posición entreaybsi ifff[a,b]no regresaTrue.FromDigits[n,2] => Fold[#+##&,n]es un buen consejo de alephalpha.fuente
Python, 86 bytes
Como me sobrepasaron horriblemente en Pyth, hagámoslo nuevamente en Python.
Pruébalo aquí!
Explicación
Comenzamos con la conversión del número de entrada
nen una cadena binaria.bin(n)[2:]se encarga de eso. Necesitamos descartar los 2 primeros caracteres de esta cadena ya quebin()devuelve la cadena en el formato0b10101.A continuación, debemos identificar los bordes de las subsecuencias. Esto se puede hacer con la expresión regular
(?<=(.))(?=\1)que coincide con las posiciones de longitud cero en la cadena que tienen el mismo número a la izquierda y a la derecha.La forma obvia de obtener una lista de todas las subsecuencias sería utilizar
re.split()la división de una cadena en una expresión regular determinada. Lamentablemente, esta función no funciona para coincidencias de longitud cero. Pero afortunadamentere.sub()sí, así que simplemente reemplazamos esas coincidencias de longitud cero con espacios y dividimos la cadena en esos después de eso.Luego solo tenemos que analizar cada una de esas subsecuencias nuevamente en un número decimal con
int(s,2)y listo.fuente
Jalea, 12 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Bash + utilidades GNU, 51
Entrada tomada de STDIN.
dc -e2o?plee el entero de entrada de STDIN y genera una cadena base 2sed -r ':;s/(.)\1/\1 \1/;t'divide la cadena base 2 con un espacio en todas partes donde hay los mismos dígitos consecutivosdc -e2i?flee el binario dividido de una vez, coloca cada parte en la pila, luegofvolca toda ladcpila (números de salida en orden inverso) ...tac.fuente
JavaScript (ES6) 58
62 63Editar 1 byte guardado thx @ETHproductions
Editar 4 bytes guardados gracias a @Neil
fuente
/(01)*0?|(10)*1?/g, o eso arruinaría algo?x=>'0b'+x-0+' 'para guardar un byte./((.)(?!\2))*./gte ahorra 4 bytes geniales.Pyth, 26 bytes
Pruébalo aquí!
Explicación
iR2c: .BQ "(? <= (.)) (? = \\ 1)" d # Q = número de entrada .BQ # Convertir entrada a binario : "(? <= (.)) (? = \\ 1)" d # inserta un espacio en blanco entre las subsecuencias cadena dividida de c # en espacios en blanco iR2 # convierte cada subsecuencia en decimalDado que la función split () de Python no se divide en coincidencias de longitud cero, tengo que reemplazar esas coincidencias con un espacio y dividir el resultado en eso.
fuente
Pyth,
2221 bytesPruébelo en línea: demostración
Realmente una tarea tediosa en Pyth.
Explicación:
fuente
05AB1E , 18 bytes
Código:
Explicación:
Pruébalo en línea!
Utiliza la codificación CP-1252 .
fuente
MATL ,
1817 bytesPruébalo en línea!
fuente
zsh,
676355 bytesNo sé por qué, pero esto no funciona en Bash.
¡Gracias a Dennis por 8 bytes!
fuente
forsintaxis. ... Espera, ¿nofor?for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i].PHP,
Vista en despiece ordenado171168162160158121120131124118116113112 bytesUse
d(int)y ya está, la salida es unaechocadena ed deints separadas por un espacio.Ediciones:
-3: Se movió la
$bdefinición a lastrlen()llamada.-6: Se eliminó la
$cinstanciación.-2: Finalmente se solucionó el problema de concatenación.
-2: sin paréntesis para una sola línea
for().-37: Revisión total. Ir con
Arraychunklets en lugar de repetidasArray->String->Arrayllamadas.-1:
$creinicio furtivo .+11: corrección de errores. Faltaba la parte final. No más.
-7: ¿No necesitas instanciar
$den absoluto? Agradable.-6:
return->echo.-2: crujido
$c.-3:Ternario, mi primer amor.
-1: astuto astuto
$u.fuente
function d($i){for(;$d<$l=strlen($b=decbin($i));print$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"")$c.=$u=$b[$d];}.Convexo 0.2+, 25 bytes
Convex es un nuevo lenguaje que estoy desarrollando que se basa en gran medida en CJam y Golfscript. El intérprete y el IDE se pueden encontrar aquí . La entrada es un número entero en los argumentos de la línea de comando. Esto usa la codificación CP-1252 .
Explicación:
fuente
Java 8,
127119 bytesProbablemente haya una mejor expresión regular para dividir la cadena. No soy experto en expresiones regulares, pero seguiré experimentando.
-8 bytes gracias a @FryAmTheEggman
fuente
APL (APL) ,
2125 bytesAhora maneja 0 también.
Pruébalo en línea!
2⊥⍣¯1⊢convertir a base-2, utilizando tantos bits como sea necesario (literalmente, conversión inversa de base-2){...}aplica la siguiente función anónima0::Si ocurre algún error:0volver 0⋄ahora intenta:2=/⍵igualdad por pares del argumento (fallará una representación binaria de longitud 0 de 0)1,anteponer 1⍵⊂⍨úselo para dividir el argumento (comienza una nueva sección en cada 1)2⊥¨convertir cada uno de base-2fuente
⊂Es realmente útil aquí. Debería agregar eso a Jelly.R←X⊂Y: Con⎕ML<3(es decir, estilo Dyalog), se inicia una nueva partición en el resultado correspondiente a cada 1 en X hasta la posición anterior al siguiente 1 en X (o el último elemento de X) los elementos sucesivos de R. Con⎕ML=3(es decir, estilo IBM), se inicia una nueva partición en el resultado siempre que el elemento correspondiente en X sea mayor que el anterior. Los elementos en Y correspondientes a 0 en X no se incluyen en el resultado. Entonces⎕ML←1 ⋄ 1 0 0 1 0 1 1 ⊂ ⍳7es equivalente a⎕ML←3⋄ 4 3 2 4 4 5 7 ⊂ ⍳7`Japt , 7 bytes
Pruébalo
Explicación
fuente
Python 3, 115 bytes
Explicación
Resultados
solución anterior (118 bytes)
fuente
Haskell,
147, 145 bytesmap(sum.zipWith((*).(2^))[0..]).([]%).bes una función sin nombre que calcula la lista.Menos golfizado:
fuente
Perl, 53 bytes
Incluye +1 para
-pEjecutar con el número en STDIN
alterbits.pl:fuente
PowerShell, 103 bytes
Como soy horrible en expresiones regulares, estoy usando la misma expresión que la respuesta de edc65 .
Absolutamente destruido por las largas llamadas .NET para hacer conversión a / desde binario, y la llamada .NET para obtener las coincidencias de expresiones regulares. De lo contrario, bastante sencillo. Toma la entrada
$args[0],convertla envía al binario, la introduceMatches, toma la resultante.Values, la canaliza a través de un bucle|%{...}yconvertvuelve esos valores aint. La salida se deja en la tubería y se imprime implícitamente con nuevas líneas.Para crédito adicional: una versión (en su mayoría) no regex a 126 bytes
Nuevamente tomamos input
$args[0]yconvertlo binario. Relanzamos como un conjunto de caracteres, almacenando el primer personaje$ly los caracteres restantes en$r. Luego enviamos a$rtravés de un bucle|%{...}donde cada iteración que seleccionamos, ya sea del carácter antepuesto con un espacio o solo el carácter, dependiendo del resultado de un binario xor con$l, y luego se establece$ligual al carácter. Esto efectivamente garantiza que si tenemos el mismo personaje dos veces seguidas, anteponemos un espacio entre ellos.La salida del bucle se
-joinedita y se agrega al primer carácter$l, luego-spliten espacios (que técnicamente es una expresión regular, pero no voy a contarlo). Luego hacemos el mismo bucle que la respuesta de expresiones regulares aconvertlos enteros de salida.fuente
Java 345 bytes
Prueba
Salida
fuente
packageyclass, y la eliminación de espacios en blanco innecesarios. ¡Hazme saber si tienes alguna pregunta!Julia,
7057 bytesEsta es una función anónima que acepta un número entero y devuelve una matriz entera. Para llamarlo, asígnelo a una variable.
El enfoque aquí es similar a la buena respuesta de DenkerAffe en Python . Obtenemos la representación binaria del
nusobin(n)y dividimos la cadena resultante en todas las coincidencias de la expresión regular(?<=(.))(?=\1). En realidad es un partido de longitud cero;(?<=(.))es una mirada hacia atrás positiva que encuentra cualquier carácter individual, y(?=\1)es una búsqueda hacia adelante positiva que encuentra el carácter coincidente en la mirada hacia atrás. Esto ubica los lugares donde un número es seguido por sí mismo en la representación binaria. ¡Soloparsecada uno como un entero en la base 2 usandomapy listo!fuente
C,
137129 bytesLa entrada y la salida están en las transmisiones estándar.
fuente
puts, aunque sería desagradable de usar, la especificación no requiere una nueva línea final.J , 16 bytes
Pruébalo en línea!
Explicación
fuente
q / kdb +, 52 bytes
Solución:
Ejemplos:
Explicación:
qse interpreta de derecha a izquierda.Transmita la entrada a binario, recorte los ceros a la izquierda, encuentre índices donde sea diferente, invierta para obtener índices donde sea el mismo, divida la lista en estos índices, vuelva a convertir a base-10. Sin embargo, parece un poco pesado en comparación con la solución APL ...
fuente
PHP, 147
Es necesario poner espacio adicional al final de la salida ya que no hay restricción. Se muestran avisos para codificación corta.
Versión sin golf
fuente
Retina, 60
Pruébalo en línea! O pruebe una versión ligeramente modificada para todos los casos de prueba (con E / S decimal).
Desafortunadamente, las coincidencias de longitud cero parecen tener dos "lados", causando duplicación cuando se usa con la expresión regular de la tercera etapa. Sin embargo, solo cuesta un byte.
Toma la entrada como unaria, la salida como unaria. No estoy realmente seguro de usar diferentes valores unarios de entrada / salida, pero eso ahorraría 4 bytes.
fuente
Jelly , 9 bytes (¿no compite?)
Pruébalo en línea!
fuente