Sắp xếp cho Bozos


8

Giới thiệu

Thử thách này là về ba thuật toán sắp xếp (xấu): Bogosortvà hai biến thể khác mà tôi đã đưa ra (nhưng có lẽ đã được những người khác nghĩ đến vào một lúc nào đó): Bogoswap(AKA Bozosort) và Bogosmart.

Bogosorthoạt động bằng cách xáo trộn hoàn toàn mảng một cách ngẫu nhiên và kiểm tra xem nó có được sắp xếp không (tăng dần). Nếu không, lặp lại.

Bogoswaphoạt động bằng cách chọn hai yếu tố, ngẫu nhiên và hoán đổi chúng. Lặp lại cho đến khi được sắp xếp (tăng dần).

Bogosmarthoạt động bằng cách chọn ngẫu nhiên hai phần tử và chỉ hoán đổi chúng nếu nó làm cho mảng gần hơn được sắp xếp (tăng dần), tức là. nếu phần tử có chỉ số thấp hơn ban đầu lớn hơn phần tử có chỉ số cao hơn. Lặp lại cho đến khi được sắp xếp.

Các thách thức

Thử thách này khám phá tính hiệu quả (hoặc thiếu) của mỗi trong số ba thuật toán sắp xếp này. Mã đánh gôn sẽ

  1. tạo ra một mảng 8 phần tử được xáo trộn của các số nguyên bao gồm 1-8 (tiếp tục đọc để xem bạn nên làm điều này như thế nào);

  2. áp dụng từng thuật toán cho mảng này; và

  3. hiển thị mảng ban đầu, theo sau là số lượng tính toán cần thiết cho mỗi thuật toán, được phân tách bằng một khoảng trắng (dấu cách là ok), theo định dạng <ARRAY> <BOGOSORT> <BOGOSWAP> <BOGOSMART>.

Chương trình sẽ sản xuất 10 trường hợp thử nghiệm; bạn có thể tạo tất cả mười lúc đầu hoặc tạo một lúc, bất cứ điều gì. Sản lượng mẫu dưới đây.

Chi tiết:

Đối với Bogosort, nó sẽ ghi lại số lần mảng được xáo trộn.

Đối với Bogoswap, nó nên ghi lại số lượng giao dịch hoán đổi được thực hiện.

Đối với Bogosmart, nó nên ghi lại số lượng giao dịch hoán đổi được thực hiện.

Ví dụ đầu ra:

87654321 1000000 100 1
37485612 9050000 9000 10
12345678 0 0 0 
28746351 4344 5009 5
18437256 10000 523 25
15438762 10000 223 34
18763524 58924 23524 5
34652817 9283 21 445
78634512 5748 234 13
24567351 577 24 34

Tôi đã tạo nên những con số này; Tất nhiên, chương trình của bạn sẽ in đầu ra khác nhau nhưng ở cùng định dạng.

Quy tắc

  • Tất cả tính ngẫu nhiên được sử dụng trong chương trình của bạn phải đến từ các trình tạo số giả ngẫu nhiên có sẵn cho bạn, và nếu không thì không được tính toán rộng rãi bởi bạn. Bạn không phải lo lắng về hạt giống.
  • Không có giới hạn thời gian trên các chương trình.
  • Các mảng sẽ được sắp xếp tăng dần.
  • Trailing space hoặc một dòng mới bổ sung không phải là vấn đề lớn.
  • Đối với Bogosort, mảng sẽ được xáo trộn bằng cách sử dụng bất kỳ thuật toán xáo trộn không thiên vị nào như Fisher-Yates hoặc Knuth Shuffling , được chỉ định rõ ràng trong phần giải thích của bạn. Phương pháp xáo trộn tích hợp không được phép. Tạo mảng thử nghiệm của bạn theo cách tương tự.
  • Nếu sau khi xáo trộn hoặc hoán đổi mảng vẫn như cũ, nó vẫn được tính và nên được đưa vào số đếm của chương trình. Ví dụ, xáo trộn mảng với chính nó bởi sự trùng hợp được tính là xáo trộn và hoán đổi một phần tử với chính nó được tính là một hoán đổi, mặc dù không có thao tác nào trong số này thay đổi mảng.
  • Nếu bộ nhớ của tôi phục vụ cho tôi một cách chính xác, một mảng 8 phần tử sẽ không mất quá nhiều thời gian cho bất kỳ thuật toán nào trong ba thuật toán. Trong thực tế, tôi nghĩ một vài lần cho một mảng 10 phần tử, khi tôi đã thử nó, Bogoswapchỉ cần một vài nghìn (hoặc ít hơn) các lần xáo trộn thực tế và dưới 10 giây.
  • Mã của bạn thực sự phải sắp xếp các mảng, không chỉ đưa ra các giá trị dự kiến ​​hoặc các phép tính toán học cho câu trả lời dự kiến.
  • Đây là một thử thách golf-code, vì vậy chương trình ngắn nhất tính bằng byte chiến thắng.

Dưới đây là một số bước mẫu cho mỗi thuật toán sắp xếp:

BOGOSORT
56781234
37485612
28471653
46758123
46758123
12685734
27836451
12345678

BOGOSWAP
56781234
16785234
17685234
12685734
12685743
12685734
12485763
12385764
12385764
12345768
12345678

BOGOSMART
56781234
16785234
12785634
12785364
12785364
12385764
12385674
12345678

Trong trường hợp này, chương trình sẽ xuất ra 56781234 7 10 7, và sau đó làm điều tương tự 10 lần. Bạn không phải in các mảng trong khi sắp xếp đang diễn ra, nhưng tôi đã đưa ra các bước mẫu ở trên để bạn có thể hiểu cách mỗi thuật toán hoạt động và cách tính toán.


2
Có 8! = 40.320 đơn đặt hàng có thể cho một mảng 8 phần tử. Toán học của tôi không đủ tốt để dịch điều này thành số bước bogosort dự kiến ​​(trung bình). Nhưng theo trực giác, nó ít nhất phải nằm trong một độ lớn của số đó. Lý thuyết của tôi là bogosort và bogoswap sẽ yêu cầu số bước trung bình như nhau. Chỉ có một bước của bogoswap là rẻ hơn, vì vậy thời gian sẽ thấp hơn.
Reto Koradi

Tôi đã làm điều này trước đây và tin tôi rằng bạn sẽ ngạc nhiên khi thấy suy nghĩ của bạn khác với thực tế. Bạn sẽ thấy rằng, không có gì đáng ngạc nhiên, Bogosort có số lượng tính toán lớn nhất, sau đó đáng ngạc nhiên là Bogoswap có mức thấp hơn, và dĩ nhiên, Bogosmart thậm chí còn ít hơn. Bạn cũng sẽ ngạc nhiên bởi số lượng tính toán mà Bogosort cần, thấp hơn 40320.
Faraz Masroor

Nói tóm lại, tôi không hy vọng thử thách này sẽ phá hỏng máy tính của bạn hoặc chiếm lĩnh bộ nhớ của bạn.
Faraz Masroor

2
Liên quan. (Đối với phần xáo trộn và phần Bogosort.)
Martin Ender

Chúng ta có thể chỉ xuất số bước từ phân phối chính xác về mặt toán học mà không cần thực hiện sắp xếp không?
xnor

Câu trả lời:


3

Bình thường, 62 60 byte

VTjd[jkKJ=boO0=ZS8fqZ=KoO0K0fqZ=XJO.CJ2)0fqZ=Xb*>F=NO.Cb2N)0

Điều này khá thú vị. Không chắc chắn nếu điều này là hợp lệ, có lẽ tôi đang sử dụng một số sơ hở bất thành văn.

Một đầu ra mẫu sẽ là:

23187456 22604 23251 110
42561378 125642 115505 105
62715843 10448 35799 69
72645183 7554 53439 30
61357428 66265 6568 77
62348571 1997 105762 171
78345162 96931 88866 241
17385246 51703 7880 80
74136582 36925 19875 100
26381475 83126 2432 25

Giải trình:

Hàm shuffle của tôi sử dụng hàm dựng sẵn order-by. Về cơ bản tôi gán cho mỗi phần tử của danh sách một số ngẫu nhiên của khoảng [0-1)và sắp xếp danh sách theo chúng. Điều này mang lại cho tôi một shuffle ngẫu nhiên không thiên vị.

Vòng ngoài

Khi VTbắt đầu lặp lại mã sau 10 lần.

Sự chuẩn bị

jkKJ=boO0=ZS8
           S8        create the list [1, 2, 3, 4, 5, 6, 7, 8]
         =Z          and store in Z
      oO0            shuffle
    =b               and store in b
   J                 and store in J
  K                  and store in K (3 copies of the same shuffled array)
jkK                  join K with ""

Thuốc phiện

fqZ=KoO0K0 
     oO0K            shuffle K
   =K                and store the result in K
f        0           repeat ^ until:
 qZ K                  Z == K
                     and give the number of repeats

Không có gì

fqZ=XJO.CJ2)0  
       .CJ2          give all possible pairs of elements of J
      O              take a random one
    XJ     )         swap these two elements in J
   =                 and store the result in J
f           0        repeat ^ until:
 qZ K                  Z == K
                     and give the number of repeats

Không có thông tin

fqZ=Xb*>F=NO.Cb2N)0
            .Cb2     give all possible pairs of elements of b
           O         take a random one
         =N          assign it to N
       >F N          check if N[0] > N[1]
      *         N    multiply the boolean with N
    Xb           )   swap the two (or zero) values in b
   =                 and assign to b
f                 0  repeat ^ until:
 qZ                    Z == b
                     and give the number of repeats

In ấn

jd[
  [                  put all 4 values in a list
jd                    join by spaces and print

=JXJO.cJ2)là giống như =XJO.cJ2)- gán tăng. Giữ tương tự cho =bXbsau này. Ngoài ra, tôi nghĩ các giao dịch hoán đổi được cho là có các cặp được chọn thay thế ( .C)
isaacg

@isaacg Cảm ơn, đã sửa. Không chắc chắn nếu .choặc .Cđược cho phép. Chẳng hạn .C[3 1 2)2, không trả lại cặp [2, 1]. Đó là một tài sản, mà tôi đang khai thác trong thuật toán của mình.
Jakube

có lẽ *JJvậy Nó cũng ngắn hơn một ký tự, rất hay.
isaacg

2

JavaScript ( ES6 ), 319 345

Không có gì đáng ngạc nhiên khi điều này khá dài.

Đối với ngẫu nhiên ngẫu nhiên, tín dụng cho @ core1024 (tốt hơn so với của tôi cho cùng một chellenge)

Kiểm tra chạy đoạn mã (chỉ Firefox như bình thường)

// FOR TEST : redefine console
var console = { log: (...p)=>O.innerHTML += p.join(' ')+'\n' }
// END 

// Solution
R=n=>Math.random()*n|0, 
S=a=>(a.map((c,i)=>(a[i]=a[j=R(++i)],a[j]=c)),a), // shuffle
T=f=>{for(a=[...z];a.join('')!=s;)f(a)}, // apply sort 'f'  algorithm until sorted

s='12345678';
for(i=0;i<10;i++)
  z=S([...s]),
  n=l=m=0,
  T(a=>S(a,++n)),
  T(a=>(t=a[k=R(8)],a[k]=a[j=R(8)],a[j]=t,++m)),
  T(a=>(t=a[k=R(8)],u=a[j=R(8)],(t<u?j<k:k<j)&&(a[k]=u,a[j]=t,++l))),
  console.log(z.join(''),n,m,l)
<pre id=O></pre>


Liên kết "Chạy đoạn mã" không hoạt động đối với tôi. Không chắc đó có phải là trình duyệt / hệ thống của tôi không, nhưng các liên kết đoạn trích đã hoạt động với tôi trong quá khứ.
Reto Koradi

Tương tự, đoạn mã không hoạt động trên trình duyệt của tôi
Faraz Masroor

2
@Reto et al EcmaScript 6: chỉ chạy trên Firefox.
edc65
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.