Frankenstein'ın Canavarı Adı


15

Giriş:

Neredeyse Cadılar Bayramı olduğundan, Cadılar Bayramı temalı rastgele bazı zorluklar düşünüyordum. Sonunda Frankenstein'ın wikipedia sayfasını okuyordum ve aşağıdaki metne rastladım:

Yaratık

Frankenstein'ın yaratımını reddetmesinin bir kısmı, ona bir isim vermemesi ve bu da kimlik eksikliğine neden olmasıdır. Bunun yerine, "sefil", "canavar", "yaratık", "iblis", "şeytan", "şeytan" ve "o" gibi kelimelerle ifade edilir. Frankenstein Bölüm 10'daki yaratıkla sohbet ettiğinde, onu "aşağılık böcek", "iğrenç canavar", "şeytan", "sefil şeytan" ve "iğrenç şeytan" olarak ele alır.

kaynak

Meydan okuma:

İki tamsayı (yıl ve bölüm) verildiğinde, aşağıdaki kurallara göre bir dize çıktılayın:

  1. Yıl 1818'den azsa: boş bir dize çıkar
  2. Yıl tam olarak 1818 ise ve bölüm 10'un altındaysa: listeden rastgele bir dize çıktı["wretch", "monster", "creature", "demon", "devil", "fiend", "it"]
  3. Yıl tam olarak 1818 ve bölüm 10 veya daha yüksekse: listeden rastgele bir dize çıktılar["vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"]
  4. 1818'in üzerindeki yıl (ve böylece kitap yayınlandı), geri dönün "Frankenstein's Monster".

Zorluk kuralları:

  • Küçük harf, büyük harf veya kombinasyon halinde çıktı almayı seçebilirsiniz.
  • Yıl her zaman aralık dahilinde olacak 1500-2017
  • Bölüm her zaman aralıkta olacaktır 1-24(doğru bir şekilde google'ı seçersem, kitabın 24 bölümü vardır)
  • yerine seçenek 1 için boş bir dize çıktılamayıp, ayrıca çıkışa izin verilir null, undefined, false, 0, veya istediğiniz herhangi diğer değer diğer üç seçenekten parçası olmayan (eğer cevap kullandım şeyi belirtin).
  • Çıktıda ön veya arka boşluklar / sekmeler veya yeni satırlar bulunmayabilir. Bir adet isteğe bağlı sondaki yeni satır içerebilir.

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyon / yöntemi uygun parametrelerle, tam programları kullanmanıza izin verilir. Çağrınız.
  • Varsayılan Loopholes yasaktır (özellikle 'Sahte rasgele sayılar' ).
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, gerekirse bir açıklama ekleyin.

Test senaryoları:

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"

Yanıtlar:


3

Perl 5, 156 153 151 bayt

DomHastings sayesinde -3 bayt.

Şununla koş: -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]

Bu çıkış dağıtımı, varsayılan olarak kabul edilen tek tip değildir . Özellikle, tarih 1818 ve bölüm ≥10 ise, “nefret edilen şeytan” ve “nefret edilen canavar” adları iki kat daha fazladır. Bu rand 7, listeler farklı boyutlarda olsa da her iki durum için de kullanmamı sağlıyor .

1818'den önceki yılların çıktısı “sefil canavar”. Bazı benzerliklere rağmen, bu dize diğer üç seçenekten herhangi birinin bir parçası değildir , bu da kullanımını kolaylaştırır.

Bu, 1212-2424 aralığının dışında yıllarca başarısız olur, ancak neyse ki yıl, 1500-2017 aralığındaki kurallarla garanti edilir.

Çevrimiçi deneyin!


Brace genişlemesinin Perl'de hiç bir şey olduğunu bilmiyordum ... Bu yaklaşımı kullanarak , bilinen bilirkişiler için harika bir çözüm var ! Çevrimiçi deneyin!
Dom Hastings

@DomHastings Ooh Böyle boşluklar teklif edebileceğinizi bilmiyordum. Burada -3 bayt var!
Grimmy

Yardım edebildim sevindim! Kesinlikle bunu denemek ve hatırlamak zorundayım, sanırım <...>globs varsayar?
Dom Hastings

1
<> readline veya glob, şeylere bağlı olarak (klasik Perl: dilbilgisi belirsizdir, ancak ayrıştırıcı DWYM'yi dener). Bir glob olduğunda, kabuklarda ortak bir özellik olan küme genişletme de dahil olmak üzere kabuk globlarını yakından taklit eder.
Grimmy

Cevabınıza belki bir TIO bağlantısı ekleyebilir misiniz? :) Şu anda en kısa cevap, ama sadece en kısa olarak kabul etmeden önce her şeyin çalıştığından emin olmak istiyorum.
Kevin Cruijssen

9

Piton 2 , 227 220 214 bayt

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 "

Çevrimiçi deneyin!


1
'abhorred 'İki kez kullanıldığından, alttaki listeye de koyarak 6 bayt daha kaydedebilirsiniz . ( 'wretch'ayrıca mümkündür, ancak bayt sayısı aynı kalır.)
Kevin Cruijssen

6

Perl 5 , 172 bayt

171 bayt kod + 1 için -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]

Çevrimiçi deneyin!

açıklama

Oldukça standart sadece biraz sıradışı şey 'uzay operatörü' (kullanarak <=>) ile 1818dönüş -1, 0ya da 1giriş ise, $_e eşit veya ondan daha yüksek az, daha 1818kaynak veri son birinci ya da ikinci indeks dönmek . Ayrıca, balık operatörünü seviyorum!


Ben kullanmama sorusu vardı $F=fiend, ama test ettikten sonra bunu yapmak için aynı uzunlukta olur.
Kamil Drakari

@KamilDrakari Evet, sigil yüzünden altı veya daha fazla uzunlukta olması gerekiyor $:(
Dom Hastings

$}ne değişken bir isim ...
Titus

@Titus Yup! Hemen hemen her şey işe yarıyor, ancak birçoğunun ekstra özel anlamı var. Sadece orada kullandım sanki başka bir mektubun yanında $Wkullanmam gerekecekmiş ${W}gibi kullandım .
Dom Hastings

1
Bunu hesaba kattım. gotcha none the less :)
Titus

4

C # (Visual C # derleyicisi) , 225 209 bayt

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

Çevrimiçi deneyin!

-16 Kevin Cruijssen sayesinde

Özellikle kısa değil, ama C # Python cevap sadece onları tekrar yapmak gibi tekrarlanan dizeleri beyan ve kullanmak için daha fazla yer almak beklenir. Dahil edilen test çalıştırıcısı, Thread.Sleep(1)test vakalarının bir numaralandırmasına sahiptir, çünkü varsayılan tohumlama Random()geçerli zamanı kullanır ve gerçek işlev, bir sonraki çalıştırmalarda gecikmeden aynı tohumla sonuçlanacak kadar hızlı çalışır.

Fonk çağrısında köri sözdizimi kullanılır f(year)(chapter)(veya işlevin f yerine kaydedildiği herhangi bir ad kullanılır)


2
Her fiendiki listede de mevcut olduğu için, tek bir dize dizisinin ortasına koyarak, meydan okumayı gönderdiğimde aklıma aynı hileyi uyguladığınızı görüyorum . (-16 bayt) new[]{"wretch","monster","creature","demon","devil","it","fiend","vile insect","abhorred monster","wretched devil","abhorred devil"}ile değiştirerek bazı baytları kaydedebilirsiniz"wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')
Kevin Cruijssen

@KevinCruijssen Güzel hile, Hemen faydalı görünmüyor, ancak sınırlayıcıyı ","sadece birkaç maddeden daha ,uzun süre telafi .Split(',')ediyor new[]{}.
Kamil Drakari

3

Bash, 229 , 206 , 197 , 179 bayt

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

küme ayracı / değişken açılımları ile ilgili açıklama

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

önce genişletildi

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

sonra m değişkeni genişletilir

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

ancak, $wilk olarak bir araya getirileceği edve wedtanımlanmadığı ve boş dizeye genişletileceği için aşağıdakiler işe yaramaz .

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

w etrafında açık parantez ekleyerek yapılabilir, ancak daha uzun olacaktır

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

TIO


wretchVe monster( 225 bayt ) için değişkenler oluşturarak 4 bayt kaydedebilirsiniz .
Kevin Cruijssen

değişken genişlemeden önce meydana gelen
küme

Ben (neredeyse) Bash'te hiç programlamam, bununla ne demek istediğini açıklayabilir misin? TIO'da çalışıyor gibi görünüyor , ancak programlama dilinin davranış biçimi nedeniyle belki de bir şey eksik.
Kevin Cruijssen

1
@KevinCruijssen thnak size en son eleman genişletme çalışmaları parantez olduğunda bir şey öğrendim
Nahuel Fouilleul

1
@DomHastings, evet, sabit
Nahuel Fouilleul

2

APL (Dyalog Unicode) , 189 bayt

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

Çevrimiçi deneyin!

Test etmek için, test kutusunu son kıvırcık köşeli parantez içine şu şekilde ekleyin:

{⊃⍵=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'e, önde gelen boşluk sorununa yardımcı olduğu için çok teşekkür ederiz.

Nasıl çalışır:

APL'nin dizeleri karakter dizileri ( vektörleri ) 'wretch' 'creature'olarak yorumladığını belirtmek gerekir , bu nedenle diğer dillerde şu şekilde yorumlanır:[[w,r,e,t,c,h],[c,r,e,a,t,u,r,e]]

Bunlar yardımcı işlevlerdir:

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.

Bu, daha iyi anlaşılması için 3 parçaya ayrılacak ana işlevdir:

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

Bölü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 ⍵

Bölüm 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 ⍵

Bölüm 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 bayt

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]

Çevrimiçi deneyin!




1
203 bayt . Çalıştırmak için IntFunctions yerine kullanın Function<Integer>.
Olivier Grégoire

2

PHP, 184176 bayt

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

Çalıştırın -nve yıl ve bölümü komut satırı bağımsız değişkenleri olarak verin veya çevrimiçi deneyin .

endeksi ve dolayısıyla sonuç NULL<1818 yılı için değerlendirerek , boş çıktıya yol açar.


Ne yapar $argv[1]<=>1818? Bunu hiç görmedim.
YU NO WORK


1

Javascript (ES6), 205 bayt

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]

0Yıl 1818'den küçükse döndürür


1

Javascript 199 bayt

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

4
Merhaba, PPCG'ye hoş geldiniz! Bir kod golf mücadelesinde amaç, mümkün olduğunca az bayt elde etmektir. Bu nedenle yöntem / değişken adları en iyi tek karakterdir. Ek olarak, tüm gereksiz boşlukları ve yeni satırları kaldırabilir ve "Frankenstein's Monster"bunun için bir değişken yapmak yerine doğrudan kullanabilirsiniz . Ayrıca, nerede yearve chapterşimdi gelen? Yöntemin parametreleri olarak görmüyorum. İçinde golf için ipuçları <tüm diller> ve C golf için ipuçları yararlı olabilir. Keyfini çıkarın! :)
Kevin Cruijssen

Sorun değil. Ve biraz daha golf oynayabilirsiniz: 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 bayt Burada deneyin! (Bütün gereksiz boşluklar, tek harfine yeniden adlandırılmış yöntem / değişken / parametreleri kaldırıldı; tek; üçlü -eğer bazı gereksiz parantez kaldırıldı printf; değişti <10etmek >9; vs.) Emin niçin Değil rand().. TIO çalışmıyor: S
Kevin Cruijssen


1

MBASIC , 288 bayt

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

05AB1E , 114 110 bayt

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

çıktılar 0Yıl aşağıda olduğunda1818 .

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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)

Benim bu 05AB1E ucu bakın (bölümler sözlüğü nasıl kullanılır? ; Nasıl kompres dizeleri sözlükte parçası olmayan nasıl? ; Ne kadar büyük tamsayılar sıkıştırmak için? Ve nasıl kompres tamsayı listelerine? ) Anlamak için:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.