ใช้งาน Bogosort


29

คือการแก้ซูโดกุที่ยากเกินไป? แม้แต่เวอร์ชั่นกำลังดุร้าย ? นี่คือแบบฝึกหัดการเข้ารหัสที่ง่ายขึ้นเล็กน้อย ฉันหวังว่า. :-P

เขียนฟังก์ชั่นที่สั้นที่สุดเพื่อใช้โบกี้ โดยเฉพาะหน้าที่ของคุณควร:

  • ใช้อาร์เรย์ (หรือเทียบเท่าภาษาของคุณ) เป็นอินพุต
  • ตรวจสอบว่าองค์ประกอบอยู่ในลำดับที่เรียง; ถ้าเป็นเช่นนั้นกลับอาร์เรย์
  • ถ้าไม่ให้สับองค์ประกอบแล้วเริ่มใหม่อีกครั้ง

รายการที่สั้นที่สุดชนะ ในกรณีที่มีการผูกฟังก์ชั่นที่รองรับตัวเปรียบเทียบแบบกำหนดเอง (และ / หรือเครื่องกำเนิดหมายเลขเทียมเทียม) ได้รับการสนับสนุน ความสัมพันธ์ที่เหลืออยู่ใด ๆ จะได้รับการแก้ไขโดยการสนับสนุนการส่งก่อนหน้า


การชี้แจง:คุณสามารถใช้องค์ประกอบประเภทใดก็ได้ที่คุณต้องการตราบใดที่มีวิธีการสั่งซื้อพวกเขาแน่นอน นอกจากนี้การสับจะต้องเหมือนกัน; ไม่มีสิ่งนี้ "ฉันจะทำมันด่วนและเรียกมันว่าสับ" ธุรกิจ :-)


องค์ประกอบคืออะไร int หรือสตริง?
Alexandru

@Alexandru: ไม่เป็นไร คุณเลือก.
Chris Jester-Young

การเพิ่มเครื่องมือเปรียบเทียบแบบกำหนดเองจะเพิ่มความยาวของรหัสเพื่อให้รายการที่ชนะจะไม่มีเครื่องมือเปรียบเทียบแบบกำหนดเอง ฉันคิดว่าการผูกเน็คไทไม่สมเหตุสมผล
Alexandru

1
เป็นไปได้ว่าอัลกอริทึมนี้อาจล้มเหลวเมื่อใช้ตัวสร้างแบบสุ่มหลอก เช่นเมื่อความยาวของรายการเกินกว่าพูด 2000 มี 2000! สถานะสำหรับรายการที่อาจเกินจำนวนรัฐ interal ของ prng
gnibbler

2
ใช่คำพูดที่เกี่ยวข้องจากวิกิพีเดีย "อย่างไรก็ตามหากมีการใช้เครื่องกำเนิดหมายเลขเทียมเทียมแทนแหล่งที่มาแบบสุ่มมันอาจจะไม่ยุติเพราะสิ่งเหล่านี้แสดงพฤติกรรมวงจรระยะยาว"
gnibbler

คำตอบ:


8

APL (Dyalog), 20

{⍵≡⍵[⍋⍵]:⍵⋄∇⍵[?⍨⍴⍵]}

คำอธิบาย

คืออาร์กิวเมนต์ (ขวา)
⍵≡⍵[⍋⍵]: ตรวจสอบว่าเรียงเท่ากับตัวเอง
:⍵: ถ้าใช่แล้วกลับ
∇⍵[?⍨⍴⍵]: อื่นสร้างอาร์เรย์ 1 ถึง⍴⍵(ความยาว) ในลำดับสุ่มเรียงลำดับตามนั้น ( ⍵[...]) และใช้ฟังก์ชั่นมัน ( )


ทันใดนั้นกลับมาทบทวนปัญหานี้และ ...

APL (Dyalog), 19

{∧/2≤/⍵:⍵⋄∇⍵[?⍨⍴⍵]}

เพียงแค่คิดเกี่ยวกับการเรียงลำดับอาเรย์ในการตรวจสอบทำให้มันไม่มีจุดหมาย (ไม่ได้บอกว่าโบโกตามีความหมาย) การดำเนินการที่แม่นยำยิ่งขึ้นจะ∧/2≤/⍵เกิดขึ้นและนั่นจะลดจำนวนถ่าน


15

Perl 6: 23 ตัวอักษร

@s.=pick(*)until[<=] @s

1
นี่คือฟังก์ชั่นเป็นภาษา Perl หรือไม่? มันดูดี :)
Eelvex

1
หากคุณไม่รู้ให้[<=]ตรวจสอบว่ารายการเรียงลำดับ[<=] (1, 2, 3,) == (1 <= 2 <= 3) == (1 <= 2) and (2 <= 3)แล้วและ.pick(n)เลือกองค์ประกอบแบบสุ่มจากรายการและ.pick(*)ให้ Perl เลือกองค์ประกอบทั้งหมด use.perl.org/~masak/journal/40459
Ming-Tang

นี้จะต้องเป็น Perl 6. ผมไม่เคยเห็นใช้ก่อนที่จะให้อยู่คนเดียวpick [<=]เอกสารเหล่านี้อยู่ที่ไหน?
Mr. Llama

@GigaWatt นี่คือ Perl 6 (ไม่ใช่ Perl 5) []เป็นตัวดำเนินการลดซึ่งใช้ตัวดำเนินการระหว่างวงเล็บเหลี่ยม ตัวอย่างเช่น[<=] 1, 2, 3คือ1 <= 2 <= 3(และใช่คุณมีช่วงเช่นนี้ใน Perl 6) ในกรณีนี้มันถูกใช้เพื่อตรวจสอบว่าองค์ประกอบอยู่ในลำดับ .pick(*)วิธีการสับรายการ ( pick(N)เลือกNองค์ประกอบจากรายการ) .=วิธีการเรียกและกำหนดผลลัพธ์ให้กับตัวแปร สำหรับเอกสาร - ดีสำหรับตอนนี้มีข้อกำหนดของ Perl 6 เท่านั้น - feather.perl6.nl/synแต่มีอยู่
Konrad Borowski

7

APL (22)

{(⍳X←⍴⍵)≡⍋⍵:⍵⋄∇⍵[X?X]}

การใช้งาน:

    {(⍳X←⍴⍵)≡⍋⍵:⍵⋄∇⍵[X?X]} 3 2 1
1 2 3

คำอธิบาย:

  • ⍋⍵: ส่งคืนดัชนีของรายการตามลำดับที่จัดเรียงดังนั้น⍋30 10 20จะให้2 1 3
  • (⍳X←⍴⍵)≡⍋⍵:⍵จัดเก็บความยาวของรายการอินพุตใน X หากช่วง[1..X]เท่ากับลำดับดัชนีเรียงลำดับรายการจะถูกเรียงลำดับดังนั้นส่งคืน
  • ⋄∇⍵[X?X]: ถ้าไม่ใช่กรณีนี้ให้คืนค่าด้วยอาเรย์แบบสับ

7

Ruby - 33 ตัวอักษร

g=->l{l.shuffle!!=l.sort ?redo:l}

1 ถ่านน้อยลง:g=proc{|l|0until l.sort==l.shuffle!}
AShelly

@ AShelly รุ่นของคุณใช้งานไม่ได้ รุ่นของฉัน (น้อยกว่า 5 ตัวอักษร) f=->l{l.sort!=l.shuffle!?redo:l}(ทับทิม 1.9)
Hauleth

ใครจะกรุณาอธิบายให้ฉันทำไมredoงานด้วยprocแต่ไม่ได้อยู่ในวิธีการที่คลาสสิกกับdef...end? ฉันคิดว่าredoใช้ได้กับลูปเท่านั้น
Patrick Oscity

1
โอเคไม่เป็นไรฉันพบบางอย่างในหนังสือ 'ภาษาโปรแกรมภาษาทับทิม':” redo[…] ถ่ายโอนการควบคุมกลับไปที่จุดเริ่มต้นของ proc หรือแลมบ์ดา” มันเป็นอย่างนั้น
Patrick Oscity

6

Mathematica , 40 37

NestWhile[RandomSample,#,Sort@#!=#&]&

ด้วยช่องว่าง:

NestWhile[RandomSample, #, Sort@# != # &] &

หากคุณไม่สนใจข้อผิดพลาดคุณสามารถบันทึกสามไบต์ด้วย#//.l_/;Sort@l!=l:>RandomSample@l&
Martin Ender

ไบต์ 13sh ใน Mthmca
Michael Stern

5

J - 34 27

f=:({~?~@#)^:(1-(-:/:~))^:_

เช่น:

f 5 4 1 3 2
1 2 3 4 5

f 'hello'
ehllo

ส่วน{~? ~ @ # #สับเปลี่ยนอินพุต:

({~ ?~@#) 1 9 8 4
4 8 9 1
({~ ?~@#) 'abcd'
bdca

3

Python 61

เรียงลำดับในสถานที่

import random
def f(l):
 while l!=sorted(l):random.shuffle(l)

ฟังก์ชั่นของคุณจะไม่คืนค่าอาร์เรย์เมื่อสำเร็จ
hallvabo

เรียงลำดับในสถานที่ อาร์เรย์ที่ส่งผ่านถูกแก้ไข
Alexandru

คำถามบอกว่าฟังก์ชั่นควรจะกลับอาร์เรย์แม้ว่า - ในทางเทคนิคไม่จำเป็นต้องได้รับผล
Jonathan M Davis

1
from random import*สามารถบันทึกตัวละคร
ugoren

1
สิ่งนี้อาจไม่ได้ผลเสมอ: (จากเอกสารประกอบโมดูลแบบสุ่มของไพ ธ อน): "โปรดทราบว่าสำหรับ len ที่ค่อนข้างเล็ก (x) จำนวนพีชคณิตทั้งหมดของ x นั้นใหญ่กว่าช่วงเวลาของเครื่องกำเนิดเลขสุ่มแบบส่วนใหญ่ ไม่สามารถสร้างลำดับที่ยาวได้ "
Matt

3

Python 94

from itertools import*
def f(a):return [x for x in permutations(a) if x==tuple(sorted(a))][0]

คำตอบหลามอื่น ๆ ใช้ random.shuffle () เอกสารประกอบของโมดูลโมดูลแบบหลาม:

โปรดทราบว่าสำหรับ len (x) ที่ค่อนข้างเล็กจำนวนรวมของพีชคณิตการเรียงลำดับของ x นั้นใหญ่กว่าช่วงเวลาของตัวสร้างตัวเลขสุ่มแบบสุ่มส่วนใหญ่ นี่ก็หมายความว่าไม่สามารถสร้างลำดับที่ยาวนานของการเรียงลำดับ


ทำแลมบ์ดาแทน ฉันคิดว่ามันจะสั้นกว่านี้ โปรดทราบว่าคุณสามารถทำreturn[x...เช่นreturn [x...นั้นได้ เช่นเดียวกันกับpermutations(a) if- permutations(a)ifมันอาจจะเป็น
0WJYxW9FMN

lambda a: [x for x in __import__("itertools").permutations(a) if x==tuple(sorted(a))][0]คือ 88 ไบต์
โด่งดัง 1622

3

K, 31 25

{while[~x~x@<x;x:x@(-#x)?#x];x}

{x@(-#x)?#x}/[{~x~x@<x};]

.

k){x@(-#x)?#x}/[{~x~x@<x};] 3 9 5 6 7 9 1
`s#1 3 5 6 7 9 9

.

k){x@(-#x)?#x}/[{~x~x@<x};] "ascsasd"
`s#"aacdsss"

2

Python (69 ตัวอักษร)

from random import*
def f(a):
 while a>sorted(a):shuffle(a)
 return a

เรียงลำดับจำนวนเต็มตามลำดับตัวเลขที่เพิ่มขึ้น โปรดทราบว่าโซลูชั่นแบบเรียกซ้ำเช่น

from random import*;f=lambda a:a>sorted(a)and(shuffle(a)or f(a))or a

จะล้มเหลวเนื่องจากการโอเวอร์โฟลว์ของสแต็กสำหรับอินพุตขนาดเล็ก (พูดว่า N> 5) เนื่องจาก Python ไม่ได้ทำการปรับให้เหมาะสมแบบ tail-call


2

D โดยไม่มีเครื่องมือเปรียบเทียบที่กำหนดเอง: 59 ตัวอักษร

R f(R)(R r){while(!isSorted(r))r.randomShuffle();return r;}

ชัดเจนยิ่งขึ้น:

R f(R)(R r)
{
    while(!r.isSorted)
        r.randomShuffle();

    return r;
}

D พร้อมตัวเปรียบเทียบแบบกำหนดเอง: 69 ตัวอักษร

R f(alias p,R)(R r){while(!isSorted!p(r))r.randomShuffle();return r;}

ชัดเจนยิ่งขึ้น:

R f(alias p, R)(R r)
{
    while(!isSorted!p(r))
        r.randomShuffle();

    return r;
}

2

สกาลา 73:

def s(l:Seq[Int]):Seq[Int]=if(l==l.sorted)l else s(util.Random.shuffle l)

ใน Scala เราสามารถตรวจสอบได้ว่าคอมไพเลอร์ได้ทำการปรับให้เหมาะสมแบบ tail-call หรือไม่:

@annotation.tailrec
def s(l:Seq[Int]):Seq[Int]=if(l==l.sorted)l else s(util.Random shuffle l)

และใช่มันทำ อย่างไรก็ตามสำหรับรายการสั้น ๆ ของค่า 100:

val rList = (1 to 100).map(x=>r.nextInt (500))
s(rList) 

ใช้เวลาเกือบ 4 เดือนจึงจะเสร็จสมบูรณ์ ;)


2

C # (184 ตัวอักษร)

T[]S<T>(T[]i)where T:IComparable<T>{T l=default(T);while(!i.All(e=>{var r=e.CompareTo(l)>=0;l=e;return r;})){i=i.OrderBy(a=>Guid.NewGuid()).ToArray();l=default(T);}return i.ToArray();}

มันไม่ดีเลยที่จะทำใน C # คุณต้องสนับสนุนข้อมูลทั่วไปเพื่อรองรับทั้งค่าและประเภทการอ้างอิง ไม่มีฟังก์ชั่นการสลับแบบอาเรย์หรือฟังก์ชั่นเพื่อตรวจสอบว่ามีบางอย่างถูกเรียง

ใครบ้างมีเคล็ดลับที่จะทำให้ดีขึ้นหรือไม่

แก้ไขเวอร์ชันที่เรียงลำดับ int เท่านั้น (134 chars):

int[]S(int[]i){var l=0;while(!i.All(e=>{var r=e>=l;l=e;return r;})){i=i.OrderBy(a=>Guid.NewGuid()).ToArray();l=0;}return i.ToArray();}

2

GNU / BASH 65

b(){ IFS=$'\n';echo "$*"|sort -C&&echo "$*"||b $(shuf -e "$@");}

อืมฉันจะได้รับข้อยกเว้นพิเศษในการคืนค่ากฎอาเรย์เนื่องจากฟังก์ชั่นทุบตีสามารถส่งคืนไบต์ที่ไม่ได้ลงชื่อเท่านั้น?
kojiro

2

C ++ 11, 150 ตัวอักษร

#include<deque>
#include<algorithm>
void B(std::deque &A){while(!std::is_sorted(A.begin(),A.end())std::random_shuffle(myvector.begin(),myvector.end());}

เพียงแค่ .. สร้างขึ้นเพื่อความสนุกสนาน


1
std :: random_shuffle ไม่เหมือนกัน ในการชี้แจงก็จะกล่าวว่า: "นอกจากนี้การสับจะต้องเหมือนกัน"
STDQ

โอเค ... ฉันไม่รู้ว่ามันไม่เหมือนกัน

มันอาศัยอยู่กับแรนด์ () ซึ่งไม่ได้เป็นเครื่องแบบ - ดูopen-std.org/jtc1/sc22/wg21/docs/papers/2014/n3924.pdf ดูเหมือนว่าจะมีคนไม่มากนักที่ติดตามดังนั้นฉันคิดว่ามันไม่ใช่เรื่องใหญ่
STDQ

ดังนั้นถ้าฉันใช้สุ่มอย่างเต็มที่เช่นการใช้ srand (เวลา (0)) มันจะนับหรือไม่

ปัญหาคือว่าแรนด์ไม่รับประกันว่าจะมีคุณภาพของตัวเลขสุ่มให้อยู่คนเดียวอย่างสม่ำเสมอบางคนผลิตบิตที่ไม่มีลำดับต่ำแบบสุ่ม ฉันเดาว่ามันไม่ควรและสำคัญในท้ายที่สุด ฉันได้รับ 8 ไบต์เท่านั้นโดยใช้ผู้จัดจำหน่ายเครื่องแบบกับ std :: shuffle และอื่น ๆ ดีพอสำหรับฉัน
STDQ

2

Python - 61 ตัวอักษร

ซ้ำ

from random import*;f=lambda l:l==sorted(l)or shuffle(l)>f(l)

ฟังก์ชั่นของคุณจะคืนค่าจริงหรือเท็จไม่ใช่อาร์เรย์
hallvabo

2
นอกจากนี้โปรดทราบว่าโซลูชันแบบเรียกซ้ำมีความผิดพลาดแม้สำหรับอินพุตขนาดเล็ก
hallvabo

1
@ Hallvabo: จริง ๆ แล้วฉันต้องการเขียนโซลูชันแบบเรียกซ้ำหางใน Scheme ซึ่งแน่นอนว่าจะไม่ทำให้กองซ้อนของคุณหมดหวัง
Chris Jester-Young

@ Hallvabo, Alexandru ได้ทำ Python อย่างชัดเจนแล้วดังนั้นฉันจึงไปหาสิ่งที่แตกต่างที่นี่ แน่นอนว่าการแก้ปัญหาแบบวนซ้ำนั้นเป็นเรื่องสนุกและไม่ใช่นักแข่งขันที่จริงจัง
gnibbler

from random import*อาจสั้นกว่านี้
0WJYxW9FMN

2

PowerShell , 85 82 56 55 52 ไบต์

-26 bytes ขอบคุณคำแนะนำของ mazzy
-1 byte ขอบคุณ AdmBorkBork
-3 bytes ขอบคุณ mazzy

for($l=$args;"$l"-ne($l|sort)){$l=$l|sort{random}}$l

ลองออนไลน์!

PowerShell มีการเปรียบเทียบอาเรย์ที่ค่อนข้างถูกโดยการส่งไปยังสตริงและเปรียบเทียบ


2
ย้ายการparamเริ่มต้นของคุณforไปยังการเริ่มต้นของคุณเพื่อบันทึกไบต์ -for($l=$args;
AdmBorkBork

1
ดี -neปลดเปลื้องโอเปอเรเตอร์ที่เหมาะสมกับสเกลาร์ของโอเปอร์เรเตอร์ซ้าย ดังนั้นคุณสามารถบันทึกไม่กี่ไบต์: ลองออนไลน์!
mazzy

1

Javascript 291 ตัวอักษร

นาที

function f(e){var t=[].concat(e).sort();t.e=function(e){var n=true;t.forEach(function(t,r){if(t!=e[r])n=false});return n};while(!t.e(e.sort(function(){return Math.floor(Math.random()*2)?1:-1}))){console.log(e)}return e}

ยกเลิกนาที

function f(a) {
var b = [].concat(a).sort();
b.e = function (z) {
    var l = true;
    b.forEach(function (v, i) {
        if (v != z[i]) l = false;
    });
    return l
};
while (!b.e(a.sort(function () {
    return Math.floor(Math.random() * 2) ? 1 : -1;
}))) {
    console.log(a);
}
return a;
}

ฉันมีความรู้สึกที่ฉันเคยพูดเรื่องนี้มาก่อน แต่คุณสามารถลบทั้งหมดvarได้ เพียงแค่ทำให้พวกมันกลมกลืนไปโดยปริยายมันแค่สร้างรหัสให้สั้นที่สุด
gcampbell

1

Matlab, 59 ไบต์

วิธีการตรงไปตรงมาค่อนข้าง:

x=input('');while~issorted(x);x=x(randperm(numel(x)));end;x

1

J, 22 ไบต์

$:@({~?~@#)`]@.(-:/:~)

นี่เป็นการเรียกซ้ำโดยใช้วาระการประชุม นี่คือวิธีการทำงาน:

ให้yเป็นรายการของเรา -:/:~ครั้งแรกกริยาทางด้านขวาของวาระการประชุมคือ นี้เป็นคำกริยาที่จัดไว้ให้โดยเกล้าฯรั่วนูน มันตรงกับ ( -:) หรือไม่ว่าการป้อนข้อมูลจะถูกจัดเรียง ( /:~) โดยใช้เบ็ด monadic ( (f g) y = y f (g y)) สิ่งนี้คืนค่าหนึ่งหรือศูนย์ตาม ด้านซ้ายของระเบียบวาระการประชุมเป็นคำกริยาของคำกริยาสอง: ด้านขวาคือกริยาประจำตัว]และด้านซ้ายเป็นที่ที่เกิดการเรียกซ้ำ วาระเลือกคำกริยาเอกลักษณ์ที่ตำแหน่ง1หากรายการถูกเรียงลำดับและกริยายาวที่ตำแหน่ง0หากรายการไม่ถูกเรียงลำดับ

$:@({~?~@#)โทร$:(ที่ยาวที่สุดกริยามันมีอยู่ใน) บนยอดผลมาจากใน{~?~@# yนี้ฟืรายการขณะที่?~@#ใช้เวลาการเปลี่ยนลำดับของความยาวของที่เป็นดัชนีสุ่มเรียงของy ในเบ็ด monadic ส่งคืนรายการจากดัชนีที่มีอาร์กิวเมนต์ที่ถูกต้อง รายการที่สับแล้วนี้จะถูกเรียกอีกครั้งพร้อมวาระการประชุมและทำซ้ำจนกว่าจะมีการเรียงลำดับy{~y


1

C ++ 14, 158 ไบต์

#include <algorithm>
#include <random>
[](int*a,int s){std::random_device r;for(std::knuth_b g(r());!std::is_sorted(a,a+s);std::shuffle(a,a+s,g));return a;};

1

ความท้าทายของเยลลี่ขนาด 6 ไบต์ภาษาจะโพสต์วันที่

ẊŒ¿’$¿

ลองออนไลน์!

คำอธิบาย

ẊŒ¿’$¿
     ¿  While
 Œ¿’$     the input is not in its earliest possible permutation (i.e. sorted)
Ẋ       shuffle it

Œ¿กำหนดหมายเลขให้กับการเรียงลำดับของแต่ละรายการ 1 ถูกเรียงลำดับ 2 มีการแลกเปลี่ยนสององค์ประกอบสุดท้าย ฯลฯ จนถึงแฟกทอเรียลของความยาวรายการ (ซึ่งเป็นรายการในลำดับที่กลับกัน) ดังนั้นสำหรับรายการที่เรียงลำดับค่านี้มีค่า 1 และเราสามารถลดค่าได้โดยใช้เพื่อสร้างการทดสอบแบบ "ไม่เรียงลำดับ" ซึ่งสามารถใช้งานเป็นบูลีนในเงื่อนไขลูปในขณะที่ $คือการทำให้เกิดสภาพที่จะแยกเป็นกลุ่ม


1

C ++, 166 ไบต์

Meh

#import<algorithm>
#import<random>
#define r b.begin(),b.end()
template<class v>
v f(v b){auto a=std::mt19937();while(!std::is_sorted(r))std::shuffle(r,a);return b;}

นี้จะทำงานบนภาชนะ STL ทั้งหมดที่มีและbegin()end()

Ungolfed:

#include <algorithm>
#include <random>
template <class v>
v f(v b) {
    auto a = std::mt19937();
    while (!std::is_sorted(b.begin(),b.end()))
        std::shuffle(b.begin(),b.end(),a);

    return b;
}


1

Brachylogขนาด 5 ไบต์

∈&ṣ≤₁

ลองออนไลน์!

ครั้งแรกที่ฉันเห็นคำตอบของ Brachylog ของ ais523 (ตรงข้ามกับคำตอบ Jelly ของเขาเพราะถ้าฉันไม่เข้าใจผิด user62131 เป็นเขา) ฉันสงสัยว่าถ้าใช้ backtracking แทนการเรียกซ้ำ ตอนแรกฉันลองṣ≤₁แล้ว กลับกลายเป็นว่าเนื่องจากการเลือกแบบสุ่มไม่ได้สร้างผลลัพธ์หลายรายการเท่าที่มันเพิ่งสร้างผลลัพธ์เดียวแบบไม่ระบุชื่อภาคการสุ่มแบบสุ่มไม่สามารถย้อนกลับได้ดังนั้นการรันที่จะล้มเหลวเว้นแต่คุณโชคดีพอที่จะสับเปลี่ยนถูกต้อง ในการลองครั้งแรก หลังจากนั้นฉันพยายามpṣ≤₁ซึ่งใช้เวลาส่วนใหญ่ แต่เนื่องจากรายการที่มีความยาวมีการเรียงสับเปลี่ยนจำนวนมากมันก็ล้มเหลวโดยการสุ่ม หลังจากทิ้งเป้าหมายในการลดความยาวลงในที่สุดฉันก็พบสิ่งนี้:

         The input
∈        is an element of
         an unused implicit variable,
 &       and the input
  ṣ      shuffled randomly
   ≤₁    which is increasing
         is the output.

(การสาธิตแบบสุ่ม)

ถึงแม้ว่ามันจะสั้นกว่านี้เล็กน้อยถ้าเราใช้เสรีภาพกับ I / O ...

Brachylogขนาด 4 ไบต์

⊆ṣ≤₁

ลองออนไลน์!

เพื่อให้เอาต์พุตมีประโยชน์อินพุตจะต้องไม่มีอิลิเมนต์ที่ซ้ำกันใด ๆ เนื่องจากนอกเหนือจากการเรียงลำดับอินพุตเพรดิเคต bogosort นี้จะเพิ่มจำนวนอิลิเมนต์และศูนย์ที่ซ้ำกันแบบสุ่ม (สมมุติฐานมันสามารถเพิ่มอะไรก็ได้ แต่มันก็ไม่ได้) โดยปกติฉันจะไม่พูดถึงบางสิ่งบางอย่างจากการทำงานอย่างถูกต้อง แต่ฉันรู้สึกว่ามันอยู่ในจิตวิญญาณของความท้าทาย

⊆        An ordered superset of the input
 ṣ       shuffled randomly
  ≤₁     which is increasing
         is the output.

1

Perl 6 , 28 ไบต์

{({.pick(*)}...~.sort).tail}

ลองออนไลน์!

บล็อกรหัสไม่ระบุชื่อที่สับรายการจนกว่าจะมีการเรียงลำดับ โปรดทราบว่ามันจะเรียงลำดับรายการอย่างน้อยหนึ่งครั้งซึ่งได้รับอนุญาต และไม่{.pick(*)}สามารถแทนที่ด้วย*.pick(*)


1

Pyth , 11 ไบต์

Wn=Q.SQSQ;Q

ค่อนข้างมีความสุขกับสิ่งนี้อาจจะสามารถเล่นกอล์ฟได้อีก

คำอธิบาย


Wn=Q.SQSQ;Q
W    While
  =Q.SQ    Variable Q (input variable) shuffled 
 n  Does not equal
       SQ    Variable Q sorted
             ;  Do nothing (loop ends)
              Q    And output variable Q

ลองออนไลน์!


1

Japt , 11 9 ไบต์

_eZñ}a@öx

ลองมัน

_eZñ}a@öx     :Implicit input of array U
_             :Function taking an array as argument via parameter Z
 e            :  Test Z for equality with
  Zñ          :  Z sorted
    }         :End function
     a        :Repeat and return the first result that returns true
      @       :Run this function each time and pass the result to the first function
       öx     :  Random permutation of U

1

Brachylog (v2), 5 ไบต์

≤₁|ṣ↰

ลองออนไลน์!

ฟังก์ชั่นการส่ง (ลิงก์ TIO ใช้อาร์กิวเมนต์บรรทัดคำสั่งที่ล้อมฟังก์ชันเข้ากับโปรแกรมเต็มโดยอัตโนมัติ)

คำอธิบาย

≤₁|ṣ↰
≤₁      Assert that {the input} is (nonstrictly) sorted in ascending order
  |     Output it
  |     Exception handler: if an assertion fails:
   ṣ      Randomly shuffle {the input}
    ↰     and run this function recursively on it, {outputting its output}

Prolog (ภาษาที่ Brachylog รวบรวมไว้) เป็นแบบเรียกซ้ำดังนั้นฟังก์ชันนี้จึงถูกเรียบเรียงเป็นวนซ้ำ


0

C (203 ตัวอักษรไม่มีลูปอินพุต: เฉพาะ func)

#include <stdio.h>
#define P (int*a,int n){
#define F for(i=0;i<n;i++){
int i,j,v;s P F if(a[i]>a[i+1])return 0;}return 1;}void h P F v=a[i];a[i]=a[j=rand()%n];a[j]=v;}}void b P while(!s(a,n-1))h(a,n);}

นี่เป็นสิ่งเดียวกันกับที่เราอ่านอาเรย์จาก stdin และเขียนอาเรย์ที่เรียงลำดับ เนื่องจาก Q ถามถึงฟังก์ชั่นไม่ใช่โปรแกรมทั้งหมด ...

C (296 ตัวอักษร)

#include <stdio.h>
#define P (int*a,int n){
#define F for(i=0;i<n;i++){
int i,j,n,v,x[999];s P F if(a[i]>a[i+1])return 0;}return 1;}void h P F j=rand()%n;v=a[i];a[i]=a[j];a[j]=v;}}void b P while(!s(a,n-1))h(a,n);}main(){while(scanf("%d",&v)==1)x[n++]=v;if(!s(x,n))b(x,n);F printf("%d\n",x[i]);}}

การคอมไพล์อาจให้คำเตือน (การประกาศโดยนัย) ขีด จำกัด ขนาดของอาร์เรย์ Hardencoded จำนวน 999 องค์ประกอบ บอบบาง.

หากไม่จำเป็นต้องตรวจสอบล่วงหน้าว่ามีการเรียงแถวลำดับหรือไม่สามารถทำได้ใน 284

C (251 ตัวอักษรคือ 284)

#include <stdio.h>
#define F for(i=0;i<n;i++){
int i,j,n,v,a[999];s(int n){F if(a[i]>a[i+1])return 0;}return 1;}void h(){F v=a[i];a[i]=a[j=rand()%n];a[j]=v;}}void b(){while(!s(n-1))h();}main(){while(scanf("%d",&a[n++])>0);b();F printf("%d\n",a[i]);}}

(ใช้ globals แทนที่จะเป็นฟังก์ชัน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.