Nama Monster Frankenstein

15

Pengantar:

Karena hampir Halloween, saya hanya memikirkan beberapa tantangan bertema Halloween yang acak. Akhirnya saya membaca halaman wikipedia Frankenstein , dan menemukan teks berikut:

Makhluk itu

Bagian dari penolakan Frankenstein terhadap ciptaannya adalah fakta bahwa ia tidak memberikan nama, yang menyebabkan kurangnya identitas. Sebaliknya itu disebut dengan kata-kata seperti "celaka", "monster", "makhluk", "setan", "iblis", "iblis", "iblis", dan "itu". Ketika Frankenstein bercakap-cakap dengan makhluk itu di Bab 10, ia menyebutnya sebagai "serangga jahat", "monster yang dibenci", "iblis", "iblis celaka", dan "iblis yang dibenci".

sumber

Tantangan:

Diberikan dua bilangan bulat (tahun dan bab), menghasilkan string berdasarkan aturan berikut:

  1. Jika tahun ini kurang dari 1818: menghasilkan string kosong
  2. Jika tahun ini tepat tahun 1818 dan bab di bawah 10: mengeluarkan string acak dari daftar["wretch", "monster", "creature", "demon", "devil", "fiend", "it"]
  3. Jika tahun tepat 1818 dan bab 10 atau lebih tinggi: output secara acak string dari daftar["vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"]
  4. Adalah tahun di atas 1818 (dan dengan demikian buku itu diterbitkan), kembali "Frankenstein's Monster".

Aturan tantangan:

  • Anda dapat memilih apakah akan menghasilkan huruf kecil, huruf besar, atau kombinasi.
  • Tahun akan selalu di kisaran 1500-2017
  • Bab ini akan selalu berada dalam jangkauan 1-24(jika saya googled dengan benar, buku ini memiliki 24 bab)
  • Alih-alih keluaran string kosong untuk opsi 1, Anda juga diperbolehkan untuk output null, undefined, false,0 , atau nilai lain pilihan Anda bukan bagian dari tiga pilihan lain (sebutkan apa yang telah Anda digunakan dalam jawaban Anda).
  • Output mungkin tidak mengandung spasi / tab spasi tambahan, atau baris baru terkemuka. Ini mungkin mengandung satu baris tambahan opsional.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa yang bukan kode. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
  • Celah default dilarang (terutama 'Angka acak palsu' ).
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

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"
Kevin Cruijssen
sumber

Jawaban:

3

Perl 5, 156 153 151 byte

-3 byte berkat DomHastings.

Jalankan dengan -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]

Distribusi output ini tidak seragam, yang diterima secara default . Khususnya, jika tanggalnya 1818 dan babnya ≥10, nama "iblis yang dibenci" dan "monster yang dibenci" ditimbang dua kali lipat. Ini memungkinkan saya menggunakan rand 7untuk kedua kasus, meskipun daftar memiliki ukuran yang berbeda.

Keluaran selama bertahun-tahun sebelum 1818 adalah "monster celaka". Meskipun ada beberapa kesamaan, string ini bukan bagian dari salah satu dari tiga opsi lainnya, membuatnya boleh digunakan.

Ini gagal selama bertahun-tahun di luar kisaran 1212-2424, tapi untungnya tahun ini dijamin oleh aturan untuk berada di kisaran 1500-2017.

Cobalah online!

Grimmy
sumber
Saya tidak tahu ekspansi brace adalah hal di Perl sama sekali ... Menggunakan pendekatan itu, ada solusi yang bagus untuk tantangan yang dikenal ! Cobalah online!
Dom Hastings
@HomHastings Ooh Saya tidak tahu Anda bisa mengutip spasi seperti itu. Itu -3 byte di sini!
Grimmy
Senang saya bisa membantu! Saya pasti harus mencoba dan mengingat ini, saya kira itu karena <...>menganggap gumpalan?
Dom Hastings
1
<> adalah readline atau glob, tergantung pada ... hal-hal (Perl klasik: tata bahasanya ambigu, tetapi pengurai mencoba ke DWYM). Ketika itu adalah gumpalan, ia sangat menyerupai gumpalan shell, termasuk ekspansi brace yang merupakan fitur umum dalam cangkang.
Grimmy
Bisakah Anda menambahkan tautan TIO ke jawaban Anda. :) Ini adalah jawaban terpendek, tetapi saya hanya ingin memastikan semuanya berfungsi sebelum saya menerimanya sebagai yang terpendek.
Kevin Cruijssen
9

Python 2 , 227 220 214 byte

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 "

Cobalah online!

TFeld
sumber
1
Anda dapat menyimpan 6 byte lebih banyak dengan meletakkan 'abhorred 'ke daftar di bagian bawah juga, karena sudah digunakan dua kali. ( 'wretch'juga dimungkinkan, tetapi byte-count tetap sama.)
Kevin Cruijssen
6

Perl 5 , 172 byte

Kode 171 byte +1 untuk -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]

Cobalah online!

Penjelasan

Cukup standar, hanya hal yang sedikit tidak biasa adalah menggunakan 'operator pesawat ruang angkasa' ( <=>) dengan 1818untuk mengembalikan -1,, 0atau 1, jika input $_kurang dari, sama dengan, atau lebih besar daripada 1818mengembalikan indeks data sumber terakhir, pertama, atau kedua . Juga, saya suka operator ikan !

Dom Hastings
sumber
Saya akan mempertanyakan tidak menggunakan $F=fiend, tetapi setelah pengujian itu berakhir menjadi panjang yang sama untuk melakukannya.
Kamil Drakari
@ KamilDrakari Ya, harus panjangnya enam atau lebih karena $sigil :(
Dom Hastings
$}nama variabel apa ...
Titus
@Titus Yup! Hampir semuanya berfungsi, meskipun banyak yang memiliki makna istimewa. Saya hanya menggunakannya di sana seolah-olah saya menggunakan $Wsaya harus menggunakan ${W}karena itu di sebelah surat lain.
Dom Hastings
1
Saya pikir itu. tidak ada yang kurang :)
Titus
4

C # (Visual C # Compiler) , 225 209 byte

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)];

Cobalah online!

-16 Terima kasih kepada Kevin Cruijssen

Tidak terlalu ringkas, tapi saya berharap C # mengambil lebih banyak ruang untuk menyatakan dan menggunakan string berulang seperti cara jawaban Python daripada hanya mengulanginya. Pelari uji yang disertakan memiliki bagian Thread.Sleep(1)dalam penghitungan kasus uji karena penyemaian default untuk Random()menggunakan waktu saat ini dan fungsi sebenarnya berjalan cukup cepat untuk berakhir dengan seed yang sama pada putaran berikutnya tanpa penundaan.

Panggilan ke func menggunakan sintaks currying, f(year)(chapter)(atau apa pun nama fungsi disimpan bukan f)

Kamil Drakari
sumber
2
Saya melihat Anda menerapkan trik yang sama seperti yang saya pikirkan ketika saya memposting tantangan, menempatkan fienddi tengah-tengah string-array tunggal, karena itu hadir di kedua daftar. Anda dapat menyimpan beberapa byte dengan mengganti new[]{"wretch","monster","creature","demon","devil","it","fiend","vile insect","abhorred monster","wretched devil","abhorred devil"}dengan "wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')(-16 bytes)
Kevin Cruijssen
@KevinCruijssen Trik yang bagus, Kelihatannya tidak segera bermanfaat tetapi mengubah pembatas dari ","hanya ,membuat lebih lama .Split(',')dibandingkan new[]{}dengan lebih dari beberapa item.
Kamil Drakari
3

Bash, 229 , 206 , 197 , 179 byte

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)]}"

penjelasan tentang ekspansi brace / variabel

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

pertama kali diperluas ke

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

maka variabel m diperluas

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

Namun berikut ini tidak berfungsi karena $wakan pertama kali bergabung dengan eddan wedtidak didefinisikan dan akan diperluas ke string kosong.

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

itu bisa dilakukan dengan menambahkan kurung kurawal di sekelilingnya tetapi akan lebih lama

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

TIO

Nahuel Fouilleul
sumber
Anda dapat menyimpan 4 byte dengan membuat variabel untuk wretchdan monster( 225 byte ).
Kevin Cruijssen
tidak begitu sederhana karena ekspansi brace yang terjadi sebelum ekspansi variabel
Nahuel Fouilleul
I (almost) never programmed in Bash, so could you clarify what you mean by that? It does seem to work in TIO, but maybe I'm missing something due to the way the programming language behaves.
Kevin Cruijssen
1
@KevinCruijssen thnak you i learnt something when braces are the last element expansion works
Nahuel Fouilleul
1
@DomHastings, yes, fixed
Nahuel Fouilleul
2

APL (Dyalog Unicode) , 189 byte

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''}⍵}

Cobalah online!

Untuk menguji, tambahkan saja test case ke braket keriting terakhir seperti:

{⊃⍵=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

Terima kasih banyak kepada @ngn untuk membantu mengatasi masalah spasi putih terkemuka.

Bagaimana itu bekerja:

Perlu dicatat bahwa APL mengartikan string sebagai array ( vektor ) karakter, sehingga 'wretch' 'creature'akan ditafsirkan dalam bahasa lain sebagai[[w,r,e,t,c,h],[c,r,e,a,t,u,r,e]]

Ini adalah fungsi pembantu:

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.

Ini adalah fungsi utama, yang akan dipecah menjadi 3 bagian untuk pemahaman yang lebih baik:

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

Bagian 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 ⍵

Bagian 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 ⍵

Bagian 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 ⍵
J. Sallé
sumber
2

Java (OpenJDK 8) , 275 269 255 207 203 byte

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]

Cobalah online!

Roberto Graham
sumber
1
203 bytes. Use IntFunctions instead of Function<Integer> to get it working.
Olivier Grégoire
2

PHP, 184 176 bytes

<?=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 "]);

Run with -n and give year and chapter as command line arguments or try it online.

index and thus result evaluate to NULL for year<1818, leading to empty output.

Titus
sumber
What does $argv[1]<=>1818 do? I've never ever seen that.
Y U NO WORK
1

Javascript (ES6), 205 bytes

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]

Returns 0 if the year is less than 1818

Herman L
sumber
1

Javascript 199 bytes

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))

DanielIndie
sumber
1

C, 380 BYTES

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"));}
Igbokwe Danny
sumber
4
Hi, welcome to PPCG! In a code-golf challenge the goal is to have as few bytes as possible. So method/variable names are best as single characters. In addition, you can remove all unnecessary spaces and new-lines, and use the "Frankenstein's Monster" directly instead of making a variable for it. Also, where is the year and chapter coming from now? I don't see it as parameters of the method. Tips for golfing in <all languages> and Tips for golfing in C might be useful. Enjoy your stay! :)
Kevin Cruijssen
No problem. And you can golf a bit more: 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 bytes Try it here! (I removed all unnecessary spaces, renamed method/variables/parameters to single letter; removed some unnecessary parenthesis at the ternary-if; single printf; changed <10 to >9; etc.) Not sure why rand() isn't working in TIO.. :S
Kevin Cruijssen
234 bytes
ceilingcat
1

MBASIC, 288 bytes

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
wooshinyobject
sumber
0

05AB1E, 114 110 bytes

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

Outputs 0 when the year is below 1818.

Try it online or verify all test cases.

Explanation:

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)

See this 05AB1E tip of mine (sections How to use the dictionary?; How to compress strings not part of the dictionary?; How to compress large integers?; and How to compress integer lists?) to understand why:

  • …뢼–±¹ is "creature devil monster";
  • .•ʒ¦Ë"ìËM₂G¶тá≠• is "demon fiend it wretch ";
  • .•1ÏiT¥Ƶʒ“T¡Äg… 5ÀΘO¼™Ãí?ιË%4₄‡‡λYιi¾н• is "abhorred devilabhorred monsterfiendvile insectwretched devil";
  • •Jtm• is 1249548 and •Jtm•17в is [14,16,5,11,14];
  • 'ì³ is "liechtenstein ";
  • ’¡¬ÿÿ±¹’ is "frankÿÿmonster";
  • Ž7X is 1818.
Kevin Cruijssen
sumber
-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)]
user75200
sumber
doesnt really match the test cases
DanielIndie