Тамагочи и Гига Питомцы были маленькими электронными устройствами, которые имитировали маленького виртуального питомца. У этого питомца было несколько характеристик, таких как здоровье, голод и т. Д.
Я недавно написал этот пример:
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
Это виртуальный домашний питомец размером 467 байт! Затем я подумал, насколько хорошо могут сыграть профессионалы в гольф-коде , так что теперь это вызов.
Соревнование
Создайте программу, которая отслеживает 6 характеристик виртуального питомца и обновляет их с течением времени и в ответ на вводимые пользователем данные. Статистика: здоровье и деньги (начиная с 100), еда (начиная с 10), а также голод, сон и зелья (начиная с 0).
Программа должна обновить значения в ответ на следующие события:
Пока программа не получает никаких входных данных, она должна выполнять обновления через регулярные промежутки времени (интервал между обновлениями не должен быть короче, чем полсекунды или дольше, чем одна секунда). Каждое обновление делает следующее:
- Голод и сон каждый раз увеличивается на 1.
- Если Голод составляет 80 или выше, здоровье уменьшается на 1.
- Если Sleep равен 80 или выше, он сбрасывается на 0, и голод увеличивается еще на 9.
- Если Здоровье 80 или выше, Деньги увеличиваются на 1.
- Если Health равен 0, программа завершается.
Программа также должна немедленно реагировать на следующие нажатия клавиш пользователем (это означает, что вам нужно будет использовать языковую функцию или библиотеку, которая может обнаруживать нажатие клавиши и немедленно реагировать на нее, а не просто читать из стандартного ввода), выполняя следующие действия:
f
: Если Голод больше 8 и Еда отлична от нуля, то Еда уменьшается на 1, а Голод уменьшается на 9.s
: Сон сбрасывается на 0.p
: Если зелья больше нуля, зелья уменьшаются на 1, а здоровье увеличивается на 9.b
: Если деньги больше 8, то деньги уменьшаются на 9, а зелья - на 1.t
: Если Деньги больше 8, то Деньги уменьшаются на 9, а Еда увеличивается на 1.
Всякий раз, когда значения статистики меняются, они должны отображаться на экране в форме . Все шесть характеристик должны отображаться всякий раз, когда изменяется какая-либо из них; и статистика на дисплее должна быть разделена запятыми или переводом строки.Stat: value
Этот вызов следует нормально Код-гольфправила: выигрывает самая короткая программа, соответствующая приведенной выше спецификации. (Обратите внимание, что, как обычно, если язык новее, чем у конкурса, заявка должна быть помечена как не конкурирующая.)
Ответы:
C
424406386357 байтЯ ценю необходимость необработанного ввода и асинхронных обновлений в спецификации проблемы. Несмотря на то, что это потребовало некоторых дополнительных затрат от настройки ncurses и обработчиков сигналов, приятно иметь случайную проблему, которая (надеюсь) не будет автоматически выиграна одним из выделенных языков игры в гольф.
Вы не указали, как именно указана игра, так что этот погибает с традиционным смертельным криком Тамагочи «Исключение с плавающей запятой (ядро сброшено)».
Ungolfed
источник
PHP,
396413 байт(Dang, моя первая запись в гольф-коде, которую я должен был отредактировать в счетчике байтов. Отредактирован для удаления вызова sleep (), поскольку он на самом деле не соответствовал правилам, как предполагалось.)
Требуется ОС unix-ish для неблокирующего STDIN. Как ни странно, использование параметра switch / case против каскадирования, если / else приводит к более короткому исходному коду, но последующая сжатая версия была длиннее.
Ungolfed:
источник
sleep(1)
вернется вызов до обработки ввода. Несмотря на то, что он обрабатывает любые команды в очереди перед следующим обновлением, так что это может быть хорошо.Mathematica, 374 байта
Разрывы строки важны, потому что они являются символами новой строки в строке, поэтому я мог бы использовать
Row
вместоColumn
. Если вы оцените это в тетради Mathematica, вы должны увидеть что-то вроде этого:Вы должны щелкнуть в поле ввода и быстро (менее секунды) набрать своего персонажа, прежде
Dynamic
чем поле ввода будет обновлено. Эту головную боль можно было бы полностью избежать, если бы онаEventHandler
находилась в своей собственной ячейке, а не была элементомRow
, но для этого потребовалось бы сохранить программу в виде файла .nb, что значительно увеличило бы число байтов.источник
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++]]};
... это должно позволить вам избежать необходимости щелкать в поле ввода. Добавление опции, PassEventsDown -> True
в конец этого кода позволит вам продолжить редактирование записной книжки, но может быть удалено в самом конце для экономии байтов :)C # 6,
567563 байтаUngolfed:
источник
Clojure,
1224702 байтаV2
Все атомы потеряли переменные вместо того, чтобы находиться внутри объекта состояния. Это само по себе избавило от большого количества кода. Я также создал функции быстрого доступа
a!
иs!
для сложения и вычитания из болееatoms
простых (в основном действует как+=
и-=
, так как Clojure не имеет этих операторов).Я понял, что, возможно, смогу покончить с
atom
s, если мне удастся интегрировать ввод ключа в aloop
. Я должен увидеть.Ungolfed:
V1
О Боже мой. Определенно, здесь есть место для улучшения. Такую проблему легче всего решить с помощью побочных эффектов, а Clojure работает, поэтому я пытаюсь злоупотреблять
atom
ею, чтобы уменьшить объем необходимого кода. К сожалению, я не согласился с планом, так что сейчас это что-то бессмысленное. Я уже получил несколько идей, чтобы уменьшить, хотя.Это полная программа. Это можно запустить, запустив
-main
.Ungolfed:
источник
applying-rules
иhandle-keypress
чистое. Я пишу версию "винт это" прямо сейчас.