Имя монстра Франкенштейна


15

Вступление:

Поскольку сейчас почти Хэллоуин, я просто думал о некоторых случайных темах на Хэллоуин. В конце концов я прочитал страницу Википедии Франкенштейна и наткнулся на следующий текст:

Существо

Частью неприятия Франкенштейном его творчества является тот факт, что он не дает ему имя, что вызывает отсутствие идентичности. Вместо этого на него ссылаются такие слова, как «негодяй», «монстр», «существо», «демон», «дьявол», «изверг» и «оно». Когда Франкенштейн разговаривает с существом в главе 10, он обращается к нему как «мерзкое насекомое», «отвратительный монстр», «злодей», «отвратительный дьявол» и «отвратительный дьявол».

источник

Вызов:

Учитывая два целых числа (год и главу), выведите строку, основанную на следующих правилах:

  1. Если год меньше 1818: выведите пустую строку
  2. Если год ровно 1818, а глава меньше 10: выведите случайную строку из списка["wretch", "monster", "creature", "demon", "devil", "fiend", "it"]
  3. Если год ровно 1818, а глава 10 или выше: выведите случайную строку из списка["vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"]
  4. Является ли год выше 1818 (и, таким образом, книга была опубликована), возвращение "Frankenstein's Monster".

Правила вызова:

  • Вы можете выбрать, выводить ли строчную, прописную или комбинацию.
  • Год всегда будет в диапазоне 1500-2017
  • Глава всегда будет в пределах досягаемости 1-24(если я правильно погуглил, книга состоит из 24 глав)
  • Вместо вывода пустой строки для варианта 1, вы также разрешается выход null, undefined, false, 0, или любое другое значение по своему усмотрению не являются частью других трех вариантов (пожалуйста , укажите , что вы использовали в своем ответе).
  • Вывод не может содержать ни начальных, ни конечных пробелов / табуляций, ни каких-либо начальных новых строк. Он может содержать один дополнительный трейлинг новой строки.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с соответствующими параметрами, полные программы. Ваш звонок.
  • Лазейки по умолчанию запрещены (особенно «Ложные случайные числа» ).
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Также, пожалуйста, добавьте объяснение, если это необходимо.

Тестовые случаи:

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"

Ответы:


3

Perl 5 156 153 151 байт

-3 байта благодаря DomHastings.

Бежать с -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]

Это выходное распределение является неоднородным, что принимается по умолчанию . В частности, если дата 1818, а в главе ≥10, имена «отвратительный дьявол» и «отвратительный монстр» взвешиваются вдвое больше. Это позволяет мне использовать rand 7в обоих случаях, хотя списки имеют разные размеры.

Выход за годы до 1818 года - «убогий монстр». Несмотря на некоторые сходства, эта строка не является частью какого-либо из трех других вариантов, поэтому ее можно использовать.

Это не выполняется в течение многих лет за пределами диапазона 1212–2424, но, к счастью, по правилам год гарантированно находится в диапазоне 1500–2017.

Попробуйте онлайн!


Я не знал, что расширение скобок было чем- то особенным в Perl ... При таком подходе есть отличное решение проблемы известных известных ! Попробуйте онлайн!
Дом Гастингс

@DomHastings Ооо, я не знал, что вы могли бы процитировать такие места. Это -3 байта здесь!
Grimmy

Рад, что смог помочь! Я определенно должен буду попытаться запомнить это, я полагаю, это потому, что <...>предполагает наличие шариков?
Дом Гастингс

1
<> это либо readline, либо glob, в зависимости от… вещи (классический Perl: грамматика неоднозначна, но анализатор пытается DWYM). Когда это глобус, он близко имитирует глобусы оболочки, включая расширение скобок, которое является общей особенностью оболочек.
Grimmy

Не могли бы вы добавить TIO-ссылку на ваш ответ. :) В настоящее время это самый короткий ответ, но я просто хочу убедиться, что все работает, прежде чем принять его как самый короткий.
Кевин Круйссен

9

Python 2 , 227 220 214 байт

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 "

Попробуйте онлайн!


1
Вы можете сохранить еще 6 байтов, поместив 'abhorred 'их в список внизу, поскольку он использовался дважды. ( 'wretch'также возможно, но количество байтов остается прежним.)
Кевин Круйссен

6

Perl 5 , 172 байта

Код 171 байт + 1 для -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]

Попробуйте онлайн!

объяснение

Довольно стандартная, немного необычная вещь - это использование оператора космического корабля ( <=>) 1818для возврата -1, 0или 1, если входное значение $_меньше, равно или больше, чем 1818для возврата последнего, первого или второго индекса исходных данных , Также мне нравится рыбный оператор !


Я собирался задавать вопросы, не используя $F=fiend, но после тестирования он получился такой же длины, чтобы сделать это.
Камил Дракари

@KamilDrakari Да, длина должна быть шесть или более из-за $сигил :(
Дом Гастингс,

$}какое имя переменной ...
Тит

@ Titus Ага! Почти все работает, хотя у многих есть особое значение. Я использовал его там только так, как если бы я использовал, $Wмне нужно было использовать ${W}его рядом с другим письмом.
Дом Гастингс

1
Я считал это. получил, тем не менее :)
Тит

4

C # (компилятор Visual C #) , 225 209 байт

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

Попробуйте онлайн!

-16 благодаря Кевину Круйссену

Не очень кратко, но я ожидаю, что C # займет больше места для объявления и использования любых повторяющихся строк, как это делает ответ Python, чем просто повторяет их. У включенного тестового бегуна есть Thread.Sleep(1)внутреннее перечисление тестовых случаев, потому что заполнение по умолчанию дляRandom() использует текущее время и фактическую функцию, выполняющуюся достаточно быстро, чтобы в результате получить те же начальные значения при последующих запусках без задержки.

В вызовах функции используется синтаксис каррирования f(year)(chapter)(или любое другое имя, в котором хранится функция вместо f)


2
Я вижу, что вы применили тот же трюк, который я имел в виду, когда отправлял задание, помещая его fiendв середину одного строкового массива, поскольку он присутствует в обоих списках. Вы можете сохранить несколько байт, заменяя new[]{"wretch","monster","creature","demon","devil","it","fiend","vile insect","abhorred monster","wretched devil","abhorred devil"}с "wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')(-16 байт)
Kevin Cruijssen

@KevinCruijssen Хороший трюк, это не кажется сразу выгодным, но изменение разделителя с ","просто ,компенсирует дольше .Split(',')по сравнению new[]{}с более чем несколькими пунктами.
Камил Дракари

3

Bash, 229 , 206 , 197 , 179 байтов

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

объяснение расширений скобок / переменных

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

сначала расширяется до

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

тогда переменная m расширяется

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

однако следующее не работает, потому что $wбудет сначала соединено с edи wedне определено и будет расширено до пустой строки.

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

это можно сделать, добавив явные скобки arround w, но это займет больше времени

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

TIO


Вы можете сохранить 4 байта, создав переменные для wretchи monster( 225 байтов ).
Кевин Круйссен

не все так просто из-за расширения скобок, которое происходит до расширения переменных
Науэль Фуйе

Я (почти) никогда не программировал на Bash, поэтому не могли бы вы уточнить, что вы подразумеваете под этим? Кажется, он работает в TIO , но, возможно, я что-то упустил из-за поведения языка программирования.
Кевин Круйссен,

1
@KevinCruijssen Спасибо, я кое-что узнал, когда скобки - последний элемент расширения работ
Науэль Фуийо

1
@DomHastings, да, исправлено
Науэль Фуийе

2

APL (Dyalog Unicode) , 189 байтов

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

Попробуйте онлайн!

Чтобы проверить, просто добавьте контрольный пример к последней фигурной скобке следующим образом:

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

Огромное спасибо @ngn за помощь в решении проблемы пробелов.

Как это устроено:

Стоит отметить, что APL интерпретирует строки как массивы ( векторы ) символов, поэтому 'wretch' 'creature'будет интерпретироваться в других языках как[[w,r,e,t,c,h],[c,r,e,a,t,u,r,e]]

Это вспомогательные функции:

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.

Это основная функция, которая будет разбита на 3 части для лучшего понимания:

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

Часть 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 ⍵

Часть 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 ⍵

Часть 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 байта

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]

Попробуйте онлайн!



И вы можете сохранить еще 4 байта, поместив fiend(который присутствует в обоих списках) посередине: 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(";")[(int)(Math.random()*(c<10?7:5))+(c<10?0:6)]( 207 байтов )
Кевин Круйссен,

1
203 байта . Используйте IntFunctions вместо того, Function<Integer>чтобы заставить его работать.
Оливье Грегуар,

2

PHP, 184 176 байт

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

Запустите с -nи укажите год и главу в качестве аргументов командной строки или попробуйте онлайн .

Индекс и, следовательно, результат оценивают NULLна год <1818, что приводит к пустым результатам.


Что делает $argv[1]<=>1818? Я никогда не видел этого.
НЕТ РАБОТЫ


1

Javascript (ES6), 205 байт

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]

Возвращает, 0если год меньше 1818


1

Javascript 199 байт

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 байт

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
Привет, добро пожаловать в PPCG! Задача кода-гольфа состоит в том, чтобы как можно меньше байтов. Поэтому имена методов / переменных лучше всего использовать в виде отдельных символов. Кроме того, вы можете удалить все ненужные пробелы и новые строки и использовать "Frankenstein's Monster"непосредственно вместо создания переменной для него. Кроме того, откуда yearи chapterоткуда? Я не рассматриваю это как параметры метода. Советы по игре в гольф на <все языки> и Советы по игре в гольф на Си могут быть полезны. Приятного пребывания! :)
Кевин Круйссен

Нет проблем. И вы можете играть в гольф немного больше: 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 байт. Попробуйте здесь! (Я удалил все ненужные пробелы, переименовал метод / переменные / параметры в одну букву; удалил некоторые ненужные круглые скобки в тройном-if; одиночный printf; изменил <10на >9; и т. Д.) Не уверен, почему rand()не работает в TIO ..: S
Кевин Круйссен


1

MBASIC , 288 байт

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 байт

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

Выходы, 0когда год ниже1818 .

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

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)

Смотрите этот 05AB1E наконечник шахты (разделы Как пользоваться словарем? ; Как сжать строки не часть словаря? ; Как сжать большие целые числа? И Как сжать целые списки? ) , Чтобы понять , почему:

  • …뢼–±¹есть "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и •Jtm•17весть [14,16,5,11,14];
  • 'ì³есть "liechtenstein ";
  • ’¡¬ÿÿ±¹’есть "frankÿÿmonster";
  • Ž7Xесть 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)]

действительно не соответствует тестовым случаям
DanielIndie
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.