Introducción
"¡Yarr! ¡Tuvimos un muchacho que se hacía llamar" programador "para hacer un mapa de nuestro tesoro escondido! ¡Pero está escrito con números y letras extraños!" E5, N2, E3 "... ¿qué hace? "¡Locura! ¡Ni siquiera puedo escribir un mapa del tesoro apropiado, cretino inútil. ¡Arreglalo para nosotros! ¡Te regalaremos una parte del tesoro!"
Descripción del desafío
Un grupo de piratas tiene problemas para leer un mapa del tesoro. ¿Puedes escribir un programa para convertirlo en una forma más ... de piratería?
Como entrada, recibirá el mapa del tesoro original. Es una lista de cadenas separadas por comas, cada cadena que consiste en una porción de letra (que le dice a los piratas en qué dirección deben caminar), y una porción de número (que les dice a los piratas cuántos pasos deben tomar en esa dirección). Por ejemplo, el siguiente mapa del tesoro:
E2,N4,E5,S2,W1,S3
significaría: "camina dos pasos hacia el este, camina cuatro pasos hacia el norte, camina cinco pasos hacia el este, camina dos pasos hacia el sur, camina un paso hacia el oeste, luego camina tres pasos hacia el sur".
Como salida, tendrá salida el mapa en una forma gráfica, el uso de los caracteres >
, ^
, v
, y <
como punteros. Aquí está la salida para la entrada anterior:
>>>>>v
^ v
^ v<
^ v
>>^ X
Tenga en cuenta que hemos reemplazado el último paso hacia el sur con un X
lugar. Esto se debe a que el último paso es donde está el tesoro, y como todos sabemos, los piratas deben tener una X en sus mapas del tesoro, de lo contrario no sabrán cómo leerlo.
Por cierto, el mapa nunca se cruzará, por lo que no debe preocuparse por las superposiciones. Además, puede tener una nueva línea final al final de la salida.
Entradas y salidas de muestra
S5,W2
v
v
v
v
v
X<
N1,E1,S1,E1,N1,E1,S2
>v>v
^>^X
N1
X
N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2
>>>>>>v
^>>>>vv
^^>>vvv
^^^Xvvv
^^^^<vv
^^^<<<v
^^<<<<<
E21,S2
>>>>>>>>>>>>>>>>>>>>>v
X
N12,E11,S12,W2,N4
>>>>>>>>>>>v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ X v
^ ^ v
^ ^ v
^ ^<<
X
debería marcar el paso después del último movimiento, como todos los demás movimientos se cuentan. Imagina que el último paso es N3: caminas tres pasos hacia el norte y cavas, pero no hay nada aquí, tuviste que caminar 2 pasos en su lugar. No me importa si mantienes la regla existente, porque agrega un pequeño caso de esquina para manejar. Pero recuerda lo que le pasó a ese muchacho.Respuestas:
Rubí,
213 209 198 186178Pase la entrada a través de stdin.
Este utiliza un
y -> x -> char
diccionario para construir el mapa, donde ambosx
yy
puede ser negativo. Una vez que se ha analizado la entrada, se extrae el mínimo global de la coordenada x. Para cada fila, itera sobre un rango que va desde el índice mínimo global al índice máximo para la línea actual e imprime el carácter correcto para ese índice.Para mantenerse con el tema, las expresiones que se convierten
NESW
en los índices apropiados fueron pirateados sin pudor de SP3000 's respuesta .Versión original que usaba un
[x,y] -> char
diccionario:fuente
Python 2,
249248244239237 bytesEntrada como
"E2,N4,E5,S2,W1,S3"
.NSEW
está mapeado[1, 3, 2, 0]
pord=ord(c)%10%7
. Si se cambiay
ox
luego se decide pord%2
, y si se incrementa o disminuyed-2|1
. La primera y tercera expresiones fueron encontradas por la fuerza bruta.Aparte de eso, es un uso simple de un diccionario anidado de la forma
{y: {x: char}}
.(Gracias a @joriki por la ayuda con el mapeo)
fuente
(d + 1 & 2) - 1
1|d%-3
(que es la negación, pero me di cuenta de que también está bien)!Javascript (ES6), 260
Esta fue una interesante ...
¡Gracias @ETHproductions, @ edc65 y @vihan por la ayuda!
Esto define una función anónima, por lo que para llamarla agregue
f=
al principio para darle un nombre.Probar:
console.log(f("E2,N4,E5,S2,W1,S3"))
Explicación:
fuente
i++
delfor
bucle al último lugar donde se usa, en este casoc=i++>r-2?"X":c
.v[0].repeat(+v.slice(1))
en lugar deArray(v.slice(1)- -1).join(v[0])
, y" ".repeat(j-p-1)
en lugar deArray(j-p).join(" ")
, guardar 11 bytes en general. Creo que también podría colocarF='forEach'
al comienzo de la función, luego cambiar cada uno.forEach
de allí en adelante[F]
, guardando otros 4.if
s, podría ayudar si disminuye las variables al mismo tiempo tambiénq=x=y=2e3
significa que la salida sería incorrecta si lo hiciera, por ejemploW9999
?PHP,
431417 bytesPóngalo en un archivo (
treasure.php
), elimine la sangría, una las líneas (está envuelto aquí para facilitar la lectura), coloque el<?php
marcador al comienzo del archivo (no se muestra aquí, ya que técnicamente no forma parte del programa).Ejemplo de ejecución:
La opción
-d error_reporting=0
es necesaria para suprimir avisos sobre valores no encontrados en índices especificados en$z
.Actualizar:
Mientras preparaba la versión no codificada del código para publicar, descubrí que contenía dos asignaciones innecesarias (12 bytes) y un espacio en blanco que se puede eliminar (
as$i
); Además, al reemplazar awhile
con unfor
bucle y apretar una asignación en él (no es posible usar elwhile
bucle) guardé otro byte.fuente
$count --;
.$argn
guardar 3 byteschop
guardar 1 byte"X"
->X
usar constantes guardar más bytes$argn
pista. Soy consciente del"X"->X
truco, pero probablemente lo olvidé cuando escribí esta solución. Escribo código PHP desde 2002 pero hasta hoy no noté que PHP proporciona lachop()
función. Gracias por esta pista.Perl,
702613546474439338260 bytesGracias a Dom Hastings por su ayuda y su versión supergolf.
El código usa una matriz 2D.
Versión de Dom Hastings:
Mi versión de golf menor de 338 bytes (para referencia):
Prueba
fuente
use strict;
, no necesita todos losmy
s, lo que le ahorrará al menos unos pocos bytes. También==
es más corto queeq
ya que este último requiere espacios.$m
una vez, por lo que en lugar de almacenar el argumento de la línea de comando como una variable, puede llamarlo directamentesplit
, es decir@m=split(',',$ARGV[0])
.$d
y$s
se pueden capturar usando regex para ahorrarle algunos bytes($d,$s)=/^(.)(.+)$/
, y todas lasforeach
s pueden serfor
(ya que son lo mismo. También podría guardar algunos caracteres reemplazando algunos de estos conmap{
...}@x
ya que puede ignorar los parens alrededor del elemento iterado (esto funciona bien si tiene que contener otros bucles). Si lo está usando$ARGV[0]
, puede reemplazarlo con pop, ¡pero si usa el script comoperl script.pl <<< "text"
puede usarlo<>
!pop
para guardar un par. En lugar deuse Swtich
y las declaracionesswitch
/case
, podría hacer comprobaciones individuales que podrían ahorrarle bytes. Algo así$y-="N"eq$d
funcionará también (ya que verdadero1
y falso es''
). A menudo, puedes tener palabras como palabras simples, ¡así$y-=N eq$d
que funcionará! Hay algunas variables mágicas que puede usar para guardar bytes,$/
es'\n'
y$"
es' '
, pero a veces una nueva línea literal también puede ayudar a salvar un carácter. Otro truco (¡sucio!) Son las asignaciones múltiples para guardar algunas más, como$a=0;$b=0;
puede ser$a=$b=0
.substr($_,0,1)
puede serlosubstr$_,0,1
. Postfix para bucles y si las comprobaciones pueden ser útiles también como enfor(@c){...}
vs....for@c
pero no puede usar;
en el código, tendría que separar las comas en su lugar (que no siempre funciona cuando se llaman funciones). También hay muchos consejos excelentes en codegolf.stackexchange.com/questions/5105/… . ¡Buena suerte!Python 2, 394 bytes
Ejecute el programa y luego péguelo en la entrada estándar como, por ejemplo,
"E2,N4,E5,S2,W1,S3"
Esto no está muy optimizado. Primero se ejecuta a través de la entrada para registrar la ruta. Luego hace algunos cálculos para determinar la posición inicial correcta y el tamaño de
o
. Luego se ejecuta nuevamente y establece las entradas apropiadas deo
como una de>v<^X
. La inteligencia principal está en reutilizar la misma función para estos dos recorridos.fuente
XQuery 3.0, 498
XQuery a menudo no es ni siquiera un poco competitivo, por lo que fue divertido.
Sin golf
fuente
PHP, 496
514528Probé mi suerte en PHP, el resultado es bastante largo, todavía quiero publicarlo, solo por diversión.
Sin golf
fuente
for(;$i++<$f;)
, tratar de eliminar corchetes innecesarios, usar constantes indefinidas (N
) en lugar de cadenas ('N'
), ...if
s, intente usar operadores trenarios o lógicos ands. Además, ayudará si usa PHP4.1 y usa una matriz GET con los puntos.JavaScript (ES6),
244249274Los espacios iniciales y las nuevas líneas se agregaron para mayor claridad y no se contaron, excepto la nueva línea cerca del final en la llamada de unión, que es significativa y contada.
Pruebe a ejecutar el fragmento (solo ECMAScript 6, Firefox y Safari 9)
fuente
C, 557
Versión sin golf:
La asignación de memoria dinámica no es mucho más difícil, pero malloc es un identificador demasiado largo para ser utilizado en el código de golf. Siento que debería haber algún tipo de encabezado PCG.h legalmente incluido automáticamente para jugar golf en c, solo para acortar algunos identificadores.
fuente
Groovy, 359
fuente
Lisp común - 603
Implementación sin matrices: imprime de arriba a abajo, de izquierda a derecha.
Analiza y expande direcciones en un rastro de
(x y char)
elementos:La simple entrada "N3" produce
((0 0 #\^) (0 -1 #\^) (0 -2 #\X))
x
yy
y
primero y luego porx
Iterar sobre la lista ordenada mientras mueve el cursor
x - minx
,y - miny
, imprimir el carácter deseadoEjemplos
Resultado:
fuente
CoffeeScript,
303285 bytesMostrar fragmento de código
fuente