Imię potwora Frankensteina

15

Wprowadzenie:

Ponieważ jest już prawie Halloween, myślałem tylko o losowych wyzwaniach związanych z Halloween. W końcu czytałem stronę wikipedii Frankensteina i natrafiłem na następujący tekst:

Stworzenie

Częścią odrzucenia jego dzieła przez Frankensteina jest to, że nie nadaje mu nazwy, co powoduje brak tożsamości. Zamiast tego są określane słowami takimi jak „nieszczęśnik”, „potwór”, „stworzenie”, „demon”, „diabeł”, „diabeł” i „to”. Kiedy Frankenstein rozmawia ze stworzeniem z rozdziału 10, nazywa go „podły owad”, „odrażony potwór”, „diabeł”, „nędzny diabeł” i „odrażający diabeł”.

źródło

Wyzwanie:

Biorąc pod uwagę dwie liczby całkowite (rok i rozdział), wypisz ciąg oparty na następujących zasadach:

  1. Jeśli rok jest krótszy niż 1818: wypisz pusty ciąg
  2. Jeśli rok ma dokładnie 1818, a rozdział jest poniżej 10: wypisz losowy ciąg z listy["wretch", "monster", "creature", "demon", "devil", "fiend", "it"]
  3. Jeśli rok ma dokładnie 1818, a rozdział wynosi 10 lub więcej: wypisz losowo ciąg z listy["vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"]
  4. Jest rok powyżej 1818 (a więc książka została opublikowana), powrót "Frankenstein's Monster".

Zasady konkursu:

  • Możesz wybrać, czy dane mają być drukowane małymi literami, dużymi literami czy kombinacją.
  • Rok będzie zawsze w przedziale 1500-2017
  • Rozdział zawsze będzie w zasięgu 1-24(jeśli poprawnie przejdę do Google, książka ma 24 rozdziały)
  • Zamiast wyprowadzania pusty ciąg dla opcji 1, masz również możliwość wyjścia null, undefined, false, 0, lub jakakolwiek inna wartość swojego wyboru nie część z pozostałych trzech opcji (proszę określić, co już używany w odpowiedzi).
  • Dane wyjściowe nie mogą zawierać żadnych początkowych ani końcowych spacji / tabulatorów ani żadnych wiodących nowych wierszy. Może zawierać jedną opcjonalną końcową nową linię.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi odnoszą się standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione (zwłaszcza „Fałszywe losowe liczby” ).
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe:

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
źródło

Odpowiedzi:

3

Perl 5, 156 153 151 bajtów

-3 bajty dzięki DomHastings.

Biegnij z -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]

Ten rozkład wyjściowy jest nierównomierny, co jest domyślnie akceptowane . W szczególności, jeśli data to 1818, a rozdział to ≥10, nazwy „wstrętny diabeł” i „wstrętny potwór” są ważone dwa razy więcej. To pozwala mi użyćrand 7 w obu przypadkach, mimo że listy mają różne rozmiary.

Produkcja sprzed lat 1818 to „nędzny potwór”. Mimo pewnych podobieństw ten ciąg jest nie częścią żadnej z pozostałych trzech opcji, dzięki czemu można go używać.

Nie udaje się to przez lata poza przedziałem 1212–2424, ale na szczęście rok jest gwarantowany przez reguły z przedziału 1500–2017.

Wypróbuj online!

Ponury
źródło
Nie wiedziałem, że ekspansja nawiasów klamrowych była w Perlu w ogóle ... Przy takim podejściu istnieje świetne rozwiązanie znanego wyzwania znanego ! Wypróbuj online!
Dom Hastings
@DomHastings Ooh Nie wiedziałem, że możesz cytować takie miejsca. To -3 bajty tutaj!
Grimmy
Cieszę się, że mogłem pomóc! Zdecydowanie będę musiał to zapamiętać, chyba dlatego, że <...>zakłada globusy?
Dom Hastings
1
<> jest albo readline, albo glob, w zależności od… rzeczy (klasyczny Perl: gramatyka jest dwuznaczna, ale parser próbuje DWYM). Kiedy jest globem, ściśle naśladuje globusy powłoki, w tym rozszerzenie nawiasów, które jest powszechną cechą powłok.
Grimmy,
Czy możesz dodać link TIO do swojej odpowiedzi? :) To obecnie najkrótsza odpowiedź, ale chcę się upewnić, że wszystko działa, zanim zaakceptuję ją jako najkrótszą.
Kevin Cruijssen
9

Python 2 , 227 220 214 bajtów

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 "

Wypróbuj online!

TFeld
źródło
1
Możesz zapisać jeszcze 6 bajtów, umieszczając 'abhorred 'także listę na dole, ponieważ została ona użyta dwukrotnie. ( 'wretch'jest również możliwe, ale liczba bajtów pozostaje taka sama.)
Kevin Cruijssen
6

Perl 5 , 172 bajty

171 bajtów kod + 1 dla -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]

Wypróbuj online!

Wyjaśnienie

Dość standardowy tylko nieznacznie unsual rzeczą jest użycie określenia „podmiot kosmiczny” ( <=>) w 1818celu powrotu -1, 0lub 1, jeśli sygnał wejściowy $_jest mniejszy, równy lub większy niż 1818powrotu ostatniego, pierwszy lub drugi indeks danych źródłowych . Lubię też operatora ryb !

Dom Hastings
źródło
Nie miałem zamiaru używać $F=fiend, ale po przetestowaniu okazało się, że mam taką samą długość.
Kamil Drakari
@KamilDrakari Tak, musi mieć długość sześciu lub więcej ze względu na $sigil :(
Dom Hastings
$}co za zmienna nazwa ...
Tytus
@Titus Yup! Prawie wszystko działa, chociaż wiele ma dodatkowe specjalne znaczenie. Użyłem go tylko tak, jak gdybym użył $W, musiałbym użyć, ${W}ponieważ jest obok innego listu.
Dom Hastings
1
Liczyłem to. gotcha mimo to :)
Tytus
4

C # (kompilator Visual C #) , 225 209 bajtów

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

Wypróbuj online!

-16 dzięki Kevin Cruijssen

Nie jest to szczególnie zwięzłe, ale spodziewałbym się, że C # zajmie więcej miejsca do zadeklarowania i użycia dowolnych powtarzających się ciągów, tak jak robi to odpowiedź Python, niż po prostu ich powtarzanie. Dołączony tester ma Thread.Sleep(1)wewnątrz wyliczenie przypadków testowych, ponieważ domyślny seeding dla Random()wykorzystuje bieżący czas, a faktyczna funkcja działa wystarczająco szybko, aby skończyć z tym samym seedem w kolejnych uruchomieniach bez opóźnień.

Wywołania func używają składni curry f(year)(chapter)(lub jakiejkolwiek nazwy, w której funkcja jest przechowywana zamiast f)

Kamil Drakari
źródło
2
Widzę, że zastosowałeś tę samą sztuczkę, o której myślałem, kiedy opublikowałem wyzwanie, umieszczając fiendw środku pojedynczą tablicę łańcuchów, ponieważ jest on obecny na obu listach. Można zaoszczędzić kilka bajtów zastępując new[]{"wretch","monster","creature","demon","devil","it","fiend","vile insect","abhorred monster","wretched devil","abhorred devil"}z "wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')(-16 bajtów)
Kevin Cruijssen
@KevinCruijssen Fajna sztuczka, nie wydaje się to od razu korzystne, ale zmiana separatora z ","na po prostu rekompensuje ,dłuższe w .Split(',')porównaniu new[]{}z więcej niż kilkoma elementami.
Kamil Drakari
3

Bash, 229 , 206 , 197 , 179 bajtów

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

wyjaśnienie dotyczące rozszerzeń nawiasów / zmiennych

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

jest najpierw rozszerzony do

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

następnie zmienna m jest rozszerzana

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

jednak następujące nie działa, ponieważ $wzostanie najpierw połączone edi wednie jest zdefiniowane i zostanie rozwinięte do pustego ciągu.

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

można to zrobić dodając wyraźne nawiasy klamrowe wokół w, ale będzie ono dłuższe

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

TIO

Nahuel Fouilleul
źródło
Możesz zapisać 4 bajty, tworząc zmienne dla wretchi monster( 225 bajtów ).
Kevin Cruijssen
nie tak proste ze względu na ekspansję nawiasów, która występuje przed ekspansją zmiennej
Nahuel Fouilleul
Nigdy (prawie) nigdy nie programowałem w Bash, więc czy mógłbyś wyjaśnić, co masz na myśli? Wygląda na to, że działa w TIO , ale może coś mi brakuje ze względu na zachowanie języka programowania.
Kevin Cruijssen
1
@KevinCruijssen dziękuję, że nauczyłem się czegoś, gdy nawiasy klamrowe są ostatnim elementem rozszerzenia elementu
Nahuel Fouilleul
1
@DomHastings, tak, naprawione
Nahuel Fouilleul
2

APL (Dyalog Unicode) , 189 bajtów

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

Wypróbuj online!

Aby przetestować, po prostu dołącz skrzynkę testową do ostatniego nawiasu klamrowego w następujący sposób:

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

Ogromne podziękowania dla @ngn za pomoc w wiodącym problemie z białymi znakami.

Jak to działa:

Warto zauważyć, że APL interpretuje ciągi znaków jako tablice ( wektory ) znaków, dlatego 'wretch' 'creature'w innych językach byłby interpretowany jako[[w,r,e,t,c,h],[c,r,e,a,t,u,r,e]]

Są to funkcje pomocnicze:

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.

Jest to główna funkcja, która zostanie podzielona na 3 części dla lepszego zrozumienia:

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

Część 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 ⍵

Część 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 ⍵

Część 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é
źródło
2

Java (OpenJDK 8) , 275 269 255 207 203 bajtów

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]

Wypróbuj online!

Roberto Graham
źródło
1
203 bajty . Użyj IntFunctions zamiast, Function<Integer>aby uruchomić.
Olivier Grégoire
2

PHP, 184 176 bajtów

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

Uruchom -ni podaj rok i rozdział jako argumenty wiersza poleceń lub wypróbuj online .

indeks, a tym samym wynik oceny NULLdla roku <1818, co prowadzi do pustej produkcji.

Tytus
źródło
Co ma $argv[1]<=>1818zrobić? Nigdy tego nie widziałem.
YU NO PRORK
1

JavaScript (ES6), 205 bajtów

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]

Zwraca, 0jeśli rok jest krótszy niż 1818

Herman L.
źródło
1

JavaScript 199 bajtów

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
źródło
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
źródło
4
Cześć, witamy w PPCG! W wyzwaniu golfowym celem jest jak najmniej bajtów. Zatem nazwy metod / zmiennych najlepiej nadają się jako pojedyncze znaki. Ponadto możesz usunąć wszystkie niepotrzebne spacje i nowe wiersze oraz użyć "Frankenstein's Monster"bezpośrednio zamiast tworzenia dla niego zmiennej. Poza tym, skąd yeari co chapterpochodzi teraz? Nie widzę tego jako parametrów metody. Przydatne mogą być wskazówki dotyczące gry w golfa w <wszystkich językach> oraz wskazówki dotyczące gry w golfa w C. Miłego pobytu! :)
Kevin Cruijssen
Nie ma problemu. Możesz jeszcze trochę zagrać w golfa: 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 bajtów Wypróbuj tutaj! (Usunąłem wszystkie niepotrzebne spacje, printfzmieniłem nazwę metody / zmiennych / parametrów na jedną literę; usunąłem niepotrzebne nawiasy w trójce-jeśli; pojedyncze ; zmieniłem <10na >9; itp.) Nie jestem pewien, dlaczego rand()nie działa w TIO ..: S
Kevin Cruijssen
234 bajty
ceilingcat
1

MBASIC , 288 bajtów

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
źródło
0

05AB1E , 114 110 bajtów

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

Dane wyjściowe, 0gdy rok jest poniżej1818 .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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)

Zobacz tę końcówkę 05AB1E kopalni (sekcje Jak korzystać ze słownika? ; Jak kompresować strun nie Część słownika? ; Jak skompresować dużych liczb całkowitych? ; I jak skompresować list całkowitych? ) , Aby zrozumieć, dlaczego:

  • …뢼–±¹jest "creature devil monster";
  • .•ʒ¦Ë"ìËM₂G¶тá≠•jest "demon fiend it wretch ";
  • .•1ÏiT¥Ƶʒ“T¡Äg… 5ÀΘO¼™Ãí?ιË%4₄‡‡λYιi¾н•jest "abhorred devilabhorred monsterfiendvile insectwretched devil";
  • •Jtm•jest 1249548i •Jtm•17вjest [14,16,5,11,14];
  • 'ì³jest "liechtenstein ";
  • ’¡¬ÿÿ±¹’jest "frankÿÿmonster";
  • Ž7Xjest 1818.
Kevin Cruijssen
źródło
-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)]
użytkownik75200
źródło
tak naprawdę nie pasuje do przypadków testowych
DanielIndie