Introducción
Definí la clase de permutaciones ansiosas en un desafío anterior . Como recordatorio, una permutación p de los números del 0 al r-1 es inquietante, si para cada entrada p [i] excepto la primera, hay alguna entrada anterior p [ik] tal que p [i] == p [ ik] ± 1 . Como dato curioso, también dije que para r ≥ 1 , hay exactamente 2 permutaciones ansiosas de r-1 de longitud r . Esto significa que existe una correspondencia biunívoca entre las permutaciones inquietas de longitud r y los vectores binarios de longitud r-1. En este desafío, su tarea es implementar dicha correspondencia.
La tarea
Su tarea es escribir un programa o función que tome un vector binario de longitud 1 ≤ n ≤ 99 y genere una permutación inquieta de longitud n + 1 . La permutación puede estar basada en 0 o en 1 (pero esto debe ser coherente), y la entrada y la salida pueden estar en cualquier formato razonable. Además, las diferentes entradas siempre deben dar diferentes salidas; Aparte de eso, puede devolver cualquier permutación ansiosa que desee.
El conteo de bytes más bajo gana.
Ejemplo
Las permutaciones ansiosas (basadas en 0) de longitud 4 son
0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
2 1 0 3
2 1 3 0
2 3 1 0
3 2 1 0
y su programa debería devolver uno de ellos para cada uno de los vectores de ocho bits de longitud 3:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
fuente
0 1
y0 0 1
debe dar salidas de diferentes longitudes.Respuestas:
Jalea ,
121110 bytesPruébalo en línea! o generar todas las permutaciones de longitud 4 .
Cómo funciona
fuente
Python 2,
6260 bytes¡Gracias a @xnor por jugar 2 bytes!
Pruébelo en Ideone .
fuente
x=0,
?0,
Es una tupla. Sin la coma, el mapeo sobre x fallaría.n
para hacer[n*len(x)]
y cambiar el mapa a una lista de comp.Python, 54 bytes
Utiliza el siguiente procedimiento:
Por ejemplo,
l=[1,0,1,0]
daf(l) == [2,1,3,0,4]
Anteponer un 0 también daría el mismo resultado. El
enumerate
es torpe, veré si puede hacerlo mejor recursivamente.fuente
sum
y la sintaxis de corte.JavaScript (ES6),
484745 bytesEsto resultó ser similar al método de @ETHproductions, excepto que había comenzado calculando directamente el primer elemento y luego usando el vector binario para determinar si cada dígito es un nuevo máximo o un nuevo mínimo. Editar: guardado 1 byte gracias a @ETHproductions. Ahorró 2 bytes comenzando con cero y ajustándolo después. Mi método anterior resultó ser similar al método de @ Dennis, pero tomó 54 bytes:
fuente
Perl, 33 bytes
Incluye +1 para
-p
Dar vector como cadena sin espacios en STDIN:
antsy.pl
:fuente
JavaScript (ES6), 52 bytes
Pruébalo:
Explicación
Esto aprovecha el hecho de que cuando se revierte una permutación inquieta, cada elemento es 1 más que el máximo de las entradas bajas anteriores o 1 menos que el mínimo de las entradas altas anteriores. Al denotar un elemento superior como ay un elemento
0
inferior como a1
, podemos crear una correspondencia exacta uno a uno entre las permutaciones ansiosas de longitud ny los vectores binarios de longitud n - 1 .Lo mejor que puedo hacer con la técnica de Dennis es
5751 bytes:La solución de xnor es 56 (se guardó 1 byte gracias a @Neil):
fuente
i-i*x
podría seri*!x
.Haskell, 40 bytes
La solución Python de Dennis juega al golf maravillosamente en Haskell con
map
yfold
. Es más corto que mis intentos de portar mi construcción directa de entrada:fuente
Lote, 127 bytes
Toma la entrada como parámetros de línea de comando, la salida está separada por línea. (Es posible ingresar datos separados por espacios en STDIN sin costo adicional).
fuente