Hay un juego que me gusta jugar. Sucede en una cuadrícula de tamaño finito (pero está envuelta, como una esfera). En esa cuadrícula, se selecciona un punto aleatorio (solo entero). Luego, a mí, el usuario, se me solicita una entrada de coordenadas. Si mi entrada coincide exactamente con el punto aleatorio, me dicen que he ganado. De lo contrario, me informan la distancia de punto entre mi entrada y el punto aleatorio. Por ejemplo, si supuse que (2,2)
el punto aleatorio estaba en (4,3)
, entonces la distancia sería sqrt[(3-2)^2 + (4-2)^2] = sqrt[5]
.
El juego continúa hasta que el jugador llega a la ubicación correcta del punto.
Objetivo Crear una versión funcional del juego descrita anteriormente. Debe crear un programa completo para hacerlo. Esto es lo que debe hacer su programa:
- Solicite dos entradas: la altura y el ancho de la placa. El origen está en la esquina superior izquierda del tablero. Estas entradas no excederán
1024
. - Seleccione un punto aleatorio en ese tablero; este será el punto a adivinar.
- Aceptar entrada simulando un giro. La entrada será un par de enteros separados por espacios o dos entradas enteras separadas. En respuesta a esta entrada, el programa hará una de dos cosas:
- Si la entrada coincide con el punto aleatorio seleccionado, envía un mensaje que indica la victoria del usuario. Sugeriría "¡Ganaste!".
- De lo contrario, muestre la distancia entre el punto de entrada del usuario y el punto aleatorio.
- Una vez que el usuario haya logrado la victoria, muestre el número de turnos que tomó el usuario. El programa se cierra.
Bonos
Los bonos se aplican en el orden en que aparecen en esta lista
- -150 bytes si su programa toma un entero de entrada
D
que describe la dimensión en la que se desarrolla el juego. Por ejemplo, siD = 3
crea un punto aleatorio de3
enteros, toma3
entradas enteras y genera la distancia entre esos puntos. - -50% (o + 50% si
score < 0
) si proporciona una representación gráfica del tablero (ASCII o imagen) que muestra dónde el usuario ha adivinado previamente en la cuadrícula de dimensiones dadas y el contador de giros. (Si opta por el primer bono, este bono solo se aplica a los modos2D
y1D
. Si agrega una salida gráfica en 3D, obtendrá un -50% adicional). - -60 bytes si puede proporcionar un modo de juego (seleccionado por una entrada al principio; es decir, cuando se le dé
0
, realice el modo de juego normal; cuando se le dé1
, realice este modo de juego) en el que el punto se mueve 1 unidad en una dirección ortogonal aleatoria por turno
Más sobre envoltura
El ajuste ocurre solo cuando, en el tercer bono, el punto de movimiento se mueve a través de cualquiera de los límites; en este caso, el punto móvil se deforma al punto respectivo, así:
... ...
..R (move right) R..
... ...
Este comportamiento de ajuste no afecta la suposición del usuario, además del hecho de que el punto ha cambiado de dirección.
Tabla de clasificación
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
10x10
, el punto aleatorio es(9,4)
, y supongo(2,2)
, ¿es la distanciasqrt(13)
osqrt(53)
? (Nota para el futuro: si está haciendo algo extraño, no incluya la aleatoriedad porque hace que sea casi imposible suministrar casos de prueba). 2. En el tercer bono, ¿se debe calcular y generar la distancia antes o después de que se mueva el punto?Respuestas:
Cjam,
-113-139-152-157-159 bytesEl programa tiene 51 bytes de largo y califica para el bonos de -150 bytes y -60 bytes .
El modo de juego y el número de dimensiones se leen como un argumento de línea de comandos, el tamaño en cada dimensión de STDIN. Ya que el mensaje de victoria es arbitrario , el programa imprimirá
0.0
(distancia al gol) para indicar que el juego ha terminado.Pruebas de funcionamiento
Cómo funciona
fuente
Pyth, 91 (-150 -60) = -119
Solución anterior: (54-150 = -96)
Toda la entrada tiene lugar en una nueva línea.
1
o0
)Primersegundo enteroD
representa las dimensiones del juego.D
entradas representan el tamaño del campoD
entradas a partir de este momento son conjeturasReproducción de muestra (las sugerencias no aparecen en el programa real):
fuente
J=YmOvwvw
lugar deVvwaYOvw;JY
, que es 2 bytes más corto. No he revisado el otro código, pero supongo que también puedes acortar algunas cosas allí.Pitón 2, 210-150 = 60
Primer desafío solo hasta ahora. Pruébalo en línea
fuente
Pip,
4342 bytes - 150 = -108Toma las dimensiones del tablero como argumentos de línea de comandos (con D implicada por el número de argumentos). Toma conjeturas como números separados por espacios en stdin.
Este código aprovecha al máximo las características de programación de matriz de Pip. La matriz de cmdline args se almacena en
g
. Generamos el punto de ser adivinado por la cartografía del operador randrangeRR
másg
, y un tirón a la lista resultante en lay
variable. Luego viene el ciclo while principal, donde la condición es la siguiente:Si la distancia no era cero, el interior del bucle lo imprime. Si fue cero, hemos alcanzado el punto objetivo; el bucle se detiene y el programa emite el mensaje ganador y el número de turnos.
Ejemplo de ejecución:
fuente
R, 134-150 = -16 bytes
fuente
Haskell, 240-150 = 90
fuente
Dyalog APL ,
7771 - 210 = -139Okay:
Tenga en cuenta que esto se ejecuta en el índice de origen 0 (
⎕IO←0
), que es el predeterminado en muchas APL.Toma el modo booleano como argumento derecho (
M
) y los tamaños de dimensión como argumento izquierdo (S
).El número de dimensiones es
D
, que debe establecerse (por ejemplo,D←3
antes de llamar, según OP).P←?S
el objetivo obtiene un punto aleatorio en el rango 1, aunque cada uno de los límites de la dimensión{
...}⍣≢C←0
repita la función hasta que el resultado sea diferente deC
, que inicialmente obtiene0
?2
el número aleatorio 0 o 1¯1 1[
... el]
índice de la lista de dos números seM×
multiplica por modo; hace que0
si el modo es0
D↑
pad con0
s para que coincida con el número de dimensiones, ajuste el objetivo actual módulo de tamaño mundial(?D)⌽
gire la lista al azar (0 a través del número de dimensiones-1)P+
S|
P←
guarde una nueva entrada deC+←1
contador de incremento de punto objetivoP≢G←⎕:
y, si es diferente del punto objetivo, entonces ... lasP-G
distancias en cada dimensión al2*⍨
cuadrado+/
suman.5*⍨
la⎕←
impresión de raíz cuadrada que0⊣
devuelve 0 (es decir, idéntico al valor inicial, repita)C
... de lo contrario, devuelve el número de conjeturas (que, al ser diferente de 0, detiene el bucle y devuelve el último valor)fuente