Siêu âm


26

Giới thiệu

Bạn là một tên tội phạm có nhiệm vụ đánh cắp một số kế hoạch bí mật từ startup công nghệ mới Dejavu. Bạn lẻn vào bức tường phía sau, nhưng tìm một cánh cửa cần có chốt để mở nó. Bạn nhận ra cấu tạo của khóa và biết rằng cần một mã pin gồm 5 chữ số bằng cách sử dụng tất cả các số từ 0 đến 4. Sau mỗi chữ số được nhập, khóa sẽ kiểm tra 5 chữ số cuối cùng được nhập và mở nếu mã chính xác. Bạn phải vượt qua khóa này, và nhanh chóng.

Superpermutations trong một Nutshell

Một hoán vị là tất cả các kết hợp có thể có của một tập hợp các chữ số nhất định. ví dụ: tất cả các hoán vị của các chữ số 0, 1, 2 là:

012, 021, 102, 120, 201 và 210.

Nếu chúng ta ghép tất cả các hoán vị này lại với nhau, chúng ta sẽ có một siêu biến:

012021102120201210

siêu đột biến này chứa tất cả các hoán vị của 0, 1, 2, nhưng có thể làm cho nó ngắn hơn cái này. Tôi sẽ bỏ qua một chút ở đây, nhưng siêu đột biến ngắn nhất của các chữ số này là:

012010210

Đối với ý định và mục đích của chúng tôi, đây thực chất là chuỗi chữ số ngắn nhất có chứa tất cả các hoán vị có thể có của các chữ số đó, tức là một siêu biến.

Bài tập

Nhiệm vụ của bạn khó hơn một chút so với ví dụ siêu đột biến như được hiển thị ở trên, bởi vì bạn có thêm hai chữ số để lo lắng. - Nếu bạn chưa đọc về siêu năng lực, hoặc ví dụ của tôi ở trên có chút không rõ ràng, tôi khuyên bạn nên đọc bài viết tuyệt vời này của Patrick Honner về chủ đề này (thử thách này được truyền cảm hứng khá nhiều từ bài viết của anh ấy, vì vậy, rất thích anh ấy): https://www.quantamagazine.org/unscrambled-the-hidden-secrets-of-superpermutations-20190116/ . Mục tiêu của bạn là viết chương trình ngắn nhất có thể tạo ra siêu biến của các chữ số từ 0 đến 4.

Chấm điểm

Chương trình của bạn không nhận bất kỳ đầu vào nào, và tạo ra sự siêu biến của các chữ số từ 0 đến 4. Kết quả siêu đột biến này phải được in ra bàn điều khiển hoặc hiển thị rõ ràng cho người dùng trong phạm vi do ngôn ngữ bạn chọn cung cấp. Đây không phải là hoán vị ngắn nhất có thể, nó chỉ phải là một siêu biến hợp lệ. Bởi vì điều này, mục tiêu là viết chương trình ngắn nhất với siêu đột biến ngắn nhất, vì vậy bạn nên tính điểm của mình như vậy:

kích thước tệp (byte) * tạo độ dài siêu đột biến (chữ số)

ví dụ: nếu tôi có chương trình 40 byte và siêu đột biến của tôi dài 153 chữ số, điểm của tôi sẽ là:

40 * 153 = 6120

như mọi khi, mục tiêu là đạt được điểm này càng thấp càng tốt.

Bản mẫu

Đây là cách bạn nên đăng câu trả lời của bạn:

Ngôn ngữ | Ghi bàn

liên kết đến mã trong môi trường làm việc (nếu có thể)

code snippet

giải thích mã, vv

Chung kết

Đây là một trong những câu hỏi đầu tiên của tôi trên trang web này. Vì vậy, vui lòng cho tôi biết nếu tôi thiếu bất cứ điều gì hoặc một phần của thử thách của tôi không rõ ràng. Cảm ơn bạn, và vui chơi golf!


Chúng ta có thể biết độ dài của siêu đột biến ngắn nhất để có được ý tưởng về điểm số thấp nhất không?
Gây tử vong vào

1
@Firthize 153 là ngắn nhất
TFeld

1
@Firthize Xem A180632 .
Arnauld

1
Thoạt nhìn, có vẻ như nó chỉ yêu cầu một chuỗi de Bruijn; tuy nhiên, tiêu chí chấm điểm làm cho thử thách này trở nên thú vị. Làm tốt!
Erik the Outgolfer

3
@EriktheOutgolfer Đó không chỉ là sự khác biệt về điểm số: một siêu đột biến bao gồm tất cả các hoán vị có độ dài, trong khi chuỗi de Bruijn bao gồm tất cả các chuỗi có độ dài.
Anders Kaseorg

Câu trả lời:


6

05AB1E , điểm = 1673 (7 byte · 239)

žBœ∊{3ý

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

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

žB          push 1024
  œ         permutations: ["1024", "1042", …, "4201"]
   ∊        vertically mirror: ["1024", "1042", …, "4201", "4201", …, "1042", "1024"]
    {       sort: ["0124", "0124", "0142", "0142", …, "4210", "4210"]
     3      push 3
      ý     join: "01243012430142301423…3421034210"

Pyth , điểm = 1944 (9 byte · 216)

s+R+4d.p4

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

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

 +R   .p4   append to each permutation d of [0, 1, 2, 3]:
   +4d        [4] + d
s           concatenate

1
vy3yJlưu một byte
Emigna

1
Trong mã Pyth, m+d-> +Rlưu một byte.
isaacg

8
Sẽ không tốt hơn nếu đăng bài này thành hai câu trả lời riêng biệt, vì cách tiếp cận và ngôn ngữ lập trình đều khác nhau?
Kevin Cruijssen

@KevinCruijssen Meh, cả hai đều biến thể theo chủ đề nối các hoán vị của 4 phần tử với phần tử còn lại; câu trả lời 05AB1E của tôi thực sự có nhiều điểm tương đồng với câu trả lời Pyth của tôi cũng như với các phiên bản khác nhau của chính nó. Vì vậy, tôi không muốn yêu cầu gấp đôi số lần upvote chỉ để chuyển đổi ngôn ngữ.
Anders Kaseorg

3

Brachylog , điểm = 2907 (19 byte × 153)

4⟦pᶠP∧~l.g;Pz{sᵈ}ᵐ∧

Quá chậm để xem bất cứ điều gì, nhưng nếu bạn thay đổi 4bằng cách 2bạn có thể kiểm tra nó: Hãy thử trực tuyến!

Điều này tìm thấy siêu đột biến ngắn nhất như vậy:

4⟦                   The range [0,1,2,3,4]
  pᶠP                P is the list of all permutations of this range
     ∧
      ~l.            Try increasing lengths for the output
         g;Pz        Zip the output with P
             {sᵈ}ᵐ   For each permutation, it must be a substring of the output
                  ∧

2

JavaScript (ES6), 26975 (325 * 83 byte)

Với hệ thống tính điểm này, có rất ít chỗ cho một cái gì đó giữa 'mã hóa siêu âm tối ưu''chỉ cần sử dụng một đoạn ngắn tích hợp để ghép tất cả các hoán vị' , ít nhất là trong các phi esolang.

Dù sao đây cũng là một nỗ lực.

f=(a=[0,1,2,3,4],p=r='')=>a.map((v,i)=>f(a.filter(_=>i--),p+v))|~r.search(p)?r:r+=p

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

Nó tạo ra một chuỗi gồm 325 byte:

012340124301324013420142301432021340214302314023410241302431031240314203214032410341203421
041230413204213042310431204321102341024310324103421042310432201342014320314203412041320431
210342104330124301423021430241304123042131024310423201432041321044012340132402134023140312
4032141023410324201342031421034301243021431024320143210

Bạn có một điểm hợp lệ, tôi sẽ nói rằng tôi đã hơi lo lắng về hệ thống tính điểm. Trong tương lai, tôi sẽ cố gắng quan tâm hơn và ghi điểm theo cách cho phép thực hiện nhiều phương pháp khác nhau. : D
Isaac C

Nếu bạn có thể trả về một chuỗi cho ít hơn 23 byte soạn sẵn, hardcoding điểm tốt hơn so với giải pháp này ( 26975/153-153>23)
Sanchises

@Sanchises Chúng tôi cần 5 byte soạn sẵn cho một chuỗi hoặc 4 cho BigInt .
Arnauld

@Sanchises Chúng tôi có thể nén chuỗi một chút: Hãy thử trực tuyến! (hoặc ít hơn nếu bạn không tính nhậu tố mặc định console.logxuất ra)
Neil


2

05AB1E , điểm: 5355 2160 (216 * 10 byte )

3ÝœJε4yJ}J

Cảng @AndersKaseorg 's Pyth câu trả lời , vì vậy hãy chắc chắn để upvote anh ta!

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

Giải trình:

3Ý           # Push a list in the range [0,3]: [0,1,2,3]
  œ          # Get all possible permutations of this list
   J         # Join each inner list together to a single string
    ε        # Map each string `y` to:
             #  (Push string `y` implicitly)
     4       #  Push 4
      y      #  Push string `y` again
       J     #  Join all three together
        }J   # After the map: Join all strings together to a single string
             # (and output it implicitly as result)

2

Octave , 27 x 442 = 11934

'01234'(perms(1:5)'(4:445))

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

Vì vậy, hóa ra, ngây thơ tạo ra tất cả các hoán vị và sau đó cắt ngắn thành chuỗi con ngắn nhất vẫn là siêu đột biến hợp lệ ngắn hơn so với tạo ra siêu đột biến ngắn nhất. Đáng buồn thay, lần này điểm số không phải là một bảng màu.

Octave , 97 x 153 = 14841

a=sym(9);while i<120
i=0;a+=1;q='01234';for t=q(perms(1:5))'
i+=any(regexp(char(a),t'));end
end
a

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

Mục nhập được cập nhật cho một vài điều

  • a++ không được thực hiện cho các số tượng trưng.
  • contains()không được thực hiện trong Octave. Thay thế bằng any(regexp()).
  • Trong liên kết trực tuyến, tôi đã nhập thủ công arất gần với siêu đột biến dài 153. Điều này cho phép giải pháp được xác minh.

2

CJam (6 * 240 = 1440)

5e!72>

Bản demo , xác thực trực tuyến (xuất ra chỉ mục mà mỗi hoán vị 0..4có thể được tìm thấy; nó cần làm phẳng đầu ra vì chương trình ban đầu cung cấp đầu ra phù hợp cho thiết bị xuất chuẩn nhưng những gì nó đặt trên ngăn xếp không thể sử dụng trực tiếp).

Cách tiếp cận bị đánh cắp từ Sanchises , mặc dù thứ tự hoán vị của CJam là khác nhau, tạo ra một chuỗi con khác.


CJam (22 * 207 = 4554)

0a4{)W@+W+1$)ew\a*W-}/

Bản demo trực tuyến , xác nhận .

Mổ xẻ

Điều này sử dụng một xây dựng đệ quy đơn giản.

0a       e# Start with a superpermutation of one element, [0]
4{       e# for x = 0 to 3:
  )      e#   increment it: n = x+1
  W@+W+  e#   wrap the smaller superpermutation in [-1 ... -1]
  1$)ew  e#   split into chunks of length n+1
  \a*    e#   insert an n between each chunk
  W-     e#   remove the -1s from the ends
}/


1

Than , 29 byte, chiều dài đầu ra 153, điểm 4437

”)⊞⧴�r3⁼H⁴↓¦σ✳LïpWS [T↑ZωÞ”‖O

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải thích: Giống như @TFeld, tôi chỉ in một nửa số siêu đột biến và phản chiếu nó. Tôi đã tính toán siêu đột biến bằng cách sử dụng mã sau:

Push(u, w);
for (u) {
    Assign(Plus(Plus(i, Length(i)), i), h);
    Assign(Ternary(i, Join(Split(w, i), h), h), w);
    Assign(Incremented(Length(i)), z);
    if (Less(z, 5)) for (z) Push(u, Slice(h, k, Plus(k, z));
}
Print(w);

Điều này chuyển thành chương trình 45 byte trong Char than nên đã đạt được 6885.




0

Perl 6 , 7191 (153 * 47 byte)

say first *.comb(permutations(5).all.join),0..*

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

Tìm số đầu tiên chứa tất cả các hoán vị của các chữ số 0 đến 4. Điều này sẽ mất nhiều thời gian để thực hiện, nhưng bạn có thể kiểm tra nó với hai hoán vị đầu tiên 00,1


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.