Tamagotchi y Giga Pets eran pequeños dispositivos electrónicos que simulaban una pequeña mascota virtual. Esta mascota tenía varias estadísticas, como salud, hambre, etc.
Recientemente escribí este ejemplo:
import msvcrt,os,sys;d=m=100;h=s=t=p=0;f=10
while 1:
os.system('cls'if os.name=='nt'else'clear');print("health:",d,"\nhunger:",h,"\nsleep:",s,"\nfood:",f,"\npotions:",p,"\nmoney:",m);t+=1
if msvcrt.kbhit():
k=ord(msvcrt.getch())
if k==102 and h>8 and f:f-=1;h-=9
if k==115:s=0
if k==112 and p:p-=1;d+=9
if k==98 and m>8:m-=9;p+=1
if k==116 and m>8:m-=9;f+=1
if t>99:
t=0;h+=1;s+=1
if s>80:s=0;h+=9
if h>80:d-=1
if d<1:sys.exit(0)
if d>79:m+=1
¡Esta es una mascota virtual básica en 467 bytes! Entonces me pregunté qué tan bien podrían hacer los profesionales de golf de código , así que ahora, el desafío.
El reto
Cree un programa que rastree 6 estadísticas de una mascota virtual y las actualice con el tiempo y en respuesta a las aportaciones del usuario. Las estadísticas son: salud y dinero (a partir de 100), comida (a partir de 10) y hambre, sueño y pociones (a partir de 0).
El programa debe actualizar los valores en respuesta a los siguientes eventos:
Mientras el programa no recibe ninguna entrada, debe realizar actualizaciones a intervalos regulares (el intervalo entre actualizaciones no debe ser más corto que medio segundo ni más largo que un segundo). Cada actualización hace lo siguiente:
- El hambre y el sueño aumentan en 1.
- Si el hambre es 80 o superior, la salud disminuye en 1.
- Si Sleep es 80 o superior, se restablece a 0, y Hunger aumenta en 9 adicionales.
- Si la salud es 80 o superior, el dinero aumenta en 1.
- Si la salud es 0, el programa se cierra.
El programa también debe responder inmediatamente al presionar las siguientes teclas por el usuario (esto significa que necesitará usar una función o biblioteca de idioma que pueda detectar una tecla presionada y responder de inmediato, en lugar de solo leer desde la entrada estándar), realizando las siguientes acciones:
f
: Si el hambre es mayor que 8 y la comida no es cero, la comida disminuye en 1 y el hambre disminuye en 9.s
: El sueño se restablece a 0.p
: Si Pociones es mayor que cero, las Pociones disminuyen en 1 y la Salud aumenta en 9.b
: Si el dinero es mayor que 8, entonces el dinero se reduce en 9 y las pociones se incrementan en 1.t
: Si el dinero es mayor que 8, entonces el dinero se reduce en 9 y los alimentos aumentan en 1.
Siempre que los valores de las estadísticas cambien, deben mostrarse en la pantalla en el formulario . Las seis estadísticas deben mostrarse cada vez que alguna de ellas cambie; y las estadísticas dentro de una pantalla deben estar separadas por comas o por nuevas líneas.Stat: value
Este desafío sigue las reglas normales de código de golf : gana el programa más corto que cumpla con la especificación anterior. (Tenga en cuenta que, como de costumbre, si el idioma es más nuevo que la competencia, la presentación debe estar marcada como no competitiva).
Respuestas:
C,
424406386357 bytesAprecio la necesidad de entrada sin formato y actualizaciones asincrónicas en la especificación del problema. Aunque eso requirió un poco de sobrecarga de la configuración de ncurses y los controladores de señal, es bueno tener el desafío ocasional de que (con suerte) uno de los idiomas dedicados al golf no lo gane automáticamente.
No especificaste exactamente cómo se indica el final del juego, por lo que este perece con el tradicional grito de muerte de Tamagotchi de "excepción de punto flotante (núcleo volcado)".
Sin golf
fuente
PHP,
396413bytes(Dang, mi primera entrada de código de golf que tuve que editar en el recuento de bytes. Editado para eliminar la llamada sleep (), ya que en realidad no cumplía con las reglas según lo previsto).
Requiere un sistema operativo unix-ish para el STDIN sin bloqueo. Curiosamente, el uso de switch / case versus en cascada si / else produjo un código fuente más corto, pero la versión comprimida posterior fue más larga.
Sin golf:
fuente
sleep(1)
regrese antes de procesar la entrada. Aunque procesa cualquier comando en cola antes de hacer la próxima actualización, podría estar bien.Mathematica, 374 bytes
Los saltos de línea son importantes porque son caracteres de nueva línea en la cadena, por lo que podría usarlos en
Row
lugar deColumn
. Si evalúa esto en un cuaderno de Mathematica, debería ver algo como esto:Debe hacer clic en el campo de entrada y escribir rápidamente (menos de un segundo) su carácter antes de
Dynamic
que el campo de entrada se actualice. Este dolor de cabeza podría evitarse por completo siEventHandler
estuviera en su propia celda en lugar de ser un elemento deRow
, pero eso requeriría guardar el programa como un archivo .nb que aumentaría en gran medida el recuento de bytes.fuente
CurrentValue[EvaluationNotebook[], NotebookEventActions] = {"KeyDown" :> Switch[CurrentValue@"EventKey", "f", If[g > 8 && f > 0, f--; g -= 9], "s", s = 0, "p", If[p > 0, p--; h += 9], "b", If[m > 8, m -= 9; p++], "t", If[m > 8, m -= 9; f++]]};
... esto debería permitirle evitar la necesidad de hacer clic en un campo de entrada. Agregar la opción, PassEventsDown -> True
al final de ese código le permitirá continuar editando el cuaderno, pero se puede eliminar al final para ahorrar bytes :)C # 6,
567563 bytesSin golf:
fuente
Clojure,
1224702 bytesV2
Hizo que todos los átomos perdieran variables en lugar de estar dentro de un objeto de estado. Solo eso eliminó mucho código. También creé las funciones de acceso directo
a!
ys!
para sumar y restar de loatoms
más fácil (básicamente actuando como+=
y-=
, ya que Clojure no tiene esos operadores).Me di cuenta de que probablemente podría acabar con
atom
s si logro integrar la entrada clave en aloop
. Tendré que verSin golf:
V1
Oh Dios mio. Definitivamente hay margen de mejora aquí. Este tipo de problema es más fácil de hacer con los efectos secundarios, y Clojure es funcional, por lo que estoy tratando de abusar de
atom
s para disminuir la cantidad de código necesario. Desafortunadamente, no entré con un plan, por lo que es un poco azaroso en este momento. Sin embargo, ya tengo algunas ideas para reducir.Es un programa completo. Se puede ejecutar ejecutando
-main
.Sin golf:
fuente
applying-rules
yhandle-keypress
pure. Estoy escribiendo una versión "atornilla" en este momento.