Ayer hice esta pregunta sobre el riffle shuffles. Parece que la pregunta de ayer fue demasiado difícil, por lo que esta es una tarea relacionada pero mucho más fácil.
Hoy se le pide que determine si una permutación es en realidad una mezcla aleatoria. Nuestra definición de riffle shuffle está adaptada de nuestra última pregunta:
La primera parte del shuffle es la división. En la división se divide el mazo de cartas en dos. Las dos subsecciones deben ser continuas, mutuamente excluyentes y exhaustivas. En el mundo real, desea que su partición sea lo más parecida posible, sin embargo, en este desafío esto no es una consideración, todas las particiones, incluidas las que están degeneradas (una partición está vacía) son de igual consideración.
Después de haber sido particionadas, las tarjetas se unen de tal manera que las tarjetas mantienen su orden relativo dentro de la partición de la que son miembros . Por ejemplo, si la carta A está antes de la carta B en el mazo y las cartas A y B están en la misma partición, la carta A debe estar antes de la carta B en el resultado final, incluso si el número de cartas entre ellas ha aumentado. Si A y B están en particiones diferentes, pueden estar en cualquier orden, independientemente de su orden inicial, en el resultado final.
Cada riffle shuffle se puede ver como una permutación del mazo de cartas original. Por ejemplo la permutación
1,2,3 -> 1,3,2
es un riffle shuffle Si divides la baraja así
1, 2 | 3
vemos que cada tarjeta 1,3,2
tiene el mismo orden relativo que todas las demás tarjetas de su partición. 2
Todavía está después 1
.
Por otro lado, la siguiente permutación no es un riffle shuffle.
1,2,3 -> 3,2,1
Podemos ver esto porque para las dos particiones (no triviales)
1, 2 | 3
1 | 2, 3
Hay un par de cartas que no mantienen su orden relativo. En la primera partición 1
y 2
cambiar su orden, mientras que en la segunda partición 2
y 3
cambiar su orden.
Tarea
Dada una permutación a través de cualquier método razonable, determine si representa una combinación aleatoria válida. Debe generar dos valores constantes distintos, uno para "Sí, este es un aleatorio" y otro para "No, no es un aleatorio".
Este es el código de golf, por lo que las respuestas se puntuarán en bytes, siendo mejores menos bytes.
Casos de prueba
1,3,2 -> True
3,2,1 -> False
3,1,2,4 -> True
2,3,4,1 -> True
4,3,2,1 -> False
1,2,3,4,5 -> True
1,2,5,4,3 -> False
5,1,4,2,3 -> False
3,1,4,2,5 -> True
2,3,6,1,4,5 -> False
fuente
0
para falso pero ¿algún entero[1, +∞)
para verdad?[3,1,4,2,5]
.[2,3,6,1,4,5]
.[0, ..., n-1]
lugar de[1, ..., n]
como entrada?Respuestas:
JavaScript (ES6), 47 bytes
Toma datos como una matriz de enteros. Devuelve un booleano.
Casos de prueba
Mostrar fragmento de código
¿Cómo?
La matriz de entrada A es una combinación aleatoria válida si consta de como máximo dos secuencias entrelazadas distintas de enteros consecutivos.
Las reglas de desafío especifican que tenemos una permutación de [1 ... N] . Por lo tanto, no es necesario que verifiquemos adicionalmente que la unión ordenada de estas secuencias realmente resulte en dicho rango.
Usamos un contador x inicializado en A [0] y un contador y inicialmente indefinido.
Para cada entrada z en A , comenzando con la segunda:
fuente
Haskell , 41 bytes
Pruébalo en línea!
Comprueba si la lista concatenada a sí misma contiene los números
0..n-1
en orden como subsecuencia.fuente
Haskell , 43 bytes
s
toma una lista de enteros como en los ejemplos de OP y devuelve aBool
.Pruébalo en línea!
Cómo funciona
x
dep
a su vez y comprueba si puede ser el primer elemento de la segunda partición del shuffle. Luegoor
regresaTrue
si alguno de los cheques fueronTrue
.filter
)p
en elementos más pequeños y más grandes que (o iguales a)x
, concatenando y verificando si la lista resultante es[1..length p]
, es decir, los elementos en orden.[1..length p]
se realiza al ver si el resultado es estrictamente más pequeño que la lista infinita[1..] == [1,2,3,etc.]
, lo que da el mismo resultado para cualquier permutación.fuente
Jalea ,
136 bytesPruébalo en línea!
Versión alternativa, desafío de fecha posterior, 5 bytes
Pruébalo en línea!
Cómo funciona
fuente
Python 2 , 39 bytes
Pruébalo en línea!
Toma la lista indexada en 0 y las salidas a través del código de salida.
fuente
Brachylog , 9 bytes
Pruébalo en línea!
El predicado tiene éxito si la entrada representa un riffle shuffle y falla si no lo hace, lo que significa, entre otras cosas, que si el predicado se ejecuta como un programa completo, el éxito se imprimirá
true.
y el fracaso se imprimiráfalse.
. La entrada se toma como una lista de cualquier tipo de elementos y se interpreta como una permutación de sí misma ordenada.Siento que hay algo en el espíritu
⊆ᵐ
que debería funcionar en lugar de la construcción de "sandwich" de cuatro bytes⟨⊆⊇⟩
.fuente
Python 2 ,
756047 bytesgracias a Dennis por -13 bytes
Pruébalo en línea!
La salida es a través del código de salida.
fuente
Ruby , 35 bytes
Pruébalo en línea!
¿Cómo?
l & [*1..a] | l
aplica una intersección y luego una unión: primero obtenga los elementosl
que son<=a
y luego agregue los elementos restantes del
sin cambiar el orden. Si a es el número que estamos buscando, entonces esta operación es lo mismo que ordenarl
.fuente
Limpio ,
5655 bytesPruébalo en línea!
fuente
Pyth, 5 bytes
Banco de pruebas
Comprueba si la lista de entrada duplicada contiene una versión ordenada de sí misma como subsecuencia.
Gracias a Erik the Outgolfer por 1 byte aprovechando mejor la entrada implícita con en
+QQ
lugar de*2Q
.fuente
}SQy+
. Se expande a}SQy+QQ
.Pyth , 9 bytes
Banco de pruebas.
Guardado 3 bytes gracias a isaacg .
Pyth , 14 bytes
Pruébalo aquí! o Verificar todos los casos de prueba.
Salidas
True
yFalse
para riffle-shuffle y non-riffle-shuffle respectivamente.¿Cómo?
fuente
<#0
se puede reemplazar por-
2 bytes más.Casco , 7 bytes
¡Banco de pruebas!
fuente
Perl, 28 bytes
Incluye
+1
paraa
Entrada en STDIN, 1 basado
Utiliza el algoritmo de xnor
fuente
C (gcc) , 61 bytes
Pruébalo en línea!
fuente