Nombre del monstruo de Frankenstein

15

Introducción:

Como es casi Halloween, solo estaba pensando en algunos desafíos aleatorios con temas de Halloween. Finalmente, estaba leyendo la página de Wikipedia de Frankenstein y encontré el siguiente texto:

La criatura

Parte del rechazo de Frankenstein de su creación es el hecho de que no le da un nombre, lo que provoca una falta de identidad. En su lugar, se le conoce con palabras como "miserable", "monstruo", "criatura", "demonio", "demonio", "demonio" y "eso". Cuando Frankenstein conversa con la criatura en el Capítulo 10, la aborda como "insecto vil", "monstruo aborrecido", "demonio", "demonio miserable" y "demonio aborrecido".

fuente

Desafío:

Dados dos enteros (año y capítulo), genera una cadena basada en las siguientes reglas:

  1. Si el año es inferior a 1818: envíe una cadena vacía
  2. Si el año es exactamente 1818 y el capítulo está por debajo de 10: genera una cadena aleatoria de la lista["wretch", "monster", "creature", "demon", "devil", "fiend", "it"]
  3. Si el año es exactamente 1818 y el capítulo es 10 o superior: genera una cadena aleatoria de la lista["vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"]
  4. Es el año anterior a 1818 (y así se publicó el libro), regreso "Frankenstein's Monster".

Reglas de desafío:

  • Puede elegir si desea generar en minúsculas, mayúsculas o una combinación.
  • El año siempre estará en el rango 1500-2017
  • El capítulo siempre estará en el rango 1-24(si busqué en Google correctamente, el libro tiene 24 capítulos)
  • En lugar de dar salida a una cadena vacía para la opción 1, que también están autorizados para emitir null, undefined, false, 0, o cualquier otro valor de su elección no es parte de las otras tres opciones (especifique lo que usted ha utilizado en su respuesta).
  • La salida no puede contener espacios / pestañas iniciales o finales, ni líneas nuevas nuevas. Puede contener una nueva línea final opcional.

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados, programas completos. Tu llamada.
  • Las lagunas predeterminadas están prohibidas (especialmente 'Números aleatorios falsos' ).
  • Si es posible, agregue un enlace con una prueba para su código.
  • Además, agregue una explicación si es necesario.

Casos de prueba:

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
fuente

Respuestas:

3

Perl 5, 156 153 151 bytes

-3 bytes gracias a DomHastings.

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

Esta distribución de salida no es uniforme, lo cual se acepta por defecto . Específicamente, si la fecha es 1818 y el capítulo es ≥10, los nombres "demonio aborrecido" y "monstruo aborrecido" se ponderan el doble. Esto me permite usarlo rand 7en ambos casos, aunque las listas sean de diferentes tamaños.

La producción de años anteriores a 1818 es "monstruo miserable". A pesar de algunas similitudes, esta cadena no forma parte de ninguna de las otras tres opciones, por lo que está bien usarla.

Esto falla durante años fuera del rango 1212-2424, pero afortunadamente el año está garantizado por las reglas para estar en el rango 1500-2017.

Pruébalo en línea!

Mugriento
fuente
No sabía que la expansión de aparatos ortopédicos fuera algo en absoluto en Perl ... ¡Usando ese enfoque, hay una gran solución para el desafío conocido ! Pruébalo en línea!
Dom Hastings
@DomHastings Ooh, no sabía que podrías citar espacios como ese. ¡Eso es -3 bytes aquí!
Grimmy
Me alegro de haber podido ayudar! Definitivamente tendré que tratar de recordar esto, supongo que es porque <...>asume globos.
Dom Hastings
1
<> es readline o glob, dependiendo de ... cosas (Perl clásico: la gramática es ambigua, pero el analizador intenta DWYM). Cuando se trata de un globo, imita de cerca los globos de caparazón, incluida la expansión del soporte que es una característica común en los depósitos.
Grimmy
¿Podría agregar un enlace TIO a su respuesta? :) Actualmente es la respuesta más corta, pero solo quiero asegurarme de que todo funcione antes de aceptarla como la más corta.
Kevin Cruijssen
9

Python 2 , 227 220 214 bytes

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 "

Pruébalo en línea!

TFeld
fuente
1
Puede guardar 6 bytes más poniéndolos también 'abhorred 'en la lista al final, ya que se ha usado dos veces. ( 'wretch'también es posible, pero el recuento de bytes permanece igual.)
Kevin Cruijssen
6

Perl 5 , 172 bytes

Código de 171 bytes + 1 para -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]

Pruébalo en línea!

Explicación

Bastante estándar, solo algo poco usual es usar el 'operador de nave espacial' ( <=>) con 1818para devolver -1, 0o 1, si la entrada $_es menor, igual o mayor que 1818para devolver el último, primer o segundo índice de los datos de origen . Además, me gusta el operador de pescado !

Dom Hastings
fuente
Iba a cuestionar no usar $F=fiend, pero después de probarlo termina teniendo la misma longitud para hacerlo.
Kamil Drakari
@KamilDrakari Sí, debe tener una longitud de seis o más debido al $sigilo :(
Dom Hastings
$}qué nombre de variable ...
Titus
@Titus Sí! Casi todo funciona, aunque muchos tienen un significado especial adicional. Solo lo usé allí como si lo hubiera hecho $W, habría necesitado usarlo ${W}ya que está al lado de otra letra.
Dom Hastings
1
Calculé eso. gotcha no obstante :)
Titus
4

C # (compilador de Visual C #) , 225 209 bytes

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

Pruébalo en línea!

-16 gracias a Kevin Cruijssen

No es particularmente conciso, pero esperaría que C # ocupara más espacio para declarar y usar cualquier cadena repetida de la forma en que lo hace la respuesta de Python que simplemente repetirla. El corredor de prueba incluido tiene una Thread.Sleep(1)enumeración interna de casos de prueba porque la inicialización predeterminada Random()utiliza la hora actual y la función real se ejecuta lo suficientemente rápido como para terminar con la misma semilla en ejecuciones posteriores sin demora.

Las llamadas al func usan la sintaxis de curry f(year)(chapter)(o cualquier nombre en el que esté almacenada la función en lugar de f)

Kamil Drakari
fuente
2
Veo que aplicó el mismo truco que tenía en mente cuando publiqué el desafío, colocando fienden el medio de un único conjunto de cadenas, ya que está presente en ambas listas. Puede guardar algunos bytes reemplazándolos 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 bytes)
Kevin Cruijssen
@KevinCruijssen Buen truco, no parece inmediatamente beneficioso, pero cambiar el delimitador de ","a solo ,compensa por más tiempo en .Split(',')comparación new[]{}con más de unos pocos elementos.
Kamil Drakari
3

Bash, 229 , 206 , 197 , 179 bytes

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 explicación sobre las llaves / expansiones variables

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

primero se expande a

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

entonces la variable m se expande

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

sin embargo, el siguiente no funciona porque se $wunirá por primera vez edy wedno está definido y se expandirá a una cadena vacía.

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

se puede hacer agregando llaves explícitas alrededor de w pero será más largo

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

TIO

Nahuel Fouilleul
fuente
Puede guardar 4 bytes creando variables para wretchy monster( 225 bytes ).
Kevin Cruijssen
no es tan simple debido a la expansión de
llaves
Yo (casi) nunca programé en Bash, ¿podría aclarar qué quiere decir con eso? Parece funcionar en TIO , pero tal vez me falta algo debido a la forma en que se comporta el lenguaje de programación.
Kevin Cruijssen
1
@KevinCruijssen, gracias. Aprendí algo cuando las llaves son el último elemento que funciona
Nahuel Fouilleul
1
@DomHastings, sí, arreglado
Nahuel Fouilleul
2

APL (Dyalog Unicode) , 189 bytes

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

Pruébalo en línea!

Para probar, simplemente agregue el caso de prueba al último corchete así:

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

Muchas gracias a @ngn por ayudarnos con el problema principal de espacios en blanco.

Cómo funciona:

Vale la pena señalar que APL interpreta las cadenas como matrices ( vectores ) de caracteres, por 'wretch' 'creature'lo que se interpretaría en otros idiomas como[[w,r,e,t,c,h],[c,r,e,a,t,u,r,e]]

Estas son funciones auxiliares:

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.

Esta es la función principal, que se dividirá en 3 partes para una mejor comprensión:

{⊃⍵=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 ⍵
J. Sallé
fuente
2

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

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]

Pruébalo en línea!

Roberto Graham
fuente
1
203 bytes . Use IntFunctions en lugar de Function<Integer>hacerlo funcionar.
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 "]);

Ejecutar con -ny dar año y capítulo como argumentos de línea de comando o probarlo en línea .

índice y, por lo tanto, resultado evaluado NULLpara el año <1818, lo que lleva a una producción vacía.

Titus
fuente
¿Qué $argv[1]<=>1818hacer? Nunca he visto eso.
NO TRABAJAS
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]

Devuelve 0si el año es menor a 1818

Herman L
fuente
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
fuente
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
fuente
44
Hola, bienvenido a PPCG! En un desafío de código de golf, el objetivo es tener la menor cantidad de bytes posible. Por lo tanto, los nombres de métodos / variables son mejores como caracteres individuales. Además, puede eliminar todos los espacios innecesarios y las nuevas líneas, y utilizar "Frankenstein's Monster"directamente en lugar de crear una variable para ello. Además, ¿de dónde es yeary de dónde chapterviene ahora? No lo veo como parámetros del método. Las sugerencias para jugar golf en <todos los idiomas> y las sugerencias para jugar golf en C pueden ser útiles. ¡Disfruta tu estancia! :)
Kevin Cruijssen
No hay problema. Y puedes jugar un poco más al 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 bytes. ¡ Pruébalo aquí! (Eliminé todos los espacios innecesarios, printfcambié el nombre del método / variables / parámetros a una sola letra; eliminé algunos paréntesis innecesarios en el ternario si; único ; cambió <10a >9; etc.) No estoy seguro de por qué rand()no funciona en 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
fuente
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@èΩ

Salidas 0cuando el año está por debajo 1818.

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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)

Ver este consejo 05AB1E mío (secciones cómo utilizar el diccionario? ; ¿Cómo comprimir cadenas no forma parte del diccionario? ; Cómo comprimir grandes números enteros? ; Y Cómo comprimir listas de números enteros? ) Para entender por qué:

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