Interpretuj serię Świnia

13

Biorąc pod uwagę dane wejściowe programu Pig , SickPig , DeadPig , QuinePig lub DeafPig , wybierz jeden z tych „języków” losowo i zinterpretuj dane wejściowe jako „język”.

Po pierwsze, losowo wybierz jednego z pięciu członków „Świni”:

  • Świnia

    Jeśli wybrano Świnia, naśladuj tłumacza referencyjnego , wykonując następujące czynności:

    • Znajdź pierwsze wystąpienie słowa PIGna wejściu (rozróżniana jest wielkość liter).

    • Jeśli słowo PIGnie pojawia się na wejściu, wyślij komunikat File must contain the string 'PIG'.i wyjdź.

    • W przeciwnym razie podziel łańcuch wejściowy przy pierwszym wystąpieniu PIG. Wypisuj tekst po pierwszym wystąpieniu PIGdo pliku z nazwą pliku wcześniej PIG.

      PIGmoże być zawarty w tekście, który ma być wyprowadzony (więc wejście fooPIGbarPIGbazpowinno wypisać się barPIGbazdo pliku o nazwie foo).

    Zauważ, że interpreter odniesienia pobiera dane wejściowe za pomocą argumentu wiersza poleceń, który określa nazwę pliku do odczytu. Twoje zgłoszenie może jednak uwzględniać dowolną standardową metodę akceptowaną w PPCG.

  • SickPig

    Jeśli wybór padł na SickPig, postępuj zgodnie z tymi samymi instrukcjami, co Świnia. Jednak zamiast wpisywać tekst PIGdo pliku, wybierz losowo z poniższej listy

    GRUNT
    MOAN
    OINK
    BURP
    GROAN
    WHINE
    

    i zamiast tego wyślij go do pliku. Ten losowy wybór musi być niezależny od poprzedniego wyboru (więc wyjście GRUNTpowinno mieć ogólną szansę 1/5 * 1/6 = 1/30).

  • DeadPig

    DeadPig jest jak SickPig, ale zawsze wyświetla następujący ciąg zamiast losowego wybierania ciągu:

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

    QuinePig jest jak Pig, ale zamiast zapisywać tekst po PIGpliku, zamiast tego zapisuje całe dane wejściowe do pliku (więc wejście fooPIGbarPIGbazpowinno wypisać się fooPIGbarPIGbazdo pliku o nazwie foo).

  • DeafPig

    Jeśli wybór padł na DeafPig, nie rób nic. (Świnia jest głucha ... czego oczekujesz?)

Różne zasady:

  • „Losowy” oznacza, że ​​każdy wybór powinien być w przybliżeniu jednakowo prawdopodobny (więc wybranie Świni w 90% przypadków, a inne warianty tylko w 2,5% przypadków jest nieprawidłowe).

  • Możesz założyć, że żądane nazwy plików będą zawsze poprawne dla twojego systemu plików (ale mogą zawierać spacje itp.).

  • Dla wszystkich wariantów Pig Twój kod może opcjonalnie wypisać do pliku również jedną końcową linię nowego wiersza.

  • Ponieważ jest to , wygra najkrótszy kod w bajtach.

Klamka
źródło
2
+1 czego oczekujesz?
Dennis
Czy wybór losowy musi być idealnie jednolity, czy modding 32768 jest do przyjęcia?
Dennis
@Dennis Perfekcyjna jednolitość nie jest konieczna, ale każdy wybór musi mieć z grubsza jednakowe prawdopodobieństwo (więc mod duża liczba jest w porządku).
Klamka
Woah ... Napisałem tego tłumacza Pig ...
LegionMammal978

Odpowiedzi:

1

Pyth - 157 bajtów

Będzie wykonywać kompresję ciągów.

?}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'."

Nie działa online, ponieważ plik I / O pliku, ale spróbuj wypisać [content, filename]go tutaj na stdio .

Maltysen
źródło
6

Bash, 251 246 bajtów

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*}"

Byłoby to o wiele krótsze, gdyby głuche świnie potrafiły przynajmniej czytać ...

Dennis
źródło
4

Python 2, 296 286 278 bajtów

def g (p):
 import random; f = random.randint; r = f (0,4); i = p.find („PIG”)
 jeśli r:
    jeśli i + 1: otwórz (p [: i], „w”). napisz ([0, p [i + 3:], [„GRUNT”, „MOAN”, „OINK”, „BURP”, „GROAN „,„ WHINE ”] [f (0,5)],„ Twoja świnia niestety umarła. Spróbuj ponownie. ”, P] [r])
    else: print „Plik musi zawierać ciąg„ PIG ”.”

Ostatnie dwa wiersze zaczynają się od tabulacji zamiast renderowanych 4 spacji.

Pobiera program wejściowy jako argument funkcji.

Denker
źródło
Witaj, kiedy liczę bajty w twoim zgłoszeniu, otrzymuję 317. Jak liczyć bajty?
Ogaday
1
@Ogaday Cztery spacje poprzedzające ostatnie dwa wiersze są w rzeczywistości znakami tabulacji. (Wymiana stosów zastępuje jednak tabulacje spacjami w blokach kodu.)
Klamka
@Doorknob Ah, ok! To by było na tyle. Zastanawiałem się, dlaczego te przestrzenie nie zostały zagrane w golfa.
Ogaday
Powinien być okres później 'PIG'.
LegionMammal978
@ LegionMammal978 Dzięki za podpowiedź, całkowicie tego przegapiłem.
Denker
2

Partia, 409 406 405 bajtów

@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%

Niestety %p:*PIG=%zawodzi, jeśli p jest puste, więc x%1hack. call setto dobry sposób na uniknięcie włączonego opóźnionego rozszerzenia, które znalazłem na stosie przepełnienia; podczas gdy %%~xa==.był to błysk inspiracji z mojej strony.

Edycja: Zapisano 3 bajty dzięki @ CᴏɴᴏʀO'Bʀɪᴇɴ. Zapisano 1 bajt dzięki @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.

Neil
źródło
Dlaczego @echo on? Czy to nie jest zrobione domyślnie? Może miałeś na myśli @echo off?
Conor O'Brien
Również generowanie liczby losowej SET/A r=%RANDOM%%%5jest krótsze.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ugh, miałem na myśli, @echo offale debugowałem ... również dzięki za wskazówkę% RANDOM%, o której nie słyszałem.
Neil
@ CᴏɴᴏʀO'Bʀɪᴇɴ Niestety %RANDOM%wersja wymaga ode mnie użycia dodatkowej, set /aktóra kończy się o 10 bajtów dłużej.
Neil
Ale już używasz set/a...?
Conor O'Brien