Decode Factor Trees

11

Jika Anda melewatkan Encode Factor Tree, berikut adalah definisi Pohon Faktor:

  • String kosong adalah 1.
  • Rangkaian mewakili penggandaan.
  • Angka n yang dilampirkan dalam tanda kurung (atau karakter berpasangan apa pun) mewakili bilangan prima ke- n , dengan 2 sebagai bilangan prima pertama.
    • Perhatikan bahwa ini dilakukan secara rekursif: the n prima th adalah pohon faktor untuk n dalam tanda kurung.
  • Faktor-faktor nomor harus dipesan dari yang terkecil hingga yang terbesar.

Sebagai contoh, berikut adalah pohon faktor untuk 2 hingga 10:

()
(())
()()
((()))
()(())
(()())
()()()
(())(())
()((()))

Tantangan ini menggunakan format yang serupa; Namun, tantangan ini adalah untuk memecahkan kode struktur ini.

Uji Kasus

Tanpa malu-malu dicuri, digunakan kembali dari tantangan terakhir.

Selain 9 di atas ...

()()((()))((())) => 100
(()(()(()))) => 101
(()())(((())))(()(())) => 1001
(((((((()))))))) => 5381
(()())((((()))))(()()(())(())) => 32767
()()()()()()()()()()()()()()() => 32768

Aturan

  • Karakter yang dipasangkan di input adalah pilihan Anda tanda kurung, kurung, kurung kurawal, atau kurung sudut. Saya dapat mengizinkan format lain (misalnya tag XML) jika diminta.
  • Anda harus dapat menangani Factor Trees untuk nomor dari 2 hingga 2 15 atau 32768.
  • Karena ini adalah , jawaban tersingkat dalam byte menang.
Nissa
sumber

Jawaban:

9

Bahasa Wolfram (Mathematica) , 52 45 byte

ToExpression@*StringReplace[{"["->"Prime[1"}]

Cobalah online!

Input menggunakan tanda kurung.

Mengubah input menjadi ekspresi Mathematica yang menghitung hasilnya. Kami melakukan ini hanya dengan mengganti [dengan Prime[1. Ini bekerja karena penggabungan adalah perkalian dalam Mathematica.

Martin Ender
sumber
8

Prolog (SWI) , 134 128 127 124 byte

Jawaban ini adalah bagian dari kolaborasi antara saya dan 0 '. Kami berdua mengerjakan ini bersama, satu-satunya alasan saya mempostingnya adalah karena saya memenangkan Rock, Paper, Scissors.

\Q-->{Q=1};"(",\N,")",\B,{findnsols(N,I,(between(2,inf,I),\+ (between(3,I,U),0=:=I mod(U-1))),L)->append(_,[Y],L),Q is Y*B}.

Cobalah online!

Penjelasan

Jawaban ini adalah contoh sempurna dari apa yang membuat bermain golf di prolog menyenangkan.


Jawaban ini menggunakan sistem kuat Prolog untuk tata bahasa klausa yang pasti. Ini adalah tata bahasa kita yang tidak diserang sedikit.

head(1)-->[].
head(Q)-->"(",head(N),")",head(B),{prime(N,Y),Q is Y*B}.
isprime(I):- \+ (between(3,I,U),0 =:= I mod(U-1)).
prime(N,Y):-
  findnsols(N,I,(
    between(2,inf,I),
    isprime(I)
  ),L),
  append(_,[Y],L),!.

Aturan konstruksi pertama adalah:

head(1)-->[].

Ini memberi tahu Prolog bahwa string kosong berhubungan dengan 1.

Aturan konstruksi kedua kami sedikit lebih kompleks.

head(Q)-->"(",head(N),")",head(B),{prime(N,Y),Q is Y*B}.

Ini memberitahu kita bahwa string yang tidak kosong berisi tanda kurung di sekitar klausa dengan aturan yang sama, di sebelah kanan klausa dengan aturan yang sama.

Ini juga memberi tahu kita bahwa nilai klausa ini ( Q) mengikuti aturan:

{prime(N,Y),Q is Y*B}

Breaking down ini, Qadalah produk dari 2 angka Ydan B. Bhanya nilai dari klausa ke kiri dan Ymerupakan Nperdana ke manaN nilai klausa di dalam tanda kurung.

Aturan ini mencakup kedua aturan pembentukan pohon faktor

  • Penggabungan digandakan
  • Enclosure mengambil nth prime

Sekarang untuk definisi predikat. Dalam versi yang tidak diserang ada dua predikat yang bermain (dalam kode saya yang sebenarnya saya sudah maju merantai predikat itu). Dua predikat yang relevan di sini adalah isprime/1, yang cocok dengan bilangan prima, dan prime/2, yang, diberikan Ndan Y, cocok dengan iff Yadalah Nbilangan prima. Pertama yang kita miliki

isprime(I):- \+ (between(3,I,U),0 =:= I mod(U-1)).

Ini berfungsi dari definisi standar yang cukup primoral, kami bersikeras bahwa tidak ada angka antara 2 dan I, termasuk 2 tetapi tidak Imembagi I.

Predikat berikutnya juga cukup sederhana

prime(N,Y):-
  findnsols(N,I,(
    between(2,inf,I),
    isprime(I)
  ),L),
  append(_,[Y],L),!.

Kami menggunakan findnsolsuntuk menemukan Nangka pertama yang prima, kami kemudian mengembalikan yang terakhir. Kuncinya di sini adalah bahwa sementara findnsolstidak dijamin untuk menemukan bilangan prima terkecil N , karena cara SWI menangani betweenitu akan selalu menemukan bilangan prima yang lebih kecil lebih cepat. Namun ini berarti kita harus memotong untuk mencegahnya menemukan lebih banyak bilangan prima.


Golf

Kami dapat meneruskan alasan dalam kode kami dua kali. Karena isprimehanya digunakan setelah definisi dapat dipindahkan ke dalamnya prime. Yang berikutnya adalah untuk pindah primelangsung ke dalam DCG, namun karena kami menggunakan cut-in primeuntuk mencegah findnsolsdari menghasilkan terlalu banyak bilangan prima, kami memiliki sedikit masalah. Pemotongan, memotong seluruh DCG alih-alih hanya sedikit yang kita inginkan. Setelah sedikit penggalian dokumentasi kami menemukan bahwa once/1dapat digunakan untuk memotong hanya bagian ini tetapi tidak seluruh DCG. Namun penggalian dokumentasi lebih lanjut mengungkapkan bahwa ->operator juga dapat digunakan untuk melakukan tugas serupa. The ->Operator kira-kira setara dengan ,!,jadi kami pindah cut kami ke sisi lain dari append/3dan menggantinya dengan ->.

Dalam SWI-Prolog predikat (dan aturan) dapat memberikan operator sebagai nama yang memungkinkan kita untuk melepaskan tanda kurung yang biasanya diperlukan. Dengan demikian kita dapat menyimpan 6 byte dengan memanggil aturan \.

Ad Hoc Garf Hunter
sumber
2

Python 3 , 125 110 byte

lambda s:eval(s.replace("]","1]*").replace("[","p[1*")+"1")
p=2,
k=P=1
while k<1e4:
 if P%k:p+=k,
 P*=k*k;k+=1

Cobalah online!

Menggunakan implementasi xnor dari metode Teorema Wilson untuk menghasilkan bilangan prima. Pengganti ()dengan [].

notjagan
sumber
1

JavaScript (ES6), 98 byte

Terinspirasi oleh jawaban Python notjagan . Mengubah ekspresi input menjadi string yang dapat dieksekusi besar dan jelek.

s=>eval(s.split`)(`.join`)*(`.split`(`.join`(g=(n,k)=>(C=d=>n%--d?C(d):k-=d<2)(++n)?g(n,k):n)(1,`)

Menggabungkan Cdan gfungsinya menjadi satu dapat menghemat beberapa byte, tetapi akan membutuhkan lebih banyak rekursi.

Uji kasus

Arnauld
sumber