Tamagotchi et Giga Pets étaient de petits appareils électroniques qui simulaient un petit animal virtuel. Cet animal avait plusieurs statistiques, comme la santé, la faim, etc.
J'ai récemment écrit cet exemple:
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
Ceci est un animal de compagnie virtuel à nu en 467 octets! Je me suis ensuite demandé dans quelle mesure les pros du golf pouvaient faire du code , alors maintenant, le défi.
Le défi
Créez un programme qui suit 6 statistiques d'un animal virtuel et les met à jour au fil du temps et en réponse à l'entrée de l'utilisateur. Les statistiques sont les suivantes: santé et argent (à partir de 100), nourriture (à partir de 10) et faim, sommeil et potions (à partir de 0).
Le programme doit mettre à jour les valeurs en réponse aux événements suivants:
Pendant que le programme ne reçoit aucune entrée, il doit effectuer des mises à jour à intervalles réguliers (l'intervalle entre les mises à jour ne doit pas être inférieur à une demi-seconde ni supérieur à une seconde). Chaque mise à jour effectue les opérations suivantes:
- La faim et le sommeil augmentent chacun de 1.
- Si la faim est de 80 ou plus, la santé diminue de 1.
- Si le sommeil est de 80 ou plus, il est réinitialisé à 0 et la faim augmente de 9 supplémentaires.
- Si la santé est de 80 ou plus, l'argent augmente de 1.
- Si Health est 0, le programme se ferme.
Le programme doit également répondre immédiatement aux pressions de touches suivantes de l'utilisateur (cela signifie que vous devrez utiliser une fonction de langue ou une bibliothèque qui peut détecter une touche enfoncée et y répondre immédiatement, plutôt que de simplement lire à partir d'une entrée standard), les actions suivantes:
f
: Si la faim est supérieure à 8 et que la nourriture n'est pas nulle, la nourriture est diminuée de 1 et la faim est diminuée de 9.s
: Le sommeil est réinitialisé à 0.p
: Si Potions est supérieur à zéro, Potions est diminué de 1 et Santé est augmentée de 9.b
: Si l'argent est supérieur à 8, l'argent est diminué de 9 et les potions sont augmentées de 1.t
: Si l'argent est supérieur à 8, l'argent est diminué de 9 et la nourriture est augmentée de 1.
Chaque fois que les valeurs des statistiques changent, elles doivent être affichées à l'écran dans le formulaire . Les six statistiques doivent être affichées chaque fois que l'une d'entre elles change; et les statistiques dans un affichage doivent être séparées soit par des virgules soit par des sauts de ligne.Stat: value
Ce défi suit les règles normales du code-golf : le programme le plus court conforme aux spécifications ci-dessus l'emporte. (Notez que, comme d'habitude, si la langue est plus récente que la compétition, la soumission doit être marquée comme non concurrente.)
Réponses:
C,
424406386357 octetsJ'apprécie la nécessité d'une entrée brute et de mises à jour asynchrones dans les spécifications du problème. Même si cela nécessitait des frais généraux de la configuration de ncurses et des gestionnaires de signaux, il est agréable d'avoir le défi occasionnel qui (espérons-le) ne sera pas automatiquement remporté par l'une des langues de golf dédiées.
Vous n'avez pas spécifié exactement comment le jeu est indiqué, donc celui-ci périt avec le cri de mort traditionnel Tamagotchi de "l'exception à virgule flottante (noyau vidé)".
Non golfé
la source
PHP,
396413 octets(Dang, ma première entrée de golf de code que j'ai dû modifier en nombre d'octets. Modifié pour supprimer l'appel sleep (), car il ne respectait pas vraiment les règles comme prévu.)
Nécessite un système d'exploitation unix pour le STDIN non bloquant. Curieusement, l'utilisation de switch / case par rapport à la cascade si / else produisait un code source plus court, mais la version compressée suivante était plus longue.
Non golfé:
la source
sleep(1)
retour de l'appel avant de traiter l'entrée. Bien qu'il traite toutes les commandes en file d'attente avant de faire la prochaine mise à jour, cela peut donc être correct.Mathematica, 374 octets
Les sauts de ligne sont importants car ce sont des caractères de nouvelle ligne dans la chaîne que je pourrais utiliser à la
Row
place deColumn
. Si vous évaluez cela dans un cahier Mathematica, vous devriez voir quelque chose comme ceci:Vous devez cliquer dans le champ de saisie et saisir rapidement (moins d'une seconde) votre caractère avant
Dynamic
de mettre à jour le champ de saisie. Ce casse-tête pourrait être évité entièrement si leEventHandler
était dans sa propre cellule plutôt que d'en être un élémentRow
, mais cela nécessiterait d'enregistrer le programme sous forme de fichier .nb, ce qui augmenterait considérablement le nombre d'octets.la source
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++]]};
... cela devrait vous permettre d'éviter de cliquer dans un champ de saisie. L'ajout de l'option, PassEventsDown -> True
à la fin de ce code vous permettra de continuer à modifier le bloc-notes, mais peut être supprimé à la fin pour économiser des octets :)C # 6,
567563 octetsNon golfé:
la source
Clojure,
1224702 octetsV2
Fait que tous les atomes perdent des variables au lieu d'être à l'intérieur d'un objet d'état. Cela seul a éliminé beaucoup de code. J'ai également créé les fonctions de raccourci
a!
ets!
pour ajouter et soustraire duatoms
plus facile (agissant essentiellement comme+=
et-=
, puisque Clojure n'a pas ces opérateurs).Je me suis rendu compte que je pourrais probablement me débarrasser de
atom
s si j'arrivais à intégrer une entrée clé dans aloop
. Je vais devoir voir.Non golfé:
V1
Oh mon Dieu. Certainement matière à amélioration ici. Ce type de problème est plus facile à faire avec les effets secondaires, et Clojure est fonctionnel, donc j'essaie d'abuser de
atom
s pour réduire la quantité de code nécessaire. Malheureusement, je ne suis pas entré avec un plan, donc c'est un peu hasardeux en ce moment. J'ai déjà eu quelques idées pour rétrécir.C'est un programme complet. Il peut être exécuté en exécutant
-main
.Non golfé:
la source
applying-rules
ethandle-keypress
pur. J'écris une version "à visser" en ce moment.