Sắp xếp lại loạn trí


14

Nhiệm vụ của bạn là viết một chương trình máy tính sao cho khi nó được cắt thành các dòng (phân chia trên ký tự dòng mới), mọi sự sắp xếp của các dòng sẽ tạo ra một số khác nhau trong khoảng từ 1 đến n! (trong đó n là tổng số dòng). Không có số nào được xuất theo hai cách sắp xếp khác nhau và mỗi sắp xếp sẽ xuất một số trên phạm vi này. Vì có n! cách sắp xếp các dòng của chương trình, điều này có nghĩa là mỗi số phải được xuất ra bằng một sắp xếp lại.

Ví dụ chương trình python

print 1;"""
print 2;"""

Có hai sự sắp xếp

print 1;"""
print 2;"""

print 2;"""
print 1;"""

Đầu ra đầu tiên 1và đầu ra thứ hai 2.

Bạn có thể sử dụng bất kỳ định dạng đầu ra nào là chuẩn trong ngôn ngữ bạn đang sử dụng. Bạn không thể giả sử bất kỳ loại nồi hơi. Tôi nghĩ thử thách này thú vị hơn nếu bạn phải làm việc với bất kỳ định dạng nào mà ngôn ngữ khăng khăng.

Chấm điểm

Điểm của bạn sẽ là số dòng trong chương trình của bạn với điểm cao hơn sẽ tốt hơn. Bạn có thể chọn xuất các số từ 0 đến n! -1 nếu muốn.


3
Điều gì về câu trả lời trình bày các công trình xây dựng cho bất kỳ n? Có phải tất cả đều được buộc ở một số điểm ∞?
Martin Ender

@MartinEnder Có. Là một điểm tốt. Nếu bạn tìm thấy một công trình như vậy thì bạn thắng.
Đăng Rock Garf Hunter

@AdmBorkBork Có mỗi sắp xếp sẽ xuất một số. Điều đó có thể rõ ràng hơn?
Đăng Rock Garf Hunter

1
@totallyhuman Quy tắc đầu ra tiêu chuẩn cho bất kỳ ngôn ngữ nào bạn đang sử dụng. Tôi sẽ cập nhật câu hỏi để hoàn toàn rõ ràng về điều này.
Đăng Rock Garf Hunter

1
@EriktheOutgolfer Không có bộ ngắt kết nối. Martin có thể đã tìm ra cách ghi điểm vô hạn trong CJam nhưng có rất nhiều ngôn ngữ khác để thử.
Đăng Rock Garf Hunter

Câu trả lời:


7

CJam , điểm:

Mỗi dòng có dạng

];Lx+:L{__(f<0+:+\,,(;1+:**\(;}h]:+

nơi xlà một số từ 0để n-1. Kết quả là trong phạm vi 0để n!-1.

Hãy thử trực tuyến! (Dành cho n=3.)

Tín dụng cho jimmy23013 cho mã tính toán chỉ số hoán vị thực tế. Tôi chỉ thay thế bit đọc đầu vào bằng cách ];Lx+:Lloại bỏ kết quả từ dòng trước đó và sau đó thêm chỉ mục của dòng hiện tại vào biến L(ban đầu là một mảng trống).


Ồ, tôi đã viết nó. Nhưng nó không giống golf ... (ví dụ như 0+:+) Tôi nghĩ rằng bạn có thể có được một phiên bản ngắn hơn nhiều bằng cách sử dụng ,m!#.
jimmy23013

4

Perl:

$z.="-1,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-2,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-3,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}

Mở rộng đến bất kỳ độ dài nào bạn thích

Sẽ nhanh chóng hết bộ nhớ vì việc sử dụng bộ nhớ giống như O (n ^ n). Tuy nhiên, có thể dễ dàng thay thế bộ chỉ mục hoán vị bằng mã O (n), chỉ lâu hơn. Tôi chỉ minh họa cách bạn có thể sử dụng END{}cho nhiệm vụ này trong perl. Tất cả END{}các khối chạy tại thời điểm thoát, nhưng chỉ khối đầu tiên được gọi (khối cuối cùng trong mã) sẽ xuất ra bất cứ điều gì do /A/thử nghiệm chỉ đúng một lần

Lưu ý rằng bộ $mđếm phải được tính là một chuỗi bởi vì như một số, nó sẽ tràn ra (muộn hơn so với sự kết thúc của vũ trụ nhưng đó là nguyên tắc được tính). Vì lý do tương tự, tôi "đếm" số lượng dòng bằng cách xây dựng một chuỗi As thay vì sử dụng bộ đếm thực mặc dù việc tràn này sẽ xảy ra ngay cả sau đó.

Một cách khác để làm điều này trong perl:

@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"1".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"2".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"3".!($a.=A),

Điều này sử dụng thực tế rằng trong foo = bar barđược thực hiện sau foo. Tuy nhiên, phiên bản này không phát điên về thời gian và không gian nhưng điều đó làm cho mã dài hơn

Tuy nhiên, một ý tưởng khác là sử dụng DESTROYcó lợi thế là chỉ một trong số chúng sẽ được thực thi. Tôi sẽ không lặp lại mã lập chỉ mục hoán vị mà tôi đã đưa ra hai ví dụ.

push@F,"1";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"2";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"3";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }

Hoặc sử dụng BEGIN:

BEGIN{push@F,"1"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"2"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"3"} print"Work out permutation index of @F\n"; exit;

3

Thạch ,

;3ÇQŒ¿$⁼Q$?
;2ÇQŒ¿$⁼Q$?
;1ÇQŒ¿$⁼Q$?

(Ví dụ với n=3.)

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

23 13 11 byte mỗi dòng.

Đối với chương trình có ndòng, dòng sẽ có định dạng

; <i> ÇQŒ¿$⁼Q$?

nơi <i>đại diện cho literal số ivà mỗi dòng có một giá trị khác nhau cho itừ 1đến n. (Các giá trị ikhông thực sự phải là những con số cụ thể này, chúng chỉ phải có các giá trị dương duy nhất.) Chương trình này không còn sử dụng ntrong cấu trúc dòng.

Làm sao?

  • Không có đối số Jelly bắt đầu với 0.
  • ;1gắn thêm 1vào 0hoặc danh sách hoạt động.
  • ⁼Q$là đơn vị có điều kiện cho câu lệnh if ( ?) kiểm tra xem các phần tử của danh sách có phải là duy nhất hay không. Nếu có, liên kết ở trên được gọi là ( Ç) và một số khác được thêm vào danh sách. Nếu chúng không phải là duy nhất, điều đó có nghĩa là chúng tôi đã kết nối với liên kết đầu tiên. Phần tử lặp lại được xóa khỏi danh sách ( Q) và chỉ mục của hoán vị được tìm thấy ( Œ¿). Lưu ý rằng có một 0ở đầu danh sách khi Œ¿được thực hiện nhưng nó không ảnh hưởng đến đầu ra vì các giá trị cho itất cả đều dương.

Tính năng Jelly mới

Với việc Ƒnhanh chóng được thêm vào , chúng ta có thể giảm ⁼Q$xuống , tiết kiệm một byte.

10 byte / dòng (cho các chữ số đơn)

;1ÇQŒ¿$QƑ?

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


2

Brain-Flak , 3

(({}){})
({}())
(()(){([()()]{})()(){[()()](<{}>)}}{})

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

Tôi đã đăng bài này trong cuộc trò chuyện trước đó nhưng hy vọng bằng cách đăng nó ở đây mọi người có thể xây dựng nó.

Giải trình

Chúng tôi bắt đầu với chương trình cơ bản

(({}){})
({}())

Điểm số này 2 điểm của riêng mình. Để bước lên cấp độ tiếp theo, tôi muốn thêm một dòng mới. Dự đoán bắt đầu của tôi là

(()(){[()()]{}(<()>)}{})

Điều này đặt ĐKDV 2nếu nó bằng 0 và không làm gì khác. Đây thực sự là một khởi đầu tốt. Với hai dòng khác chúng tôi có thể nhận được tất cả các số từ 1để 6trừ 4, bởi vì có rất 2nhiều cách để đầu ra 2:

({}())
(({}){})
(()(){[()()]{}(<()>)}{})

({}())
(()(){[()()]{}(<()>)}{})
(({}){})

Để khắc phục điều này, chúng tôi làm cho dòng của chúng tôi cũng thiết lập 2được 4. Điều này có thể được thực hiện với

(()(){([()()]{})()(){[()()](<{}>)}}{})

Để rõ ràng, điều này về cơ bản thực hiện chức năng Haskell

f 0 = 2
f 2 = 4
f x = x

Điều này khắc phục sự cố của chúng tôi vì một trong những chương trình trước đây đã xuất 2ra kết quả đầu ra 4mà không có chương trình nào khác thay đổi.


2

Java 7, điểm:

public class DerangedRearrangements implements B{public void a(){System.out.println("0");}public static void main(String[]a)throws Exception{java.util.regex.Pattern p=java.util.regex.Pattern.compile("^(?:public )?class ([\\w]+).*");java.io.BufferedReader r=new java.io.BufferedReader(new java.io.FileReader("./DerangedRearrangements.java"));String line; while((line=r.readLine())!=null){java.util.regex.Matcher m=p.matcher(line);if(m.matches()){((B)Class.forName(m.group(1)).getDeclaredConstructor().newInstance()).a();}}}}interface B{void a();}
class b1 implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

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

Điều này có thể in ra 0 đến n! -1 . Các dòng bổ sung có định dạng sau (trong đó INDEX là một số từ 1 đến n! -1 ):

class b<INDEX> implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

Phương thức này hoạt động bằng cách đọc nguồn riêng của nó để xác định các lớp thứ tự được liệt kê trong đó. Thật không may, không có phương pháp nào tôi có thể tìm thấy bằng cách phân tích tệp đã biên dịch hoặc tạo ClassLoader tùy chỉnh nhờ cách java biên dịch JIT. Tôi cho rằng tôi có thể có mỗi lớp bổ sung chỉ cần in ra một số được xác định tĩnh nhưng điều này có vẻ vui hơn. Điều đó cũng sẽ làm cho nó có thể xóa Bgiao diện nhưng việc tính điểm không dựa trên byte nên tôi sẽ để nó vui.

Cách thức hoạt động (mức cao):

Đọc từng dòng mã nguồn của nó theo từng dòng. Vì mỗi dòng khai báo một lớp mới, chúng tôi sử dụng sự phản chiếu để tạo một thể hiện của lớp mới và gọi aphương thức của nó mà nó cần phải có vì nó thực hiện Bgiao diện.


1

Ruby , điểm:

(a||=[])<<2;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<1;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<3;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))

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

Chương trình này có 61 byte trên mỗi dòng (cho n <10). Nó có định dạng cơ bản giống như giải pháp của dylnan ; số đầu tiên trong mỗi dòng sẽ là một giá trị khác nhau giữa 1nvà số thứ hai trong mỗi dòng sẽ là n.

Tôi đã hy vọng tìm ra cách để tránh đưa nvào chương trình, nhưng tôi không thể tìm thấy.



0

05AB1E , điểm: 1.114.112

0ˆ¯JD{œsk
1ˆ¯JD{œsk
2ˆ¯JD{œsk

Hãy thử trực tuyến! Chỉ số 0. Ở đầu mỗi dòng đẩy các ký tự riêng biệt đến mảng toàn cục. Phần còn lại của mã được thực thi một cách vô ích, ngoại trừ trên dòng cuối cùng, nơi nó nối các giá trị thành một chuỗi, sau đó tìm chỉ số hoán vị của nó. 1.114.112 là số lượng ký tự Unicode có thể có tại thời điểm viết (điểm mã 48-57 là dễ nhất để chứng minh với khóa học).

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.