フランケンシュタインの怪物の名前


15

前書き:

ハロウィーンに近いので、ハロウィーンをテーマにしたランダムなチャレンジを考えていました。最終的に私はフランケンシュタインのウィキペディアのページを読んでいて、次のテキストに出くわしました:

生き物

フランケンシュタインが彼の創造を拒否した理由の1つは、彼が名前を付けていないという事実です。代わりに、「惨め」、「怪物」、「生き物」、「悪魔」、「悪魔」、「悪魔」、「それ」などの言葉で呼ばれます。フランケンシュタインは、第10章でクリーチャーと会話するとき、「卑劣な昆虫」、「忌まわしいモンスター」、「悪魔」、「惨めな悪魔」、および「忌まわしい悪魔」と呼びます。

ソース

チャレンジ:

2つの整数(年と章)が与えられた場合、次の規則に基づいて文字列を出力します。

  1. 年が1818未満の場合:空の文字列を出力
  2. 年がちょうど1818で、章が10未満の場合:リストからランダムな文字列を出力します["wretch", "monster", "creature", "demon", "devil", "fiend", "it"]
  3. 年がちょうど1818で、章が10以上の場合:リストからランダムな文字列を出力します["vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"]
  4. 1818年を超える年(したがって、本が出版された年)に戻り"Frankenstein's Monster"ます。

チャレンジルール:

  • 小文字で出力するか、大文字で出力するか、組み合わせて出力するかを選択できます。
  • 年は常に範囲内になります 1500-2017
  • チャプターは常に範囲内にあります1-24(グーグルで正しく検索した場合、本には24のチャプターがあります)
  • 代わりに、オプション1に空の文字列を出力する、あなたはまた、出力に許可されているnullundefinedfalse0、またはお好みの任意の他の値が他の3つのオプションの一部ではないが、(あなたがあなたの答えに使用してきた内容を指定してください)。
  • 出力には、先頭または末尾のスペース/タブ、または先頭の改行を含めることはできません。オプションの末尾の改行を1つ含めることができます。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターを持つ関数/メソッド、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています(特に「偽の乱数」)。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース:

year,chapter possible outputs:

1700,1       ""; null; undefined; false; 0; etc.
1700,12      ""; null; undefined; false; 0; etc.
1817,10      ""; null; undefined; false; 0; etc.
1818,1       "wretch"; "monster"; "creature"; "demon"; "devil"; "fiend"; "it"
1818,9       "wretch"; "monster"; "creature"; "demon"; "devil"; "fiend"; "it"
1818,10      "vile insect"; "abhorred monster"; "fiend"; "wretched devil"; "abhorred devil"
1818,11      "vile insect"; "abhorred monster"; "fiend"; "wretched devil"; "abhorred devil"
1818,18      "vile insect"; "abhorred monster"; "fiend"; "wretched devil"; "abhorred devil"
1819,1       "Frankenstein's Monster"; "frankenstein's monster"; "FRANKENSTEIN'S MONSTER"
1819,18      "Frankenstein's Monster"; "frankenstein's monster"; "FRANKENSTEIN'S MONSTER"
2017,24      "Frankenstein's Monster"; "frankenstein's monster"; "FRANKENSTEIN'S MONSTER"

回答:


3

パール5、156の 153 151バイト

DomHastingsのおかげで-3バイト。

で実行 -p

$_=($d=devil,$m=monster,$w=wretch,<"{creature,demon,it,fiend,vile insect,{abhorr,$w}ed {$d,$d,$m},Frankenstein's $m}">)[/818/?6*/,../+rand 7:$_/606-5]

この出力分布は不均一であり、デフォルト受け入れられます。具体的には、日付が1818で、チャプターが10以上の場合、「忌まわしい悪魔」と「忌まわしい怪物」の名前に2倍の重みが付けられます。これによりrand 7、リストのサイズが異なっていても、両方のケースで使用できます。

1818年以前の出力は「破壊されたモンスター」です。いくつかの類似点はありますが、この文字列は他の3つのオプションの一部ではないため、使用しても問題ありません

これは、1212〜2424の範囲外の年には失敗しますが、幸運なことに、1500〜2017年の範囲にあることがルールによって保証されています。

オンラインでお試しください!


ブレースの拡張がPerlのことだとはまったく知りませんでした...そのアプローチを使用すると、既知の既知の課題に対する優れたソリューションがあります。オンラインでお試しください!
ドムヘイスティングス

@DomHastingsああ、そのようなスペースを引用できるとは知りませんでした。ここは-3バイトです!
グリムミー

喜んで助けてくれました!私は間違いなくこれを試して覚えておく必要があります、それ<...>はグロブを仮定しているからだと思いますか?
ドムヘイスティングス

1
<>は、…に応じてreadlineまたはglobのいずれかです(古典的なPerl:文法はあいまいですが、パーサーはDWYMを試みます)。グロブの場合、シェルの一般的な機能であるブレースの展開を含め、シェルグロブを厳密に模倣します。
グリムミー

回答にTIOリンクを追加していただけますか。:)現在、これは最短の回答ですが、最短として受け入れる前にすべてが機能することを確認したいだけです。
ケビンCruijssen

9

パイソン2227の 220 214バイト

lambda y,c:[[choice([["wretch",m,"creature","demon",d,F,"it"],["vile insect",a+m,F,"wretched "+d,a+d]][c>9]),"Frankenstein's "+m][y>1818],0][y<1818]
from random import*
m,d,F,a='monster','devil','fiend',"abhorred "

オンラインでお試しください!


1
'abhorred '2回使用されているため、下部のリストに追加することで、さらに6バイト節約できます。('wretch'可能性もありますが、バイト数は同じままです。)
ケビンCruijssen

6

Perl 5、172バイト

171バイトコードの+ 1 -p

@a=<><10?($}=wretch,$M=monster,creature,demon,$D=devil,fiend,it):("vile insect",($A="abhorred ").$M,fiend,"$}ed $D",$A.$D);$_=($a[rand@a],"frankenstein's $M",0)[$_<=>1818]

オンラインでお試しください!

説明

かなり標準、わずかしかunsualものは「宇宙船演算子」(使用している<=>と)、1818リターンに-10または1入力があれば、$_等しい、またはより大きい以下、よりなる1818ソースデータの最後、第一または第2のインデックスを返します。また、私は魚のオペレーターが好きです!


私はを使用しないで質問するつもりでした$F=fiendが、テスト後は同じ長さになります。
カミルドラカリ

@KamilDrakariええ、シギルのために6以上の長さである必要があり$ます:(
Dom Hastings

$}どのような変数名
タイタス

@タイタスうん!多くは特別な意味を持っていますが、ほとんど何でも機能します。別の文字の横にあるので$W使用する必要があったかのように、私はそれをそこでのみ使用しました${W}
ドムヘイスティングス

1
私はそれを計算しました。それにもかかわらず:)
タイタス

4

C#(Visual C#コンパイラ)225 209バイト

y=>c=>y<1818?"":y>1818?"frankenstein's monster":"wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')[new System.Random().Next(c>9?6:0,c>9?11:7)];

オンラインでお試しください!

-16 Kevin Cruijssenに感謝

特に簡潔ではありませんが、C#は、Pythonの答えが繰り返すように、繰り返される文字列を宣言して使用するためにより多くのスペースを必要とすることを期待します。Thread.Sleep(1)デフォルトのシードRandom()は現在の時間を使用し、実際の関数は後続の実行で遅延なしで同じシードで終わるのに十分な速度で実行されるため、含まれているテストランナーにはテストケースの列挙があります。

funcの呼び出しはカリー化構文を使用しますf(year)(chapter)(または、fの代わりに関数が保存される名前)


2
私はチャレンジを投稿したときに思い描いていたのと同じトリックを適用し、fiend両方のリストに存在するため、単一の文字列配列の真ん中に入れていることがわかります。あなたは交換することにより、いくつかのバイトを保存することができnew[]{"wretch","monster","creature","demon","devil","it","fiend","vile insect","abhorred monster","wretched devil","abhorred devil"}"wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')(-16バイト)
ケビンCruijssen

@KevinCruijssen素敵なトリック、すぐに有益ではないように見えますが、デリミタをから","に変更すると、数個のアイテムと比較して,長い時間を補います。.Split(',')new[]{}
カミルドラカリ

3

バッシュ、229206197、179のバイト

m=monster
a=("Frankenstein's $m" wretch $m creature demon devil it fiend vile\ insect {abhorr,wretch}ed\ {devil,$m})
echo "${a[$1>1818?0:$1<1818?13:RANDOM%($2>9?5:7)+($2>9?7:1)]}"

ブレース/変数展開に関する説明

m=monster
{abhorr,wretch}ed\ {devil,$m}

最初に展開されます

abhorred\ {$m,devil} wretched\ {devil,$m}
abhorred\ $m abhorred\ devil wretched\ devil wretched\ $m

次に、変数mが展開されます

abhorred\ monster abhorred\ devil wretched\ devil wretched\ monster

しかしので動作しません、次の$w最初に結合されますedwed定義されておらず、空の文字列に展開されます。

m=monster
w=wretch
{abhorr,$w}ed\ {devil,$m}

wの周りに明示的な中括弧を追加して実行できますが、より長くなります

m=monster
w=wretch
{abhorr,${w}}ed\ {devil,$m}

TIO


wretchand monster225バイト)の変数を作成すると、4バイト節約できます。
ケビンCruijssen

変数展開の前に発生するブレース展開のため、それほど単純ではありません
ナウエル・フイユル

私は(ほとんど)Bashでプログラミングしたことがないので、それが何を意味するのかを明確にできますか?TIOで動作するようですが、プログラミング言語の動作のせいで何かが足りないかもしれません。
ケビンCruijssen

1
@KevinCruijssen thnakあなたはブレースが最後の要素展開の作業であるときに何かを学びました
ナウエルフイウル

1
@DomHastings、はい、修正済み
ナウエル・フイユル

2

APL(Dyalog Unicode)、189 バイト

m'monster'
a'abhorred ',⊢
f'fiend'
d'devil'
{⊃⍵=1818:{⊃⌽⍵<10:(?7)⊃'wretch'm'creature' 'demon'd f'it'⋄(?5)⊃'vile insect'(a m)f('wretched ',⊢d)(a d)}⍵⋄{⊃⍵>1818:'frankenstein''s ',⊢m''}⍵}

オンラインでお試しください!

テストするには、次のように最後の波かっこにテストケースを追加します。

{⊃⍵=1818:{⊃⌽⍵<10:(?7)⊃'wretch'm'creature' 'demon'd f'it'⋄(?5)⊃'vile insect'(a m)f('wretched ',⊢d)(a d)}⍵⋄{⊃⍵>1818:'frankenstein''s ',⊢m''}⍵}1818 10

主要な空白の問題を解決してくれた@ngnに感謝します。

使い方:

APLは文字列を文字の配列(ベクトル'wretch' 'creature'として解釈するため、他の言語では次のように解釈されることに注意してください[[w,r,e,t,c,h],[c,r,e,a,t,u,r,e]]

これらはヘルパー関数です:

m'monster'      #These are pretty self explanatory, variables m, f and d are being set to 'monster', 'fiend' and 'devil respectively.
f'fiend'
d'devil'
a'abhorred ',⊢  # a is being set to 'abhorred ' concatenated with the argument to it's right.

これが主な機能であり、理解を深めるために3つの部分に分けられます。

{⊃⍵=1818:{⊃⌽⍵<10:(?7)⊃'wretch'm'creature' 'demon'd f'it'⋄(?5)⊃'vile insect'(a m)f('wretched ',⊢d)(a d)}⍵⋄{⊃⍵>1818:'frankenstein''s ',⊢m''}⍵}

パート1:

{⊃⍵=1818:{Part2}⍵⋄{Part3}⍵} # First conditional
        :                   # If
                           # the first element
                           # of the argument ⍵
   =1818                    # Equals the literal 1818
         {Part2}⍵           # Executes part 2 with argument ⍵
                           # Else
                  {Part3}⍵  # Executes part 3 with argument ⍵

パート2:

{⊃⌽⍵<10:(?7)⊃'wretch'm'creature' 'demon'd f'it' # Second conditional
(?5)⊃'vile insect'(a m)f('wretched ',⊢d)(a d)}⍵                
       :                                         # If
                                                # the first element
                                                # of the inverse
                                                # of the argument ⍵
    <10                                          # is less than 10
                                                # pick the nth
       (?7)                                      # random element between [1,7]
            'wretch'm'creature' 'demon'd f'it'   # from this string array
                                                # Else
                                                # pick the nth
(?5)                                             # random element between [1,5]
     'vile insect'(a m)f('wretched ',⊢d)(a d)    # from this string array
                                             }⍵  # using argument ⍵

パート3:

{⊃⍵>1818:'frankenstein''s ',⊢m''}⍵ # Third conditional
        :                           # If
                                   # the first element
                                   # of the argument ⍵
   >1818                            # is greater than 1818
         'frankenstein''s ',⊢m      # print the string "frankenstein's" concatenated with m (which prints monster)
                                   # else
                               ''   # print an empty string
                                 }⍵ # with argument ⍵

2

Java(OpenJDK 8)275 269 255 207 203バイト

y->c->y<1818?0:y>1818?"Frankenstein's monster":"wretch;monster;creature;demon;devil;it;fiend;vile insect;abhorred monster;wretched devil;abhorred devil".split(";")[c+=Math.random()*(c>9?5:7)+(c>9?6:0)-c]

オンラインでお試しください!




1
203バイトIntFunction代わりにsを使用しFunction<Integer>て動作させます。
オリビエグレゴワール

2

PHP、184 176バイト

<?=strtr([0,1,2,Creature,Demon,It,Fiend,30,31,"2ed 1","Vile Insect","Frankenstein´s 0"][[rand(6*$x=$argv[2]>9,6+4*$x),11][$argv[1]<=>1818]],[Monster,Devil,Wretch,"Abhorred "]);

-nコマンドライン引数として年と章を指定して実行するか、オンラインで試してください

インデックスと結果はNULL1818年に評価され、空の出力になります。


何を$argv[1]<=>1818するの?私はそれを見たことがありません。
YU NO WORK


1

Javascript(ES6)、205バイト

a="abhorred ",d="devil",f="fiend",m="monster"
y=>c=>y<1818?0:y>1818?"frankenstein's "+m:(l=c<10?[f,"wretch",m,"creature","demon",d,f,"it"]:["vile insect",a+m,f,"wretched "+d,a+d])[0|Math.random()*l.length]

0年が1818より小さいかどうかを返します


1

Javascript 199バイト

M="monster"
A=(y,c)=>y<1818?"":y^1818?"Frankenstein's "+M:[W="wretch",M,"creature","demon",D="devil",F="fiend","it","vile insect",(H="abhorred ")+M,F,W+"ed "+F,H+D][Math.random()*(c>9?5:7)+7*(c>9)|0]

console.log(A(1700,1))
console.log(A(1700,12))
console.log(A(1817,10))
console.log(A(1818,1))
console.log(A(1818,9))
console.log(A(1818,10))
console.log(A(1818,11))
console.log(A(1819,1))
console.log(A(1819,18))
console.log(A(2017,24))


1

C、380バイト

void ok(int *year, int* chapter){char*below_10[] = {"wretch", "monster", "creature", "demon", "devil", "fiend", "it"}; char*at_10[] = {"vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"}; year < 1818?printf("0"):(year == 1818?(chapter<10 printf("%s",below_10[rand()%8]):printf("%s",at_10[rand()%7])):printf("Frankenstein's Monster"));}

4
こんにちは、PPCGへようこそ!コードゴルフチャレンジの目標は、できるだけ少ないバイト数にすることです。したがって、メソッド/変数名は単一文字として最適です。さらに、不要なスペースと改行をすべて削除"Frankenstein's Monster"し、変数を作成する代わりに直接使用できます。また、どこでyearそしてchapter今から来ますか?メソッドのパラメーターとしては見えません。ゴルフのためのヒント<すべての言語>Cでのゴルフのためのヒントが役に立つかもしれません。滞在を楽しんで!:)
ケビンクルーイッセン

問題ない。そしてもう少しゴルフができます:void o(int y,int c){char*b[]={"wretch","monster","creature","demon","devil","fiend","it"},*a[]={"vile insect","abhorred monster","fiend","wretched devil","abhorred devil"};printf("%s",y<1818?0:y==1818?c>9?a[rand()%6]:b[rand()%7]:"Frankenstein's Monster");} 256バイト ここで試してみてください!(私はすべての不要なスペースを、単一の文字に名称変更方法/変数/パラメータを削除し、三元-場合にいくつかの不要な括弧を削除し、単一printf;変更<10する>9;など)わからないのはなぜrand().. TIOに動作していない:S
ケビンCruijssen


1

MBASIC、288バイト

1 DIM R$(12):FOR I=1 TO 12:READ R$(I):NEXT:INPUT Y,C:IF Y<1818 THEN 5
2 IF Y>1818 THEN O$="Frankenstein's Monster":GOTO 5
3 IF C>9 THEN O=7
4 O$=R$(O+INT(RND(1)*N+1))
5 PRINT O$:DATA wretch,monster,creature,demon,devil,fiend,it,vile insect,abhorred monster,fiend,wretched devil,abhorred devil

0

05AB1E114 110 バイト

0…뢼–±¹.•ʒ¦Ë"ìËM₂G¶тá≠•ì#.•1ÏiT¥Ƶʒ“T¡Äg… 5ÀΘO¼™Ãí?ιË%4₄‡‡λYιi¾н••Jtm•17в£‚…'s 'ì³R7£R’¡¬ÿÿ±¹’¸¸)sŽ7X.S>èsT@èΩ

0年が以下の場合に出力1818

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

0                    # Push a 0
…뢼–±¹              # Push dictionary string "creature devil monster"
 .•ʒ¦Ë"ìËM₂G¶тá≠•   "# Push compressed string "demon fiend it wretch "
  ì                  # Prepend it: "demon fiend it wretch creature devil monster"
   #                 # Split by spaces: ["demon","fiend","it","wretch","creature","devil","monster"]
.•1ÏiT¥Ƶʒ“T¡Äg 5ÀΘO¼™Ãí?ιË%4₄‡‡λYιi¾н•
                     # Push compressed string "abhorred devilabhorred monsterfiendvile insectwretched devil"
 Jtm               # Push compressed integer 1249548
      17в            # Converted to Base-17 as list: [14,16,5,11,14]
         £           # Split the string into parts of that size: ["abhorred devil","abhorred monster","fiend","vile insect","wretched devil"]
                    # Pair both string-lists together
's                 '# Push string "'s "
   'ì³              '# Push dictionary string "liechtenstein"
      R7£R           # Leave the last 7 characters: "enstein"
          ’¡¬ÿÿ±¹’   # Push dictionary string "frankÿÿmonster", where the "ÿ" are automatically
                     # replaced with the strings at the top of the stack: "frankenstein's monster"
                  ¸¸ # Wrap it twice into a list: [["frankenstein's monster"]]
)                    # Wrap everything on the stack into a list
                     # (We now have: [0,[["demon","fiend","it","wretch","creature","devil","monster"],["abhorred devil","abhorred monster","fiend","vile insect","wretched devil"]],[["frankenstein's monster"]]])
 s                   # Swap to get the first (implicit) input
  Ž7X                # Push compressed integer 1818
     .S              # Compare it with the input (-1 if below; 0 if equal; 1 if above)
       >             # Increase it by 1 (0 if below; 1 if equal; 2 if above)
        è            # Use it to index into the list
         s           # Swap to get the second (implicit) input
          T@         # Check if it's larger than or equal to 10 (results in 0 for falsey; 1 for truthy)
            è        # Use it to index into the inner list
             Ω       # And finally get a random value from that list (which is output implicitly)

セクション(私のこの05AB1Eのヒントを参照してください?辞書を使用する方法 ; ?どのように圧縮文字列にない辞書の一部 ; ?大きな整数を圧縮する方法、およびどのように圧縮するためのリスト整数?理由を理解します:

  • …뢼–±¹です"creature devil monster"
  • .•ʒ¦Ë"ìËM₂G¶тá≠•です"demon fiend it wretch "
  • .•1ÏiT¥Ƶʒ“T¡Äg… 5ÀΘO¼™Ãí?ιË%4₄‡‡λYιi¾н•"abhorred devilabhorred monsterfiendvile insectwretched devil"
  • •Jtm•である1249548•Jtm•17в is [14,16,5,11,14];
  • 'ì³"liechtenstein "
  • ’¡¬ÿÿ±¹’"frankÿÿmonster"
  • Ž7Xです1818

-1

JavaScript、194 B

e=Math.random,f=Math.floor;x=(a,b,c=`insect,monster,wretch,creature,demon,devil,fiend,it`.split`,`,d=[`vile `,`abhorred `])=>a<1818||a-1818?`Frankenstein's `+c[1]:(b<10||c[f(e()*2)])+c[f(e()*8)]

テストケースと実際には一致しない
-DanielIndie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.