El videojuego Minecraft se trata de colocar y eliminar diferentes tipos de bloques en la red de enteros 3D que conforma el mundo virtual. Cada punto de la red puede contener exactamente un bloque o estar vacío (un bloque " aéreo " oficialmente). En este desafío, solo nos ocuparemos de un plano horizontal 2D del mundo 3D y un tipo de bloque: cofres .
Los cofres permiten a los jugadores almacenar artículos. Cuando dos cofres son adyacentes ortogonalmente en el mismo plano horizontal, sus texturas se unen y se forma un cofre doble con el doble de capacidad. No se puede hacer nada más grande que un cofre doble; no hay cofres triples ni cofres cuádruples.
Un bloque de cofre solo se puede colocar en un punto de celosía vacío si sus cuatro puntos adyacentes ortogonalmente están todos vacíos, o si exactamente uno contiene un bloque de cofre que aún no es parte de un cofre doble. Estas reglas de colocación aseguran que nunca haya ambigüedad sobre qué bloques de cofres se vinculan para formar cofres dobles.
Por ejemplo, supongamos que .
es un espacio vacío y C
es un cofre: (Los números también son espacios vacíos y solo con fines de identificación).
.......C..
.1.C2.C3..
........5C
.CC4..CC..
..........
- Se puede colocar un cofre en el lugar 1 porque sus 4 vecinos están vacíos.
- Se puede colocar un cofre en el lugar 2 porque el cofre vecino no es (todavía) parte de un cofre doble.
- No se puede poner un cofre en el lugar 3 porque habría ambigüedad sobre cómo se forma el cofre doble.
- No se puede colocar un cofre en el lugar 4 porque el cofre vecino ya es parte de un cofre doble.
- Se puede colocar un cofre en el lugar 5. El doble cofre adyacente en diagonal no afecta nada.
Suponiendo que el área más allá de la cuadrícula esté vacía, cambiar cada una .
de las cuadrículas a *
si se pudiera colocar un cofre allí resulta en esto:
******.C**
***C**C.**
*..***..*C
.CC.*.CC.*
*..***..**
No todos los *
espacios se pueden ocupar con cofres al mismo tiempo, por supuesto, pero si solo tuviera un cofre, podría colocarse en cualquiera de ellos.
Desafío
Escriba un programa o función que abarque una cuadrícula .
y C
, y cambie cada uno .
a *
si se puede colocar un cofre allí, imprimiendo o devolviendo la cuadrícula resultante.
La entrada puede ser desde stdin o un archivo o como un argumento de cadena a una función.
Puede suponer que la entrada está bien formada, es decir, una cuadrícula de texto perfectamente rectangular, de al menos 1 carácter de ancho y alto, que solo contiene
.
yC
, opcionalmente, puede suponer que hay una nueva línea final después de la última fila (y puede haber una en la salida )Puede suponer que la disposición de los cofres en la entrada es coherente con las reglas anteriores. Nunca habrá ambigüedades sobre qué cofres forman cofres dobles.
Si lo desea, puede utilizar cualquiera de los tres distintos ASCII imprimibles caracteres en lugar de
.
,C
, y*
. No puede usar otra cosa en lugar de nuevas líneas.Todos los cofres son cofres normales. No cofres atrapados o cofres de ender .
Puntuación
El envío con la menor cantidad de bytes gana.
Para un desafío relacionado con Minecraft que es un poco más desafiante, prueba la detección de portal abisal .
Respuestas:
CJam,
82 76 66 62 5854 bytesEl formato de entrada espera
0
para la celda de aire y8
para una celda de cofre. La salida contiene1
todas las celdas que se pueden colocar con un Cofre.ACTUALIZACIÓN :
Se corrigió un error. Incrementado en 3 bytes :(golfed más :). 4 bytes guardados gracias a @ Sp3000Entrada de ejemplo:
Salida:
Creo que he terminado de jugar golf por ahora ...
Explicación
Pruébalo en línea aquí
fuente
.NET Regex ( Retina ),
434416310 + 1 = 311 bytesDespués del último desafío que respondí en regex (el Desafío del Portal del Nether vinculado a este desafío), finalmente me propuse escribir una herramienta de línea de comandos, que actúa como un intérprete para expresiones regulares de estilo .NET, para que pueda responder preguntas con expresiones regulares sin ser cuestionados de que no son un lenguaje independiente. Lo he llamado Retina.
Ahora, este desafío no se presta muy bien para una presentación de expresiones regulares, pero solo tenía que usar Retina ahora. ;) (Además, Sp3000 me retó a hacerlo en el chat.) Así que aquí está:
Archivo Regex
Archivo de reemplazo
El archivo regex es principalmente solo la expresión regular, excepto que le
`
permite poner algunas opciones en el archivo, en este caso, simplemente el modo multilínea. Cuando se le dan dos archivos, Retina asume automáticamente el modo de reemplazo total. Estos dos archivos definen un programa que lee la entrada de STDIN e imprime el resultado en STDOUT.También puede probarlo en RegexHero y RegexStorm . La expresión regular funciona con y sin línea nueva, y se usa
_
en lugar de.
. (Aparentemente, RegexStorm ocasionalmente tiene problemas si no hay una nueva línea final, pero RegexHero parece manejar bien cualquier caso).Hay una cantidad horrible de duplicación en la expresión regular, y tengo un par de ideas para acortarla significativamente ... Lo intentaré más tarde y luego agregaré una explicación. Mientras tanto, avíseme si puede encontrar alguna entrada que produzca un resultado incorrecto.
fuente
J,
7573 bytesUtiliza el formato en la pregunta, usando
.
/*
/C
para espacio / espacio utilizable / cofre, respectivamente.Editar: corrige un pequeño error (accidentalmente usé un toro en lugar de tratar adecuadamente los alrededores como un espacio vacío).
Explicación
fuente
C, 193
2 líneas innecesarias para mayor claridad. Los cambios con respecto al código no protegido incluyen: caracteres como códigos ascii en lugar de literales de caracteres; reordenamiento de v = 0, strlen y strchr para guardar caracteres (strchr es el más feo, ya que significa que un cálculo que de otro modo se realizaría una sola vez, ¡se realiza 5 veces por celda!)
Las funciones C no aceptan cadenas como argumentos ni las devuelven como valores, por lo que lo mejor que puedo hacer es lo siguiente:
q
es un puntero a la cadena de entrada. La función modifica la cadena y cuando la función devuelve la salida se encuentra en la cadena original.Para resumir las reglas:
un cuadrado en blanco (que no contiene C o nueva línea) se puede convertir si tiene un máximo de 1 vecino con una C
... Y ese vecino no tiene vecinos con una C.
La función g contiene una función f que recurre desde la profundidad 1 a la profundidad 0. Con solo 2 niveles de recursión, una simple
f(r,0)
llamada recursiva servirá, ¡no hay necesidad de hacerlof(r,d-1)
!Código no protegido en el programa de prueba
La cadena de prueba de entrada está codificada.
gets
yscanf
no aceptará una cadena de entrada con nuevas líneas; lo cortan en pedazos en cada nueva línea.Salida basada en un ejemplo de pregunta
fuente
JavaScript (ES6) 124
129Usando los caracteres 0 (*), 6 (C), 7 (.)
Desengañado y explicado
Prueba en la consola Firefox / FireBug
Salida
fuente
Perl, 66
Los conflictos de cofres de combinación de expresiones regulares terminaron en el lado largo, por lo que esta vez no competir con CJam.
Utiliza 0 y 2 para espacios vacíos y de cofre en la entrada, 1 para marcar los puntos en la salida.
Intentalo aquí .
fuente
Python 2 - 281 bytes
(Las líneas 8 y 9 están pensadas con un solo carácter de tabulación, que SE convierte a 4 espacios. Cada línea en este programa tiene 0 o 1 bytes de espacios en blanco iniciales).
Entrada:
0
para no cofre,2
para cofreOuput:
0
para no cofre,2
para cofre existente,1
para posible cofre nuevoDios, esto es horrible. Debo estar seriamente fuera de práctica. Lancé todos los trucos que conozco y salieron ... bueno, salieron como 281 bytes, perdiendo por cada respuesta, excepto la de expresión regular , jaja. Honestamente siento que jugué un poco bien, así que supongo que mi algoritmo fue menos que ideal.
Sin golf:
fuente