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 0
y 1
alternos.
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\n3
donde\n
son 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)/3
o 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
|tac
permanecerá 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
tJ
por+dJ
puede eliminarhM
.Mathematica, 47 bytes
Sin golf:
Split[list,f]
divide una lista en varias listas, rompiendo en la posición entrea
yb
si 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
n
en 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?p
lee 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?f
lee el binario dividido de una vez, coloca cada parte en la pila, luegof
volca toda ladc
pila (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))*./g
te ahorra 4 bytes geniales.Pyth, 26 bytes
Pruébalo aquí!
Explicación
Dado 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
for
sintaxis. ... 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 unaecho
cadena ed deint
s separadas por un espacio.Ediciones:
-3: Se movió la
$b
definición a lastrlen()
llamada.-6: Se eliminó la
$c
instanciació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
Array
chunklets en lugar de repetidasArray
->String
->Array
llamadas.-1:
$c
reinicio furtivo .+11: corrección de errores. Faltaba la parte final. No más.
-7: ¿No necesitas instanciar
$d
en 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:0
volver 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 ⊂ ⍳7
es 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..]).([]%).b
es una función sin nombre que calcula la lista.Menos golfizado:
fuente
Perl, 53 bytes
Incluye +1 para
-p
Ejecutar 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]
,convert
la envía al binario, la introduceMatches
, toma la resultante.Value
s, la canaliza a través de un bucle|%{...}
yconvert
vuelve 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]
yconvert
lo binario. Relanzamos como un conjunto de caracteres, almacenando el primer personaje$l
y los caracteres restantes en$r
. Luego enviamos a$r
travé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$l
igual 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
-join
edita y se agrega al primer carácter$l
, luego-split
en 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 aconvert
los enteros de salida.fuente
Java 345 bytes
Prueba
Salida
fuente
package
yclass
, 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
n
usobin(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. ¡Soloparse
cada uno como un entero en la base 2 usandomap
y 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:
q
se 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