Tamagotchi und Giga Pets waren kleine elektronische Geräte, die ein kleines virtuelles Haustier simulierten. Dieses Haustier hatte mehrere Statistiken, wie Gesundheit, Hunger usw.
Ich habe kürzlich dieses Beispiel geschrieben:
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
Dies ist ein virtuelles Haustier mit nackten Knochen in 467 Bytes! Ich habe mich dann gefragt, wie gut die Code-Golf-Profis das machen können, also jetzt die Herausforderung.
Die Herausforderung
Erstellen Sie ein Programm, das 6 Statistiken eines virtuellen Haustieres verfolgt und diese im Laufe der Zeit und als Reaktion auf Benutzereingaben aktualisiert. Die Statistiken sind: Gesundheit und Geld (ab 100), Essen (ab 10) und Hunger, Schlaf und Tränke (ab 0).
Das Programm sollte die Werte als Reaktion auf die folgenden Ereignisse aktualisieren:
Während das Programm keine Eingabe empfängt, sollte es in regelmäßigen Abständen Aktualisierungen durchführen (das Intervall zwischen den Aktualisierungen sollte nicht kürzer als eine halbe Sekunde und nicht länger als eine Sekunde sein). Jedes Update führt Folgendes aus:
- Hunger und Schlaf erhöhen sich jeweils um 1.
- Wenn der Hunger 80 oder mehr beträgt, verringert sich die Gesundheit um 1.
- Wenn der Schlaf 80 oder höher ist, wird er auf 0 zurückgesetzt und der Hunger um weitere 9 erhöht.
- Wenn die Gesundheit 80 oder höher ist, erhöht sich das Geld um 1.
- Wenn Health 0 ist, wird das Programm beendet.
Das Programm muss auch sofort auf die folgenden Tastendrücke des Benutzers reagieren (dies bedeutet, dass Sie eine Sprachfunktion oder -bibliothek verwenden müssen, die eine gedrückte Taste erkennen und sofort darauf reagieren kann, anstatt nur von der Standardeingabe zu lesen) die folgenden Aktionen:
f
: Wenn der Hunger größer als 8 ist und das Essen ungleich Null ist, wird das Essen um 1 und der Hunger um 9 verringert.s
: Der Schlaf wird auf 0 zurückgesetzt.p
: Wenn Tränke größer als Null sind, werden Tränke um 1 verringert und die Gesundheit um 9 erhöht.b
: Wenn das Geld größer als 8 ist, wird das Geld um 9 verringert und die Tränke um 1 erhöht.t
: Wenn das Geld größer als 8 ist, wird das Geld um 9 verringert und das Essen um 1 erhöht.
Wenn sich die Werte der Statistiken ändern, müssen sie im Formular auf dem Bildschirm angezeigt werden Stat: value
. Alle sechs Statistiken müssen angezeigt werden, wenn sich eine von ihnen ändert. und die Statistiken innerhalb einer Anzeige müssen entweder durch Kommas oder durch Zeilenumbrüche getrennt werden.
Diese Herausforderung folgt den normalen Code-Golf- Regeln: Das kürzeste Programm, das der obigen Spezifikation entspricht, gewinnt. (Beachten Sie, dass wie üblich, wenn die Sprache neuer als der Wettbewerb ist, die Einreichung als nicht konkurrierend markiert werden muss.)
Antworten:
C,
424406386357 BytesIch schätze die Notwendigkeit von Roheingaben und asynchronen Aktualisierungen in der Problemspezifikation. Auch wenn dies einen gewissen Aufwand für das Setup und die Signalhandler von ncurses erfordert, ist es schön, gelegentlich die Herausforderung zu haben, die (hoffentlich) nicht automatisch von einer der dedizierten Golfsprachen gewonnen wird.
Sie haben nicht genau angegeben, wie das Spielende angezeigt wird, daher geht dieses mit dem traditionellen Tamagotchi-Todesschrei "Gleitkomma-Ausnahme (Core Dumped)" zugrunde.
Ungolfed
quelle
PHP,
396413 Bytes(Dang, mein erster Code-Golf-Eintrag, den ich in Byte-Anzahl bearbeiten musste. Bearbeitet, um den Aufruf sleep () zu entfernen, da er nicht wirklich den beabsichtigten Regeln entsprach.)
Benötigt ein Unix-Betriebssystem für das nicht blockierende STDIN. Seltsamerweise verwendete switch / case versus cascading if / else einen kürzeren Quellcode, aber die nachfolgende komprimierte Version war länger.
Ungolfed:
quelle
sleep(1)
zurückkehrt, bevor Eingaben verarbeitet werden. Obwohl vor dem nächsten Update alle Befehle in der Warteschlange verarbeitet werden, ist dies möglicherweise in Ordnung.Mathematica, 374 Bytes
Die Zeilenumbrüche sind wichtig, da es sich um Zeilenumbrüche in der Zeichenfolge handelt, die ich
Row
anstelle von verwenden könnteColumn
. Wenn Sie dies in einem Mathematica-Notizbuch auswerten, sollten Sie Folgendes sehen:Sie müssen in das Eingabefeld klicken und Ihren Charakter schnell (weniger als eine Sekunde) eingeben, bevor
Dynamic
das Eingabefeld aktualisiert wird. Diese Kopfschmerzen könnten vollständig vermieden werden, wenn sich das ProgrammEventHandler
in einer eigenen Zelle befindet und nicht ein Element von. DiesRow
würde jedoch das Speichern des Programms als .nb-Datei erfordern, was die Anzahl der Bytes erheblich erhöhen würde.quelle
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++]]};
... verwenden, damit Sie nicht in ein Eingabefeld klicken müssen. Wenn Sie die Option, PassEventsDown -> True
am Ende dieses Codes hinzufügen, können Sie das Notizbuch weiter bearbeiten, es kann jedoch ganz am Ende entfernt werden, um Byte zu sparen :)C # 6,
567563 BytesUngolfed:
quelle
Clojure,
1224702 BytesV2
Alle Atome haben Variablen verloren, anstatt sich in einem Zustandsobjekt zu befinden. Das allein hat viel Code losgeworden. Ich habe auch die Verknüpfungsfunktionen erstellt
a!
unds!
um dieatoms
einfacheren zu addieren und zu subtrahieren (im Grunde genommen als+=
und-=
, da Clojure diese Operatoren nicht hat).Mir wurde klar, dass ich
atom
s wahrscheinlich abschaffen könnte, wenn ich es schaffe, Schlüsseleingaben in a zu integrierenloop
. Ich muss sehen.Ungolfed:
V1
Oh mein Gott. Hier gibt es definitiv Raum für Verbesserungen. Diese Art von Problem ist am einfachsten mit Nebenwirkungen zu lösen, und Clojure ist funktionsfähig, also versuche ich zu missbrauchen
atom
s zu , um die benötigte Codemenge zu verringern. Leider habe ich keinen Plan erstellt, daher ist das momentan ein Zufall. Ich habe schon ein paar Ideen bekommen, um mich zu verkleinern.Es ist ein volles Programm. Es kann durch Ausführen ausgeführt werden
-main
.Ungolfed:
quelle
applying-rules
undhandle-keypress
Pure. Ich schreibe gerade eine "Screw-It" -Version.