Dungeon Master adalah salah satu game role-time pertama yang pernah dimainkan, awalnya dirilis pada tahun 1987 di Atari ST. Di antara hal-hal menarik lainnya untuk saat ini, ia menawarkan sistem mantra yang agak canggih berdasarkan rune.
Tugas Anda hari ini adalah menulis program atau fungsi yang mengevaluasi jumlah poin Mana yang diperlukan untuk melemparkan mantra yang diberikan dalam Dungeon Master.
Sistem 'spell cast' adalah kotak cyan kanan atas pada gambar di atas.
Mantra, rune, dan Mana
Mantra Master Penjara Bawah Tanah terdiri dari 2 hingga 4 rune, dipilih di antara kategori berikut, dalam urutan yang tepat ini:
- Kekuasaan (wajib)
- Elemental Influence (wajib)
- Formulir (opsional)
- Kelas / Alignment (opsional)
Itu berarti mantra yang valid adalah:
- Power + Elemental Pengaruh
- Kekuatan + Pengaruh Elemen + Bentuk
- Kekuatan + Pengaruh Elemental + Bentuk + Kelas / Alignment
Setiap kategori berisi 6 rune, dan setiap rune memiliki biaya Mana dasar terkait:
=============================================================================
| 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 |
=============================================================================
Mengevaluasi biaya Mana
Biaya Mana dari mantra adalah jumlah dari biaya Mana semua rune:
Biaya Rune daya selalu sama dengan biaya dasarnya (dari 1 hingga 6).
Untuk rune lainnya, rumus berikut ini berlaku:
di mana daya adalah biaya dasar Rune daya.
Contohnya
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
Klarifikasi dan aturan
- Input Anda akan terdiri dari 2 hingga 4 string yang menunjuk rune mantra. Anda dapat mengambilnya dalam format apa pun yang wajar, seperti 4 parameter berbeda, array string (mis.
['Lo', 'Ful']
), Atau hanya satu string dengan pemisah satu karakter pilihan Anda (mis'Lo Ful'
.). Silakan tentukan format input yang dipilih dalam jawaban Anda. - Tanda dijamin valid.
- Urutan kategori harus dihormati. Kategori yang tidak digunakan dapat hilang atau diganti dengan nilai falsy.
- Anda dapat menerima rune dalam format berikut: 1. Huruf kapital diikuti dengan huruf kecil (
'Ful'
) 2. Semua huruf kecil ('ful'
) 3. Semua huruf besar ('FUL'
). Tetapi Anda tidak dapat mencampur format yang berbeda. - Jelas sekali, kami tidak peduli untuk mengetahui apakah mantra itu benar-benar memiliki efek dalam permainan (untuk mantra yang ingin tahu dan berguna tercantum di sini .)
- Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
- Dan ingat: Lord Chaos memperhatikanmu!
Uji kasus
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
sumber
Jawaban:
SOGL V0.12 ,
11078 byteCoba Di Sini!
Mungkin bisa golf satu atau dua byte dari mengulang semuanya
Penjelasan:
sumber
Python 2 ,
135119115 byteCobalah online!
Input adalah daftar string dari stdin
sumber
05AB1E ,
8382 byteCobalah online!
-1 terima kasih kepada Emigna .
SOOOOOOO ungolfed :(
Penjelasan:
sumber
.•Y<εΔ•
di awal, Anda tidak perlu menambah indeks.JavaScript (ES6),
1571561161121009997 byteMengambil input sebagai array string.
Cobalah secara Online!
Penjelasan
Hoo, nak, ini akan menyenangkan - penjelasan saya untuk solusi sepele menyedot pada saat terbaik! Mari kita coba ...
Fungsi anonim mengambil array sebagai argumen melalui parameter
a
.Kurangi elemen dalam array dengan melewati masing-masing fungsi; yang
t
parameter adalah total berjalan,c
parameter adalah string saat ini dan0
merupakan nilai awalt
.Konversi elemen saat ini dari string base 36 ke integer desimal.
Lakukan beberapa operasi modulo di atasnya.
Ambil karakter dari string pada indeks itu dan ubah menjadi angka.
Tetapkan nomor itu ke variabel
v
.Periksa apakah variabel
a
adalah angka. Untuk elemen pertamaa
adalah array string, mencoba mengubahnya menjadi angka akan kembaliNaN
, yang merupakan falsey. Pada setiap operan berikutnya,a
akan menjadi bilangan bulat positif, yang benar.Jika
a
adalah angka maka kita kalikan dengan nilaiv
, tambahkan nilaiv
dan geser bit hasil 1 bit ke kanan, yang memberikan hasil yang sama seperti membaginya dengan 2 dan lantai.Jika
a
bukan angka, kita memberikan nilaiv
untuk itu, yang juga akan memberi kita a0
untuk menambah total kita pada pass pertama.Akhirnya, kami menambahkan hasil dari ternary di atas ke total berjalan kami.
Asli, 156 byte
sumber
a=>a.reduce((t,c)=>t+(v=+'27169735020045670435262'[parseInt(c,36)%141%83%50%23],+a?a*v+v>>1:a=v),0)
(EDIT: menghapus komentar yang tidak relevan tentang bilangan bulat yang diteruskan dalam input - sepertinya saya tidak memahami tantangan saya dengan sangat baik ^^)JavaScript,
212210207206 byteAlgoritma pencarian straight-forward, string pencarian hanya berkontribusi pada total byte.
Kode
Masukkan format
Array string, setiap item adalah string huruf kapital pertama. Contoh: ["Sen", "Zo", "Ir", "Neta"]
Penjelasan
Ini menanyakan biaya dasar.
Menginisialisasi 2 variabel dengan item pertama dari hasil array di atas, dan menghapus item itu. Harus dilemparkan ke nomor pertama, jika tidak maka akan dianggap sebagai penggabungan string di bagian selanjutnya.
Menambahkan biaya rune non-daya ke daya dasar. Pergeseran digunakan bukan lantai (bla) / 2.
Evaluasi hasil terakhir. (Kredit: Langkah Hen)
Uji Kasus
Sunting 1: 212> 210 - Menghapus sepasang kawat gigi
Sunting 2: 210> 207 - Terima kasih Langkah Hen untuk pengingat pada aturan JS dan beberapa petunjuk tentang penggunaan fungsi eval (). Karena AS3 melarang penggunaan eval () saya belum menggunakannya untuk waktu yang lama
Sunting 3: 207> 206 - Terima kasih Shaggy untuk gagasan mengganti indexOf () dengan pencarian ()
sumber
g
bagian dalamg
, kami mengizinkan jawaban JS untuk menghapusg=
. Selain itu, Anda dapat menyimpan beberapa byte dengan mengalihkannya ke eval dan menghapusreturn
: Fiddlesearch
akan menghemat lebih banyak byteindexOf
.Haskell ,
159156148133130127 byteCobalah online!
sumber
Python 2 ,
320 318 314 311307 byteFormat Input - Daftar String. Program lengkap:
Cobalah online!
sumber
Excel, 339 byte
Input dimasukkan
A1
melaluiD1
. Formula di sel lain mana pun.Atau, mengimpor sebagai CSV:
Excel & CSV, 228 byte
Input dimasukkan di baris pertama,
SPACE
untuk nol. Hasilnya ditampilkan dalam A3.sumber
SCALA, 1106 karakter, 1106 byte
Ini cukup lama, mungkin dapat dioptimalkan, tapi itu menyenangkan untuk dilakukan :)
Format input : rune yang dipisahkan ruang dalam sebuah string. Jika hanya ada 2 input (seperti "Lo Ful") kode saya melengkapinya
while(k.length<4)k:+=""
(jadi saya bisa menghemat 24 byte dengan mengubah parameter, jika saya memerlukannya menjadi "ABC D").while(k.length<4)k:+=""
Terima kasih atas tantangan luar biasa ini. Cobalah online!
sumber
Bahasa Pemrograman Shakespeare , 4420 byte
Mengambil input sebagai string huruf besar.
Penjelasan akan segera hadir ... Untuk saat ini, Fakta menyenangkan:
Microsoft
adalah kata benda negatif di SPL. Semua kata diterima lainnya muncul dalam karya Shakespeare.Cobalah online!
sumber
Java (OpenJDK 8) , 252 byte
Cobalah online!
Tanda adalah input sebagai
String[]
(array dariString
), dalam bentuk huruf pertama (huruf pertama adalah huruf besar, sisanya huruf kecil).Ini adalah "menemukan n-th huruf" metode standar, dengan twist yang baik
Ros
danRa
ada di segmen ke-4. Saya memperlakukannya dengan pengganti inline dan eksplisitRa
untukX
.sumber
Retina ,
124123 byteCobalah online! Tautan termasuk kasus uji. Membawa rune yang dipisahkan oleh ruang. Penjelasan: Tahap-tahap awal cukup mengkonversi setiap rune menjadi digit, yang kemudian dikonversi ke unary. Angka-angka setelah yang pertama dikalikan dengan satu lebih dari angka pertama, yang diikuti dengan angka pertama digandakan. Integer tahap akhir membagi semua hasil dengan 2 dan mengambil jumlah.
sumber
C, 274
Lebih ungolfed:
Anda perlu menyediakan empat argumen baris perintah - jadi untuk kasus uji pertama yang perlu Anda jalankan
./a.out Lo Ful "" ""
sumber
Pergi, 205 byte
Ini adalah fungsi yang bisa dipanggil, mengambil rune sebagai sepotong string, misalnya
[]string{"Um", "Ful"}
.Cobalah di Go Playground .
sumber
Haskell, 623 byte
Menggunakan ADT bukan voodoo numerik.
CATATAN: Tambahkan 36 untuk
{-# LANGUAGE GADTs,ViewPatterns #-}
-XGADTs -XViewPatterns
Input: mantra tunggal sebagai string normal, mis
Lo Ful
Um Ful
Multilining dapat dilakukan dengan mengganti baris terakhir dengan
Tapi ini akan menambah byte ke hitungan
sumber