Interpretar a série Pig

13

Dada a entrada de um programa Pig , SickPig , DeadPig , QuinePig ou DeafPig , escolha um desses "idiomas" aleatoriamente e interprete a entrada como "idioma".

Primeiro, escolha aleatoriamente entre um dos cinco membros da "série Pig":

  • Porco

    Se a opção foi Pig, imite o intérprete de referência , fazendo o seguinte:

    • Encontre a primeira ocorrência da palavra PIGna entrada (diferencia maiúsculas de minúsculas).

    • Se a palavra PIGnão aparecer na entrada, envie a mensagem File must contain the string 'PIG'.e saia.

    • Caso contrário, divida a sequência de entrada na primeira ocorrência de PIG. Envie o texto após a primeira ocorrência de PIGpara um arquivo com um nome de arquivo do texto anterior PIG.

      PIGpode estar contido no texto a ser produzido (portanto, uma entrada de fooPIGbarPIGbazdeve ser enviada barPIGbazpara um arquivo chamado foo).

    Observe que o intérprete de referência recebe entrada por meio de um argumento de linha de comando que especifica um nome de arquivo para leitura. No entanto, sua submissão pode ser inserida em qualquer um dos métodos padrão aceitos no PPCG.

  • SickPig

    Se a opção foi SickPig, siga as mesmas instruções que o Pig. No entanto, em vez de escrever o texto depois PIGno arquivo, escolha aleatoriamente na lista a seguir

    GRUNT
    MOAN
    OINK
    BURP
    GROAN
    WHINE
    

    e envie isso para o arquivo. Essa escolha aleatória deve ser independente da escolha anterior (portanto, uma saída de GRUNTdeve ter uma chance de 1/5 * 1/6 = 1/30 no total).

  • DeadPig

    DeadPig é como SickPig, mas sempre gera a seguinte string em vez de escolher aleatoriamente uma string:

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

    O QuinePig é como o Pig, mas em vez de escrever o texto depois PIGno arquivo, ele grava toda a entrada no arquivo (portanto, uma entrada de fooPIGbarPIGbazdeve ser enviada fooPIGbarPIGbazpara um arquivo chamado foo).

  • DeafPig

    Se a escolha foi DeafPig, não faça nada. (O porco é surdo ... o que você espera?)

Regras diversas:

  • "Aleatório" significa que cada opção deve ser igualmente provável (portanto, escolher Pig 90% das vezes e as outras variantes apenas 2,5% das vezes são inválidas).

  • Você pode supor que os nomes de arquivos solicitados sempre serão válidos para o seu sistema de arquivos (mas eles podem conter espaços etc.).

  • Para todas as variantes do Pig, seu código também pode, opcionalmente, gerar uma nova linha à direita no arquivo.

  • Como esse é o , o código mais curto em bytes será vencedor.

Maçaneta da porta
fonte
2
+1 o que você espera?
Dennis
A escolha aleatória deve ser perfeitamente uniforme ou a modificação 32768 é aceitável?
Dennis19 /
@ Dennis A uniformidade perfeita não é necessária, mas cada opção deve ter uma probabilidade aproximadamente igual (para que um número grande de mod seja aceitável).
Maçaneta
Woah ... eu escrevi esse intérprete de porco ... #
7897

Respostas:

1

Pitão - 157 bytes

Estará fazendo compressão de string.

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

Não funciona on-line, porque a E / S do arquivo, mas tente a saída [content, filename]para o stdio aqui .

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

Isso seria muito mais curto se os porcos surdos pudessem pelo menos ler ...

Dennis
fonte
4

Python 2, 296 286 278 bytes

def g (p):
 aleatório de importação; f = random.randint; r = f (0,4); i = p.find ("PIG")
 se r:
    se i + 1: aberto (p [: i], "w"). escreva ([0, p [i + 3:], ["GRUNT", "MOAN", "OINK", "BURP", "GROAN" "," WHINE "] [f (0,5)]," Infelizmente, o seu porco morreu. Tente novamente. ", P] [r])
    else: print "O arquivo deve conter a string 'PIG'."

As duas últimas linhas começam com uma guia, em vez dos 4 espaços renderizados.

Leva o programa de entrada como argumento de função.

Denker
fonte
Olá, quando conto os bytes no seu envio, recebo 317. Como você está contando os bytes?
Ogaday
1
@Ogaday Os quatro espaços que precedem as duas últimas linhas são na verdade caracteres de tabulação. (Stack Exchange substitui tabulações por espaços dentro de blocos de código, no entanto.)
Doorknob
@Doorknob Ah, ok! Seria isso. Eu me perguntava por que os espaços não tinham sido jogados fora.
Ogaday
Deve haver um período depois 'PIG'.
LegionMammal978
@ LegionMammal978 Obrigado pela dica, perdi completamente isso.
Denker
2

Lote, 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%

Infelizmente %p:*PIG=%falha se p estiver em branco, portanto, o x%1hack. call seté uma boa maneira de evitar a expansão retardada que encontrei no Stack Overflow; enquanto isso %%~xa==.foi um flash de inspiração da minha parte.

Editar: salvou 3 bytes graças a @ CᴏɴᴏʀO'Bʀɪᴇɴ. Guardou 1 byte graças a @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.

Neil
fonte
Por que @echo on? Isso não é feito implicitamente? Talvez você quis dizer @echo off?
Conor O'Brien
Além disso, para gerar um número aleatório, SET/A r=%RANDOM%%%5é mais curto.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ugh, eu quis dizer, @echo offmas eu estava depurando ... também obrigado pela dica% RANDOM%, eu não tinha ouvido falar dessa.
Neil
@ CᴏɴᴏʀO'Bʀɪᴇɴ Infelizmente, a %RANDOM%versão exige que eu use um extra set /aque acaba sendo 10 bytes mais longo.
Neil
Mas você já está usando set/a...?
Conor O'Brien