Tamagotchi i Giga Pets były małymi urządzeniami elektronicznymi, które symulowały małego wirtualnego zwierzaka. To zwierzę miało kilka statystyk, takich jak zdrowie, głód itp.
Niedawno napisałem ten przykład:
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
To wirtualne zwierzę bez kości w 467 bajtach! Zastanawiałem się wtedy, jak dobrze potrafią golfiści , więc teraz wyzwanie.
Wyzwanie
Stwórz program, który śledzi 6 statystyk wirtualnego zwierzaka i aktualizuje je wraz z upływem czasu i odpowiedziami użytkowników. Statystyki to: zdrowie i pieniądze (od 100), jedzenie (od 10) oraz głód, sen i mikstury (od 0).
Program powinien zaktualizować wartości w odpowiedzi na następujące zdarzenia:
Chociaż program nie otrzymuje żadnych danych wejściowych, powinien przeprowadzać aktualizacje w regularnych odstępach czasu (odstęp między aktualizacjami nie powinien być krótszy niż pół sekundy ani dłuższy niż jedna sekunda). Każda aktualizacja wykonuje następujące czynności:
- Głód i sen każdego wzrostu o 1.
- Jeśli Głód wynosi 80 lub więcej, Zdrowie spada o 1.
- Jeśli tryb uśpienia wynosi 80 lub więcej, jest resetowany do 0, a głód wzrasta o dodatkowe 9.
- Jeśli Zdrowie wynosi 80 lub więcej, Pieniądze wzrosną o 1.
- Jeśli stan zdrowia wynosi 0, program kończy się.
Program musi również natychmiast reagować na następujące naciśnięcia klawiszy użytkownika (oznacza to, że będziesz musiał użyć funkcji języka lub biblioteki, która może wykryć naciśnięcie klawisza i zareagować na niego natychmiast, a nie tylko czytać ze standardowego wejścia), wykonując następujące działania:
f
: Jeśli Głód jest większy niż 8, a Jedzenie jest niezerowe, to Jedzenie zmniejsza się o 1, a Głód zmniejsza się o 9.s
: Tryb uśpienia jest resetowany do 0.p
: Jeśli Mikstury są większe od zera, Mikstury są zmniejszane o 1, a Zdrowie zwiększa się o 9.b
: Jeśli Pieniądze są większe niż 8, to Pieniądze są zmniejszane o 9, a Mikstury zwiększane o 1.t
: Jeśli Pieniądze są większe niż 8, to Pieniądze są zmniejszane o 9, a Jedzenie jest zwiększane o 1.
Ilekroć zmieniają się wartości statystyk, muszą być one wyświetlane na ekranie w formularzu . Wszystkie sześć statystyk musi być wyświetlane przy każdej zmianie; a statystyki w obrębie wyświetlacza muszą być oddzielone przecinkami lub znakami nowej linii.Stat: value
To wyzwanie jest normalne golf-golfzasady: wygrywa najkrótszy program zgodny z powyższą specyfikacją. (Pamiętaj, że jak zwykle, jeśli język jest nowszy niż konkurs, zgłoszenie musi być oznaczone jako niekonkurujące).
Odpowiedzi:
C,
424406386357 bajtówDoceniam potrzebę nieprzetworzonych danych wejściowych i aktualizacji asynchronicznych w specyfikacji problemu. Mimo że wymagało to trochę narzutu od konfiguracji ncurses i obsługi sygnałów, miło jest mieć okazjonalne wyzwanie, które (miejmy nadzieję) nie zostanie automatycznie wygrane przez jeden z dedykowanych języków golfowych.
Nie określiłeś dokładnie, w jaki sposób kończy się gra, więc ten ginie z tradycyjnym okrzykiem śmierci Tamagotchi „Wyjątek zmiennoprzecinkowy (zrzut rdzenia)”.
Nie golfił
źródło
PHP,
396413 bajtów(Dang, mój pierwszy kod golfowy, który musiałem edytować w liczbie bajtów. Edytowany, aby usunąć wywołanie sleep (), ponieważ tak naprawdę nie było zgodne z regułami zgodnie z przeznaczeniem).
Wymaga systemu operacyjnego uniksowego dla nieblokującego STDIN. Dziwne, że użycie przełącznika / wielkość liter w porównaniu do kaskadowania, jeśli / else produkuje krótszy kod źródłowy, ale późniejsza skompresowana wersja była dłuższa.
Nie golfowany:
źródło
sleep(1)
Przed przetworzeniem danych wejściowych czeka na wywołanie powrotu. Chociaż przed kolejną aktualizacją przetwarza wszelkie kolejkowane polecenia, więc może być w porządku.Mathematica, 374 bajty
Podziały linii są ważne, ponieważ są znakami nowej linii w ciągu, więc mógłbym użyć
Row
zamiastColumn
. Jeśli ocenisz to w notatniku Mathematica, powinieneś zobaczyć coś takiego:Musisz kliknąć pole wejściowe i szybko (mniej niż sekundę) wpisać swoją postać, zanim
Dynamic
spowoduje ona aktualizację pola wejściowego. Tego bólu głowy można było całkowicie uniknąć, gdybyEventHandler
znajdował się w swojej komórce, a nie był elementemRow
, ale wymagałoby to zapisania programu jako pliku .nb, co znacznie zwiększyłoby liczbę bajtów.źródło
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++]]};
... to powinno pozwolić ci uniknąć konieczności klikania pola wejściowego. Dodanie opcji, PassEventsDown -> True
na końcu tego kodu pozwoli kontynuować edycję notatnika, ale można go usunąć na samym końcu, aby zaoszczędzić bajty :)C # 6,
567563 bajtówNie golfowany:
źródło
Clojure,
1224702 bajtówV2
Sprawiło, że wszystkie atomy traciły zmienne zamiast znajdować się w obiekcie stanu. Już sam pozbyłem się dużo kodu. Stworzyłem również funkcje skrótów
a!
orazs!
dodawanie i odejmowanieatoms
łatwiejszych (w zasadzie działa jako+=
i-=
, ponieważ Clojure nie ma tych operatorów).Zdałem sobie sprawę, że prawdopodobnie mógłbym pozbyć się
atom
s jeśli uda mi się zintegrować wejście klucza doloop
. Będę musiał zobaczyćNie golfowany:
V1
Drogi Boże. Zdecydowanie miejsce na poprawę tutaj. Tego rodzaju problem najłatwiej jest rozwiązać z efektami ubocznymi, a Clojure działa, więc próbuję nadużyć,
atom
aby zmniejszyć potrzebną ilość kodu. Niestety nie wdałem się w plan, więc teraz jest to trochę przypadkowe. Mam już kilka pomysłów na zmniejszenie.To pełny program. Można go uruchomić, uruchamiając
-main
.Nie golfowany:
źródło
applying-rules
ihandle-keypress
czyszczenie. Piszę teraz wersję „zakręconą”.