Las envolturas de burbujas son entretenimiento de máximo nivel. Todos pueden estar de acuerdo con eso.
Ahora, incluso las computadoras disfrutarán de envolturas de burbujas.
Especificaciones
Se le darán dos enteros, w, y h. (Cada uno responde de ancho y alto)
Su programa debe generar todas las fases w * h esperando 1 segundo entre cada una y finalizar.
Cada envoltura de burbujas comienza con todas las celdas llenas.
Por ejemplo, una envoltura de burbuja de 4 * 6 comienza como:
O_O_
_O_O
O_O_
_O_O
O_O_
_O_O
Y en cada fase, se abre una celda aleatoria no reventada. Por ejemplo,
O_O_
_O_O
O_X_
_O_O
O_O_
_O_O
El programa debe finalizar cuando todas las celdas se abren. aka.
X_X_
_X_X
X_X_
_X_X
X_X_
_X_X
Ejemplos
(4,6)
(5,5)
(6,2)
(10,10)
(7,9)
1
y en0
lugar deO
yX
?(1,1)
no tenga burbujas (por ejemplo, la "celda" superior izquierda siempre es un guión bajo)?Respuestas:
C (Windows),
260248 bytesfuente
system("cls")
también es específico de Windows, por lo que el código tampoco sería más portátil con la biblioteca de hilos. Y con C ++ también necesitaría incluiriostream
ocstdio
.Python 3 ,
222220 bytesEsta es la primera vez que respondo, así que sea amable (y señale los errores que he cometido).
Pruébalo en línea!
Cómo funciona:
r*c+r%2*c%2
tiempos: hayr*c
burbujas en el patrón, a menos que r y c sean impares, en cuyo caso las hayr*c+1
.fuente
f(c,r)
y estarás bien).MATL , 37 bytes
La esquina superior izquierda siempre es un guión bajo (permitido por el desafío).
La pantalla se borra entre fases. Podría guardar un byte al no borrar la pantalla, pero se ve mejor de esta manera.
El programa sale con un error ( permitido por defecto ) después de mostrar todas las fases.
¡Pruébalo en MATL Online! (Si no funciona después de un par de segundos, actualice la página e intente nuevamente).
fuente
Mathematica (145 bytes)
Función anónima, toma la altura y el ancho como entrada (en ese orden; si eso es un problema, reemplácelo
{##}
con{#2,#}
en el medio del código para un extra de 2 bytes).Código:
Explicación:
""<>Riffle[Array["_"["O"][[Mod[#+#2,2]]]&,{##}],"\n"]
crea la envoltura de burbuja inicial, sin reventar, haciendo una matriz de "_" sy "O" y luego uniendo Cadena entre líneas nuevas.NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,..., Floor[##/2]]
elige repetidamente una de las "O" para reemplazar con una "X", tantas veces como haya "O" (que es Floor [width * height / 2] - gracias a @JonathanAllan por la idea de poner "_ "en lugar de" O "en la esquina superior izquierda, de lo contrario esto seríaCeiling
lugar y, por lo tanto, 2 bytes más).Monitor[Do[Pause@1,{i,...}],i]
marcasi
toman los valores de la lista que acabamos de calcular, durante 1 segundo cada uno, de forma dinámica y grabadosi
.Salida de ejemplo:
fuente
Jalea ,
3029 bytesLlama al enlace como una diada con los argumentos del programa y luego se cierra con un mensaje (cuyo código es
çṛ“\'=ṙMḋḌẓ(ėo»
)Matiz: la "celda" inferior derecha siempre será una burbuja (en lugar de la superior izquierda como el ejemplo de la pregunta), esto es para garantizar que cuando se reventan todas las burbujas, la opción aleatoria devuelve 0, que será
"X"
el final de la lista: reemplazar eso no cambia el valor y rompe el ciclo.Nota: no borra la pantalla (no se especificó, y no estoy seguro de cómo hacerlo).
¿Cómo?
fuente
Scala , 764 bytes
Cómo funciona
El algoritmo primero llena una secuencia 2D con valores falsos. Determina cuántas iteraciones (cuadros abiertos) existen en función de los argumentos de la línea de comando introducidos. Crea un pliegue con este valor como límite superior. El valor entero del pliegue solo se usa implícitamente como una forma de contar cuántas iteraciones debe ejecutar el algoritmo. La secuencia rellena que creamos anteriormente es la secuencia de inicio para el pliegue. Esto se utiliza en la generación de una nueva secuencia 2D de valores falsos con sus indecisiones de co-respuesta.
Por ejemplo,
Se convertirá en
Tenga en cuenta que todas las listas que son completamente verdaderas (tienen una longitud de 0) se omiten de la lista de resultados. El algoritmo luego toma esta lista y elige una lista aleatoria en la lista más externa. La lista aleatoria se elige como la fila aleatoria que elegimos. Desde esa fila aleatoria, nuevamente encontramos un número aleatorio, un índice de columna. Una vez que encontramos estos dos índices aleatorios, dormimos el hilo en el que estamos durante 1000 milisegundos.
Una vez que terminamos de dormir, limpiamos la pantalla y creamos un nuevo tablero con un
true
valor actualizado en los índices aleatorios que hemos creado.Para imprimir esto correctamente, lo usamos
map
y lo comprimimos con el índice del mapa para tenerlo en nuestro contexto. Usamos el valor de verdad de la secuencia en cuanto a si debemos imprimir unaX
o unaO
o_
. Para elegir este último, utilizamos el valor del índice como nuestra guía.Cosas interesantes a tener en cuenta
Para determinar si debe imprimir una
O
o una_
,((r._2 % 2) + c._2) % 2 == 0
se usa el condicional .r._2
se refiere al índice de fila actual mientras que sec._2
refiere a la columna actual. Si uno está en una fila impar,r._2 % 2
será 1, por lo tanto, compensadoc._2
por uno en el condicional. Esto asegura que en filas impares, las columnas se muevan en 1 según lo previsto.Imprimir la cadena
"\033[H\033[2J\n"
, de acuerdo con alguna respuesta de Stackoverflow que leí, borra la pantalla. Está escribiendo bytes en la terminal y haciendo algunas cosas funky que realmente no entiendo. Pero he descubierto que es la forma más fácil de hacerlo. Sin embargo, no funciona en el emulador de consola de Intellij IDEA. Tendrás que ejecutarlo usando una terminal regular.Otra ecuación que uno puede encontrar extraño al ver este código por primera vez es
(l * k) / 2 - (l * k + 1) % 2
. Primero, desmitifiquemos los nombres de las variables.l
se refiere a los primeros argumentos pasados al programa mientras que sek
refiere al segundo. Para traducirlo,(first * second) / 2 - (first * second + 1) % 2
. El objetivo de esta ecuación es llegar a la cantidad exacta de iteraciones necesarias para obtener una secuencia de todas las X. La primera vez que hice esto, hice lo(first * second) / 2
que tenía sentido. Para cadan
elemento en cada sublista, hayn / 2
burbujas que podemos reventar. Sin embargo, esto se rompe cuando se trata de entradas como(11 13)
. Necesitamos calcular el producto de los dos números, hacerlo impar si es par, e incluso si es impar, y luego tomar el mod de eso por 2. Esto funciona porque las filas y columnas que son impares requerirán una iteración menos para llegar al resultado final.map
se usa en lugar de aforEach
porque tiene menos caracteres.Cosas que probablemente puedan mejorarse
Una cosa que realmente me molesta de esta solución es el uso frecuente de
zipWithIndex
. Está tomando tantos personajes. Traté de hacerlo para poder definir mi propia función de un solo carácter que solo funcionaríazipWithIndex
con el valor pasado. Pero resulta que Scala no permite que una función anónima tenga parámetros de tipo. Probablemente haya otra forma de hacer lo que estoy haciendo sin usar,zipWithIndex
pero no he pensado demasiado en una forma inteligente de hacerlo.Actualmente, el código se ejecuta en dos pases. El primero genera un nuevo tablero mientras que el segundo pase lo imprime. Creo que si uno combinara estos dos pases en uno solo, ahorraría un par de bytes.
Este es el primer código de golf que he hecho, así que estoy seguro de que hay mucho margen de mejora. Si desea ver el código antes de que optimice los bytes tanto como sea posible, aquí está.
fuente
JavaScript (ES6),
246229 bytesfuente
`${`_O`.repeat(w).slice(w)} ${`O_`.repeat(w).slice(w)}
¿combinarse de alguna manera? Tal vez una bandera booleana para determinar primero_O
oO_
, y luego hacer el.repeat(w).slice(w)
?Python - 290 bytes
Nunca he hecho uno de estos antes, por lo que cualquier crítica constructiva sería apreciada :)
El truco principal aquí es solo comprensiones de listas molestamente anidadas. Podría salvar algunos personajes al no tener una nueva línea entre los pops, pero eso se ve feo.
fuente
w
yh
como entrada (a través de STDIN, como una entrada de función, o algo similar), en lugar de tener un código rígidoH=4 W=6
. Además, aunque nunca programé en Python, creo que puedes jugar algunos espacios en tu código actual. Los consejos para jugar golf en Python también pueden ser interesantes de leer para darle ideas sobre cómo jugar más golf. ¡Disfruta tu estancia! :)Carbón ,
494639 bytes (sin competencia)Verboso
fuente
APL (Dyalog) ,
6159 bytes⎕←
salidam←
m , donde m es'O_'[
...]
estos caracteres indexados por ...2|
la división-resto-cuando-dividido-por-dos de-/¨
la diferencia entre cada una de⍳
todas las coordenadas (índices) en una matriz de⎕
entrada numérica de forma (el número de filas y columnas )(
...)[
...]←'X'
asigne el carácter X a uno de los ... elementos desglosadosb/
filtrados por b (por definir),m
de m, específicamente ...?
un elemento aleatorio (número iluminado) en el rango uno a+/
la suma deb←
b , donde b es'O'=
booleano para donde la letra es igual a,m
m raveled⎕DL 1
D e l ay un segundo→2
Vaya a la línea 2/⍨
si (literalmente, filtrado por)'O'∊
si la letra es un miembro del⎕←m
valor de salida, donde el valor de salida es mPruébalo en línea!
A partir de la versión 16.0 será más corto:
{0::→⋄'X'@(⊂(?∘≢⊃⊢)⍸'O'=⍵⊣⎕DL 1)⊢⎕←⍵}⍣≡'O_'[2|-/¨⍳⎕]
fuente
Python 3,
195188 bytesUsando
bytearray
ydecode
parece ser más corto que cortar y volver a ensamblar una cuerda a laa[:i]+'X'+a[i+1:]
.fuente
Java 7, 317 bytes
Explicación:
Prueba gif (4,6)
fuente
Perl, 148 bytes
146 bytes de código +
-pl
banderas.Para ejecutarlo:
fuente
MATLAB (R2016b), 172 bytes
Código:
¡Las recomendaciones son siempre bienvenidas! Pruébalo en línea!
Salida del programa:
Explicación:
fuente