Nome del mostro di Frankenstein


15

Introduzione:

Dato che è quasi Halloween, stavo solo pensando ad alcune sfide casuali a tema Halloween. Alla fine stavo leggendo la pagina di Wikipedia di Frankenstein e mi sono imbattuto nel seguente testo:

La creatura

Parte del rifiuto di Frankenstein della sua creazione è il fatto che non gli dà un nome, il che provoca una mancanza di identità. Invece è indicato da parole come "disgraziato", "mostro", "creatura", "demone", "diavolo", "diavolo" e "esso". Quando Frankenstein conversa con la creatura nel capitolo 10, lo affronta come "insetto vile", "mostro a disgusto", "diavolo", "diavolo miserabile" e "diavolo a disgusto".

fonte

Sfida:

Dati due numeri interi (anno e capitolo), genera una stringa in base alle seguenti regole:

  1. Se l'anno è inferiore a 1818: genera una stringa vuota
  2. Se l'anno è esattamente 1818 e il capitolo è inferiore a 10: emettere una stringa casuale dall'elenco["wretch", "monster", "creature", "demon", "devil", "fiend", "it"]
  3. Se l'anno è esattamente 1818 e il capitolo è 10 o superiore: emettere una stringa casuale dall'elenco["vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"]
  4. È l'anno sopra il 1818 (e quindi il libro è stato pubblicato), ritorno "Frankenstein's Monster".

Regole della sfida:

  • È possibile scegliere se eseguire l'output in minuscolo, maiuscolo o in una combinazione.
  • L'anno sarà sempre nella gamma 1500-2017
  • Il capitolo sarà sempre nella gamma 1-24(se ho cercato su Google correttamente, il libro ha 24 capitoli)
  • Invece di emettere una stringa vuota per l'opzione 1, si sono anche permesso di uscita null, undefined, false, 0, o qualsiasi altro valore della vostra scelta non parte delle altre tre opzioni (si prega di specificare quello che hai utilizzato nella risposta).
  • L'output non può contenere spazi / tab iniziali o finali, né nuove righe iniziali. Può contenere una nuova riga finale facoltativa.

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Per la tua risposta valgono regole standard , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti, programmi completi. La tua chiamata.
  • Sono vietate le scappatoie predefinite (in particolare i "numeri casuali falsi" ).
  • Se possibile, aggiungi un link con un test per il tuo codice.
  • Inoltre, si prega di aggiungere una spiegazione, se necessario.

Casi test:

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"

Risposte:


3

Perl 5, 156 153 151 byte

-3 byte grazie a DomHastings.

Corri con -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]

Questa distribuzione di output è non uniforme, accettata per impostazione predefinita . In particolare, se la data è 1818 e il capitolo è ≥10, i nomi "diavolo aborrito" e "mostro aborrito" vengono pesati il ​​doppio. Questo mi permette di usarerand 7 per entrambi i casi, anche se le liste sono di dimensioni diverse.

L'uscita per anni prima del 1818 è "mostro miserabile". Nonostante alcune somiglianze, questa stringa non fa parte di nessuna delle altre tre opzioni, il che rende ok per l'uso.

Questo fallisce per anni al di fuori dell'intervallo 1212-2424, ma per fortuna l'anno è garantito dalle regole per essere nell'intervallo 1500-2017.

Provalo online!


Non sapevo affatto che l'espansione del tutore fosse una cosa in Perl ... Usando questo approccio, c'è un'ottima soluzione per la sfida dei noti noti ! Provalo online!
Dom Hastings,

@DomHastings Ooh, non sapevo che potresti citare spazi del genere. Sono qui -3 byte!
Grimmy,

Sono contento di essere stato in grado di aiutare! Dovrò assolutamente provare a ricordare questo, immagino che sia perché si <...>suppone?
Dom Hastings,

1
<> è readline o glob, a seconda di ... cose (Perl classico: la grammatica è ambigua, ma il parser prova a DWYM). Quando è un glob, imita da vicino i globs della shell, inclusa l'espansione del controvento che è una caratteristica comune nelle shell.
Grimmy,

Potresti forse aggiungere un link TIO alla tua risposta. :) Attualmente è la risposta più breve, ma voglio solo assicurarmi che tutto funzioni prima di accettarlo come il più breve.
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 "

Provalo online!


1
Puoi salvare altri 6 byte inserendo 'abhorred 'anche l'elenco in fondo, poiché è stato usato due volte. ( 'wretch'è anche possibile, ma il conteggio dei byte rimane lo stesso.)
Kevin Cruijssen,

6

Perl 5 , 172 byte

171 byte codice + 1 per -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]

Provalo online!

Spiegazione

Abbastanza standard, solo una cosa leggermente insolita sta usando l '"astronave operatore" ( <=>) con 1818per restituire -1, 0oppure 1, se l'input $_è minore di, uguale o maggiore di 1818per restituire l'ultimo, primo o secondo indice dei dati di origine . Inoltre, mi piace l' operatore di pesce !


Stavo per mettere in discussione il non utilizzo $F=fiend, ma dopo il test finisce per avere la stessa lunghezza per farlo.
Kamil Drakari,

@KamilDrakari Sì, deve avere una lunghezza di sei o più a causa del $sigillo :(
Dom Hastings,

$}che nome variabile ...
Tito

@Titus Yup! Quasi tutto funziona, anche se molti hanno un significato speciale in più. L'ho usato solo come se $Wavessi dovuto usarlo ${W}perché è accanto a un'altra lettera.
Dom Hastings,

1
L'ho calcolato. ma comunque :)
Tito,

4

C # (compilatore Visual C #) , 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)];

Provalo online!

-16 grazie a Kevin Cruijssen

Non particolarmente conciso, ma mi aspetto che C # occupi più spazio per dichiarare e usare qualsiasi stringa ripetuta come fa la risposta di Python piuttosto che semplicemente ripeterla. Il runner di test incluso contiene un Thread.Sleep(1)elenco interno dei casi di test poiché il seeding predefinito Random()utilizza l'ora corrente e la funzione effettiva viene eseguita abbastanza velocemente da finire con lo stesso seed nelle successive esecuzioni senza ritardo.

Le chiamate alla funzione utilizzano la sintassi del curry f(year)(chapter)(o qualunque sia il nome in cui è memorizzata la funzione anziché f)


2
Vedo che hai applicato lo stesso trucco che avevo in mente quando ho pubblicato la sfida, inserendo fiendun singolo array di stringhe, poiché è presente in entrambe le liste. È possibile salvare alcuni byte sostituendoli new[]{"wretch","monster","creature","demon","devil","it","fiend","vile insect","abhorred monster","wretched devil","abhorred devil"}con "wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')(-16 byte)
Kevin Cruijssen,

@KevinCruijssen Un bel trucco, non sembra immediatamente utile ma cambiare il delimitatore da ","a ,compensare più .Split(',')a lungo rispetto anew[]{} più di alcuni elementi.
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)]}"

la spiegazione delle parentesi graffe / espansioni variabili

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

viene prima esteso a

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

quindi la variabile m viene espansa

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

tuttavia il seguito non funziona perché $wverrà prima unito con ede wednon è definito e verrà espanso in una stringa vuota.

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

si può fare aggiungendo parentesi graffe intorno a w ma sarà più lungo

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

TIO


È possibile salvare 4 byte creando variabili per wretche monster( 225 byte ).
Kevin Cruijssen,

non così semplice a causa dell'espansione del rinforzo che si verifica prima dell'espansione variabile
Nahuel Fouilleul

Non ho quasi mai programmato in Bash, quindi potresti chiarire cosa intendi con questo? Sembra funzionare in TIO , ma forse mi manca qualcosa a causa del comportamento del linguaggio di programmazione.
Kevin Cruijssen,

1
@KevinCruijssen grazie per aver imparato qualcosa quando le parentesi graffe sono le ultime opere di espansione dell'elemento
Nahuel Fouilleul,

1
@DomHastings, sì, risolto
Nahuel

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

Provalo online!

Per testare, basta aggiungere il test case all'ultima parentesi graffa in questo modo:

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

Grazie mille a @ngn per l'aiuto con il principale problema degli spazi bianchi.

Come funziona:

Vale la pena notare che APL interpreta le stringhe come matrici ( vettori ) di caratteri, quindi'wretch' 'creature' verrebbero interpretate in altre lingue come[[w,r,e,t,c,h],[c,r,e,a,t,u,r,e]]

Queste sono le funzioni di supporto:

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.

Questa è la funzione principale, che verrà suddivisa in 3 parti per una migliore comprensione:

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

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

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

Parte 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 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]

Provalo online!




1
203 byte . Usa IntFunctions invece di Function<Integer>farlo funzionare.
Olivier Grégoire,

2

PHP, 184 176 byte

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

Esegui con -ne fornisci anno e capitolo come argomenti della riga di comando o provalo online .

l'indice e quindi il risultato valutano NULLper l'anno <1818, portando a una produzione vuota.


Cosa fa $argv[1]<=>1818? Non l'ho mai visto.
NO NO WORK


1

Javascript (ES6), 205 byte

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]

Restituisce 0se l'anno è inferiore a 1818


1

Javascript 199 byte

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
Ciao, benvenuto in PPCG! In una sfida di code-golf l'obiettivo è quello di avere il minor numero di byte possibile. Quindi i nomi di metodo / variabile sono i migliori come singoli caratteri. Inoltre, puoi rimuovere tutti gli spazi non necessari e le nuove righe e utilizzare "Frankenstein's Monster"direttamente invece di creare una variabile per esso. Inoltre, dove è la yeare chapterproveniente da oggi? Non lo vedo come parametri del metodo. Suggerimenti per giocare a golf in <tutte le lingue> e Suggerimenti per giocare a golf in C potrebbero essere utili. Goditi la permanenza! :)
Kevin Cruijssen,

Nessun problema. E puoi giocare a golf un po 'di più: 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 byte Provalo qui! (Ho rimosso tutti gli spazi non necessari, rinominato metodo / variabili / parametri in una sola lettera; rimosso alcune parentesi non necessarie al ternario-se; singolo printf; cambiato <10in >9; ecc.) Non sono sicuro del perché rand()non funzioni in TIO ..: S
Kevin Cruijssen,


1

MBASIC , 288 byte

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 byte

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

Emette 0quando l'anno è inferiore 1818.

Provalo online o verifica tutti i casi di test .

Spiegazione:

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)

Vedere questo suggerimento 05AB1E mio (sezioni come utilizzare il dizionario? ; Come stringhe di comprimere che non fanno parte del dizionario? ; Come comprimere grandi numeri interi? E Come per liste di interi comprimere? ) Per capire perché:

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

non corrisponde davvero ai casi di test
DanielIndie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.