Інтерпретувати серію Свиня


13

З огляду на введення програми Pig , SickPig , DeadPig , QuinePig або DeafPig , виберіть одну з цих "мов" випадковим чином і інтерпретуйте вклад як цю "мову".

По-перше, випадковим чином вибирайте одного з п’яти учасників "Свині серії":

  • Свиня

    Якщо вибір був Pig, імітуйте перекладача , виконуючи наступні дії:

    • Знайдіть перше виникнення слова PIGу введенні (залежно від регістру).

    • Якщо слово PIGне відображається на вводі, виведіть повідомлення File must contain the string 'PIG'.та вийдіть.

    • В іншому випадку розділіть рядок введення при першому появі PIG. Виведіть текст після першого появи у PIGфайлі з назвою цього тексту раніше PIG.

      PIGможе міститись у тексті для виведення (таким чином, вхід fooPIGbarPIGbazповинен виводити barPIGbazу файл, що називається foo).

    Зауважте, що довідковий інтерпретатор приймає введення через аргумент командного рядка, який визначає ім'я файлу, з якого слід читати. Однак ваше подання може взяти участь у будь-якому зі стандартних методів, прийнятих на PPCG.

  • Хворі свині

    Якщо вибір був SickPig, дотримуйтесь тих же вказівок, що і Свиня. Однак замість того, щоб писати текст після 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, нічого не робіть. (Свиня глуха ... що ти очікуєш?)

Різні правила:

  • "Випадковий" означає, що кожен вибір повинен бути приблизно однаково вірогідним (таким чином, вибір Свині 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 тут .


6

Bash, 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 пробілів.

Приймає програму введення як аргумент функції.


Привіт, коли я підраховую байти у вашому поданні, я отримую 317. Як ви рахуєте байти?
Огадай

1
@Ogaday Чотири пробіли, що передують останнім двом рядкам, насправді є символами вкладки. (Обмін стека замінює вкладки пробілами в кодових блоках.)
Doorknob

@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=%виходить з ладу, якщо p порожній, таким чином, x%1хак. call setце хороший спосіб уникнути enabledelayedex розширення, яке я знайшов у стеку Overflow; в той час %%~xa==.як з мого боку був спалах натхнення.

Редагувати: Збережено 3 байти завдяки @ CᴏɴᴏʀO'Bʀɪᴇɴ. Збережено 1 байт завдяки @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.


Чому @echo on? Чи це не неявно зроблено? Можливо, ви мали на увазі @echo off?
Conor O'Brien

Також для генерації випадкового числа SET/A r=%RANDOM%%%5коротше.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Фу, я мав на увазі, @echo offале я налагоджував ... також дякую за підказку% RANDOM%, я не чув про неї.
Ніл

@ CᴏɴᴏʀO'Bʀɪᴇɴ На жаль, %RANDOM%версія вимагає від мене використовувати додатковий, set /aякий у 10 байт довше.
Ніл

Але ти вже використовуєш set/a...?
Conor O'Brien
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.