Interpreta la serie Pig

13

Dada una entrada de un programa Pig , SickPig , DeadPig , QuinePig o DeafPig , elija uno de esos "idiomas" al azar e interprete la entrada como ese "idioma".

Primero, elija al azar entre uno de los cinco miembros de la "serie Pig":

  • Cerdo

    Si la elección fue Pig, imite al intérprete de referencia haciendo lo siguiente:

    • Encuentre la primera aparición de la palabra PIGen la entrada (distingue entre mayúsculas y minúsculas).

    • Si la palabra PIGno aparece en la entrada, envíe el mensaje File must contain the string 'PIG'.y salga.

    • De lo contrario, divida la cadena de entrada en la primera aparición de PIG. Envíe el texto después de la primera aparición PIGa un archivo con un nombre de archivo del texto anterior PIG.

      PIGpuede estar contenido en el texto que se generará (por lo tanto, una entrada de fooPIGbarPIGbazdebería generar barPIGbazun archivo llamado foo).

    Tenga en cuenta que el intérprete de referencia toma datos a través de un argumento de línea de comando que especifica un nombre de archivo para leer. Sin embargo, su envío puede recibir información de cualquiera de los métodos estándar aceptados en PPCG.

  • SickPig

    Si la elección fue SickPig, siga las mismas instrucciones que Pig. Sin embargo, en lugar de escribir el texto después PIGen el archivo, elija al azar de la siguiente lista

    GRUNT
    MOAN
    OINK
    BURP
    GROAN
    WHINE
    

    y enviarlo al archivo en su lugar. Esta elección aleatoria debe ser independiente de la elección anterior (por lo tanto, una salida de GRUNTdebe tener una probabilidad de 1/5 * 1/6 = 1/30 en general).

  • DeadPig

    DeadPig es como SickPig, pero siempre genera la siguiente cadena en lugar de elegir una cadena al azar:

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

    QuinePig es como Pig, pero en lugar de escribir el texto después PIGen el archivo, en su lugar escribe la entrada completa en el archivo (por lo tanto, una entrada de fooPIGbarPIGbazdebería salir fooPIGbarPIGbaza un archivo llamado foo).

  • DeafPig

    Si la elección fue DeafPig, no haga nada. (El cerdo es sordo ... ¿qué esperas?)

Reglas misceláneas:

  • "Aleatorio" significa que cada opción debe ser aproximadamente igual de probable (por lo tanto, elegir Pig el 90% del tiempo y las otras variantes solo el 2.5% del tiempo no es válido).

  • Puede suponer que los nombres de archivo solicitados siempre serán válidos para su sistema de archivos (pero pueden contener espacios, etc.).

  • Para todas las variantes de Pig, su código también puede generar opcionalmente una nueva línea final al archivo.

  • Como se trata de , el código más corto en bytes ganará.

Pomo de la puerta
fuente
2
+1 ¿qué esperas?
Dennis
¿La elección aleatoria tiene que ser perfectamente uniforme o es aceptable la modificación 32768?
Dennis
@Dennis La uniformidad perfecta no es necesaria, pero cada opción debe tener una probabilidad aproximadamente igual (por lo que está bien modificar un gran número).
Pomo de la puerta
Woah ... escribí ese intérprete de Pig ...
LegionMammal978

Respuestas:

1

Pyth - 157 bytes

Hará compresión de cuerdas.

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

No funciona en línea porque el archivo de E / S, pero intenta que [content, filename]salga a stdio aquí .

Maltysen
fuente
6

Bash, 251 246 bytes

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

Esto sería mucho más corto si los cerdos sordos pudieran leer al menos ...

Dennis
fuente
4

Python 2, 296 286 278 bytes

def g (p):
 import random; f = random.randint; r = f (0,4); i = p.find ("PIG")
 si r:
    si i + 1: abierto (p [: i], "w"). escribir ([0, p [i + 3:], ["GRUNT", "MOAN", "OINK", "BURP", "GROAN "," WHINE "] [f (0,5)]," Tu cerdo lamentablemente ha muerto. Inténtalo de nuevo ", p] [r])
    de lo contrario: print "El archivo debe contener la cadena 'PIG'".

Las dos últimas líneas comienzan con una pestaña, en lugar de los 4 espacios representados.

Toma el programa de entrada como argumento de función.

Denker
fuente
Hola, cuando cuento los bytes en tu envío, obtengo 317. ¿Cómo estás contando los bytes?
Ogaday
1
@Ogaday Los cuatro espacios que preceden a las dos últimas líneas son en realidad caracteres de tabulación. (Sin embargo, Stack Exchange reemplaza las pestañas con espacios dentro de los bloques de código).
Pomo de la puerta
@Pomo de puerta Ah, está bien! Eso sería todo. Me preguntaba por qué los espacios no se habían jugado al golf.
Ogaday
Debería haber un período después 'PIG'.
LegionMammal978
@ LegionMammal978 Gracias por la pista, completamente lo perdí.
Denker
2

Lotes, 409 406 405 bytes

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

Lamentablemente %p:*PIG=%falla si p está en blanco, por lo tanto, el x%1hack. call setes una buena manera de evitar enabledelayedexpansion que encontré en Stack Overflow; mientras que %%~xa==.fue un destello de inspiración de mi parte.

Editar: Guardado 3 bytes gracias a @ CᴏɴᴏʀO'Bʀɪᴇɴ. Guardado 1 byte gracias a @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.

Neil
fuente
¿Por qué @echo on? ¿No se hace eso implícitamente? Quizás quisiste decir @echo off?
Conor O'Brien
Además, para generar un número aleatorio, SET/A r=%RANDOM%%%5es más corto.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ugh, quise decir, @echo offpero había estado depurando ... también gracias por el consejo% RANDOM%, no había oído hablar de eso.
Neil
@ CᴏɴᴏʀO'Bʀɪᴇɴ Lamentablemente, la %RANDOM%versión requiere que use un extra set /aque termina siendo 10 bytes más.
Neil
Pero ya estás usando set/a...?
Conor O'Brien