Сколько маны мне нужно?


33

Dungeon Master - одна из первых ролевых игр в реальном времени, впервые выпущенная в 1987 году на Atari ST. Среди других захватывающих вещей того времени, он предложил довольно сложную систему заклинаний, основанную на рунах.

Ваша задача сегодня состоит в том, чтобы написать программу или функцию, которая оценивает количество очков маны, необходимое для наложения данного заклинания в Dungeon Master.

Скриншот Dungeon Master

Система заклинаний - это верхний правый голубой прямоугольник на картинке выше.

Заклинания, руны и мана

Заклинания Мастера подземелий состоят из 2-4 рун, выбранных из следующих категорий, в точном порядке:

  1. Мощность (обязательно)
  2. Стихийное влияние (обязательно)
  3. Форма (необязательно)
  4. Класс / Выравнивание (необязательно)

Это означает, что действительными заклинаниями являются:

  • Сила + Стихийное влияние
  • Сила + Стихийное Влияние + Форма
  • Сила + Стихийное Влияние + Форма + Класс / Выравнивание

Каждая категория содержит 6 рун, и каждая руна имеет связанную базовую стоимость маны:

=============================================================================
| Power               | Rune      |   Lo |   Um |   On |   Ee |  Pal |  Mon |
|                     +-----------+------+------+------+------+------+------+
|                     | Base cost |    1 |    2 |    3 |    4 |    5 |    6 |
=============================================================================
| Elemental Influence | Rune      |   Ya |   Vi |   Oh |  Ful |  Des |   Zo |
|                     +-----------+------+------+------+------+------+------+
|                     | Base cost |    2 |    3 |    4 |    5 |    6 |    7 |
=============================================================================
| Form                | Rune      |  Ven |   Ew | Kath |   Ir |  Bro |  Gor |
|                     +-----------+------+------+------+------+------+------+
|                     | Base cost |    4 |    5 |    6 |    7 |    7 |    9 |
=============================================================================
| Class / Alignment   | Rune      |   Ku |  Ros | Dain | Neta |   Ra |  Sar |
|                     +-----------+------+------+------+------+------+------+
|                     | Base cost |    2 |    2 |    3 |    4 |    6 |    7 |
=============================================================================

Оценка стоимости маны

Мана-стоимость заклинания равна сумме мана-стоимости всех рун:

  • Стоимость Силовой руны всегда равна ее базовой стоимости (от 1 до 6).

  • Для других рун применяется следующая формула:

    стоимость = этаж ((мощность + 1) * базовая стоимость / 2)

    где сила - базовая стоимость руны силы.

Примеры

Spell: Lo Ful
Cost : 1 + floor((1 + 1) * 5 / 2) = 1 + 5 = 6

Spell: Um Ful
Cost : 2 + floor((2 + 1) * 5 / 2) = 2 + 7 = 9

Spell: Pal Vi Bro
Cost : 5 + floor((5 + 1) * 3 / 2) + floor((5 + 1) * 7 / 2) = 5 + 9 + 21 = 35

Разъяснения и правила

  • Ваш ввод будет состоять из 2-4 строк, обозначающих руны заклинания. Вы можете взять их в любом приемлемом формате, например, 4 различных параметра, массив строк (например ['Lo', 'Ful']) или только одну строку с разделителем из одного символа на ваш выбор (например 'Lo Ful'). Пожалуйста, укажите выбранный формат ввода в вашем ответе.
  • Руны гарантированно действительны.
  • Порядок категорий должен соблюдаться. Неиспользуемые категории могут отсутствовать или заменяться каким-либо ложным значением.
  • Вы можете принять руны в любом из следующих форматов: 1. Заглавная буква, за которой следует нижний регистр ( 'Ful') 2. Все строчные буквы ( 'ful') 3. Все прописные буквы ( 'FUL'). Но вы не можете смешивать разные форматы.
  • Совершенно очевидно, что нам не важно знать, действительно ли заклинание имеет какой-то эффект в игре (любопытные, полезные заклинания перечислены здесь ).
  • Это , поэтому выигрывает самый короткий код в байтах.
  • И помните: лорд Хаос наблюдает за вами!

Контрольные примеры

Spell          | Output
---------------+-------
Lo Ful         | 6
Um Ful         | 9
On Ya          | 7
Lo Zo Ven      | 12
Pal Vi Bro     | 35
Ee Ya Bro Ros  | 31
On Ful Bro Ku  | 31
Lo Zo Kath Ra  | 20
On Oh Ew Sar   | 35
Ee Oh Gor Dain | 43
Mon Zo Ir Neta | 68
Mon Des Ir Sar | 75

1
Tangential - но для людей, которым нравится эта система, The Magical Land of Wozz - это японская игра SNES (доступен английский перевод), в которой реализована почти та же система - где любая цепочка букв становится заклинанием. google.co.jp/webhp?ie=UTF-8#q=magical+land+of+wozz
Коти Джонатан Саксман

Я смутно помню, как кто-то играл в Dungeon Master (я не думаю, что это было на ST). Они снабдили одного из своих бойцов волшебным ожерельем, и время от времени они проверяли, перезаряжалось ли оно, и в этом случае разыгрывали еще одну руну того, что, на мой взгляд, было светоносным заклинанием какого-то рода, так что боец ​​мог читать это заклинание каждые десять минут или около того, и в конечном итоге получил уровень в волшебстве.
Нил

@Neil Это ожерелье было либо лунным камнем (+3 маны), либо подвесным диким (+1 навык волшебника). Все предметы перечислены здесь .
Arnauld

этот скрипт должен выводить все возможные входные комбинации
NieDzejkob

Ответы:


6

SOGL V0.12 , 110 78 байтов

θKKι"LUOEPM”;W:A≤{B"⁶Μ↓§QΕņj“L─"¶Ζq«╝γDyΜ2¶S◄Μ$‘č¹I6nēwι{_Cb:ƧRA=┌*ΚKι=?aIc*»+

Попробуй здесь!

Возможно, удастся сыграть в байт или два, переделав все

Объяснение:

θ            split on spaces
 K           pop the 1st item
  K          pop from the string the 1st character
   ι         remove the original string from stack
    "”;W     get the chars index in "LUOEPM"
        :A   save a copy to variable A
          ≤  put the power (used as the mana) on the bottom of the stack (with the thing above being the input array)

{            for the leftover items in the input do
 B             save the current name on B
  "..“         push 456779223467234567
      L─       base-10 decode it (yes, silly, but it converts it to an array of digits)
        ".‘    push "VEKIBGKRDN-SYVOFDZ"

      č        chop to characters
       ¹       create an array of those two
        I      rotate clockwise
         6n    group to an array with sub-arrays of length 6 (so each array in the array contains 3 items, corresponding to the categories, each with 6 arrays with the runes 1st letter (or "-" in the case of Ra) and base cost)
           ē   push variable e (default = user input number, which errors and defaults to 0) and after that increase it (aka `e++`)
            w  get that item in the array (the array is 1-indexed and the variable is not, so the array was created shifted (which somehow saves 0.9 ≈ 1 byte in the compression))

 ι             remove the original array
  {            for each in that (current category) array
   _             dump all contents on stack (so pushing the runes name and then base cost)
    C            save pop (base cost) on variable B
     b:          duplicate the name
       ƧRA=      push if pop = "RA"
           ┌*    get that many (so 0 or 1) dashes
             Κ   prepend the "" or "-" to the name
              K  pop the 1st letter of the name
               ι remove the modified name, leaving the 1st letter on the stack

         =?      if top 2 are equal (one of the dumped items and the 1st letter of the current inputs)
           a       push variable A (the power)
            I      increase it
             c     push variable C (the current base cost)
              *    multiply
               »   floor-divide by 2
                +  add that to the power

2
вот что делает его еще более интересным
Walfrat

Можете ли вы добавить объяснение?
CalculatorFeline

@CalculatorFeline Kinda забыл об этом ответе. Будет, вероятно, гольф, а затем добавить объяснение
dzaima

17

Python 2 , 135 119 115 байтов

b=[int('27169735 2  4567 435262'[int(x,36)%141%83%50%23])for x in input()]
print b[0]+sum(a*-~b[0]/2for a in b[1:])

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

Ввод списка строк из стандартного ввода


Outgolfed ...>. <
Мистер Xcoder

Я скопировал ваш метод ввода TIO в мой ответ, надеюсь, вы не возражаете.
г-н Xcoder

@ Mr.Xcoder Теперь я включил все тестовые случаи. Вы можете скопировать их , если вы хотите
овс

О, хорошо сделано по индексированию - не возражаете, если я позаимствую его для своего решения JS?
Лохматый

11

05AB1E , 83 82 байта

.•Y<εΔ•¹нk©.•M₄P畲нkÌ.•Jrû •³нkD(i\ë4 3‡4+}.•A1Δ#•I4èkD(i\ë3LJ012‡Ì})ćsv®>y*;(î(+

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

-1 спасибо Эмигне .

СООООООО разгулялся :(

Объяснение:

.•Y<εΔ•¹нk©.•M₄P畲нkÌ.•Jrû •³нkD(i\ë4 3‡4+}.•A1Δ#•I4èkD(i\ë3LJ012‡Ì})ćsv®>y*;(î(+ Accepts four runes as separate lines, lowercase. Use Ø for missing runes.
.•Y<εΔ•¹нk©                                                                        Index first letter of first rune into "aluoepm" ("a" makes 1-indexed)
           .•M₄P畲нkÌ                                                             Index first letter of second rune into "yvofdz", 2-indexed.
                      .•Jrû •³нkD(i\ë4 3‡4+}                                       Index first letter of third rune into "vekibg", 0-indexed, if it's not there pop, else, if index is 4 replace with 3, else keep as-is, then increment by 4.
                                            .•A1Δ#•I4èkD(i\ë3LJ012‡Ì}              Index fourth letter (modular wrapping) of fourth rune into "kodnra", if it's not there pop, else, if index is one of 1, 2 or 3, replace with 0, 1 or 2 respectively, else keep as-is, then increment by 2.
                                                                     )ćs           Wrap all numbers into a list, keeping the power rune behind.
                                                                        v          For each
                                                                         ®>y*;(î(   Apply the formula
                                                                                 +  Add to total sum

Один маленький гольф состоит в том, что если вы начнете индексировать в .•Y<εΔ•начале, вам не нужно увеличивать индекс.
Эминья

@ Emigna Ооо еще не успел это попробовать ...
Эрик Игрок в гольф

11

JavaScript (ES6), 157 156 116 112 100 99 97 байт

Принимает ввод как массив строк.

a=>a.map(c=>t+=(v=+`27169735020045670435262`[parseInt(c,36)%141%83%50%23],+a?a*v+v>>1:a=v),t=0)|t
  • Сэкономили 44 байта, позаимствовав уловку индексирования из решения Python от ovs - если вы проголосуете против этого ответа, пожалуйста, добавьте его тоже.
  • Сохранено 13 байтов благодаря Арно, указывающему на то, что должно было быть очевидной возможностью использовать троичную.

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


объяснение

Оу, мальчик, это будет весело - мои объяснения тривиальным решениям отстойны в лучшие времена! Давайте попробуем ...

a=>

Анонимная функция, принимающая массив в качестве аргумента через параметр a.

a.reduce((t,c)=>,0)

Сократите элементы в массиве, передавая каждый через функцию; tпараметр является нарастающим итогом, то cпараметр является текущей строкой , и 0это начальное значение t.

parseInt(c,36)

Преобразовать текущий элемент из базовой строки 36 в десятичное целое число.

%141%83%50%23

Выполните несколько операций по модулю на нем.

+`27169735 2  4567 435262`[]

Возьмите символ из строки по этому индексу и преобразуйте его в число.

v=

Присвойте это число переменной v.

+a?

Проверьте, является ли переменная aчислом. Для первого элемента aбудет массив строк, попытка преобразовать его в число вернет NaN, что неверно. На каждом последующем проходе aбудет положительное целое число, что является правдой.

a*v+v>>1

Если aэто число, то мы умножаем его на значение v, добавляем значение vи сдвигаем биты результата на 1 бит вправо, что дает тот же результат, что и деление на 2 и наложение.

:a=v

Если aэто не число, мы присваиваем ему значение v, что также дает нам 0возможность добавить к нашему итогу при первом проходе.

t+

Наконец, мы добавляем результат из тройной выше к нашему текущему итогу.


Оригинал, 156 байт

a=>a.reduce((t,c)=>t+(p+1)*g(c)/2|0,p=(g=e=>+`123456234567456779223467`["LoUmOnEePaMoYaViOhFuDeZoVeEwKaIrBrGoKuRoDaNeRaSa".search(e[0]+e[1])/2])(a.shift()))

Вы можете сохранить еще один байт, повторно используя: a=>a.reduce((t,c)=>t+(v=+'27169735020045670435262'[parseInt(c,36)%141%83%50%23],+a?a*v+v>>1:a=v),0)(РЕДАКТИРОВАТЬ: удалил нерелевантный комментарий о целых числах, переданных во входных данных - похоже, я не очень хорошо понял свой собственный вызов ^^)
Арно

Отличный трюк, спасибо, @Arnauld. Попытка придумать вычисление, которое дало бы мне число, которое мы сейчас индексируем, в меньшем количестве байтов, но без особой удачи.
Лохматый

6

JavaScript, 212 210 207 206 байт

Прямой алгоритм поиска, строки поиска просто вносят вклад в общее количество байтов.

Код

s=>eval('p=q=+(e=s.map(r=>"1 2 3 4 5  6  2 3 4 5  6  7 4  5 6   7 7  9  2 2  3   4   6 7"["LoUmOnEePalMonYaViOhFulDesZoVenEwKathIrBroGorKuRosDainNetaRaSar".search(r)])).shift();e.map(c=>p+=((q+1)*c)>>1);p')

Формат ввода

Строковый массив, каждый элемент является строкой с заглавной буквой. Пример: ["Mon", "Zo", "Ir", "Neta"]

объяснение

e=s.map(r=>"1 2 3 4 5  6  2 3 4 5  6  7 4  5 6   7 7  9  2 2  3   4   6 7"["LoUmOnEePalMonYaViOhFulDesZoVenEwKathIrBroGorKuRosDainNetaRaSar".search(r)])

Это запрашивает основные расходы.

p=q=+(/*blah*/).shift() 

Инициализирует 2 переменные с первым элементом из массива, приведенного выше, и удаляет этот элемент. Сначала должен быть приведен к числу, иначе он будет рассматриваться как конкатенация строк в следующей части.

e.map(c=>p+=((q+1)*c)>>1);

Добавляет стоимость неэнергетических рун к базовой силе. Сдвиг используется вместо пола (бла) / 2.

eval(/*blah*/;p)

Оцените последний результат. (Предоставлено: Step Hen)

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

Lo Ful | 6
Um Ful | 9
On Ya | 7
Lo Zo Ven | 12
Pal Vi Bro | 35
Ee Ya Bro Ros | 31
On Ful Bro Ku | 31
Lo Zo Kath Ra | 20
On Oh Ew Sar | 35
Ee Oh Gor Dain | 43
Mon Zo Ir Neta | 68
Mon Des Ir Sar | 75

Изменить 1: 212> 210 - Удалена пара скобок

Изменить 2: 210> 207 - Спасибо, Курица за напоминание о правилах JS и некоторые советы по использованию функции eval (). Поскольку AS3 запрещает использование eval (), я не использовал это в течение длительного времени

Изменить 3: 207> 206. - Спасибо Шегги за идею заменить indexOf () на search ()


1
Если вы не позвоните gвнутрь g, мы разрешим JS ответы удалить g=. Кроме того, вы можете сохранить пару байтов, переключив их на eval и удалив return: Fiddle
Stephen

@StepHen Спасибо за идею eval () и правила JS, так как AS3 запретил eval (), я думал, что больше не смогу это использовать
Shieru Asakoto

Ну, это все еще работает, и мы определяем язык реализацией: P
Стивен

1
searchсэкономит вам больше байтов indexOf.
Лохматый

@ Shaggy Это сработало, спасибо за идею поиска;)
Шиеру Асакото


3

Python 2 , 320 318 314 311 307 байт

Формат ввода - список строк. Полная программа:

i=input()
t=[x.split()for x in"Lo Um On Ee Pal Mon|Ya Vi Oh Ful Des Zo|Ven Ew Kath Ir Bro Gor|Ku Ros Dain Neta Ra Sar".split('|')]
c=t[0].index(i[0])+1;r=c+1;s=c+r*(t[1].index(i[1])+2)/2
if len(i)>2:s+=r*(t[2].index(i[2])+4-(i[2]=='Bro'))/2
if len(i)>3:s+=r*(t[3].index(i[3])+1+(i[3]in'KuRaSar'))/2
print(s)

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


1
Я отчасти отказался от игры в гольф, поэтому любой, кто имеет идеи игры в гольф, может редактировать себя .
г-н Xcoder

3

Excel, 339 байт

Входы вводятся A1через D1. Формула в любой другой клетке.

=CHOOSE(MOD(CODE(A1),12),2,,,1,6,,3,5,4)+INT((CHOOSE(MOD(CODE(A1),12),2,,,1,6,,3,5,4)+1)*CHOOSE(MOD(CODE(B1),12),,3,,,2,7,4,6,,5)/2)+INT((CHOOSE(MOD(CODE(A1),12),2,,,1,6,,3,5,4)+1)*CHOOSE(MOD(CODE(C1),12),7,4,6,,,7,,,5,,9)/2)+INT((CHOOSE(MOD(CODE(A1),12),2,,,1,6,,3,5,4)+1)*CHOOSE(MOD(CODE(SUBSTITUTE(D1,"Ra","E")),11),4,3,6,,2,7,,,2,0)/2)

Кроме того, импорт в формате CSV:

Excel & CSV, 228 байт

,,,
=CHOOSE(MOD(CODE(A1),12),2,,,1,6,,3,5,4)+1
=A2-1+INT(A2*CHOOSE(MOD(CODE(B1),12),,3,,,2,7,4,6,,5)/2)+INT(A2*CHOOSE(MOD(CODE(C1),12),7,4,6,,,7,,,5,,9)/2)+INT(A2*CHOOSE(MOD(CODE(SUBSTITUTE(D1,"Ra","E")),11),4,3,6,,2,7,,,2,0)/2)

Ввод введен в первую строку, SPACEдля нулей. Результат отображается в A3.


2

СКАЛА, 1106 символов, 1106 байтов

Это довольно долго, наверное, оптимизируемо, но это было весело делать :)

Формат ввода : разделенные пробелами руны в строке. Если есть только 2 входа (например, «Lo Ful»), мой код завершает его while(k.length<4)k:+=""(поэтому я могу сохранить 24 байта , изменив параметры, если мне потребуется, чтобы он был «ABC D»).

def n(i:Int,p:String):Int={Math.floor(i*((""+p(0)).toInt+1)/2).toInt}
def m(s:String):Int={var k=s.split(' ')

while(k.length<4)k:+=""

k match{case Array(p,i,f,a)=>{p match{case "Lo"=>1+m(1+"/ "+i+" "+f+" "+a)
case "Um"=>2+m(2+"/ "+i+" "+f+" "+a)
case "On"=>3+m(3+"/ "+i+" "+f+" "+a)
case "Ee"=>4+m(4+"/ "+i+" "+f+" "+a)
case "Pal"=>5+m(5+"/ "+i+" "+f+" "+a)
case "Mon"=>6+m(6+"/ "+i+" "+f+" "+a)
case _ if p.contains("/")=>i match{case "Ya"=>n(2,p)+m(p+" / "+f+" "+a)
case "Vi"=>n(3,p)+m(p+" / "+f+" "+a)
case "Oh"=>n(4,p)+m(p+" / "+f+" "+a)
case "Ful"=>n(5,p)+m(p+" / "+f+" "+a)
case "Des"=>n(6,p)+m(p+" / "+f+" "+a)
case "Zo"=>n(7,p)+m(p+" / "+f+" "+a)
case _ if p.contains("/")=>f match{case "Ven"=>n(4,p)+m(p+" / "+"/ "+a)
case "Ew"=>n(5,p)+m(p+" / "+"/ "+a)
case "Kath"=>n(6,p)+m(p+" / "+"/ "+a)
case "Ir"=>n(7,p)+m(p+" / "+"/ "+a)
case "Bro"=>n(7,p)+m(p+" / "+"/ "+a)
case "Gor"=>n(9,p)+m(p+" / "+"/ "+a)
case _ if p.contains("/")=>a match{case "Ku"=>n(2,p)
case "Ros"=>n(2,p)
case "Dain"=>n(3,p)
case "Neta"=>n(4,p)
case "Ra"=>n(6,p)
case "Sar"=>n(7,p)
case _=>0}
case _=>0}
case _=>0}
case _=>0}}}}

Спасибо за этот великолепный вызов. Попробуйте онлайн!


@Arnauld Я только что заметил кое-что о моем коде: он действительно не проверяет, существует ли вещь! Я имею в виду, что если я введу «Lo Whoo Gor», то получится 5! Это нормально? Или я должен это исправить?
В. Куртуа

Это нормально, потому что «руны гарантированно действительны» (2-е правило).
Arnauld

О, правда :) Я сделал это, не задумываясь, поэтому я забыл это правило. Еще раз спасибо.
В. Куртуа

2

Язык программирования Шекспира , 4420 байт

,.Ajax,.Ford,.Page,.Puck,.Romeo,.Act I:.Scene I:.[Enter Romeo and Page]Page:You big big big big big big cat.[Exit Romeo][Enter Ajax]Page:Open thy mind!Ajax:Open thy mind!Open thy mind!You is the sum of Romeo and the sum of a big big cat and a cat.Am I as big as you?If not,let us return to Scene V.Page:You is the sum of a big big cat and a cat.Let us return to Act V.Scene V:.Ajax:You is the sum of you and the sum of a big big big cat and a pig.Am I as big as you?If not,let us return to Scene X.Page:You big cat.Let us return to Act V.Scene X:.Ajax:You is the sum of you and the sum of a big cat and a cat.Am I as big as you?If not,let us return to Scene L.Page:You big big cat.Let us return to Act V.Scene L:.Ajax:You is the sum of you and the sum of a big big cat and a big cat.Am I as big as you?If not,let us return to Scene C.Page:You is the sum of a big cat and a cat.Let us return to Act V.Scene C:.Ajax:Am I as big as the sum of you and a big big big pig?Page:You is the sum of a big big cat and a big cat.If so,you is the sum of you and a cat.Ajax:Open thy mind!Act V:.Scene I:.[Exit Ajax][Enter Ford]Page:Open thy mind!Ford:Open thy mind!Open thy mind!You is the sum of Romeo and the sum of a big big big big cat and a pig.Am I as big as you?If not,let us return to Scene V.Page:You big big cat.Let us return to Act X.Scene V:.Ford:You is the sum of you and the sum of a big big big cat and a pig.Am I as big as you?If not,let us return to Scene X.Page:You is the sum of a big cat and a cat.Let us return to Act X.Scene X:.Ford:You is the sum of you and a big big cat.Am I as big as you?If not,let us return to Scene L.Page:You is the sum of a big big big cat and a pig.Let us return to Act X.Scene L:.Ford:Am I as big as the sum of you and a pig?If not,let us return to Scene C.Page:You big cat.Let us return to Act X.Scene C:.Ford:Am I as big as the sum of Romeo and a big big cat?Page:You is the sum of a big big cat and a cat.If so,you is the sum of you and a cat.Ford:Open thy mind!Act X:.Scene I:.[Exit Page][Enter Puck]Ford:You is the sum of the sum of Ajax and a pig and the quotient between the product of Ajax and I and a big cat.Puck:Open thy mind!Is you as big as a pig?If so,let us return to Act D.[Exit Puck][Enter Page]Ford:Open thy mind!Open thy mind!You is the sum of Romeo and the sum of a big big cat and a cat.Am I as big as you?If not,let us return to Scene V.Page:You is the sum of a big big cat and a cat.Let us return to Act L.Scene V:.Ford:Am I as big as the sum of you and a big big cat?If not,let us return to Scene X.Page:You is the sum of a big big big cat and a pig.Let us return to Act L.Scene X:.Ford:Open thy mind!Am I as big as the sum of Romeo and a big cat?If not,let us return to Scene L.Page:You is the sum of a big big big cat and a pig.Let us return to Act L.Scene L:.Ford:You is the sum of Romeo and the sum of a big big big cat and a pig.Am I as big as you?If not,let us return to Scene C.Page:You is the sum of a big big big cat and a cat.Let us return to Act L.Scene C:.Ford:Am I as big as the sum of you and a big big cat?If so,let us return to Scene D.Page:You big big cat.Let us return to Act L.Scene D:.Page:Open thy mind!You is the sum of a big big cat and a big cat.Act L:.Scene I:.[Exit Page][Enter Puck]Ford:You is the sum of you and the quotient between the product of Ajax and I and a big cat.Puck:Open thy mind!Is you as big as a pig?If so,let us return to Act D.[Exit Puck][Enter Page]Ford:You is the sum of Romeo and a big big cat.Am I as big as you?If not,let us return to Scene V.Page:You is the sum of a big cat and a cat.Let us return to Act C.Scene V:.Ford:You is the sum of you and the sum of a big big big cat and a pig.Am I as big as you?If not,let us return to Scene X.Page:You big cat.Let us return to Act C.Scene X:.Ford:Am I as big as the sum of you and the sum of a big cat and a cat?If not,let us return to Scene L.Page:You big big cat.Let us return to Act C.Scene L:.Ford:Am I as big as the sum of you and a big big big cat?If not,let us return to Scene C.Page:You is the sum of a big big big cat and a pig.Let us return to Act C.Scene C:.Page:Open thy mind!Is you as big as the sum of Romeo and a cat?You big cat.If so,you is the sum of you and a big big cat.Act C:.Scene I:.[Exit Page][Enter Puck]Ford:You is the sum of you and the quotient between the product of Ajax and I and a big cat.Act D:.Scene I:.Ford:Open thy heart![Exeunt]

Принимает ввод в виде строки в верхнем регистре.

Объяснение в ближайшее время ... На данный момент забавный факт: Microsoft является отрицательным существительным в SPL. Все другие принятые слова появились в произведениях Шекспира.

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


1

Java (OpenJDK 8) , 252 байта

r->{int c[][]={{2,3,4,5,6,7},{4,5,6,7,7,9},{2,2,3,4,6,7}},l=r.length,p="LUOEPM".indexOf(r[0].charAt(0))+1,a=p,i=0;String[]s={"YVOFDZ","VEKIBG","KRDNXS"};for(;i<l-1;)a+=(p+1)*c[i][s[i++].indexOf((l>3?r[i].replace("Ra","X"):r[i]).charAt(0))]/2;return a;}

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

Руны вводятся как String[](массив String) в форме первого регистра (первая буква заглавная, остальные строчные).

Это стандартный метод «найти n-ю букву», с завихрением, которое существует Rosи Raсуществует в 4-м сегменте. Я обработал это с помощью встроенной и явной замены Raна X.


1

Сетчатка , 124 123 байта

Gor
9
[ZIBS]\w+
7
Mon|Des|Kath|Ra
6
..l|Ew
5
Ee|Oh|Ven|Neta
4
[OVD]\w+
3
[UYKR]\w+
2
Lo
1
\d
$*
(?<=^(1+) .*1)
$1
\G1
11
11

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Принимает разделенные пробелом руны. Пояснение: На начальных этапах каждая руна просто конвертируется в цифру, которая затем конвертируется в унарную. Числа после первого умножаются на единицу больше, чем первое число, после чего первое число удваивается. На последнем этапе целое число делит весь результат на 2 и принимает сумму.


1

С 274

#define c(p,r,x)(p+1)*b(r[x+1],x*17)/2
i;char*a="& ; $ # 4 %        ; B * 6 $ 8          6 5 - >3  +  A@( .   6 5    ";b(r,s)char*r;{for(i=0;i<17;i++)if(a[i+s]-3==(r[0]^r[1]))return i/2+1;return 0;}main(n,r)char**r;{n=b(r[1],0);printf("%d\n",n+c(n,r,1)+c(n,r,2)+c(n,r,3));}

Больше не одурачено:

#include<stdio.h>
char*a="& ; $ # 4 %      "
       "  ; B * 6 $ 8    "
       "      6 5 - >3  +"
       "  A@( .   6 5    ";
int b(char*r,int s){
  for(int i=0;i<17;i++)
    if(a[i+s]-3==(r[0]^r[1]))
      return i/2+1;
  return 0;
}
#define c(p,r,i)(p+1)*b(r[i+1],i*17)/2
int main(int n,char**r){
  int x=b(r[1],0);
  printf("%d\n",x+c(x,r,1)+c(x,r,2)+c(x,r,3));
}

Вам необходимо указать четыре аргумента командной строки - поэтому для первого теста вам нужно запустить ./a.out Lo Ful "" ""



1

Go, 205 байт

func c(s []string)int{f,l:=strings.IndexByte,len(s)
p:=f("UOEPM",s[0][0])+3
r:=p-1+p*(f("VOFDZ",s[1][0])+3)/2
if l>2{r+=p*(f("war o",s[2][1])+5)/2}
if l>3{r+=p*(f("it Ra",s[3][len(s[3])-2])+3)/2}
return r}

Это вызываемая функция, которая принимает руны как кусочек строки, например []string{"Um", "Ful"} .

Попробуйте это на игровой площадке Go .


0

Haskell, 623 байта

Использование ADT вместо числового вуду.

ПРИМЕЧАНИЕ: добавить 36 для {-# LANGUAGE GADTs,ViewPatterns #-}

  • Оценка рассчитывается при условии, что она составлена ​​/ выполнена с -XGADTs -XViewPatterns
data P=Lo|Um|On|Ee|Pal|Mon deriving(Enum,Read,Eq)
data E=Ya|Vi|Oh|Ful|Des|Zo deriving(Enum,Read,Eq)
data F=Ven|Ew|Kath|Ir|Bro|Gor deriving(Enum,Read,Eq)
data C=Ku|Ros|Dain|Neta|Ra|Sar deriving(Enum,Read,Eq)
data S where
  S::P->E->S
  Q::P->E->F->S
  R::P->E->F->C->S
k(a:b:x)=let{p=read a;e=read b}in case x of{[]->S p e;[c]->Q p e(read c);[c,d]->R p e(read c)(read d)}
c,d::Enum a=>a->Int
c=succ.fromEnum
d=(+2).fromEnum
e Bro=7
e x=(+2).d$x
f x|c x`elem`[1,5,6]=d x|2>1=c x
g p f x =(`div`2).(*f x).succ$c p
h(S x y)=c x+g x d y
h(Q x y z)=h(S x y)+g x e z
h(R x y z t)=h(Q x y z)+g x f t
main=print.h.k.words=<<getLine

Ввод: одно заклинание как обычная строка, например

Lo Ful

Um Ful

Multilining можно сделать, заменив последнюю строку

main=interact$unlines.map(show.h.k.words).lines

Но это добавит байтов к счету

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