Eres un explorador, mapeando un mundo desconocido. Tu barco es transportado por el viento. A dónde va, ¿quién sabe?
Cada día, en tu catalejo, ves características hacia el norte, sur, este y oeste. Siempre ve cuatro de estas características, correspondientes a las direcciones cardinales. Su catalejo informa símbolos ASCII como este:
~~.*
, ~~~~
, ~.^^
,~#~#
Los símbolos están en el orden (norte, sur, este, oeste).
Estos son los símbolos: ~
= mar, .
= costa, ^
= montaña, *
= árbol, #
= inválido (sin observación, esto ocurre cada vez que se ve el borde del mundo, o el paisaje está oscurecido por la niebla). Su catalejo ve exactamente una unidad en cada dirección.
Cada noche, miras las estrellas para ver qué tan lejos has viajado. Al mirar las estrellas se informa un símbolo ascii como este:
n
, s
, e
,w
correspondiente a Norte, Sur, Este y Oeste, respectivamente. Siempre se mueve exactamente una unidad al norte, sur, este u oeste todas las noches. Entonces, como explorador, recibirás un flujo interminable de símbolos:
~~.*n~~~~s~~.*s~.**
Su tarea es generar un mapa 2D del mundo (donde ?
hay partes desconocidas del mapa, el norte está arriba, el este está a la derecha):
?~~~??????
?~~~??????
?~~~.^^.??
?~~.***.~~
~~.*^^*.~~
~~~..~~~~~
~~~~~~~~~~
~~~~~~~~~~
En aras de la simplicidad, supongamos que comienza en la esquina inferior izquierda del mapa. Suponga que todos los mapas son 8x8.
Aquí hay un ejemplo simple de 3x3. Suponga que el mapa se ve así:
~.~
~^~
~.~
Con la siguiente entrada: ~#.#n~~^#s
Obtendrá esta salida:
~??
~^?
~.?
Más entradas y salidas de ejemplo:
entrada
~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w.#~~
salida
~~~~~~~~
~....~~~
~.????~~
~~????~~
~~????.~
~~????~~
~~?.^.~~
~~~~~~~~
Entrada:
~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s
Salida:
?~~~~~??
?....~??
?.**.~??
?~..~~??
?~~~~~??
?~~..~??
~~~.^.??
~~~~~~??
fuente
~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w
) es incorrecto, y la salida debería tener??
donde dice?.
Respuestas:
MATL ,
685958 bytesPruébalo en línea!
Explicación
El mapa se mantiene en la parte inferior de la pila y se llena gradualmente. La posición actual del explorador se almacena en el portapapeles J.
El mapa usa coordenadas de matriz, por lo que (1,1) está en la esquina superior izquierda. Además, se utiliza la indexación lineal de columna mayor. Esto significa que se accede a los elementos de la matriz 8 × 8 que representan el mapa con un solo índice de la siguiente manera:
Entonces, por ejemplo, el elemento (3,2) de la matriz es el elemento con índice lineal 11. El movimiento hacia el Norte, Sur, Este y Oeste, respectivamente, corresponde a sumar -1, 1, 8 u -8 al índice lineal. La matriz [-1 1 8 -8] sirve para codificar dos cosas diferentes:
La cadena de entrada se organiza en trozos de
5
caracteres. Como al primer fragmento le falta el primer carácter (el que indica movimiento),s
se incluye una inicial arbitrariamente para hacer que todos los fragmentos tengan el mismo tamaño. Para compensar esto, el explorador comienza en la posición 7, no en la 8, por lo que el desplazamiento inicial hacia el Sur (agregue 1 al índice lineal) los deja en la posición 8.Los fragmentos de 5 caracteres se procesan en un bucle. El primer carácter actualiza la posición, y los 4 restantes, si son diferentes
#
, se escriben en las entradas adecuadas de la matriz que representa el mapa.fuente
C,
210208207 bytesÉste usa printf y scanf para leer la entrada, y una matriz linealizada en lugar de x, y; así que siento que es lo suficientemente diferente a la de milibyte .
Golfizado:
Algo sin golf:
Representación:
Además, comienza en la posición 8 porque esto afeita un char más o menos del ciclo de impresión.
fuente
Fortran,
263251247235234216 bytesVersión 1D (similar a la de Don Muesli):
Versión 2D:
Para habilitar la forma libre y el procesamiento previo, el archivo necesita la extensión
.F90
, por ejemploexplorer.F90
. La entrada se lee desde STDIN:fuente
C,
265226224 bytesEl mapa es 8x8, no lo noté antes. Y aquí está la solución de 265 bytes que funciona para mapas con dimensiones variables:
fuente
a[8][8]
ser suficiente?int a[8][8]
le permite inicializar el mapa gratis, y el uso de charm[64]
me da grandes descuentos para la salida del mapa. Sin embargo, cuentas muy cercanase
yw
en su representación de mapa, puede usarfor(x=8;x--;)putchar((i=a[x][y])?i:63)
para afeitar dos bytes en la salida.c=getchar(),c+1
No es equivalentegetchar(),c++
o hay algún truco involucrado?Rubí,
169147 bytesPrograma completo Toma la cadena de entrada de STDIN (es probable que necesite canalizarla desde un archivo para evitar que las nuevas líneas finales estropeen las cosas) y envía el mapa resultante a STDOUT.
Recortó una tonelada poniendo todas las cuerdas en una y luego dividiéndolas más tarde.
Sin golf:
fuente
Lua, 354 bytes ( pruébelo en línea )
Golfizado:
Ligeramente incólume:
fuente
x=x+(("w e"):find(e)or 2)-2 end
puede serx=x-2+(("w e"):find(e)or 2)end
?Kotlin, 242 bytes
Las líneas nuevas se pueden reemplazar con punto y coma si se desea.
Intenta aquí
fuente