Aquí hay un rompecabezas de programación para ti:
Dada una lista de pares de cadenas y números correspondientes, por ejemplo [[A,37],[B,27],[C,21],[D,11],[E,10],[F,9],[G,3],[H,2]]
, genera otra lista que tendrá solo las cadenas de la siguiente manera:
El recuento total de cualquier cadena debe ser exactamente igual a su número correspondiente en los datos de entrada.
No se debe repetir ninguna cadena adyacente en la secuencia, y cada cadena debe aparecer en la lista de salida.
La selección de la siguiente cadena debe hacerse al azar siempre que no rompan por encima de dos reglas. Cada solución debe tener una probabilidad distinta de cero de ser elegida.
Si no es posible una combinación, la salida debería ser justa
0
.
La lista de entrada se puede dar en cualquier orden (ordenada o no), y las cadenas de la lista pueden tener cualquier longitud.
Salida de muestra para la entrada de muestra anterior 1
[A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,G,H,G,H,G]
Muestra de entrada 2:
[[A,6],[B,1],[C,1]]
Salida para la segunda entrada:
0
ya que no es posible una lista basada en reglas.
Entrada de muestra 3:
[[AC,3],[BD,2]]
salida válida: [AC,BD,AC,BD,AC]
salida inválida: [AC,BD,AC,AC,BD]
Si necesita más aclaraciones, no dude en informarme en los comentarios y actuaré de inmediato.
Este es el código de golf , por lo que gana el código más corto en bytes para cada idioma.
Respuestas:
Jalea , 11 bytes
Pruébalo en línea!
fuente
Œṙ
no se vectoriza, funcionaría sin'
Jalea , 17 bytes
Pruébalo en línea!
fuente
["A", 100], ["B", 3]
, no muestra nada, está atascado, creo.Œ!
tendrá 99029007164861804075467152545817733490901658221144924830052805546998766658416222832141441073883538492653516385977292093222882134415149891584000000000000000000000000 elementos.O(n!)
pero es corta y la velocidad no importa. No lo intente con nada donde los números sumen más de aproximadamente 6-8: PŒṙ
ayudar?["AT", 3], ["B", 3]
y obtuveTBATATBAB
como resultado, lo cual es incorrectoPython 2 ,
114189185174 bytesPruébalo en línea!
¡Ay! Mucho más difícil con la regla 3 ... :). Todavía trato de evitar el
O(n!)
enfoque, para que pueda manejar todos los casos de prueba en algún momento antes de la muerte por calor del universo ...Algoritmo: supongamos que la suma total de los recuentos de cadenas es
t
. Si cualquier cadena tiene un recuenton
con2*n>t+1
, entonces no es posible satisfacer las restricciones. Por lo tanto, si cualquier cadena (excluyendo el elegido previamente) tiene recuenton
con2*n=t+1
, entonces debemos elegir esa cadena siguiente. De lo contrario, podemos elegir al azar cualquier cadena que no sea la cadena elegida previamente.fuente
R ,
148141 bytesPruébalo en línea! (He copiado
combinat::permn
y lo llamécombinatXXpermn
allí).Fuerza bruta O (n!) Solución.
Usos
permn
delcombinat
paquete para generar todos los pedidos posibles. Luego verifica si alguno sigue las reglas y elige uno de ellos al azar.fuente
n<-sum(n|1)
Es un byte más corto, creo. Pero la peculiaridad desample
una entrada de longitud uno es bastante frustrante aquí.JavaScript, 112 bytes
Primer pase en esto, más golf para (con suerte) seguir.
Pruébalo en línea
fuente
J,
6053 bytes-7 gracias a FrownyFrog
original
sin golf
Sugerencias de mejora bienvenida.
Pruébalo en línea!
fuente
[:*/2~:/\|:
es dos más cortoJavaScript (ES6), 160 bytes
Pruébalo en línea!
fuente
Carbón , 38 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Repita mientras haya al menos un recuento distinto de cero.
Encuentre cualquier conteo que represente más de la mitad del resto.
Si no hubo uno, simplemente tome los recuentos distintos de cero filtrados anteriormente.
Filtre la cadena que salió la última vez.
Asigne un elemento aleatorio de la primera no vacía de las dos listas anteriores a la última cadena de salida. Tenga en cuenta que si se ingresa una combinación imposible, el programa se bloqueará en este punto.
Imprime la cadena.
Disminuya su recuento.
fuente
["h4x0r", 1337]
incluido como una cadena.Ruby , 85 bytes
El enfoque de la fuerza bruta (gracias a Jonás por la idea).
Pruébalo en línea!
Ruby ,
10810096 bytesAnteriormente, el enfoque de Bogosort
Pruébalo en línea!
fuente
Rust 633 bytes
Lo que hace que esto sea un poco diferente a los demás es que comenzó con la idea de reorganizar las cadenas simulando un sistema físico. Cada cadena se duplica primero el número apropiado de veces. Luego, cada cadena individual se trata como una Partícula en un espacio. Dos partículas con el mismo valor de cadena se "repelen" entre sí, mientras que dos partículas con valores diferentes se atraen entre sí. Por ejemplo, si comenzamos con AAAAAAABBBBCC, los As se derogarán entre sí, alejándose unos de otros, permitiendo que los Bs se muevan entre ellos. Con el tiempo esto alcanza una buena mezcla de partículas. Después de cada iteración de "movimiento de partículas", el programa verifica que no haya partículas iguales, luego se detiene e imprime el estado del sistema, que es simplemente la lista de cadenas en orden, tal como aparecen en el espacio unidimensional.
Ahora, cuando se trata de implementar ese sistema físico, comenzó utilizando la antigua técnica de demostración / juego de PC, para almacenar cada posición y velocidad de las partículas como números, luego pasa por iteraciones para actualizar la posición y la velocidad. En cada iteración, estamos agregando velocidad a la posición (movimiento), y agregando aceleración a la velocidad (cambio en la velocidad de movimiento), y calculando la aceleración (encontrando la fuerza sobre la partícula). Para simplificar, el sistema no calcula la fuerza sobre cada partícula en función de todas las demás partículas, solo verifica las partículas inmediatamente adyacentes. También hubo un efecto de 'amortiguación' para que las partículas no se aceleren demasiado y vuelen hasta el infinito (la velocidad se reduce en un porcentaje x cada paso, por ejemplo).
A través del proceso de golf, sin embargo, todo esto fue cortado y simplificado drásticamente. Ahora, en lugar de dos partículas iguales que se repelen, simplemente se "teletransportan". Las diferentes partículas simplemente se escapan un poco para evitar el estancamiento en el sistema. Por ejemplo, si A está al lado de A, se teletransportará. Si A está al lado de B, solo cambiará ligeramente. Luego verifica si se cumplen las condiciones (no hay partículas adyacentes) e imprime las cadenas en orden, en función de su posición en el espacio 1-d. Es casi más como un algoritmo de clasificación que una simulación; de nuevo, uno podría ver los algoritmos de clasificación como una forma de 'deriva' simulada basada en 'masa'. Estoy divagando.
De todos modos, este es uno de mis primeros programas de Rust, así que me di por vencido después de varias horas de golf, aunque todavía podría haber oportunidades allí. El análisis de bits es difícil para mí. Lee la cadena de entrada de la entrada estándar. Si lo desea, podría reemplazarse con "let mut s =" [[A, 3], [B, 2]] ". Pero ahora sí 'echo [[A, 3], [B, 2]] | carga "en la línea de comando.
El cálculo de la detención es un poco problemático. ¿Cómo detectar si nunca se alcanzará un estado válido del sistema? El primer plan fue detectar si el estado 'actual' alguna vez repitió un estado anterior, por ejemplo, si ACCC cambia a CACC pero luego regresamos a ACCC, sabemos que el programa nunca terminará, ya que es solo pseudoaleatorio. Entonces debería rendirse e imprimir 0 si eso sucediera. Sin embargo, esto parecía una gran cantidad de código Rust, por lo que en su lugar decidí que si pasa por un gran número de iteraciones, probablemente esté bloqueado y nunca alcanzará un estado estable, por lo que imprime 0 y se detiene. ¿Cuántos? El número de partículas al cuadrado.
Código:
fuente
regex
caja.JavaScript (Node.js) , 249 bytes
Pruébalo en línea!
fuente
Java (JDK 10) , 191 bytes
Pruébalo en línea!
Esto nunca vuelve si no hay soluciones.
fuente