Интерпретировать серию Свинья

13

Учитывая ввод программ Pig , SickPig , DeadPig , QuinePig или DeafPig , выберите один из этих «языков» случайным образом и интерпретируйте ввод как этот «язык».

Во-первых, случайным образом выберите одного из пяти участников «Свинья серия»:

  • свинья

    Если выбор был Pig, имитируйте ссылочный интерпретатор , выполнив следующие действия:

    • Найти первое вхождение слова PIGна входе (с учетом регистра).

    • Если слово PIGне появляется на входе, выведите сообщение File must contain the string 'PIG'.и выйдите.

    • В противном случае разбить входную строку при первом появлении PIG. Вывести текст после первого появления PIGв файл с именем файла текста до PIG.

      PIGможет содержаться в выводимом тексте (поэтому ввод fooPIGbarPIGbazдолжен выводиться barPIGbazв файл с именем foo).

    Обратите внимание, что ссылочный интерпретатор принимает ввод через аргумент командной строки, который задает имя файла для чтения. Тем не менее, ваша заявка может принимать участие в любом из стандартных методов, принятых на PPCG.

  • SickPig

    Если выбор был SickPig, следуйте тем же инструкциям, что и Pig. Однако вместо того, чтобы писать текст после PIGфайла, выберите случайным образом из следующего списка

    GRUNT
    MOAN
    OINK
    BURP
    GROAN
    WHINE
    

    и выведите это в файл. Этот случайный выбор должен быть независимым от предыдущего (поэтому выход GRUNTдолжен иметь вероятность 1/5 * 1/6 = 1/30 в целом).

  • DeadPig

    DeadPig похож на SickPig, но он всегда выводит следующую строку вместо случайного выбора строки:

    Your pig has unfortunately died. Please try again.
    
  • QuinePig

    QuinePig похож на Pig, но вместо записи текста после PIGв файл, он вместо этого записывает весь ввод в файл (поэтому ввод fooPIGbarPIGbazдолжен выводиться fooPIGbarPIGbazв файл с именем foo).

  • DeafPig

    Если выбор был DeafPig, ничего не делать. (Свинья глухая ... что вы ожидаете?)

Разные правила:

  • «Случайный» означает, что каждый выбор должен быть примерно одинаково вероятным (поэтому выбор Свиньи в 90% случаев, а в других вариантах только в 2,5% случаев недопустим).

  • Вы можете предположить, что запрошенные имена файлов всегда будут действительны для вашей файловой системы (но они могут содержать пробелы и т. Д.).

  • Для всех вариантов Pig ваш код может дополнительно выводить в конце одну завершающую новую строку.

  • Поскольку это , победит самый короткий код в байтах.

Дверная ручка
источник
2
+1 что вы ожидаете?
Деннис
Случайный выбор должен быть абсолютно одинаковым или приемлем моддинг 32768?
Деннис
@Dennis Совершенная однородность не обязательна, но каждый выбор должен иметь примерно равную вероятность (так что с большим числом все в порядке).
Дверная ручка
Вау ... Я написал этому переводчику Свинья ...
LegionMammal978

Ответы:

1

Pyth - 157 байт

Будет делать сжатие строк.

?}J"PIG"z?=GO[jJtKczJOc"GRUNT MOAN OINK BURP GROAN WHINE"d"Your pig has unfortunately died. Please try again."z0).wGhK.q"File must contain the string 'PIG'."

Не работает онлайн, потому что файловый ввод / вывод, но попробуйте вывести его [content, filename]в stdio здесь .

Maltysen
источник
6

Баш, 251 246 байт

r=$RANDOM
((r%5<4))||exit
[[ $1 =~ PIG ]]||(echo "File must contain the string 'PIG'.";exit)
s=(GRUNT MOAN OINK BURP GROAN WHINE)
m=("${1#*PIG}" ${s[r%6]}
"Your pig has unfortunately died. Please try again." "$1")
echo -n "${m[r%5]}">"${1%%PIG*}"

Это было бы намного короче, если бы глухие свиньи могли хотя бы читать ...

Деннис
источник
4

Python 2, 296 286 278 байт

def g (p):
 случайный импорт; f = random.randint; r = f (0,4); i = p.find ("PIG")
 если г:
    если i + 1: открыть (p [: i], "w"). записать ([0, p [i + 3:], ["GRUNT", "MOAN", "OINK", "BURP", "GROAN" "," WHINE "] [f (0,5)]," Ваша свинья, к сожалению, умерла. Пожалуйста, попробуйте еще раз. ", P] [r])
    else: print «Файл должен содержать строку« PIG ».»

Последние две строки начинаются с табуляции, вместо отрисованных 4 пробелов.

Принимает входную программу в качестве аргумента функции.

Denker
источник
Здравствуйте, когда я подсчитываю байты в вашем представлении, я получаю 317. Как вы подсчитываете байты?
Огадай
1
@Ogaday Четыре пробела, предшествующие двум последним строкам, на самом деле являются символами табуляции. (Stack Exchange, тем не менее, заменяет вкладки пробелами внутри блоков кода.)
Дверная ручка
@ Doorknob Ах, хорошо! Это было бы это. Я задавался вопросом, почему места не были загонены в гольф.
Огадай
Должен быть период после 'PIG'.
LegionMammal978
@ LegionMammal978 Спасибо за подсказку, это все пропустили.
Денкер
2

Пакет, 409 406 405 байт

@echo off
set/ar=%random%%%5
if 0==%r% exit/b
set p=x%1
set q=%p:*PIG=%
if %q%==%p% echo File must contain the string 'PIG'.&exit/b
set p=%1
call set p=%%p:PIG%q%=%%
goto %r%
:1
echo %q%>%p%
exit/b
:2
for %%a in (GRUNT.0 MOAN.1 OINK.2 BURP.3 GROAN.4 WHINE.5)do if %%~xa==.%time:~6,1% echo %%~na
exit/b
:3
echo Your pig has unfortunately died. Please try again.>%p%
exit/b
:4
echo %1>%p%

К сожалению, %p:*PIG=%терпит неудачу, если р пусто, таким образом, x%1взломать. call setхороший способ избежать enabledelayedexpansion, который я нашел в переполнении стека; в то время %%~xa==.как вспышка вдохновения с моей стороны.

Редактировать: 3 байта сохранены благодаря @ CᴏɴᴏʀO'Bʀɪᴇɴ. Сохранено 1 байт благодаря @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.

Нил
источник
Почему @echo on? Разве это не сделано неявно? Возможно, вы имели в виду @echo off?
Конор О'Брайен
Также, для генерации случайного числа, SET/A r=%RANDOM%%%5это короче.
Конор О'Брайен
@ CᴏɴᴏʀO'Bʀɪᴇɴ Тьфу, я имел в виду, @echo offно я отлаживал ... также спасибо за подсказку% RANDOM%, я не слышал об этом.
Нил
@ CᴏɴᴏʀO'Bʀɪᴇɴ К сожалению, %RANDOM%версия требует от меня использования дополнительного, set /aкоторое заканчивается на 10 байт длиннее.
Нил
Но вы уже используете set/a...?
Конор О'Брайен