Tìm đại diện ngắn nhất của một số trong Mô-đun SNUSP


10

Lý lịch

Nhiều ngôn ngữ lập trình bí truyền không có số được xây dựng bằng chữ, vì vậy bạn phải tính toán chúng khi chạy; và trong nhiều trường hợp này, việc biểu diễn số có thể khá thú vị. Chúng tôi đã có một thách thức về việc đại diện số cho Underload. Thử thách này là về việc đại diện cho các con số trong Modular SNUSP . (Lưu ý rằng bạn không cần phải học SNUSP để hoàn thành thử thách này - tất cả thông tin bạn cần đều có trong thông số kỹ thuật - nhưng bạn có thể thấy nền tảng thú vị.)

Nhiệm vụ

Vì mục đích của thử thách này, một số Modular SNUSP là một chuỗi hình thành từ các nhân vật @, +=, ngoại trừ các ký tự cuối cùng là một #, và rằng các nhân vật áp chót phải +hoặc =(nó không thể được @). Ví dụ, số hợp lệ bao gồm @+#, ==#@@+@=#; ví dụ về số không hợp lệ bao gồm +=, @@#+?+#.

Giá trị của số SNUSP mô-đun được tính toán đệ quy như sau:

  • # có giá trị bằng 0 (đây là trường hợp cơ sở).
  • Nếu số có dạng =x, đối với bất kỳ chuỗi nào x, giá trị của nó bằng giá trị của x.
  • Nếu số có dạng +x, đối với bất kỳ chuỗi nào x, giá trị của nó bằng giá trị của x, cộng với 1.
  • Nếu số có dạng @cx, đối với bất kỳ ký tự đơn cvà bất kỳ chuỗi nào x, giá trị của nó bằng giá trị của x, cộng với giá trị của cx.

Đối với thử thách này, bạn phải viết chương trình lấy số nguyên không âm làm đầu vào và xuất ra một chuỗi là số SNUSP mô-đun ngắn nhất có thể có giá trị bằng với đầu vào.

Làm rõ

  • Hoàn toàn có thể sẽ có nhiều hơn một chuỗi có cùng giá trị và đặc biệt, đối với một số số nguyên sẽ có một ràng buộc cho số SNUSP Mô-đun ngắn nhất với giá trị đó. Trong trường hợp như vậy, bạn có thể xuất ra bất kỳ số nào liên quan đến kết quả hòa.
  • Không có giới hạn về thuật toán bạn sử dụng để tìm số; ví dụ, các chuỗi buộc brute buộc và đánh giá chúng là một chiến thuật hợp pháp, nhưng vì vậy, đang làm một cái gì đó thông minh hơn để giảm không gian tìm kiếm.
  • Như thường lệ trên PPCG, bài nộp của bạn có thể là một chương trình đầy đủ hoặc một chức năng (chọn bất kỳ nội dung nào ngắn gọn hơn trong ngôn ngữ của bạn).
  • Đây không phải là vấn đề về việc xử lý các định dạng đầu vào và đầu ra, vì vậy bạn có thể sử dụng bất kỳ phương tiện hợp lý nào để nhập số nguyên không âm và xuất chuỗi. Có một hướng dẫn đầy đủ về meta , nhưng các phương thức pháp lý được sử dụng phổ biến nhất bao gồm các đối số / trả về hàm, đối số dòng lệnh và đầu vào tiêu chuẩn / đầu ra tiêu chuẩn.

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

Dưới đây là các đại diện ngắn nhất của một vài số đầu tiên:

  • 0 :#
  • 1 :+#
  • 2 :++#
  • 3 : +++#hoặc@++#
  • 4 : ++++#hoặc +@++#hoặc@=++#
  • 5 : @+++#hoặc@@++#
  • 6 : +@+++#hay +@@++#hay @=+++#hay @=@++#hay@@=++#
  • 7 : @++++#hoặc@+@++#
  • 8 : @@+++#hoặc@@@++#
  • 9 : +@@+++#hay +@@@++#hay @+++++#hay @++@++#hay @+@=++#hay @@=+++#hay@@=@++#
  • 10 : @=@+++#hoặc @=@@++#hoặc @@@=++#( đây là trường hợp kiểm tra khá quan trọng để kiểm tra , vì tất cả các câu trả lời có thể bao gồm =)
  • 11 : @+@+++#hay @+@@++#hay @@++++#hay@@+@++#
  • 12 : +@+@+++#hay +@+@@++#hay +@@++++#hay +@@+@++#hay @=+@+++#hay @=+@@++#hay @=@=+++#hay @=@=@++#hay @=@@=++#hay @@=++++#hay @@=+@++#hay@@=@=++#
  • 13 : @@@+++#hoặc@@@@++#
  • 14 : +@@@+++#hay +@@@@++#hay @=@++++#hay @=@+@++#hay @@+++++#hay @@++@++#hay@@+@=++#
  • 15 : @+@++++#hay @+@+@++#hay @@=@+++#hay @@=@@++#hay @@@=+++#hay@@@=@++#

Là một trường hợp thử nghiệm lớn hơn, sản lượng từ đầu vào 40 nên @@@=@@+++#, @@@=@@@++#, @@@@=@+++#, hoặc @@@@=@@++#.

Điều kiện chiến thắng

Là một thử thách , người chiến thắng là mục ngắn nhất, được đo bằng byte.


1
=Tối ưu sẽ chỉ xảy ra như @=, phải không?
orlp

3
Nhân tiện, những loại thử thách này thường được đăng tốt nhất dưới dạng metagolf , vì hầu như không có câu trả lời thú vị nào (chỉ đánh giá chuỗi và vòng lặp trên tất cả các chuỗi có thể).
orlp

3
@orlp: Tôi không đồng ý, thử thách này sẽ quá dễ dàng như một metagolf, vì việc tìm ra một câu trả lời tối ưu là tương đối dễ dàng và metagolf không đặt ra bất kỳ hạn chế nào khác đối với việc ghi điểm. Tôi hy vọng hầu hết các câu trả lời ở đây là lực lượng vũ phu, nhưng thông số kỹ thuật đủ phức tạp để lực lượng vũ phu a) có thể không ngắn nhất, và b) có thể sẽ thú vị đối với môn golf. Nếu bạn muốn có một sự thay đổi trong điều kiện chiến thắng, có lẽ điều thú vị duy nhất khác là mã nhanh nhất và điều đó có ý nghĩa hơn như một thử thách khác.

Chúng tôi cũng đã có một thử thách chơi gôn cho Brain-flak
ASCII - chỉ

Câu trả lời:


3

Oracle SQL 11.2, 341 262 byte

WITH e AS(SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),n(s,v,p,c,i)AS(SELECT'#',0,0,e,1 FROM e UNION ALL SELECT c||s,DECODE(c,'+',1,'@',p,0)+v,v,e,i+1 FROM n,e WHERE i<11)CYCLE s SET y TO 1 DEFAULT 0 SELECT s FROM n WHERE:1=v AND rownum=1;

Phiên bản cũ

WITH e AS(SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),n(s,v,p,c) AS(SELECT'#',0,0,e FROM e UNION ALL SELECT s||c,CASE c WHEN'+'THEN 1 WHEN'='THEN 0 WHEN'@'THEN p ELSE 0 END+v,v,e FROM n,e WHERE LENGTH(s)<10)CYCLE s SET y TO 1 DEFAULT 0 SELECT MIN(REVERSE(s))KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s))FROM n WHERE v=:1;

: 1 số đại diện trong SNUSP mô-đun

Chưa chơi gôn:

WITH e AS (SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),  
n(s,v,p,c,i) AS                   
(
  SELECT '#',0,0,e,1 FROM e
  UNION ALL
  SELECT s||c
       , DECODE(c,'+',1,'@',p,0)+v 
       , v
       , e
       , i+1
  FROM n,e
  WHERE i<11
) CYCLE s SET y TO 1 DEFAULT 0
SELECT s FROM n WHERE:1=v AND rownum=1;

Đầu tiên tạo chế độ xem với 3 dòng, một dòng cho mỗi ký hiệu được sử dụng để biểu thị các số, trừ # chỉ được sử dụng ở cuối chuỗi:

SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4;    

Sau đó, khung nhìn đệ quy n tạo ra mọi chuỗi có thể với 3 ký hiệu đó, nối chúng thành # và đánh giá chúng.

Các tham số là:

s: biểu diễn SNUSP mô-đun của số được đánh giá
v: giá trị thập phân của s được tính theo lần lặp trước
p: v được tính bởi lần lặp i-2
c: ký hiệu tiếp theo để ghép với s
i: độ dài của s, chỉ cần thiết để loại bỏ hai LENGTH () cho mục đích chơi gôn

DECODE(c,'+',1,'@',p,0)+v 

Nếu ký hiệu cuối cùng là + thì thêm 1
Nếu là @ thêm giá trị của lần lặp i-2
Khác, ký hiệu là # hoặc =. v được khởi tạo với 0 trong phần init của khung nhìn đệ quy, do đó v mới bằng với v trước đó trong cả hai trường hợp.

WHERE i<11

Mỗi chuỗi có thể có 3 ký hiệu được tính toán, phần này đảm bảo rằng yêu cầu không chạy cho đến khi khủng hoảng lớn.

CYCLE s SET y TO 1 DEFAULT 0

Vì không có quy tắc nào cho việc xây dựng các chuỗi, các bản sao bị ràng buộc phát sinh. Ở dạng xem đệ quy, Oracle diễn giải các bản sao đó thành các chu kỳ và đưa ra lỗi nếu trường hợp không được xử lý rõ ràng.

SELECT s FROM n WHERE:1=v AND rownum=1;

Trả về đại diện SNUSP mô-đun đầu tiên ước tính cho số thập phân được nhập dưới dạng tham số: 1

Trong các thử nghiệm của tôi, dòng đầu tiên luôn là một trong những đại diện ngắn nhất.

Trong trường hợp cơ sở dữ liệu của bạn sẽ không hoạt động theo cùng một cách, thì mệnh đề cuối cùng sẽ được thay thế bằng

SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY i)FROM n WHERE:1=v

2

JavaScript (ES6), 100 byte

n=>eval("for(a=[['#',0,0]];[[s,t,p],...a]=a,t-n;)a.push(['='+s,t,t],['+'+s,t+1,t],['@'+s,t+p,t]);s")

Thuật toán tìm kiếm đầu tiên đơn giản.


Đối với 40, nó trả về "@@@@@@ = ​​++ #" ước tính là 42
aditsu bỏ vì SE là EVIL

Ngay cả đối với 12, nó cho "@@@ +++ #", ước tính là 13
aditsu bỏ vì SE là EVIL

Hmm, tôi nghĩ việc thay đổi t<nđể t-ncó thể hoạt động ...
Neil

2

Bình thường, 41 byte

L?b+ytb@[yttb001)Chb0+hfqQyTs^L"+@="UhQ\#

Bộ kiểm tra

Làm thế nào nó hoạt động:

Có hai phần. Hàm đệ quy tính toán giá trị của biểu thức SNUSP mà không theo dõi #và một thói quen vũ phu.

Đánh giá:

L?b+ytb@[yttb001)Chb0
L                        Define the function y(b) as follows
 ?b                      If b is nonempty
   +ytb                  The sum of y(tail(b)) and   # tail(b) = b[1:]
   @[       )            The element in the list at location
   Chb                   Character values of the first character.
                         Modular indexing means that 
                         + -> 3
                         @ -> 0
                         = -> 1
                         Index 2 is filler.
    [yttb001)            @ adds y(tail(tail(b)). Tail suppresses the error when
                         called on an empty list, so this treats @# as zero, but
                         this can't lead to problems because removing the @ will
                         always make the expression shorter.
                         + adds 1, = adds 0.
 0                       If b is the empty string, return 0

Lực lượng vũ phu:

+hfqQyTs^L"+@="UhQ\#
               UhQ      0 ... Q     # Q is the input
        ^L"+@="         Map that list to all strings formed from the characters
                        "+@=", with that many characters.
       s                Concatenate
  fqQyT                 Filter for strings which evaluate to the input
 h                      Take the first success, which is the shortest due to
                        the order the strings were generated.
+                 \#    Add a '#' and output


1

Haskell , 89 86 byte

BIÊN TẬP:

  • -3 byte: nén là ngắn hơn so với lập chỉ mục.

Một giải pháp vũ phu khác kết thúc với rất nhiều cảm hứng từ câu trả lời của Neil. (Mặc dù nó hoạt động giống như Pyth của isaacg trước khi chơi golf giới thiệu l.)

f n=[s|(a,_,s)<-l,a==n]!!0
l=(0,0,"#"):[(a+c,a,d:s)|(a,b,s)<-l,(c,d)<-zip[0,1,b]"=+@"]

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

  • f là hàm chính, lấy một số nguyên và trả về một chuỗi.
  • llà một danh sách vô hạn các bộ dữ liệu (a,b,s), các biểu diễn ngắn nhất strước tiên, cùng với giá trị của chúng avà giá trị bcủa biểu diễn với ký tự đầu tiên bị tước. (như những người khác cũng đã lưu ý / chú ý, thật vô hại khi coi cái sau là 0 cho #.)
  • Các yếu tố lkhác với cái đầu tiên được tạo đệ quy với sự hiểu biết danh sách. dlà ký tự sẽ được chuẩn bị sđể tạo một đại diện mới trong danh sách và 'c' là gia số tương ứng a.
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.