Nome do monstro de Frankenstein

15

Introdução:

Como é quase o Halloween, eu estava pensando em alguns desafios aleatórios com o tema do Halloween. Eventualmente, eu estava lendo a página da Wikipedia de Frankenstein e me deparei com o seguinte texto:

A criatura

Parte da rejeição de Frankenstein à sua criação é o fato de ele não dar um nome a ela, o que causa falta de identidade. Em vez disso, é referido por palavras como "desgraçado", "monstro", "criatura", "demônio", "diabo", "demônio" e "ele". Quando Frankenstein conversa com a criatura no capítulo 10, ele a aborda como "inseto vil", "monstro detestável", "demônio", "demônio miserável" e "demônio detestável".

fonte

Desafio:

Dados dois números inteiros (ano e capítulo), produza uma string com base nas seguintes regras:

  1. Se o ano for menor que 1818: envie uma string vazia
  2. Se o ano for exatamente 1818 e o capítulo for inferior a 10: faça uma saída aleatória sequência da lista["wretch", "monster", "creature", "demon", "devil", "fiend", "it"]
  3. Se o ano for exatamente 1818 e o capítulo for 10 ou superior: faça uma saída aleatória sequência da lista["vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"]
  4. É o ano acima de 1818 (e, portanto, o livro foi publicado), retorno "Frankenstein's Monster" .

Regras do desafio:

  • Você pode optar por imprimir em minúsculas, maiúsculas ou uma combinação.
  • O ano estará sempre na faixa 1500-2017
  • O capítulo sempre estará no intervalo 1-24(se eu pesquisar no Google corretamente, o livro terá 24 capítulos)
  • Em vez de produzir uma cadeia vazia para a opção 1, você também estão autorizados a saída null, undefined, false,0 , ou qualquer outro valor de sua escolha não faz parte das outras três opções (especificar o que você usou em sua resposta).
  • A saída não pode conter espaços / guias à esquerda ou à direita, nem nenhuma nova linha à esquerda. Pode conter uma nova linha opcional à direita.

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
  • As brechas padrão são proibidas (especialmente 'Números aleatórios falsos' ).
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, adicione uma explicação, se necessário.

Casos de teste:

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
fonte

Respostas:

3

Perl 5, 156 153 151 bytes

-3 bytes graças ao DomHastings.

Correr com -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]

Essa distribuição de saída não é uniforme, o que é aceito por padrão . Especificamente, se a data for 1818 e o capítulo for ≥10, os nomes "diabo abominável" e "monstro abominável" terão o dobro do peso. Isso me permite usarrand 7 nos dois casos, mesmo que as listas sejam de tamanhos diferentes.

A produção dos anos anteriores a 1818 é "monstro miserável". Apesar de algumas semelhanças, essa sequência não faz parte de nenhuma das outras três opções, tornando aceitável o uso.

Isso falha há anos fora da faixa de 1212 a 2424, mas felizmente o ano é garantido pelas regras como estando na faixa de 1500 a 2017.

Experimente online!

Grimmy
fonte
Eu não sabia que a expansão da cinta era algo no Perl ... Usando essa abordagem, há uma ótima solução para o desafio de conhecidos ! Experimente online!
Dom Hastings
@DomHastings Ooh, eu não sabia que você poderia citar espaços assim. Isso é -3 bytes aqui!
Grimmy
Ainda bem que pude ajudar! Definitivamente vou ter que tentar lembrar disso, acho que é porque <...>assume globs?
Dom Hastings
1
<> é readline ou glob, dependendo de ... coisas (Perl clássico: a gramática é ambígua, mas o analisador tenta usar DWYM). Quando é um globo, imita de perto os globos de concha, incluindo a expansão de braçadeira que é uma característica comum nas conchas.
Grimmy #
Você poderia adicionar um link TIO à sua resposta. :) Atualmente, é a resposta mais curta, mas só quero garantir que tudo funcione antes de aceitá-la como a mais curta.
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 "

Experimente online!

TFeld
fonte
1
Você pode salvar mais 6 bytes colocando 'abhorred 'a lista na parte inferior também, pois ela foi usada duas vezes. ( 'wretch'Também é possível, mas estadias byte-count o mesmo.)
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]

Experimente online!

Explicação

Bastante padrão, apenas uma coisa pouco comum é usar o 'operador de nave espacial' ( <=>) com 1818para retornar -1, 0ou 1, se a entrada $_for menor que, igual a ou maior que 1818para retornar o último, primeiro ou segundo índice dos dados de origem . Além disso, eu gosto do operador de peixe !

Dom Hastings
fonte
Eu ia questionar não usar $F=fiend, mas depois de testar, acaba sendo do mesmo tamanho.
Kamil Drakari # 23/17
@KamilDrakari Sim, precisa ter um comprimento de seis ou mais por causa do $sigilo :(
Dom Hastings
$}o que é um nome de variável ...
Tito
@Titus Yup! Quase tudo funciona, embora muitos tenham um significado especial extra. Eu só usei lá como se eu tivesse usado, $Weu teria que usar ${W}, pois é ao lado de outra carta.
Dom Hastings
1
Eu calculei isso. pegadinha no entanto :)
Titus
4

C # (Compilador 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)];

Experimente online!

-16 agradecimentos a Kevin Cruijssen

Não é particularmente conciso, mas eu esperaria que o C # ocupasse mais espaço para declarar e usar quaisquer strings repetidas da maneira que a resposta do Python faz do que apenas repeti-las. O executor de teste incluído possui uma Thread.Sleep(1)enumeração de casos de teste porque a propagação padrão paraRandom() usa o tempo atual e a função real é executada com rapidez suficiente para terminar com a mesma semente nas execuções subseqüentes sem demora.

As chamadas para a função usam a sintaxe de curry f(year)(chapter)(ou qualquer outro nome em que a função esteja armazenada em vez de f)

Kamil Drakari
fonte
2
Vejo que você aplicou o mesmo truque que eu tinha em mente quando postei o desafio, colocando fiendno meio de uma única matriz de cadeias de caracteres, uma vez que está presente nas duas listas. Você pode salvar alguns bytes, substituindo new[]{"wretch","monster","creature","demon","devil","it","fiend","vile insect","abhorred monster","wretched devil","abhorred devil"}com "wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')(-16 bytes)
Kevin Cruijssen
@KevinCruijssen Bom truque, não parece imediatamente benéfico, mas alterar o delimitador de ","para apenas ,compensa o tempo mais longo .Split(',')comparado new[]{}com mais do que alguns itens.
Kamil Drakari 24/10
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)]}"

a explicação sobre expansões de chaves / variáveis

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

é primeiro expandido para

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

então a variável m é expandida

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

no entanto, o seguinte não funciona porque $wserá o primeiro a ser associado ede wednão está definido e será expandido para uma string vazia.

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

isso pode ser feito adicionando chaves explícitas ao redor w, mas será mais longo

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

TIO

Nahuel Fouilleul
fonte
Você pode salvar 4 bytes criando variáveis ​​para wretche monster( 225 bytes ).
Kevin Cruijssen 24/10
não é tão simples por causa da expansão cinta que ocorre antes da expansão variável
Nahuel FOUILLEUL
Eu (quase) nunca programei no Bash, então você poderia esclarecer o que quer dizer com isso? Parece funcionar no TIO , mas talvez eu esteja perdendo algo devido à maneira como a linguagem de programação se comporta.
Kevin Cruijssen 24/10
1
@KevinCruijssen thnak você aprendeu alguma coisa quando o aparelho é o último elemento que a expansão funciona
Nahuel Fouilleul
1
@DomHastings, sim, corrigido
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''}⍵}

Experimente online!

Para testar, basta anexar o caso de teste ao último colchete da seguinte maneira:

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

Muito obrigado a @ngn por ajudar com a principal questão de espaço em branco.

Como funciona:

Vale a pena notar que o APL interpreta seqüências de caracteres como matrizes ( vetores ) de caracteres, portanto 'wretch' 'creature'seria interpretado em outros idiomas como[[w,r,e,t,c,h],[c,r,e,a,t,u,r,e]]

Estas são funções 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 é a função principal, que será dividida em 3 partes para melhor compreensão:

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

Experimente online!

Roberto Graham
fonte
1
203 bytes . Use IntFunctions em vez de Function<Integer>fazê-lo 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 "]);

Execute -ne dê ano e capítulo como argumentos de linha de comando ou tente online .

índice e, portanto, o resultado é avaliado para NULLpara o ano <1818, levando à produção vazia.

Titus
fonte
O que $argv[1]<=>1818faz? Eu nunca vi isso.
YU NO WORK
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]

Retorna 0se o ano for menor que 1818

Herman L
fonte
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
fonte
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
fonte
4
Olá, seja bem-vindo ao PPCG! Em um desafio de código-golfe, o objetivo é ter o mínimo de bytes possível. Portanto, nomes de métodos / variáveis ​​são melhores como caracteres únicos. Além disso, você pode remover todos os espaços desnecessários e novas linhas e usar o "Frankenstein's Monster"diretamente em vez de fazer uma variável para ele. Além disso, de onde vem yeare chapteragora? Não o vejo como parâmetros do método. Dicas para jogar golfe em <todos os idiomas> e Dicas para jogar golfe em C podem ser úteis. Aproveite sua estadia! :)
Kevin Cruijssen
Sem problemas. E você pode jogar um pouco mais: 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 Experimente aqui! (Removi todos os espaços desnecessários, renomeei o método / variáveis ​​/ parâmetros para uma única letra; removi alguns parênteses desnecessários no ternário-se; únicoprintf ; mudei <10para >9; etc.) Não sei por que rand()não está trabalhando no TIO ..: S
Kevin Cruijssen 25/10
234 bytes
tetocat
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
fonte
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@èΩ

Resultados 0quando o ano está abaixo1818 .

Experimente online ou verifique todos os casos de teste .

Explicação:

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)

Veja esta minha dica do 05AB1E (seções Como usar o dicionário ?; Como compactar cadeias de caracteres que não fazem parte do dicionário ?; Como compactar números inteiros grandes ?; E Como compactar listas de números inteiros? ) Para entender por que:

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

JavaScript, 194 bilhões

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
fonte
doesnt realmente coincidir com os casos de teste
DanielIndie