Deadfish - это шутка «языка программирования» с четырьмя командами. Поскольку страница Esolang немного противоречива и интерпретаторы на этой странице не все работают одинаково, вам следует реализовать следующий вариант:
Спецификация
- Имеется аккумулятор размером не менее 16 бит, больше разрешено, но меньше нет. Отрицательные числа не должны поддерживаться. Аккумулятор - это
0
когда программа запускается. - Существуют следующие два набора из четырех команд, и ваша программа должна поддерживать обе команды одновременно.
Стандартный Deadfish │ XKCD Вариант │ Значение ─────────────────────┼──────────────────┼───────── ─────────────────────────── i │ x │ Аккумулятор увеличения d │ d │ Аккумулятор декремента S │ K │ Площадь (акк = акк * акк) o │ c │ Выходной аккумулятор, как число
- Если после выполнения команды аккумулятор равен
-1
или256
, аккумулятор должен быть сброшен на ноль. Обратите внимание, что это не нормальный переход. Если, скажем, аккумулятор есть20
, аs
команда запущена, аккумулятор должен быть400
позже. Аналогично, если аккумулятор есть257
иd
команда запущена, аккумулятор должен стать0
. - Любой ввод, который не является одной из этих команд, должен игнорироваться.
Тестовые программы
xiskso
должен выводить0
xiskisc
должен выводить289
I / O
Ваша программа должна отображать подсказку: >>
. Подсказка должна быть в начале новой строки. Затем он должен прочитать строку ввода пользователя и выполнить указанные команды слева направо. При выводе чисел числа должны быть разделены. То есть, 12 34
в порядке, 12,34
в порядке,
12
34
все в порядке, но 1234
нет.
Ваша программа должна продолжать делать это в цикле, по крайней мере, до EOF
будет достигнута.
Пример сеанса:
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>
code-golf
interpreter
deadfish
Мэринус
источник
источник
#{STDIN.gets}
бы сработает, но на самом деле это не так.Ответы:
К, 77 байт
Обратите внимание, что это K4 . Решение K6 немного длиннее, потому что глаголы ввода-вывода длиннее, даже если все остальное лучше:
""0:
печатает и возвращает свой аргумент. Обратите внимание, в K4 мы просто применяем к 1 .0 f/ args
демонстрирует уменьшение с начальным значением, т.е.f[f[0;first arg];second arg]…
{x*2=-1 256?x…
классифицирует x на 0 (для -1), 1 (для 256) и 2 для всех других значений.2=
означает, что мы получаем1
для неклассифицированных значений и в0
противном случае умножение наx
короче условного. В K6 мы можем сделать немного лучше, потому что{x*^-1 256?x:y@x}
полагаются на тот факт, что-1 256?x
возвращает0N
(ноль) и^
обнаруживает нули."xkcdiso"
вместо предложенного порядка, поскольку7#
он обернут вокруг четырех аргументов, т.е.7#"abcd"
возвращает"abcdabc"
что делает нашу таблицу меньше"x"
и"i"
на проекцию,1+
которая эквивалентна функции{1+x}
но короче."d"
в проекцию,-1+
которая эквивалентна функции{-1+x}
но короче."k"
и"s"
в функцию{x*x}
"c"
и"o"
в выходную функцию,{-1@$x;x}
которая снова в K6 немного длиннее:{""0:,$x;x}
но оба печатают ее вывод, за которым следует новая строка, а затем возвращает аргумент.o`
что короче.источник
Perl 5 , 90 байт
Попробуйте онлайн!
Спасибо @xfix за его помощь в этом ранее! Сохранено 4 байта благодаря @Xcali !
источник
1
при переполнении аккумулятора. Кроме того, вы можете сократить свою программу на пять символов, изменив ее$a
на$?
(которая инициализируется0
и не изменится, пока вы не запустите внешнюю программу из Perl).issso
одну команду, а не если вы выполняете каждую из них в отдельности ... Я рассмотрю это позже и, безусловно, буду использовать$?
. Спасибо!''
вместо того,""
чтобы при использовании сperl -e '...'
картой он заканчивался результатомs///
. Еще раз спасибо!Powershell,
131126121114113for($x=0){...}
- установить аккумулятор в 0 и зациклитьread-host '>>'
- получить пользовательский ввод с подсказкой>>
[char[]](...)
- преобразовать пользовательский ввод в массив символов|%{...}
- выполнить то, что внутри{}
для каждого персонажаswitch -r($_)
- переключатель регулярных выражений для каждого символа"i|x"{$x++}
- соответствуетi
илиx
- увеличивает аккумулятор"d"{$x-=!!$x}
- matchd
- уменьшить$x
на!!$x
, что будет,0
если$x
есть0
, а в1
противном случае. Это гарантирует, что аккумулятор никогда не достигнет-1
."s|k"{$x*=$x}
- совпадатьs
илиk
- квадрат"o|c"{$x}
- соответствоватьo
илиc
- выводить аккумулятор$x*=$x-ne256
- умножить аккумулятор на,0
если он есть,256
или на1
иноеПример вывода
Я предполагаю, что реализация
read-host
зависит от хоста, поэтому этот хост Powershell (ConsoleHost) добавляется:
к указанному приглашению.источник
!!$x
, позор, я не могу использовать это ...Ребол 3,
178169161159Более красивая версия:
источник
Хаскелл, 202
источник
e
иv
в операторы. Я также попытался переписатьv
иg
чтобы параметрx
оставался в IO иprint
т. Д. Был отменен. Мне не удалось заставить его работать, но я думаю, что это может быть хорошим местом для тех, кто знает их хаскель.IO
том, что они должны печатать слишком часто (именно поэтому я использовалr n
вместоx
) или недостаточно, потому что значение никогда не запрашивается…. Так как бы я изменилсяe
иv
на операторов?'i'%x=x+1;'d'%x=x-1
... И просто позвоните в vdo n<-x;r$w$o%n
. Причина, по которой операторы экономят пространство, заключается в том, что они не требуют пробелов вокруг них.Рубин,
140138Пример сеанса (такой же, как у вас):
источник
К, 121
,
источник
Ada
Вот реализация Ada для тех, кто интересуется этим языком. Мне потребовалось довольно много времени, чтобы использовать некоторые из лучших практик Ады (например, использование Indefinite_Holders вместо доступа), а также полностью понять, как должен работать Deadfish.
И вывод:
Если бы некоторые люди, экспериментирующие в Аде, могли дать мне несколько советов по оптимизации, я был бы благодарен.
источник
C 159 символов
Я попробовал другой подход, основанный на настройке справочной таблицы для декодирования команд, но, к сожалению, это закончилось дольше ( 169 ). Я включил его, потому что кто-то может придумать хитрый твик, чтобы уменьшить размер. (Должен быть запущен без каких-либо аргументов)
источник
С 163
источник
Питон 3,
181175171162Это выводит новую строку послеУже нет!>>
, но ОП не сказал, что это не разрешено.Спасибо
GlitchMr
,minitech
иgolfer9338
!источник
lambda
вместоdef
функции, которая немедленно возвращает.x in(-1,256)
сохраняет два символа. В качестве альтернативы,s=lambda x:"a=%d"%(x!=-1and x!=256and x)
можно сэкономить.print(">>")
и использоватьfor i in input(">>")
вместо этого;input()
позволяет указать подсказку. После этого не будет новой строки>>
, и вы сохраните символы.R
161,148, 138Безголовая версия:
Пример сеанса (в интерактивном режиме):
источник
Питон 3, 141
Я знаю, что опоздал, но я хотел воспользоваться возможностью, чтобы опубликовать более короткую Python-версию (и мою первую попытку CodeGolf). :)
Печатное заявление было довольно сложно для этого. Если подсказка должна заканчиваться пробелами, добавьте один символ к счетчику. :)
объяснение
v
это аккумулятор.m
проверяет, является ли данное значение-1
или256
. Если так,0
будет возвращено значение в противном случае.В следующих строках операции присваиваются соответствующим переменным (поскольку некоторые имеют одинаковое значение (например,
i
иx
), это короче, чем создание нового словаря). Затем они используются вexec
ниже.while 1:
это основной циклТеперь начинается самое интересное. Как и решение @jazzpi , оно перебирает каждый символ ввода.
locals()
словарь всех текущих (видимых) переменных. При.get(n,'')
этом соответствующий ключ будет помещен в строку exec (пустая строка, если ключ (= другой ввод) не был найден). Это тогда, когда выполнено, соединено сv
и передано кm
. Возвращаемое значение будет сохраненоv
снова.Повторяйте это, пока не надоест. :)
источник
y*(-1!=y!=256)
для -3 байтаPython 2, 139
Это аккуратно, но также довольно просто. Вот более длинная, более прохладная версия:
При весе 190 символов, это, пожалуй, не самый конкурентоспособный ответ здесь. С другой стороны, сопрограммы очень приятны, и я всегда ищу повод их использовать (и делиться)
источник
TI-BASIC,
104 10710210098Для калькуляторов серии TI-83 + / 84 +.
Назовите это
prgmD
; это в конечном счете переполняет стек, вызывая себя. Заменить рекурсию наWhile 1
, по цене двух байтов, чтобы исправить это.По умолчанию Y равно 0, поэтому либо запустите его с помощью недавно очищенного калькулятора памяти, либо сохраните от 0 до Y вручную перед запуском.
Жаль, что строчные буквы (в строковых литералах) по два байта каждая; в противном случае это будет короче, чем ответ Dom Hastings.
РЕДАКТИРОВАТЬ: Исправлена ошибка деления на ноль (0 ^ 0) за счет трех байтов.
107 -> 102: использовал мнимый трюк возведения в степень, чтобы сохранить четыре байта (включая 1 из скобок и -1 из удлинения строки поиска), и использовал Y вместо X, что требует инициализации на один байт меньше.
источник
Постскриптум 272
Ungolfed:
источник
C (
224212 символов)Это, вероятно, плохой выбор языка, ну да ладно. Дело не в том, что язык, подобный C, может работать лучше, чем какой-то динамический язык программирования. В Clang вам необходимо указать значение для
return
(это не обязательно для gcc).источник
define q
и просто использоватьprintf
?q
используется 3 раза, поэтомуdefine q
экономит ~ 2 символа.Луа,
230228Не худший, не самый лучший.
ПРИМЕЧАНИЕ: как сообщает @mniip,
256or
может не работать в вашем переводчике. Больше информации в комментариях.(более или менее) Читаемая версия:
Выход:
Редактировать: спасибо @mniip за оптимизацию на 2 символа:
until nil
->until _
источник
repeat until x
(x равно nil, как не определено) на 2 символа короче иwhile 1 do end
точно такой же длины, кроме той, что это за версия lua?256or
неверный синтаксис в моем интерпретатореrepeat until x
. Я использую последнюю версию бинарного Windows отсюда . Как видите,a=a+1 elseif
есть место. Это потому, чтоe
шестнадцатеричная цифра, в то время какo
в256or
нет, поэтому мой интерпретатор принимает вor
качестве другого оператора / block / howYouCallIt.256or
, также0repeat
и1then
; Я использую официальный lua от lua.org, ваш код не компилируется ни в 5.1, 5.2, ни в 5.3Haskell ,
186178 байтЭто должно быть выполнено с
runhaskell
(или внутриghci
), так как они оба устанавливаютBufferMode
значениеNoBuffering
по умолчанию, которое сохраняет довольно много байтов:Попробуйте онлайн!
объяснение
Это определяет новый оператор
state # source
(декларация неподвижности позволяет нам отказаться от круглых скобок при использовании его в сочетании с другими операторами(+)
,(-)
,(^)
,(:)
и(>>)
):-1
и256
r#_
), он читает новые и начинает заново, сохраняя старое состояниеЧтобы начать процесс, мы инициализируем состояние с помощью
0
и читаем новую строку с исходным кодом, т.е. Начнем с пустого источника:источник
Пакет Windows,
204256Успешно игнорирует другие команды. Действительно раздулся без необходимости
or
работать с ...Редактировать:
источник
Командный скрипт Windows - 154
Абусин неизвестных функций на макс.
источник
> <> , 258 байт
Я сделал другой ответ> <>, так как я не мог проверить фазы и он использовал предварительно составленные команды вместо эмуляции оболочки в любом случае.
Это , безусловно , может быть golfed вниз, но я не уверен , что я буду иметь необходимую
невменяемостьотвагу!Я протестировал его с помощью официального интерпретатора, работающего под python 3.5 под cygwin под windows 7, и смог воспроизвести тестовый прогон:
Если вы не можете запустить его на своем компьютере (ввод кажется сложным) или вы просто хотите попробовать его без какого-либо другого программного обеспечения, вы можете использовать следующую версию в онлайн-переводчике .
Очевидно, он игнорирует \ n и EOF, так как вы не можете вводить их в онлайн-интерпретаторе, но будет вести себя так, как если бы ввод вводился после каждой команды вывода.
источник
C (gcc) , 139 байтов
Компилировать с
-Dk="_nZZiaeY"
(включено в число байтов). -2 байта, если приглашение>>\n
разрешено.Попробуйте онлайн!
Degolf
источник
Кег , 68Б
источник
Хаскелл, 230
Если бы я только мог избавиться от этого надоедливого
hFlush stdout
звонка! Без этого приглашение не отображается, пока неo
будет выполнена операция. Любой совет?источник
hFlush
, используяrunhaskell
вместо компиляции (см. Мой ответ ), но что касается этого решения, оно недействительно и выдает ошибки.PHP + HTML 345
вывод немного схематичный (история / сеанс показывается в текстовой области, а при включенном отчете об ошибках выводится много предупреждений), но все работает
источник
> <>, 239
Начальный стек является входом. Вы можете попробовать это онлайн здесь .
источник
Golf-Basic 84, 88 символов
Запрашивает одну команду за раз, как минимум в 3 других решениях. Вот тестовый прогон для
xiskisc
:Также
xiskso
выводит 0, как и должно быть.источник
JavaScript (Node.js), 204 байта
Это, вероятно, можно сыграть в гольф. Node.js снова доказывает, что это странное замаскированное многословие еще раз. Код объяснил:
источник
C #, 311 байт
было бы 283 байта, если использование, объявление класса и т. д. можно было бы опустить, просто предоставив определение функции
источник