Considere el siguiente proceso:
Tome un número entero no negativo N.
por ejemplo, N =
571
Exprésalo en binario sin ceros a la izquierda. (Cero en sí mismo es la única excepción, convirtiéndose
0
)eg
571
=1000111011
en binarioSepare series consecutivas de unos y ceros en esta representación binaria.
por ejemplo,
1000111011
→1
,000
,111
,0
,11
Ordena las carreras de la más larga a la más corta.
por ejemplo
1
,000
,111
,0
,11
→000
,111
,11
,1
,0
Sobrescriba todos los dígitos en cada ejecución alternando
1
'sy0
' s, siempre comenzando con1
's.por ejemplo
000
,111
,11
,1
,0
→111
,000
,11
,0
,1
Concatena el resultado para obtener un nuevo número binario.
por ejemplo
111
,000
,11
,0
,1
→1110001101
=909
en decimal
Cuando traza los valores producidos por este proceso, obtiene un gráfico bastante ordenado:
Y es de esperar que sea evidente por qué llamo a la secuencia resultante la secuencia Temple Skyline :
Reto
Escriba un programa o función que tome un número entero no negativo N e imprima o devuelva el número de secuencia correspondiente de Temple Skyline. Su entrada y salida deben estar en decimal.
Por ejemplo, si la entrada es 571
la salida debería ser 909
.
El código más corto en bytes gana.
Como referencia, aquí están los términos en la secuencia de N = 0 a 20:
0 1
1 1
2 2
3 3
4 6
5 5
6 6
7 7
8 14
9 13
10 10
11 13
12 12
13 13
14 14
15 15
16 30
17 29
18 26
19 25
20 26
.BQ
lugar dejQ2
, lo que significa que puede perder el espacio entre el8
y el precedente2
.is*R`s=!Z_ShMr.BQ8 2
Es una solución interesante de la misma longitud. Principalmente publicando porque realmente no esperaba que la asignación en un argumento de mapa funcionara.`s
con]
. Guarda un byte.Python 2, 121 bytes
125121: ¡Gracias a Sp3000 por reducir 4 bytes!
125
fuente
n*`~i%2`for
lugar de"10"[i%2]*n for
sorted(...,key=len)
lugar de usarmap(len,...
pero no entiendo completamente su programa en este momento, así que no estoy seguro de que eso lo beneficie.len
porque esa es la única información que necesito para replicar la cantidad de 1 y 0. Probé su sugerencia y agrega 2 bytes, ya que tendré que usarlalen
dos veces, ¡pero gracias por la sugerencia!JavaScript ES6, 110 bytes
113116119120Guardado 3 bytes gracias a @intrepidcoder
Guardado 3 bytes gracias a @NinjaBearMonkey
Enfoque directo hacia adelante. No me gusta la longitud de la función de clasificación, pero no puedo pensar en una forma de jugar golf.
fuente
+
lugar deeval
.split(/(0+)/g)
debería poder reemplazarlomatch(/(.)\1*/g)
.+(s=0, ... .map(l=>l.replace(/./g,s^=1))...)
C ++,
535527 bytes(Gracias Zereges por recortar algunos bytes).
Ahora que nos hemos librado de esos bytes, el programa ahora es competitivo;)
Soy nuevo en el golf, así que por favor dame algunos consejos en los comentarios .
Cosas como "no necesita esos corchetes" o "use printf" son útiles, pero también agradezco los consejos sobre la lógica. ¡Gracias por adelantado!
Para facilitar la lectura, presento la versión sin golf:
EDITAR la versión de golf bajó un par de bytes, la versión sin golf no cambió
fuente
int a; int b;
usarint a,b;
. También las variables en el ámbito global se inicializan con0
. Además, no tiene que usar llaves cuando solo hay un comando para ejecutar. Tambiénones=!ones;
se puede simplificar comoones ^= 1;
for
ciclo1
, es decir,for(int i=D;i;i--)
y úsalopow(2,i-1)
dentro del ciclo.ones
también puede serint
. Tal vez macroingint(pow(i))
enP(i)
. Le recomendaría que lea la discusión aquíHaskell,
132131 bytesEjemplo de uso:
Cómo funciona:
fuente
J - 30 bytes
Función que toma un entero a la derecha. Maneja correctamente 0.
#:
- Tomar la representación binaria.1,2~:/\]
- Entre cada dígito, informe Verdadero si son diferentes. Anteponga un Verdadero para que la lista tenga Verdadero al comienzo de cada "ejecución".(#;.1~...)
- Usando el vector booleano anterior, tome la longitud de cada ejecución.\:~
- Ordene estas longitudes de mayor a menor.2|#\
- Tome una lista de alternar1 0 1 0 ...
tanto como la lista de longitudes.(...#...)
- Para cada número a la izquierda (longitudes ordenadas), tome la mayor cantidad de elementos correspondientes a la derecha (alternando 1 y 0)&.
- Convierta esta nueva representación binaria a un número.Ejemplos:
fuente
Perl 5.10,
121101Creo que la parte de clasificación puede ser más corta.
Editar: -20 bytes, gracias a symbabque!
fuente
\n
, ym
no es necesario para la coincidencia de expresiones regulares. En su sustitución, simplemente use en.
lugar del grupo char.grep
parte tampoco. Eloct
es limpio aunque :)Python 3,
146136bytesfuente
map
con unlambda
, ¿sería mejor hacerlo''.join(... for ... in ...)
?Mathematica, 83 bytes
Esto define una función sin nombre.
fuente
Ruby,
107104102 bytes(guardado 3 bytes gracias a nimi )
No voy a vencer a los gustos de CJam, pero lo tengo bastante pequeño para un lenguaje sensato.
fuente
(i+=1)%2
esi=1-i
.Java 8,
179176 bytesUsé dos importaciones estáticas:
java.util.Integer.highestOneBit
yjava.util.Arrays.sort
.Para facilitar la lectura, aquí está el código sin golf:
fuente
Python 2, 170 bytes
fuente
t(0) = 0
cuándo1
se espera yt(4) = 1
cuándo se espera 6