Dungeon Master war eines der ersten Echtzeit-Rollenspiele, das 1987 auf dem Atari ST veröffentlicht wurde. Unter anderem bot es für die damalige Zeit ein ziemlich ausgeklügeltes Zaubersystem, das auf Runen basierte.
Ihre Aufgabe heute ist es, ein Programm oder eine Funktion zu schreiben, die die Anzahl der Manapunkte auswertet, die zum Wirken eines bestimmten Zaubers in Dungeon Master erforderlich sind.
Das "Zauber" -System ist das Cyan-Feld oben rechts im obigen Bild.
Zaubersprüche, Runen und Mana
Dungeon Master-Zaubersprüche bestehen aus 2 bis 4 Runen, die genau in dieser Reihenfolge aus den folgenden Kategorien ausgewählt werden:
- Leistung (Pflichtfeld)
- Elementarer Einfluss (obligatorisch)
- Formular (optional)
- Klasse / Ausrichtung (optional)
Dies bedeutet, dass gültige Zaubersprüche entweder:
- Macht + Elementarer Einfluss
- Kraft + Elementarer Einfluss + Form
- Kraft + Elementarer Einfluss + Form + Klasse / Ausrichtung
Jede Kategorie enthält 6 Runen und jeder Rune sind Manakosten zugeordnet:
=============================================================================
| 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 |
=============================================================================
Bewertung der Manakosten
Die Manakosten des Zaubers sind die Summe der Manakosten aller Runen:
Die Kosten der Power-Rune entsprechen immer den Grundkosten (von 1 bis 6).
Für die anderen Runen gilt folgende Formel:
Wobei Macht die Grundkosten der Macht-Rune sind.
Beispiele
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
Erläuterungen und Regeln
- Ihre Eingabe besteht aus 2 bis 4 Zeichenfolgen, die die Runen des Zaubers bezeichnen. Sie können sie in jedem vernünftigen Format verwenden, z. B. 4 verschiedene Parameter, ein Array von Zeichenfolgen (z. B.
['Lo', 'Ful']
) oder nur eine Zeichenfolge mit einem Trennzeichen Ihrer Wahl (z'Lo Ful'
. B. ). Bitte geben Sie in Ihrer Antwort das ausgewählte Eingabeformat an. - Die Runen sind garantiert gültig.
- Die Reihenfolge der Kategorien muss eingehalten werden. Nicht verwendete Kategorien fehlen möglicherweise oder werden durch einen falschen Wert ersetzt.
- Sie können die Runen in einem der folgenden Formate akzeptieren: 1. Ein Großbuchstabe, gefolgt von Kleinbuchstaben (
'Ful'
) 2. Alle Kleinbuchstaben ('ful'
) 3. Alle Großbuchstaben ('FUL'
). Sie können jedoch keine verschiedenen Formate mischen. - Offensichtlich ist es uns egal, ob der Zauber tatsächlich einen Effekt im Spiel hat (für die neugierigen, nützlichen Zaubersprüche sind hier aufgelistet ).
- Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
- Und denk dran: Lord Chaos beobachtet dich!
Testfälle
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
quelle
Antworten:
SOGL V0.12 ,
11078 BytesProbieren Sie es hier aus!
Könnte wahrscheinlich ein oder zwei Bytes Golf spielen, wenn man alles noch einmal macht
Erläuterung:
quelle
Python 2 ,
135119115 BytesProbieren Sie es online!
Die Eingabe ist eine Liste von Zeichenfolgen aus stdin
quelle
05AB1E ,
8382 BytesProbieren Sie es online!
-1 danke an Emigna .
SOOOOOOO ungolfed :(
Erläuterung:
quelle
.•Y<εΔ•
nicht erhöhen müssen, wenn Sie zu Beginn in indexieren.JavaScript (ES6),
1571561161121009997 ByteNimmt Eingaben als ein Array von Zeichenfolgen.
Probieren Sie es online!
Erläuterung
Hoo, Junge, das wird Spaß machen - meine Erklärungen zu trivialen Lösungen sind zum Kotzen! Lass es uns versuchen ...
Eine anonyme Funktion, die das Array als Argument über einen Parameter verwendet
a
.Reduzieren Sie die Elemente im Array, indem Sie sie durch eine Funktion führen. Der
t
Parameter ist die laufende Summe, derc
Parameter ist die aktuelle Zeichenfolge und0
der Anfangswert vont
.Konvertiert das aktuelle Element von einer Basiszeichenfolge 36 in eine Dezimalzahl.
Führen Sie einige Modulo-Operationen aus.
Nehmen Sie das Zeichen aus der Zeichenfolge an diesem Index und konvertieren Sie es in eine Zahl.
Weisen Sie diese Nummer der Variablen zu
v
.Überprüfen Sie, ob die Variable
a
eine Zahl ist. Für das erste Elementa
wird das Array von Zeichenfolgen sein, und der Versuch, diese in eine Zahl umzuwandeln, wird zurückgegebenNaN
, was falsch ist. Bei jedem folgenden Durchganga
wird eine positive ganze Zahl angegeben, was wahr ist.Wenn
a
es sich um eine Zahl handelt, multiplizieren wir sie mit dem Wert vonv
, addieren den Wert vonv
und verschieben die Bits des Ergebnisses um 1 Bit nach rechts. Dies ergibt dasselbe Ergebnis wie Division durch 2 und Flooring.Wenn
a
es sich nicht um eine Zahl handelt, weisen wir ihr den Wertv
zu, wodurch wir0
beim ersten Durchgang eine zusätzliche Zahl zu unserer Gesamtsumme hinzufügen können.Schließlich addieren wir das Ergebnis aus dem obigen Ternär zu unserer laufenden Summe.
Original, 156 Bytes
quelle
a=>a.reduce((t,c)=>t+(v=+'27169735020045670435262'[parseInt(c,36)%141%83%50%23],+a?a*v+v>>1:a=v),0)
(BEARBEITEN: Ein irrelevanter Kommentar zu den in der Eingabe übergebenen Ganzzahlen wurde entfernt. Ich habe meine eigene Herausforderung anscheinend nicht gut verstanden. ^^)JavaScript,
212210207206 BytesUnkomplizierter Suchalgorithmus, die Suchzeichenfolgen tragen nur zur Gesamtzahl der Bytes bei.
Code
Eingabeformat
String-Array, jedes Element ist ein String mit Großbuchstaben. Beispiel: ["Mo", "Zo", "Ir", "Neta"]
Erläuterung
Dies fragt nach den Grundkosten.
Initialisiert 2 Variablen mit dem ersten Element aus dem obigen Array-Ergebnis und entfernt dieses Element. Muss zuerst in Zahl umgewandelt werden, sonst wird es im nächsten Teil als Zeichenkettenverkettung betrachtet.
Addiert die Kosten der Nicht-Power-Runen zur Basis-Power. Shifting wird anstelle von Floor (blah) / 2 verwendet.
Bewerten Sie das letzte Ergebnis. (Gutschrift: Step Hen)
Testfälle
Edit 1: 212> 210 - Ein Paar Klammern entfernt
Edit 2: 210> 207 - Danke Step Hen für die Erinnerung an die JS-Regeln und einige Hinweise zur Verwendung der eval () -Funktion. Da AS3 die Verwendung von eval () verbietet, habe ich das schon lange nicht mehr benutzt
Edit 3: 207> 206 - Danke Shaggy für die Idee, indexOf () durch search () zu ersetzen.
quelle
g
innerhalb von anrufeng
, erlauben wir JS-Antworten, die zu entferneng=
. Sie können auch ein paar Bytes sparen, indem Sie es auf eval umschalten undreturn
: Fiddlesearch
Sparen Sie sich ein paar BytesindexOf
.Haskell ,
159156148133130127 BytesProbieren Sie es online!
quelle
Python 2 ,
320 318 314 311307 BytesEingabeformat - Liste der Zeichenfolgen. Volles Programm:
Probieren Sie es online!
quelle
Excel, 339 Bytes
Eingänge eingegeben
A1
durchD1
. Formel in einer anderen Zelle.Alternativ können Sie auch als CSV importieren:
Excel & CSV, 228 Bytes
Eingabe in der ersten Zeile
SPACE
für Nullen. Ergebnis wird in A3 angezeigt.quelle
SCALA, 1106 Zeichen, 1106 Byte
Das ist ziemlich lang, wahrscheinlich optimierbar, aber es hat Spaß gemacht :)
Eingabeformat : durch Leerzeichen getrennte Runen in einer Zeichenfolge. Wenn es nur 2 Eingaben gibt (wie "Lo Ful"), vervollständigt mein Code es mit
while(k.length<4)k:+=""
(so kann ich durch Ändern der Parameter 24 Bytes sparen , wenn ich es als "ABC D" fordere).while(k.length<4)k:+=""
Vielen Dank für diese großartige Herausforderung. Probieren Sie es online!
quelle
Shakespeare-Programmiersprache , 4420 Bytes
Nimmt die Eingabe als Großbuchstaben.
Erklärung folgt in Kürze ... Im Moment ist Fun fact:
Microsoft
ein negatives Substantiv in SPL. Alle anderen akzeptierten Wörter erschienen in den Werken von Shakespeare.Probieren Sie es online!
quelle
Java (OpenJDK 8) , 252 Byte
Probieren Sie es online!
Die Runen werden als a eingegeben
String[]
(Array vonString
) in der ersten Form (der erste Buchstabe ist ein Großbuchstabe, der Rest ist ein Kleinbuchstabe).Es ist die Standardmethode "Finde den n-ten Buchstaben", mit der Wendung, dass beide
Ros
undRa
im 4. Segment existieren. Ich behandeln , dass mit einer Inline - und explizitem Austausch vonRa
zuX
.quelle
Retina ,
124123 BytesProbieren Sie es online! Link enthält Testfälle. Nimmt durch Leerzeichen getrennte Runen. Erklärung: Die Anfangsphasen wandeln einfach jede Rune in eine Ziffer um, die dann in eine unäre Zahl umgewandelt wird. Die Zahlen nach der ersten werden mit eins mehr multipliziert als die erste Zahl, woraufhin die erste Zahl verdoppelt wird. Die Ganzzahl der letzten Stufe dividiert das gesamte Ergebnis durch 2 und berechnet die Summe.
quelle
C 274
Mehr ungolfed:
Sie müssen vier Befehlszeilenargumente angeben - für den ersten Testfall müssen Sie also ausführen
./a.out Lo Ful "" ""
quelle
Go, 205 Bytes
Es ist eine aufrufbare Funktion, die Runen als ein Stück Zeichenfolge annimmt, z
[]string{"Um", "Ful"}
.Probieren Sie es auf dem Go Playground aus .
quelle
Haskell, 623 Bytes
Verwenden von ADTs anstelle von numerischem Voodoo.
HINWEIS: Addieren Sie 36 für
{-# LANGUAGE GADTs,ViewPatterns #-}
-XGADTs -XViewPatterns
Eingabe: Ein einzelner Zauberspruch als normale Zeichenfolge, z
Lo Ful
Um Ful
Multilining kann durch Ersetzen der letzten Zeile durch erfolgen
Dies würde jedoch die Anzahl der Bytes erhöhen
quelle