Cây giải mã


11

Trong trường hợp bạn bỏ lỡ Cây yếu tố mã hóa , đây là định nghĩa của cây yếu tố:

  • Chuỗi rỗng là 1.
  • Ghép đại diện cho phép nhân.
  • Một số n được đặt trong ngoặc đơn (hoặc bất kỳ ký tự được ghép nối nào) đại diện cho số nguyên tố thứ n , với 2 là số nguyên tố đầu tiên.
    • Lưu ý rằng điều này được thực hiện đệ quy: số nguyên tố thứ n là cây nhân tố cho n trong ngoặc đơn.
  • Các yếu tố của một số nên được sắp xếp từ nhỏ nhất đến lớn nhất.

Ví dụ: đây là các cây nhân tố cho 2 đến 10:

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

Thử thách này sử dụng một định dạng tương tự; tuy nhiên, thách thức này là giải mã các cấu trúc này.

Các trường hợp thử nghiệm

Shamelessly bị đánh cắp thêm thắt từ thử thách cuối cùng.

Ngoài 9 điểm trên

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

Quy tắc

  • Các ký tự được ghép nối trong đầu vào là sự lựa chọn của bạn về dấu ngoặc đơn, dấu ngoặc, dấu ngoặc hoặc dấu ngoặc góc. Tôi có thể cho phép các định dạng khác (ví dụ: thẻ XML) nếu được hỏi.
  • Bạn sẽ có thể xử lý Cây nhân tố cho bất kỳ số nào từ 2 đến 2 15 hoặc 32768.
  • Vì đây là , câu trả lời ngắn nhất tính bằng byte sẽ thắng.

Câu trả lời:


9

Ngôn ngữ Wolfram (Mathicala) , 52 45 byte

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

Hãy thử trực tuyến!

Đầu vào sử dụng dấu ngoặc.

Chuyển đổi đầu vào thành một biểu thức Mathicala để tính kết quả. Chúng tôi làm điều này đơn giản bằng cách thay thế [bằng Prime[1. Điều này hoạt động bởi vì phép nối phép nhân trong Mathicala.


8

Prolog (SWI) , 134 128 127 124 byte

Câu trả lời này là một phần của sự hợp tác giữa tôi và 0 '. Cả hai chúng tôi cùng nhau làm việc này, lý do duy nhất tôi đăng nó là vì tôi đã giành được Rock, Paper, Kéo.

\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}.

Hãy thử trực tuyến!

Giải trình

Câu trả lời này là một ví dụ hoàn hảo về những gì làm cho việc chơi golf trở nên thú vị.


Câu trả lời này sử dụng hệ thống mạnh mẽ của Prologs cho các ngữ pháp mệnh đề xác định. Đây là ngữ pháp của chúng tôi vô dụng một chút.

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),!.

Quy tắc xây dựng đầu tiên là:

head(1)-->[].

Điều này nói với Prolog rằng chuỗi rỗng tương ứng với 1.

Quy tắc xây dựng thứ hai của chúng tôi là phức tạp hơn một chút.

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

Điều này cho chúng ta biết rằng bất kỳ chuỗi không rỗng nào đều chứa dấu ngoặc đơn xung quanh một mệnh đề có cùng các quy tắc này, ở bên phải của một mệnh đề có cùng các quy tắc này.

Nó cũng cho chúng ta biết rằng giá trị của mệnh đề này ( Q) tuân theo quy tắc:

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

Phá vỡ điều này, Qlà sản phẩm của 2 số YB. Bchỉ là giá trị của mệnh đề bên trái và Ylà số Nnguyên tố thứ trong đó Nlà giá trị của mệnh đề bên trong dấu ngoặc đơn.

Quy tắc này bao gồm cả hai quy tắc hình thành của cây nhân tố

  • Nhân lên gấp bội
  • Bao vây lấy số nguyên tố thứ n

Bây giờ cho các định nghĩa vị ngữ. Trong phiên bản không có người chơi, có hai vị từ đang chơi (trong mã thực tế của tôi, tôi đã chuyển tiếp các vị từ đi). Hai vị từ có liên quan ở đây là isprime/1, khớp với một số nguyên tố, và prime/2, được cho NYkhớp với iff Ylà số Nnguyên tố thứ. Đầu tiên chúng ta có

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

Công trình này có định nghĩa khá chuẩn về tính nguyên thủy, chúng tôi khẳng định rằng không có số giữa 2 và I, bao gồm 2 nhưng không Ichia I.

Vị ngữ tiếp theo cũng khá đơn giản.

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

Chúng tôi sử dụng findnsolsđể tìm các Nsố đầu tiên là số nguyên tố, sau đó chúng tôi trả về số cuối cùng. Mẹo ở đây là trong khi findnsolskhông được đảm bảo để tìm các số nguyên tố nhỏ nhất N , vì cách xử lý SWI, betweennó sẽ luôn tìm các số nguyên tố nhỏ hơn sớm hơn. Tuy nhiên, điều này có nghĩa là chúng ta phải cắt giảm để ngăn không cho nó tìm thêm số nguyên tố.


Sân gôn

Chúng tôi có thể chuyển tiếp lý do trong mã của chúng tôi hai lần. Vì isprimechỉ được sử dụng một khi định nghĩa của nó có thể được di chuyển bên trong prime. Việc tiếp theo là di chuyển primetrực tiếp vào bên trong DCG, tuy nhiên vì chúng tôi sử dụng một biện pháp cắt giảm primeđể ngăn chặn việc findnsolstạo ra quá nhiều số nguyên tố, chúng tôi có một chút vấn đề. Việc cắt, cắt toàn bộ DCG thay vì chỉ bit chúng ta muốn. Sau một chút đào tài liệu, chúng tôi thấy rằng once/1có thể được sử dụng để cắt chỉ phần này chứ không phải toàn bộ DCG. Tuy nhiên, việc đào thêm tài liệu tiết lộ rằng ->toán tử cũng có thể được sử dụng để thực hiện một nhiệm vụ tương tự. Các ->nhà điều hành là tương đương với ,!,vì vậy chúng tôi di chuyển cắt của chúng tôi sang phía bên kia của append/3và thay thế nó với ->.

Trong các vị từ SWI-Prolog (và quy tắc) có thể được đặt cho các toán tử dưới dạng tên cho phép chúng ta bỏ dấu ngoặc đơn thông thường. Qua đó chúng ta có thể lưu 6 byte bằng cách gọi quy tắc \.



1

JavaScript (ES6), 98 byte

Lấy cảm hứng từ câu trả lời Python của notjagan . Biến biểu thức đầu vào thành một chuỗi thực thi lớn và xấu.

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,`)

Hợp nhất các hàm Cvà các ghàm thành một có thể lưu một số byte, nhưng nó sẽ đòi hỏi nhiều đệ quy hơn nữa.

Các trường hợp thử nghiệm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.