Hitung Geometri Suci saya [ditutup]

10

Di RPG meja bernama Pathfinder, ada fitur yang dapat diambil karakter yang disebut Sacred Geometry , yang memungkinkan karakter yang memilikinya untuk mengimbangi mantera mereka dengan imbalan melakukan beberapa matematika: untuk menggunakannya, karakter menggulirkan sejumlah enam sisi dadu sama dengan peringkat mereka dalam keterampilan tertentu, berkonsultasi dengan tabel berdasarkan tingkat mantera mereka untuk menentukan tiga bilangan prima yang merupakan "Perdana Konstanta" untuk tingkat mantera itu, lalu menghitung apakah mungkin untuk menghasilkan salah satu dari Konstanta Utama dengan melakukan beberapa kombinasi penjumlahan, pengurangan, perkalian, dan pembagian serta tanda kurung pada semua angka yang digulung.

Tabel Perdana Konstanta berdasarkan Tingkat Ejaan adalah sebagai berikut:

+-------------+-----------------+
| Spell Level | Prime Constants |
+-------------+-----------------+
| 1st         | 3, 5, 7         |
| 2nd         | 11, 13, 17      |
| 3rd         | 19, 23, 29      |
| 4th         | 31, 37, 41      |
| 5th         | 43, 47, 53      |
| 6th         | 59, 61, 67      |
| 7th         | 71, 73, 79      |
| 8th         | 83, 89, 97      |
| 9th         | 101, 103, 107   |
+-------------+-----------------+

Jadi, misalnya, jika karakter memiliki 5 peringkat keterampilan dan mereka sedang merapal mantra tingkat ke-4, mereka akan melempar lima dadu enam sisi dan harus dapat menghitung nilai 31, 37, atau 41. Jika mereka menggulung 6, 6, 4, 3 dan 1, maka mereka dapat menghasilkan nilai 37 dengan melakukan perhitungan berikut: (6 × 6) + (4 - 3) × 1 = 37, atau mereka dapat menghasilkan nilai 41 dengan melakukan ([6 + 6] × 3) + 4 + 1 = 41. Akibatnya, casting mantra mereka akan berhasil.

Untuk puzzle pemrograman ini, tugas Anda adalah menulis fungsi dengan dua parameter input, Level Ejaan dan Skill Ranks, melempar sejumlah dadu enam sisi sama dengan parameter Skill Ranks, lalu menghitung jika Anda dapat menghasilkan (setidaknya) salah satu dari Konstanta Perdana terkait dengan parameter Level Eja, lalu menampilkan nilai Boolean.

Jawaban akan diberi peringkat terutama oleh efisiensi algoritma mereka (saya cukup yakin bahwa algoritma brute force akan berskala sangat cepat ketika parameter Skill Ranks meningkat), dan kemudian dengan ukuran kode sumber yang dikirimkan dalam byte.

nick012000
sumber
Saya tidak berpikir Pathfinder membutuhkan karakter untuk melempar dadu, melainkan pemainnya , bukan?
mbomb007
3
Juga, bagaimana Anda bermaksud memberi peringkat efisiensi pada algoritma yang digunakan seseorang?
mbomb007
Karena penasaran, mengapa program ini bergulir untuk Anda? Bukankah lebih bermanfaat jika Anda memberikan hasil roll daripada peringkat skill (belum lagi lebih mudah untuk diuji) ...?
Triggernometri
1
@ mbomb007 Selalu ada xkcd yang relevan.
Khuldraeseth na'Barya
3
Secara default, keacakan tidak harus adil, tetapi harus mencakup semua kemungkinan. Namun, dalam hal ini, langkah-langkah tambahan di antara tidak dapat diobservasi, jadi pada dasarnya pengiriman hanya harus secara acak menghasilkan benar atau salah. Akan lebih baik jika jawaban mengambil nilai dadu sebagai input sebagai gantinya
Jo King

Jawaban:

1

Python 2.7, 285 byte

from itertools import*
from random import*
def f(s,r):
 p=[];n=1;k=1;P=1;d=choices('123456',k=r);D=permutations(d,r);O=product('+-*/',repeat=r-1)
 while-~s*3>n:p+=P%k*[k];n,k,P=n+P%k,k+1,P*k*k
 return any(n in{eval('int(%s)'%'%s'.join(i)%o)for i in D for o in O}for n in p[-4:-1])

Secara teknis sesuai dengan spesifikasi tantangan. Hanya mengembalikan Benar / Salah, tidak mengekspos gulungan dadu yang digunakan atau ungkapan yang digunakan untuk pemanggil.

Algoritma ini juga mengabaikan pengelompokan, karena kita dapat melakukan operasi yang sama tanpa pengelompokan dengan menggunakan pemesanan. (Ini tidak akan benar jika eksponensial adalah salah satu dari operasi yang mungkin, misalnya.)

Runtime eksponensial, karena menghasilkan semua kemungkinan dan kemudian memeriksa jika setidaknya ada satu solusi.

Triggernometri
sumber