豚シリーズを解釈する


13

PigSickPigDeadPigQuinePig、または DeafPigプログラムの入力が与えられたら、 それらの「言語」のいずれかをランダムに選択し、入力をその「言語」として解釈します。

まず、「豚シリーズ」の5つのメンバーのいずれかをランダムに選択します。

  • 選択肢が豚だった場合、以下を実行して参照インタープリターを模倣します。

    • PIG入力で最初に出現する単語を検索します(大文字と小文字を区別します)。

    • 単語PIGが入力に表示されない場合は、メッセージFile must contain the string 'PIG'.を出力して 終了します。

    • それ以外の場合は、入力文字列をの最初の出現時に分割しますPIG。最初に出現した後のテキストを、PIG前のテキストのファイル名を持つファイルに出力しますPIG

      PIG出力されるテキストに含まれている可能性があります(したがって、の入力は というファイルにfooPIGbarPIGbaz出力barPIGbazする必要がありますfoo)。

    参照インタープリターは、読み込むファイル名を指定するコマンドライン引数を介して入力を受け取ることに注意してください。ただし、PPCGで受け入れられている標準的な方法のいずれかで提出することができます。

  • シックピッグ

    SickPigを選択した場合は、Pigと同じ指示に従ってください。ただし、PIGファイルの後にテキストを書き込む代わりに、次のリストからランダムに選択します

    GRUNT
    MOAN
    OINK
    BURP
    GROAN
    WHINE
    

    代わりにファイルに出力します。このランダムな選択は、前の選択とは独立している必要があります(したがって、の出力にGRUNTは全体で1/5 * 1/6 = 1/30のチャンスがあります)。

  • DeadPig

    DeadPigはSickPigに似ていますが、文字列をランダムに選択する代わりに、常に次の文字列を出力します。

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

    QuinePigはPigに似PIGていますが、テキストをファイルに書き込む代わりに、入力全体をファイルに書き込みます(したがって、の入力は というファイルにfooPIGbarPIGbaz出力fooPIGbarPIGbazする必要がありますfoo)。

  • DeafPig

    選択肢がDeafPigの場合、何もしません。(ブタは耳が聞こえません...何を期待しますか?)

その他の規則:

  • 「ランダム」とは、それぞれの選択肢がほぼ同じ確率である必要があることを意味します(したがって、Pigを選択するのは90%の時間であり、他のバリアントを選択するのは2.5%の時間だけが無効です)。

  • 要求されたファイル名は常にファイルシステムで有効であると想定することができます(ただし、スペースなどが含まれている場合があります)。

  • Pigのすべてのバリアントについて、コードはオプションでファイルに単一の末尾の改行を出力することもできます。

  • これはであるため、バイト単位の最短コードが優先されます。


2
+1何を期待しますか?
デニス

ランダムな選択は完全に均一である必要がありますか、それとも32768の改造は許容されますか?
デニス

@Dennis 完全な均一性は必要ありませんが、各選択肢はほぼ等しい確率を持っている必要があります(したがって、大きな数をmodしても大丈夫です)。
ドアノブ

うわ...私はそのブタ通訳者を書いた...
LegionMammal978

回答:


1

Pyth-157バイト

文字列圧縮を行います。

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

ファイルI / Oのオンラインcuzで動作しませんが、ここで[content, filename] stdio に出力してみてください


6

バッシュ、251 246バイト

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

耳の聞こえないブタが少なくとも読むことができれば、これはずっと短くなるでしょう...


4

Python 2、296 286 278バイト

def g(p):
 import random; f = random.randint; r = f(0,4); i = p.find( "PIG")
 rの場合:
    if i + 1:open(p [:i]、 "w")。write([0、p [i + 3:]、["GRUNT"、 "MOAN"、 "OINK"、 "BURP"、 "GROAN "、" WHINE "] [f(0,5)]、"残念ながらあなたのブタは死亡しました。もう一度試してください。 "、p] [r])
    else:print "ファイルには文字列「PIG」が含まれている必要があります。」

最後の2行は、レンダリングされた4つのスペースではなく、タブで始まります。

入力プログラムを関数の引数として使用します。


こんにちは。提出物のバイト数を数えると317になります。バイト数はどのように数えていますか?
-Ogaday

1
@Ogaday最後の2行の前にある4つのスペースは、実際にはタブ文字です。(ただし、Stack Exchangeはコードブロック内のタブをスペースに置き換えます。)
Doorknob

@Doorknobああ、OK!それだろう。なぜスペースがゴルフアウトされなかったのか疑問に思いました。
-Ogaday

後に期間が必要'PIG'です。
LegionMammal978

@ LegionMammal978ヒントをありがとう、完全にそれを見逃しました。
デンカー

2

バッチ、409の 406 405バイト

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

%p:*PIG=%pが空白の場合、悲しいことに失敗しますx%1。したがって、ハックです。call setStack Overflowで見つけたenabledelayedexpansionを避ける良い方法です。一方で、%%~xa==.私のインスピレーションの閃きでした。

編集:@CᴏɴᴏʀO'Bʀɪᴇɴのおかげで3バイト保存されました。@EʀɪᴋᴛʜᴇGᴏʟғᴇʀのおかげで1バイト節約されました。


なんで@echo on?それは暗黙的に行われていませんか?おそらくあなたはどういう意味@echo offですか?
コナーオブライエン

また、乱数を生成するための、SET/A r=%RANDOM%%%5より短いです。
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴうーん、私は意図し@echo offていましたが、デバッグしていました...%RANDOM%ヒントのおかげで、私はそのことを聞いていませんでした。
ニール

@CᴏɴᴏʀO'Bʀɪᴇɴ悲しいことに、この%RANDOM%バージョンでは余分なset /aものを使用する必要がありますが、10バイト長くなります。
ニール

しかし、あなたはすでに使用していset/aます...?
コナーオブライエン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.