Nom du monstre de Frankenstein


15

Introduction:

Comme c'est presque Halloween, je pensais juste à des défis aléatoires sur le thème d'Halloween. Finalement, je lisais la page wikipedia de Frankenstein et suis tombé sur le texte suivant:

La créature

Une partie du rejet de Frankenstein de sa création est le fait qu'il ne lui donne pas de nom, ce qui provoque un manque d'identité. Au lieu de cela, il est fait référence à des mots tels que "misérable", "monstre", "créature", "démon", "diable", "démon" et "il". Lorsque Frankenstein s'entretient avec la créature dans le chapitre 10, il l'appelle «insecte vil», «monstre abhorré», «démon», «diable misérable» et «diable abhorré».

la source

Défi:

Étant donné deux nombres entiers (année et chapitre), sortez une chaîne basée sur les règles suivantes:

  1. Si l'année est inférieure à 1818: sortez une chaîne vide
  2. Si l'année est exactement 1818 et que le chapitre est inférieur à 10: sortez une chaîne aléatoire de la liste["wretch", "monster", "creature", "demon", "devil", "fiend", "it"]
  3. Si l'année est exactement 1818 et que le chapitre est supérieur ou égal à 10: sortez une chaîne aléatoire de la liste["vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"]
  4. Est l'année au-dessus de 1818 (et donc le livre a été publié), retour "Frankenstein's Monster".

Règles du défi:

  • Vous pouvez choisir de sortir en minuscules, en majuscules ou une combinaison.
  • L'année sera toujours dans la fourchette 1500-2017
  • Le chapitre sera toujours dans la plage 1-24(si je googlé correctement, le livre a 24 chapitres)
  • Au lieu de produire une chaîne vide pour l' option 1, vous êtes également autorisé à la sortie null, undefined, false, 0ou toute autre valeur de votre choix ne fait pas partie des trois autres options (s'il vous plaît préciser ce que vous avez utilisé dans votre réponse).
  • La sortie ne doit pas contenir d'espaces / tabulations de début ou de fin, ni de nouvelles lignes de début. Il peut contenir une nouvelle ligne de fin facultative.

Règles générales:

  • C'est le , donc la réponse la plus courte en octets l'emporte.
    Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues non-golfeur de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
  • Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés, des programmes complets. Ton appel.
  • Les failles par défaut sont interdites (en particulier les «faux nombres aléatoires» ).
  • Si possible, veuillez ajouter un lien avec un test pour votre code.
  • Veuillez également ajouter une explication si nécessaire.

Cas de 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"

Réponses:


3

Perl 5, 156 153 151 151 octets

-3 octets grâce à DomHastings.

Courir avec -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]

Cette distribution de sortie n'est pas uniforme, ce qui est accepté par défaut . Plus précisément, si la date est 1818 et que le chapitre est ≥10, les noms «diable abhorré» et «monstre abhorré» sont pondérés deux fois plus. Cela me permet d'utiliser rand 7dans les deux cas, même si les listes sont de tailles différentes.

Le résultat des années avant 1818 est «misérable monstre». Malgré certaines similitudes, cette chaîne ne fait partie d'aucune des trois autres options, ce qui la rend utilisable.

Cela échoue pendant des années en dehors de la plage 1212—2424, mais heureusement, l'année est garantie par les règles d'être dans la plage 1500—2017.

Essayez-le en ligne!


Je ne savais pas du tout que l'expansion des accolades était chose en Perl ... En utilisant cette approche, il existe une excellente solution pour le défi connu ! Essayez-le en ligne!
Dom Hastings du

@DomHastings Ooh, je ne savais pas que vous pouviez citer des espaces comme ça. C'est -3 octets ici!
Grimmy

Heureux d'avoir pu aider! Je vais certainement devoir essayer de m'en souvenir, je suppose que c'est parce que <...>suppose des globes?
Dom Hastings du

1
<> est soit readline soit glob, en fonction de… stuff (Perl classique: la grammaire est ambiguë, mais l'analyseur essaie de DWYM). Lorsqu'il s'agit d'un glob, il imite étroitement les globes de shell, y compris l'expansion d'accolade qui est une caractéristique commune aux shells.
Grimmy

Pourriez-vous peut-être ajouter un lien TIO à votre réponse. :) C'est actuellement la réponse la plus courte, mais je veux juste m'assurer que tout fonctionne avant de l'accepter comme la plus courte.
Kevin Cruijssen

9

Python 2 , 227 220 214 octets

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 "

Essayez-le en ligne!


1
Vous pouvez également économiser 6 octets supplémentaires en les plaçant 'abhorred 'dans la liste en bas, car il a été utilisé deux fois. ( 'wretch'est également possible, mais le nombre d'octets reste le même.)
Kevin Cruijssen

6

Perl 5 , 172 octets

171 octets de code + 1 pour -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]

Essayez-le en ligne!

Explication

Assez standard, seule une chose peu inhabituelle utilise `` l'opérateur du vaisseau spatial '' ( <=>) avec 1818pour retourner -1, 0ou 1, si l'entrée $_est inférieure, égale ou supérieure à 1818pour renvoyer le dernier, le premier ou le deuxième index des données source . Aussi, j'aime l' opérateur de poisson !


J'allais remettre en question de ne pas utiliser $F=fiend, mais après avoir testé, cela finit par être de la même longueur pour le faire.
Kamil Drakari

@KamilDrakari Ouais, doit avoir une longueur de six ou plus à cause du $sceau :(
Dom Hastings

$}quel nom de variable ...
Titus

@Titus Yup! Presque tout fonctionne, bien que beaucoup aient une signification particulière. Je ne l'ai utilisé que comme si je l'avais utilisé, $Wj'aurais dû l'utiliser ${W}car il est à côté d'une autre lettre.
Dom Hastings

1
Je l'ai compté. gotcha néanmoins :)
Titus

4

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

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

Essayez-le en ligne!

-16 grâce à Kevin Cruijssen

Pas particulièrement concis, mais je m'attendrais à ce que C # prenne plus d'espace pour déclarer et utiliser des chaînes répétées comme le fait la réponse Python que de simplement les répéter. Le lanceur de test inclus contient une Thread.Sleep(1)énumération des cas de test car l'amorçage par défaut pour Random()utilise l'heure actuelle et la fonction réelle s'exécute assez rapidement pour se retrouver avec la même graine lors des exécutions suivantes sans délai.

Les appels à la fonction utilisent la syntaxe de curry f(year)(chapter)(ou quel que soit le nom dans lequel la fonction est stockée au lieu de f)


2
Je vois que vous avez appliqué la même astuce que j'avais en tête lorsque j'ai posté le défi, en mettant fiendau milieu d'un seul tableau de chaînes, car il est présent dans les deux listes. Vous pouvez économiser quelques octets en remplaçant new[]{"wretch","monster","creature","demon","devil","it","fiend","vile insect","abhorred monster","wretched devil","abhorred devil"}par "wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')(-16 octets)
Kevin Cruijssen

@KevinCruijssen astuce, il ne semble pas immédiatement bénéfique mais en changeant le séparateur de ","juste ,fait pour le plus par .Split(',')rapport à new[]{}plus de quelques articles.
Kamil Drakari

3

Bash, 229 , 206 , 197 , 179 octets

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

l'explication sur les extensions d'accolades / variables

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

est d'abord étendu à

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

alors la variable m est développée

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

cependant, ce qui suit ne fonctionne pas car $wsera d'abord joint à edet wedn'est pas défini et sera développé en chaîne vide.

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

cela peut être fait en ajoutant des accolades explicites autour de w mais sera plus long

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

TIO


Vous pouvez enregistrer 4 octets en créant des variables pour wretchet monster( 225 octets ).
Kevin Cruijssen du

pas si simple à cause de l'expansion de l'accolade qui se produit avant l'expansion variable
Nahuel Fouilleul

Je n'ai (presque) jamais programmé en Bash, pourriez-vous clarifier ce que vous entendez par là? Cela semble fonctionner dans TIO , mais peut-être que je manque quelque chose en raison de la façon dont le langage de programmation se comporte.
Kevin Cruijssen

1
@KevinCruijssen thnak you j'ai appris quelque chose quand les accolades sont les derniers travaux d'extension d'élément
Nahuel Fouilleul

1
@DomHastings, oui, corrigé
Nahuel Fouilleul

2

APL (Dyalog Unicode) , 189 octets

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

Essayez-le en ligne!

Pour tester, ajoutez simplement le cas de test à la dernière parenthèse bouclée comme suit:

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

Un grand merci à @ngn pour sa contribution au problème majeur des espaces blancs.

Comment ça fonctionne:

Il convient de noter que APL interprète les chaînes comme des tableaux ( vecteurs ) de caractères, donc 'wretch' 'creature'serait interprété dans d'autres langues comme[[w,r,e,t,c,h],[c,r,e,a,t,u,r,e]]

Ce sont des fonctions d'assistance:

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.

Il s'agit de la fonction principale, qui sera divisée en 3 parties pour une meilleure compréhension:

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

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

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

Partie 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 octets

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]

Essayez-le en ligne!




1
203 octets . UtilisationIntFunction s au lieu de Function<Integer>pour le faire fonctionner.
Olivier Grégoire du

2

PHP, 184 176 octets

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

Exécutez avec -net donnez l'année et le chapitre comme arguments de ligne de commande ou essayez-les en ligne .

l'indice et donc le résultat s'évaluent à NULLpour l'année <1818, conduisant à une sortie vide.


Que fait $argv[1]<=>1818-il? Je n'ai jamais vu ça.
YU NO WORK


1

Javascript (ES6), 205 octets

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]

Renvoie 0si l'année est inférieure à 1818


1

Javascript 199 octets

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 octets

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
Salut, bienvenue chez PPCG! Dans un défi de code-golf, l'objectif est d'avoir le moins d'octets possible. Les noms de méthode / variable sont donc préférables en tant que caractères uniques. De plus, vous pouvez supprimer tous les espaces inutiles et les nouvelles lignes, et utiliser "Frankenstein's Monster"directement au lieu de créer une variable pour celui-ci. Aussi, d'où vient yearet chaptervient maintenant? Je ne le vois pas comme des paramètres de la méthode. Des conseils pour jouer au golf dans <toutes les langues> et des conseils pour jouer au golf en C pourraient être utiles. Profitez de votre séjour! :)
Kevin Cruijssen

Aucun problème. Et vous pouvez jouer un peu plus au golf: 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 octets Essayez-le ici! (J'ai supprimé tous les espaces inutiles, renommé méthode / variables / paramètres en lettre unique; supprimé certaines parenthèses inutiles au ternaire-si; unique printf; changé <10en >9; etc.) Je ne sais pas pourquoi rand()ne fonctionne pas dans TIO ..: S
Kevin Cruijssen


1

MBASIC , 288 octets

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 octets

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

Sorties 0lorsque l'année est inférieure1818 .

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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)

Voir cette astuce 05AB1E de mes (sections Comment utiliser le dictionnaire? ; Comment les chaînes Compresser ne font pas partie du dictionnaire? ; Comment compresser les grands entiers? Et Comment les listes entières Compresser? ) Pour comprendre pourquoi:

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

ne correspond pas vraiment aux cas de test
DanielIndie
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.