Tafsirkan seri Babi

13

Diberikan input dari program Babi , SickPig , DeadPig , QuinePig , atau DeafPig , pilih salah satu dari "bahasa" itu secara acak dan tafsirkan input sebagai "bahasa" itu.

Pertama, pilih secara acak antara satu dari lima anggota "seri Babi":

  • Babi

    Jika pilihannya adalah Babi, meniru juru bahasa referensi dengan melakukan hal berikut:

    • Temukan kemunculan kata pertama PIGdi input (peka huruf besar kecil).

    • Jika kata PIGitu tidak muncul di input, output pesan File must contain the string 'PIG'.dan keluar.

    • Jika tidak, pisahkan string input pada kemunculan pertama PIG. Keluarkan teks setelah kemunculan pertama PIGke file dengan nama file teks sebelumnya PIG.

      PIGdapat terkandung dalam teks yang akan di-output (jadi, input fooPIGbarPIGbazharus di-output barPIGbazke file bernama foo)

    Perhatikan bahwa penerjemah referensi mengambil input melalui argumen baris perintah yang menentukan nama file untuk dibaca. Namun, kiriman Anda dapat menerima input dari salah satu metode standar yang diterima di PPCG.

  • SickPig

    Jika pilihannya adalah SickPig, ikuti instruksi yang sama seperti Pig. Namun, alih-alih menulis teks setelah PIGke file, pilih secara acak dari daftar berikut

    GRUNT
    MOAN
    OINK
    BURP
    GROAN
    WHINE
    

    dan output itu ke file sebagai gantinya. Pilihan acak ini harus independen dari pilihan sebelumnya (jadi, output dari GRUNTharus memiliki 1/5 * 1/6 = 1/30 peluang keseluruhan).

  • DeadPig

    DeadPig seperti SickPig, tetapi selalu menampilkan string berikut daripada memilih string secara acak:

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

    QuinePig seperti Babi, tetapi alih-alih menulis teks setelah PIGke file, ia malah menulis seluruh input ke file (jadi, input fooPIGbarPIGbazharus output fooPIGbarPIGbazke file yang disebut foo).

  • DeafPig

    Jika pilihannya adalah DeafPig, jangan lakukan apa pun. (Babi itu tuli ... apa yang Anda harapkan?)

Aturan lain-lain:

  • "Acak" berarti setiap pilihan kira-kira memiliki kemungkinan yang sama besar (jadi, memilih Pig 90% dari waktu dan varian lainnya hanya 2,5% dari waktu tidak valid).

  • Anda dapat mengasumsikan bahwa nama file yang diminta akan selalu valid untuk sistem file Anda (tetapi mungkin berisi spasi, dll.).

  • Untuk semua varian Babi, kode Anda juga dapat menampilkan satu baris tambahan baris baru ke file.

  • Karena ini adalah , kode terpendek dalam byte akan menang.

Gagang pintu
sumber
2
+1 apa yang Anda harapkan?
Dennis
Apakah pilihan acak harus seragam sempurna atau modding 32768 dapat diterima?
Dennis
@ Dennis Keseragaman sempurna tidak diperlukan, tetapi setiap pilihan harus memiliki probabilitas yang kira-kira sama (jadi mod sejumlah besar tidak apa-apa).
Gagang Pintu
Woah ... Saya menulis penerjemah Babi itu ...
LegionMammal978

Jawaban:

1

Pyth - 157 byte

Akan melakukan kompresi 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'."

Tidak berfungsi secara online karena file I / O, tetapi coba keluaran [content, filename]ke stdio di sini .

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

Ini akan menjadi jauh lebih pendek jika babi tuli setidaknya bisa membaca ...

Dennis
sumber
4

Python 2, 296 286 278 byte

def g (p):
 impor acak; f = random.randint; r = f (0,4); i = p.find ("PIG")
 jika r:
    jika i +1: buka (p [: i], "w"). tulis ([0, p [i + 3:], ["GRUNT", "MOAN", "OINK", "BURP", "BURP", "GROAN "," WHINE "] [f (0,5)]," Sayangnya babi Anda telah mati. Coba lagi. ", P] [r])
    lain: cetak "File harus mengandung string 'PIG'."

Dua baris terakhir dimulai dengan tab, bukannya 4 spasi yang diberikan.

Mengambil input program sebagai argumen fungsi.

Denker
sumber
Halo, ketika saya menghitung byte dalam kiriman Anda, saya mendapatkan 317. Bagaimana Anda menghitung byte?
Ogaday
1
@Ogaday Empat spasi sebelum dua baris terakhir sebenarnya adalah karakter tab. (Stack Exchange menggantikan tab dengan spasi di dalam blok kode.)
Gagang Pintu
@ Doorknob Ah, ok! Itu saja. Saya bertanya-tanya mengapa ruang tidak golf.
Ogaday
Harus ada periode sesudahnya 'PIG'.
LegionMammal978
@ LegionMammal978 Terima kasih atas petunjuknya, benar-benar merindukan itu.
Denker
2

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

Sayangnya %p:*PIG=%gagal jika p kosong, maka x%1retas. call setadalah cara yang baik untuk menghindari perluasan ekspansi tidak diaktifkan yang saya temukan di Stack Overflow; sementara %%~xa==.itu adalah kilasan inspirasi di pihak saya.

Sunting: Disimpan 3 byte berkat @ CᴏɴᴏʀO'Bʀɪᴇɴ. Disimpan 1 byte berkat @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.

Neil
sumber
Mengapa @echo on? Bukankah itu dilakukan secara implisit? Mungkin maksudmu @echo off?
Conor O'Brien
Juga, untuk menghasilkan nomor acak, SET/A r=%RANDOM%%%5lebih pendek.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ugh, maksud saya @echo offtetapi saya telah men- debug ... juga terima kasih atas tip% ACAK%, saya belum pernah mendengar yang itu.
Neil
@ CᴏɴᴏʀO'Bʀɪᴇɴ Sayangnya %RANDOM%versi ini mengharuskan saya untuk menggunakan ekstra set /ayang akhirnya menjadi 10 byte lebih lama.
Neil
Tapi Anda sudah menggunakan set/a...?
Conor O'Brien