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


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 байти тут!
Гриммі

Радий, що зміг допомогти! Мені обов'язково доведеться спробувати це запам'ятати, я думаю, це тому, що <...>передбачає глобус?
Дом Гастінгс

1
<> це читання рядків, або глобул, залежно від ... матеріалів (класичний Perl: граматика неоднозначна, але аналізатор намагається DWYM). Коли це глобус, він тісно імітує кульки оболонки, включаючи розширення дужок, що є загальною рисою оболонок.
Гріммі

Не могли б ви додати TIO-посилання до своєї відповіді. :) Зараз це найкоротша відповідь, але я просто хочу переконатися, що все працює, перш ніж прийму це як найкоротший.
Kevin Cruijssen

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 Yup! Практично все працює, хоча багато хто має додаткове особливе значення. Я використовував його лише так, як ніби я використовував, що $Wмені потрібно було б використовувати ${W}його, як це поруч з іншим листом.
Дом Гастінгс

1
Я вважав це. gotcha не менш :)
Тіт

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()використовує поточний час і фактичну функцію працює досить швидко, щоб в кінцевому підсумку з наступним пробігом без зволікань.

Виклики функціоналу використовують синтаксис currying 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 байт)
Кевін Круїйсен

@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}

це можна зробити, додаючи чіткі дужки навколо w, але буде довше

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

ТІО


Ви можете зберегти 4 байти, створивши змінні для wretchта monster( 225 байт ).
Кевін Кройсейсен

не так просто через розширення
дужок,

Я (майже) ніколи не програмував у Bash, тож ви могли б пояснити, що ви розумієте під цим? Здається, це працює в TIO , але, можливо, мені щось не вистачає через поведінку мови програмування.
Kevin Cruijssen

1
@KevinCruijssen thnak Ви дізналися щось, коли брекети є останнім елементом розширення елемента
Nahuel Fouilleul

1
@DomHastings, так, виправлено
Nahuel Fouilleul

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]

Спробуйте в Інтернеті!


Ви можете зберегти 44 байти, повернувшись Objectзамість того, щоб безпосередньо надрукувати:y->c->y<1818?0:y>1818?"Frankenstein's monster":"wretch,monster,creature,demon,devil,fiend,it,vile insect,abhorred monster,fiend,wretched devil,abhorred devil".split(",")[(int)(Math.random()*(c<9?7:5))+(c<9?0:7)]
Кевін Круїссен


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йде? Я не розглядаю це як параметри методу. Поради щодо гольфу на [всіх мовах> та Поради щодо гольфу на мові C можуть бути корисними. Насолодитися перебуванням! :)
Кевін Кройсейсен

Без проблем. А ви можете покатати трохи більше: 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 байт Спробуйте тут! (Я видалив усі непотрібні пробіли, перейменував метод / змінні / параметри на одну букву; видалив непотрібні дужки у потрійному, якщо; одиночний printf; змінено <10на >9тощо). Не впевнений, чому rand()не працює в TIO.: S
Кевін Cruijssen


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.