Resumen
La tarea es navegar en el rover de Marte y decir sus coordenadas y dirección finales.
Entrada:
Primera entrada:
Primero, su programa debe tomar la entrada que tendrá el siguiente formato:
[X-Coordinate],[Y-Coordinate],[Direction]
La dirección debe ser: N
o S
o E
o W
(Letras iniciales de Norte, Sur, Oeste, Este)
Ejemplo: 10,20,N
(x = 10, y = 20, dirección = N (Norte))
Segunda entrada:
La segunda entrada consiste en series de R
, L
, M
para la derecha, izquierda y mover respectivamente.
Para R
y L
(derecha e izquierda) la dirección del móvil debe cambiar en consecuencia.
Para M
el rover debe moverse 1 unidad hacia adelante en la dirección que era antes de moverse.
Reglas para calcular coordenadas:
N = Y + 1
E = X + 1
S = Y - 1
W = X - 1
Salida:
Las coordenadas finales y la dirección actual del móvil.
Ejemplo:
Enter initial data: 1,2,N
Enter the instructions: MRMLM
Output: 2,4,N
Las coordenadas pueden ser cualquier número entero y pueden ser negativas .
No se permiten todas las lagunas estándar. Si es posible proporcionar una demostración en sitios como http://ideone.com, etc., hágalo para que pueda verificar :)
Este es un concurso de popularidad, ¡así que sé creativo!
Siguiendo el consejo de otros, decido hacer de esto un código de golf .
Respuestas:
Rubí ≥ 2.0, 101
Esta solución se puede probar aquí: https://ideone.com/C4PLdE
Tenga en cuenta que la solución vinculada en ideone es un carácter más largo (en
1.i
lugar de1i
en la línea 3). La razón de esto es que ideone solo es compatible con Ruby 1.9, que no permite la sintaxis abreviada para literales complejos.fuente
x,y,i=eval"[#{gets}]"
coneval"x,y,i="+gets
para guardar algunos caracteres.eval
las reglas de alcance:ruby -e 'eval"x=1";p x'
arroja unNameError
parax
atp x
. Funciona cuando se usan constantes (eval"X,Y,I="+gets
), pero dado que modificoi
, esto requeriría un adicionali=I
para evitar advertencias sobre redefinir una constante. ¿Pero tal vez estamos hablando de diferentes versiones de Ruby?x,y,i=eval"*a="+gets
. ¡Gracias!Javascript ( ES6 )
145141127Editar: eliminó la necesidad de una matriz de traducción usando el método de la solución C de edc65
Sin golf / comentado:
fuente
Java - 327
Con espacios en blanco:
Como es habitual con Java, aproximadamente la mitad de esto es solo analizar la entrada y formar la salida. La lógica es bastante sencilla.
fuente
Javascript (E6) 175
Editar error corregido, posiblemente fuera del rango de valor de retorno para d
139 Lógica, 36 E / S
Básico sin golf
Prueba Prueba en la consola de JavaScript en Firefox. Es más simple probar la función F evitando las ventanas emergentes.
Salida
fuente
C 164
180 186Editar Formato de entrada fijo y strchr eliminado
Editar matriz de desplazamiento eliminada, calc utilizando bits
Sin golf
fuente
C, 148
150151Un retoque de la solución de @ edc65 para usar mi enfoque de abuso de valor ASCII.
Específicamente:
d%8%5
asigna los caracteresENWS
a0,1,2,3
respectivamentec%23
se convierteL
en7
,M
en8
yR
en 13. Debido a qued
(la variable de dirección) siempre se usa mod 4, esto efectivamente hace queL
agregar -1 mod 4,M
agregar 0 mod 4 yR
agrega 1 mod 4.d&1
es 1 paraNS
y 0 paraEW
direcciones.d&2
es 2 paraWS
y 0 paraNE
direcciones.~-(d&2)
es 1 paraWS
y -1 paraNE
direcciones.c%2
es 1 paraM
y 0 paraLR
.fuente
c%(2*(1-(d&2)))
Python 3 (con gráficos de tortuga),
251199 bytesPythonistas sabios, por favor sean gentiles, porque este es mi primer intento en un programa escrito en su excelente idioma.
Tortugas en Marte!
Este desafío se correlaciona naturalmente con gráficos de tortuga estilo logo, para los cuales python tiene una importancia, por supuesto.
Lee la entrada de dos líneas de STDIN.
Salida:
Lo que más me gusta de este programa es que muestra gráficamente la ruta del móvil. Agregue
exitonclick()
al final del programa para que la salida gráfica persista hasta que el usuario haga clic:Estoy bastante seguro de que esto se puede jugar mucho más, ¡cualquier sugerencia es bienvenida! Estoy haciendo este CW, porque espero que la comunidad pueda jugar un poco más.
Cambios:
fuente
GolfScript,
116 98 88 8471Esto debería obtener las coordenadas y las instrucciones como argumentos de la siguiente manera:
1 2 'N' 'MRMLM'
. Los argumentos se hacen en una cadena y se introducen en la pila.Si desea probar esto en línea, vaya a web golfscript y pegue un punto y coma seguido de una cadena con los argumentos (por ejemplo
;"1 2 'N' 'MRMLM'"
) antes del código ( aquí hay un enlace con un ejemplo).Ejemplos de salida:
Mis intentos anteriores
84 caracteres:
88 caracteres:
98 caracteres:
116 caracteres:
fuente
Delfos (819)
Cuando comencé, todavía no era code-golf . Se editará más tarde.
Sin embargo, no puedo encontrar un compilador en línea.
Sin golf
fuente
=
? ¿Por qué son necesarios? Además, los nombres de las variables me parecen demasiado largosJavascript (353)
Este es mi primer intento real de golf de código, parece que funciona al menos!
fuente
var
s.Pitón (263)
Debe haber una forma más elegante de hacer esto también, no necesita la rama después de lo contrario.
http://ideone.com/eD0FwD
La entrada es horrible, quería hacerlo con
split(',')
pero encontré problemas de transmisión entre las entradas y las cadenas. Idealmente, también quería agregar la posición anterior con la posición de movimiento ... oh, ahora es code-golf. Oh bueno, lo que sea, lo dejaré aquí, podría inspirarte. Otras ideas que tenía estaban usando el módulo 4 de la dirección después de mapear el rumbo inicial a un índice. También fusiona los giros y mueve las matrices a una, ya que ninguna de las teclas colisiona.aun así, acortando nombres de variables y eliminando espacios es 263:
fuente
Python 2.7 -
197192 bytesDe hecho, estoy súper orgulloso de este.
Explicación
Primero, limpiemos este desastre. Usé puntos y comas en lugar de saltos de línea en muchos lugares porque creo que me hace genial. Aquí está normalmente (esto sigue siendo 197 bytes, no ha sido descartado). Sí, todavía hay un punto y coma, pero ese realmente guarda un byte.
¡Vamos a empezar!
Primero definimos
q
como la cadena'NESW'
. Lo usamos dos veces más tarde ylen("q='NESW';qq") < len("'NESW''NESW'")
.Aquí dividimos la primera línea de inpupt en cada coma. Nuestra x coord se almacena en
x
, y eny
, y la primera letra de nuestra dirección end
.Luego solo hacemos las entradas de los coords. (Me sorprendió que no se me ocurriera una mejor manera de convertir dos cadenas en ints. Lo intenté
x,y=map(int,(x,y))
pero resulta ser más largo).Esto convierte nuestra dirección en un número entero. 0 es norte, 1 es este, 2 es sur y 3 es oeste.
Aquí es donde comienza la diversión.
Cuando vamos hacia el norte, Y aumenta en 1. Entonces este diccionario toma 0 y da la cadena
'y+'
, para "aumentar y". Da resultados similares para otras direcciones: y o x seguido de + o -.Volveremos a esto.
Me he tomado la libertad de desanimar a este un poco.
Para cada personaje en la segunda línea de entrada, hacemos dos cosas. Primero, configuramos la variable
m
a lo que nuestro diccionario de antes nos da para nuestra dirección actual. No hay ninguna razón por la que necesitemos que esto suceda siempre, pero es más fácil que simplemente hacer que suceda cuando lo necesitamos.A continuación, vamos a crear una lista con tres elementos:
'd+'
,'d-'
, ym
. NOTA DEL EDITOR: Creo que puedo escapar sin usar la variablem
en absoluto. Creo que puedo ponerlov[d]
directamente en la lista. Eso me ahorrará un par de bytes si funciona, pero no tengo ganas de probarlo hasta que termine esta explicación para que puedan lidiar. (Sí, funcionó).Buscamos el carácter actual de la entrada en la cadena 'RL'.
str.find
devuelve -1 si no encuentra el carácter, por lo que esto convierte una R en un 0, una L en un 1 y cualquier otra cosa en -1. Por supuesto, la única otra entrada que podemos tener es M, pero son menos caracteres para que funcione para todo.Usamos ese número como índice para la lista que creamos. Los índices de la lista de Python comienzan al final si son negativos, por lo que obtenemos el primer elemento si la entrada es R, el segundo si es L y el último si es M. Por conveniencia, estoy a punto de suponer que estamos mirando hacia el norte, pero se aplica un principio similar para otras direcciones.
Los posibles valores con los que estamos trabajando son
'd+'
para R,'d-'
para L y'y+'
para M. Luego, los adjuntamos'=1;d=d%4'
al final de cada uno. Eso significa que nuestros valores posibles son ...¡Ese es el código válido de Python! ¡Es un código válido de Python que hace exactamente lo que queremos hacer para cada uno de esos caracteres de entrada! (La
d=d%4
parte solo mantiene nuestras instrucciones sensatas. Nuevamente, no es necesario que lo haga siempre, pero son menos caracteres).Todo lo que tenemos que hacer es ejecutar el código que obtenemos para cada carácter, imprimirlo (convirtiendo nuestra dirección de nuevo en una cadena), ¡y listo!
fuente
C - 350
Guardar como
rover.c
:Compilar:
Ejecución de muestra:
Ideona
Sin golf:
fuente
Haskell - 412 bytes
Probado con:
fuente
f=many digit
MUCHO LOL - TAN GUAUread
varias veces tomó más caracteres que usar parsec ...Bash + coreutils, 159 bytes
La entrada se lee desde 2 líneas de STDIN.
Salida:
fuente
Potencia Shell,
170167166Parece que no puede jugar más golf, lo cual es un poco vergonzoso. Pero todos los hacks obvios realmente no funcionan aquí.
No puedo
iex
la entrada porque a)N
,S
,E
yW
tendría que ser funciones para las que al trabajo (o que había necesidad de prefijo que con$
yb)1,2,N
habría que analizar elN
en modo de expresión, no ser capaz de ejecutar un comando .El
switch
parece ser el camino más corto de hacer el movimiento. La tabla hash con bloques de secuencia de comandos o cadenas no es más corta, y para cualquier otra forma, aparte de laswitch
que tendría la sobrecarga del bucle explícito.No puedo deshacerme de él
IndexOf
porque una tubería con?
es aún más larga.Tampoco puedo deshacerme de los tipos explícitos en la declaración inicial porque tengo tipos mixtos allí, por lo que un simple
|%{+$_}
no ayuda y cualquier otra opción es más larga.A veces odio el manejo de entradas en PowerShell.
fuente
Python, 135
137138Abusos de los valores ASCII de
L
,M
yR
para evitar el uso de declaraciones condicionales.Pruébalo en ideone .
fuente
Python 2.7,
170149Cosas que cambié del original:
Raw_input con alias, cambió el diccionario v [d], que de todos modos debería haber sido una lista, a alguna selección de cadena utilizada
%=
.Editar: utiliza el desempaquetado de tuplas y eval (raw_input ()) == input () para guardar 21 caracteres.
Muy prestado de @undergroundmonorail, pero con muchas mejoras.
fuente
Bash / SHELF ,
243235" SHE ll go LF " es una biblioteca de golf para Bash que proporciona algunos alias útiles. Esta es una respuesta válida ya que la biblioteca existía y estaba en GitHub antes de que se publicara el desafío.
Lo siento, no puedo hacer que esto funcione en ideone.
Como correr
Esto toma la posición inicial (separada por comas como se especifica; esto agrega muchos caracteres al código) como su primer argumento, y las instrucciones sobre la entrada estándar.
Salida de muestra
Código
Explicación
d
es para comparación; devuelve 0 si sus dos argumentos son iguales y 1 de lo contrario, puede tener otros comandos encadenados con&&
y||
.y
es comotr
(pero hechosed
).Y
Es comosed 's/.../.../g'
por sus dos argumentos.P
esecho -e -n
;p
es justoecho -e
.El siguiente bit es profundamente feo, con alrededor de 145 caracteres en una línea. Si el comando actual es M, convierta las comas en $ o en espacios, conviértalas en matriz y guárdelas en $ z. Luego, haga un cambio ... bloque de mayúsculas y minúsculas para el último elemento de $ z (la dirección que apunta el móvil. Cambie las coordenadas en consecuencia, luego convierta $ z nuevamente en una cadena separada por comas y guárdelo en $ o.
fuente
shelf.sh
ser parte de la solución? Como si tuviera que usarrequire
ciertos paquetes en Ruby oimport
también en Python si los necesita.import
PYG cuando escriben un programa Python con él, o Rebmu (AFAIK) cuando escriben un programa Rebol con élHaskell, 291
No estaba seguro de cuán flexible era el formato de cadena de entrada y salida, así que me aseguré de que se viera exactamente como el ejemplo (menos las indicaciones, por supuesto), pero eso agregó muchos caracteres adicionales. Enlace de ideona
fuente
PHP - 224
Bueno, lo intenté.
Entrada en STDIN, por ejemplo:
fuente
Python3 (288)
Implementación con uso intensivo de ifs ternarios.
Omitir las quejas de entrada obvias, dar a las cadenas de dirección valores intrínsecos puede haber beneficiado el tamaño del script. Sin embargo, el enfoque aquí es perfectamente funcional (así que creo)
fuente
Pitón 3 (143)
http://ideone.com/wYvt7J
Utilizamos el tipo de número complejo incorporado de Python para almacenar el par de coordenadas. La dirección se calcula llevando la unidad imaginaria
1j
a la potencia ded
, que almacena la dirección mod 4. La rotación se realiza aumentando o disminuyendod
. La expresión'ML'.find(c)
da la cantidad que queremos cambiard
:1
paraL
,0
paraM
y-1
(el valor predeterminado para no encontrado) paraR
.Python no tiene una forma corta de convertir un número complejo en una tupla, por lo que tenemos que hacer llamadas costosas a
.real
y.imag
.fuente