Interpreta la serie Pig


13

Dato un input di un programma Pig , SickPig , DeadPig , QuinePig o DeafPig , scegliere una di quelle "lingue" in modo casuale e interpretare l'input come quella "lingua".

Innanzitutto, scegli casualmente tra uno dei cinque membri della "serie Pig":

  • Maiale

    Se la scelta era Pig, imita l' interprete di riferimento nel modo seguente:

    • Trova la prima occorrenza della parola PIGnell'input (sensibile al maiuscolo / minuscolo).

    • Se la parola PIGnon appare nell'input, emette il messaggio File must contain the string 'PIG'.ed esce.

    • Altrimenti, dividere la stringa di input alla prima occorrenza di PIG. Emette il testo dopo la prima occorrenza PIGin un file con un nome file del testo precedente PIG.

      PIGpuò essere contenuto nel testo da emettere (quindi, un input di fooPIGbarPIGbazdovrebbe essere emesso barPIGbazin un file chiamato foo).

    Si noti che l'interprete di riferimento accetta l'input tramite un argomento della riga di comando che specifica un nome file da cui leggere. Tuttavia, il tuo invio può ricevere input in uno dei metodi standard accettati su PPCG.

  • SickPig

    Se la scelta era SickPig, seguire le stesse istruzioni di Pig. Tuttavia, invece di scrivere il testo dopo PIGnel file, scegliere in modo casuale dal seguente elenco

    GRUNT
    MOAN
    OINK
    BURP
    GROAN
    WHINE
    

    e invece l'output nel file. Questa scelta casuale deve essere indipendente dalla scelta precedente (quindi, un output di GRUNTdovrebbe avere una probabilità complessiva di 1/5 * 1/6 = 1/30).

  • DeadPig

    DeadPig è come SickPig, ma genera sempre la seguente stringa invece di scegliere casualmente una stringa:

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

    QuinePig è come Pig, ma invece di scrivere il testo dopo PIGnel file, scrive invece l'intero input nel file (quindi, un input di fooPIGbarPIGbazdovrebbe essere emesso fooPIGbarPIGbazin un file chiamato foo).

  • DeafPig

    Se la scelta era DeafPig, non fare nulla. (Il maiale è sordo ... cosa ti aspetti?)

Regole varie:

  • "Casuale" significa che ogni scelta dovrebbe essere approssimativamente ugualmente probabile (quindi, scegliere Pig il 90% delle volte e le altre varianti solo il 2,5% delle volte non è valido).

  • Puoi presumere che i nomi dei file richiesti siano sempre validi per il tuo file system (ma possono contenere spazi, ecc.).

  • Per tutte le varianti di Pig, il tuo codice può facoltativamente generare anche una sola nuova riga finale nel file.

  • Poiché si tratta di , vincerà il codice più breve in byte.


2
+1 cosa ti aspetti?
Dennis,

La scelta casuale deve essere perfettamente uniforme o il modding 32768 è accettabile?
Dennis,

@Dennis Non è necessaria una perfetta uniformità, ma ogni scelta deve avere una probabilità approssimativamente uguale (quindi mod un numero grande va bene).
Maniglia della porta

Woah ... Ho scritto quell'interprete Pig ...
LegionMammal978,

Risposte:


1

Pyth - 157 byte

Farà la compressione delle stringhe.

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

Non funziona online perché I / O dei file, ma provalo in output qui su[content, filename] stdio .


6

Bash, 251 246 byte

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

Questo sarebbe molto più breve se i maiali sordi potessero almeno leggere ...


4

Python 2, 296 286 278 byte

def g (p):
 import random; f = random.randint; r = f (0,4); i = p.find ("PIG")
 se r:
    se i + 1: open (p [: i], "w"). write ([0, p [i + 3:], ["GRUNT", "MOAN", "OINK", "BURP", "GROAN "," WHINE "] [f (0,5)]," Purtroppo il tuo maiale è morto. Riprova. ", P] [r])
    else: print "Il file deve contenere la stringa 'PIG'."

Le ultime due righe iniziano con una scheda, anziché con i 4 spazi renderizzati.

Prende il programma di input come argomento della funzione.


Ciao, quando conto i byte nel tuo invio, ottengo 317. Come stai contando i byte?
Ogaday,

1
@Ogaday I quattro spazi che precedono le ultime due righe sono in realtà caratteri di tabulazione. (Stack Exchange sostituisce le schede con spazi all'interno di blocchi di codice, tuttavia.)
Maniglia

@Doorknob Ah, ok! Quello sarebbe. Mi chiedevo perché gli spazi non fossero stati eliminati.
Ogaday,

Dovrebbe esserci un periodo dopo 'PIG'.
LegionMammal978,

@ LegionMammal978 Grazie per il suggerimento, l'ho perso del tutto.
Denker,

2

Lotto, 409 406 405 byte

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

Purtroppo %p:*PIG=%fallisce se p è vuoto, quindi l' x%1hack. call setè un bel modo per evitare l'abilitazione del ritardo di attivazione che ho trovato su Stack Overflow; mentre da %%~xa==.parte mia è stato un lampo di ispirazione.

Modifica: 3 byte salvati grazie a @ CᴏɴᴏʀO'Bʀɪᴇɴ. Salvato 1 byte grazie a @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.


Perché @echo on? Non è implicitamente fatto? Forse intendevi @echo off?
Conor O'Brien,

Inoltre, per generare un numero casuale, SET/A r=%RANDOM%%%5è più breve.
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ugh, intendevo @echo offma avevo fatto il debug ... anche grazie per il suggerimento% RANDOM%, non ne avevo sentito parlare.
Neil,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Purtroppo la %RANDOM%versione mi richiede di usare un extra set /ache finisce per essere 10 byte più lungo.
Neil,

Ma stai già usando set/a...?
Conor O'Brien,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.