Interpréter la série Pig

13

Étant donné une entrée d'un programme Pig , SickPig , DeadPig , QuinePig ou DeafPig , choisissez l'une de ces "langues" au hasard et interprétez l'entrée comme cette "langue".

Tout d'abord, choisissez aléatoirement l'un des cinq membres de la "série Pig":

  • Porc

    Si le choix était Pig, imitez l' interpréteur de référence en procédant comme suit:

    • Recherchez la première occurrence du mot PIGdans l'entrée (sensible à la casse).

    • Si le mot PIGn'apparaît pas dans l'entrée, File must contain the string 'PIG'.sortez le message et quittez.

    • Sinon, divisez la chaîne d'entrée à la première occurrence de PIG. Sortez le texte après la première occurrence de PIGdans un fichier avec un nom de fichier du texte précédent PIG.

      PIG peut être contenue dans le texte à sortir (donc, une entrée de fooPIGbarPIGbaz devrait sortir barPIGbazdans un fichier appelé foo).

    Notez que l'interpréteur de référence prend l'entrée via un argument de ligne de commande qui spécifie un nom de fichier à lire. Cependant, votre soumission peut prendre en compte l'une des méthodes standard acceptées sur PPCG.

  • SickPig

    Si le choix était SickPig, suivez les mêmes instructions que Pig. Cependant, au lieu d'écrire le texte après PIGdans le fichier, choisissez au hasard dans la liste suivante

    GRUNT
    MOAN
    OINK
    BURP
    GROAN
    WHINE
    

    et sortie à la place dans le fichier. Ce choix aléatoire doit être indépendant du choix précédent (donc, une sortie deGRUNT devrait avoir une chance 1/5 * 1/6 = 1/30 dans l'ensemble).

  • DeadPig

    DeadPig est comme SickPig, mais il génère toujours la chaîne suivante au lieu de choisir une chaîne au hasard:

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

    QuinePig est comme Pig, mais au lieu d'écrire le texte après PIGdans le fichier, il écrit plutôt l'entrée entière dans le fichier (donc, une entrée de fooPIGbarPIGbazdevrait sortir fooPIGbarPIGbazdans un fichier appelé foo).

  • DeafPig

    Si le choix était DeafPig, ne faites rien. (Le cochon est sourd ... à quoi vous attendez-vous?)

Règles diverses:

  • "Aléatoire" signifie que chaque choix devrait être à peu près tout aussi probable (donc, choisir Pig 90% du temps et les autres variantes seulement 2,5% du temps n'est pas valide).

  • Vous pouvez supposer que les noms de fichiers demandés seront toujours valides pour votre système de fichiers (mais ils peuvent contenir des espaces, etc.).

  • Pour toutes les variantes de Pig, votre code peut éventuellement générer une seule nouvelle ligne de fin dans le fichier.

  • Puisqu'il s'agit de , le code le plus court en octets gagnera.

Poignée de porte
la source
2
+1 à quoi vous attendez-vous?
Dennis
Le choix aléatoire doit-il être parfaitement uniforme ou le modding 32768 est-il acceptable?
Dennis
@Dennis Une uniformité parfaite n'est pas nécessaire, mais chaque choix doit avoir une probabilité à peu près égale (donc mod un grand nombre est correct).
Poignée de porte
Woah ... J'ai écrit cet interprète Pig ...
LegionMammal978

Réponses:

1

Pyth - 157 octets

Fera la compression des chaînes.

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

Ne fonctionne pas en ligne car les E / S des fichiers, mais essayez de les sortir [content, filename]sur stdio ici .

Maltysen
la source
6

Bash, 251 246 octets

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

Ce serait beaucoup plus court si les porcs sourds pouvaient au moins lire ...

Dennis
la source
4

Python 2, 296 286 278 octets

déf g (p):
 import random; f = random.randint; r = f (0,4); i = p.find ("PIG")
 si r:
    si i + 1: ouvert (p [: i], "w"). écrire ([0, p [i + 3:], ["GRUNT", "MOAN", "OINK", "BURP", "GROAN "," WHINE "] [f (0,5)]," Votre cochon est malheureusement décédé. Veuillez réessayer. ", P] [r])
    else: print "Le fichier doit contenir la chaîne 'PIG'."

Les deux dernières lignes commencent par une tabulation, au lieu des 4 espaces rendus.

Prend le programme d'entrée comme argument de fonction.

Denker
la source
Bonjour, lorsque je compte les octets dans votre soumission, j'obtiens 317. Comment comptez-vous les octets?
Ogaday
1
@Ogaday Les quatre espaces précédant les deux dernières lignes sont en fait des tabulations. (Stack Exchange remplace cependant les tabulations par des espaces dans les blocs de code.)
Poignée de porte
@ Doorknob Ah, ok! Ce serait tout. Je me demandais pourquoi les espaces n'avaient pas été joués au golf.
Ogaday
Il devrait y avoir une période après 'PIG'.
LegionMammal978
@ LegionMammal978 Merci pour l'allusion, complètement raté cela.
Denker
2

Lot, 409 406 405 octets

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

Échoue malheureusement %p:*PIG=%si p est vide, d'où le x%1hack. call setest une bonne façon d'éviter l'extension prolongée activée que j'ai trouvée sur Stack Overflow; alors que ce %%~xa==.fut un éclair d'inspiration de ma part.

Edit: 3 octets enregistrés grâce à @ CᴏɴᴏʀO'Bʀɪᴇɴ. 1 octet enregistré grâce à @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.

Neil
la source
Pourquoi @echo on? N'est-ce pas implicitement fait? Peut-être que vous vouliez dire @echo off?
Conor O'Brien
En outre, pour générer un nombre aléatoire, SET/A r=%RANDOM%%%5est plus court.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ugh, je voulais dire @echo offmais j'avais débogué ... aussi merci pour le conseil% RANDOM%, je n'avais pas entendu parler de celui-là.
Neil
@ CᴏɴᴏʀO'Bʀɪᴇɴ Malheureusement, la %RANDOM%version nécessite que j'utilise un supplément set /aqui finit par être 10 octets de plus.
Neil
Mais vous utilisez déjà set/a...?
Conor O'Brien