30
\$\begingroup\$

Is solving Sudoku too hard? Even the brute force version? Here's a coding exercise that's a little easier. I hope. :-P

Write the shortest function to implement bogosort. In specific, your function should:

  • Take an array (or your language's equivalent) as input
  • Check if its elements are in sorted order; if so, return the array
  • If not, shuffle the elements, and start again

The shortest entry wins. In the case of a tie, a function that supports a custom comparator (and/or pseudorandom number generator) is favoured. Any remaining ties are resolved by favouring the earlier submission.


Clarifications: You can use any element type you want, as long as there's some way to order them, of course. Also, the shuffling has to be uniform; none of this "I'll just quicksort it and call it shuffled" business. :-)

caird coinheringaahing
50.8k11 gold badges133 silver badges363 bronze badges
asked Feb 2, 2011 at 21:24
\$\endgroup\$
12
  • \$\begingroup\$ What are the element types? int or strings? \$\endgroup\$ Commented Feb 2, 2011 at 21:39
  • \$\begingroup\$ @Alexandru: Either is fine. You choose. \$\endgroup\$ Commented Feb 2, 2011 at 21:40
  • \$\begingroup\$ Adding a custom comparator will increase the code length so a winning entry will not have a custom comparator. I think breaking the tie doesn't make sense. \$\endgroup\$ Commented Feb 2, 2011 at 21:57
  • 1
    \$\begingroup\$ It's possible that this algorithm can fail when using pseudo random generator. eg when the length of the list exceeds say 2000, there are 2000! states for the list which may exceed the number of interal states of the prng. \$\endgroup\$ Commented Feb 2, 2011 at 22:38
  • 2
    \$\begingroup\$ Yes, the relevant quote from wikipedia "However, if a pseudorandom number generator is used in place of a random source, it may never terminate, since these exhibit long-term cyclic behavior." \$\endgroup\$ Commented Feb 2, 2011 at 23:30

47 Answers 47

1
2
17
\$\begingroup\$

Perl 6: 23 chars

@s.=pick(*)until[<=] @s
null
12.3k3 gold badges60 silver badges95 bronze badges
answered Feb 3, 2011 at 1:02
\$\endgroup\$
4
  • 1
    \$\begingroup\$ Is this a function in perl? It looks nice :) \$\endgroup\$ Commented Feb 3, 2011 at 18:14
  • 1
    \$\begingroup\$ If you don't know, [<=] checks if a list is sorted: [<=] (1, 2, 3,) == (1 <= 2 <= 3) == (1 <= 2) and (2 <= 3), and .pick(n) chooses n random elements from a list, and .pick(*) lets Perl pick all elements. use.perl.org/~masak/journal/40459 \$\endgroup\$ Commented Feb 4, 2011 at 1:47
  • \$\begingroup\$ This must be Perl 6. I've never seen pick used before, let alone [<=]. Where in the documentation are those? \$\endgroup\$ Commented Oct 15, 2013 at 20:33
  • \$\begingroup\$ @GigaWatt This is Perl 6 (not Perl 5). [] is reduce operator which takes operator between square brackets. For example, [<=] 1, 2, 3 is 1 <= 2 <= 3 (and yes, you do ranges like this in Perl 6). In this case, it's used to determine if elements are in order. .pick(*) method shuffles the list (pick(N) picks N elements from list). .= calls method, and assigns the result to the variable. As for documentation - well, for now only Perl 6 specification exists - feather.perl6.nl/syn, but it exists. \$\endgroup\$ Commented Jan 3, 2014 at 17:54
8
\$\begingroup\$

APL(Dyalog), 20

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

Explanation

is the (right) argument
⍵≡⍵[⍋⍵]: Checks if sorted equals itself
:⍵: If yes, then return
∇⍵[?⍨⍴⍵]: Else, generate an array of 1 to ⍴⍵ (length of ) in random order, reorder according to that (⍵[...]), and apply the function to it ()


Suddenly revisiting this problem and...

APL(Dyalog), 19

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

Was just thinking about sorting an array in the check makes it kind of pointless (not saying that Bogosort is meaningful), a more accurate implementation would be ∧/2≤/⍵, and that happens to lower the char count.

answered Oct 14, 2013 at 22:33
\$\endgroup\$
7
\$\begingroup\$

APL (22)

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

Usage:

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

Explanation:

  • ⍋⍵: returns the indexes of the items in sorted order, so ⍋30 10 20 gives 2 1 3
  • (⍳X←⍴⍵)≡⍋⍵:⍵ Store the length of input list in X. If range [1..X] is equal to the sorted index order, the list is sorted, so return it.
  • ⋄∇⍵[X?X]: if this is not the case, recurse with shuffled array.
answered May 23, 2012 at 18:00
\$\endgroup\$
7
\$\begingroup\$

Ruby - 33 characters

g=->l{l.shuffle!!=l.sort ?redo:l}
answered Feb 3, 2011 at 0:11
\$\endgroup\$
4
  • \$\begingroup\$ 1 char less: g=proc{|l|0until l.sort==l.shuffle!} \$\endgroup\$ Commented Jan 31, 2012 at 21:59
  • \$\begingroup\$ @AShelly, your version doesn't work. My version (5 chars less) f=->l{l.sort!=l.shuffle!?redo:l} (Ruby 1.9) \$\endgroup\$ Commented Mar 11, 2012 at 20:07
  • \$\begingroup\$ can someone please explain to me why redo works with a proc but not in a classical method with def...end? I thought redo only works with loops? \$\endgroup\$ Commented Jul 27, 2012 at 20:19
  • 1
    \$\begingroup\$ Ok never mind, i found something in 'The Ruby Programming Language' book: "redo [...] transfers control back to the beginning of the proc or lambda". It simply is that way. \$\endgroup\$ Commented Jul 27, 2012 at 20:26
6
\$\begingroup\$

Mathematica, (削除) 40 (削除ここまで) 37

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

With whitespace:

NestWhile[RandomSample, #, Sort@# != # &] &
answered Jun 4, 2012 at 9:06
\$\endgroup\$
2
  • \$\begingroup\$ If you ignore errors, you can save three bytes with #//.l_/;Sort@l!=l:>RandomSample@l& \$\endgroup\$ Commented Sep 30, 2015 at 14:41
  • \$\begingroup\$ 13sh bytes in Mthmca. \$\endgroup\$ Commented Jul 20, 2016 at 9:10
5
\$\begingroup\$

J - (削除) 34 (削除ここまで) 27

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

eg:

f 5 4 1 3 2
1 2 3 4 5
f 'hello'
ehllo

The {~ ?~@# part shuffles the input:

({~ ?~@#) 1 9 8 4
4 8 9 1
({~ ?~@#) 'abcd'
bdca
answered Feb 2, 2011 at 22:41
\$\endgroup\$
4
\$\begingroup\$

Python 61

Sorts in place.

import random
def f(l):
 while l!=sorted(l):random.shuffle(l)
answered Feb 2, 2011 at 21:42
\$\endgroup\$
7
  • \$\begingroup\$ Your function does not return the array on success. \$\endgroup\$ Commented Feb 3, 2011 at 13:47
  • \$\begingroup\$ Sorts in place. The passed array is modified. \$\endgroup\$ Commented Feb 3, 2011 at 14:38
  • \$\begingroup\$ The question does say that the function is supposed to return the array though - even if it isn't technically necessary to get the result. \$\endgroup\$ Commented Feb 3, 2011 at 18:01
  • 1
    \$\begingroup\$ from random import* can save a char. \$\endgroup\$ Commented May 28, 2012 at 10:39
  • 1
    \$\begingroup\$ This may not always work: (from python random module documentation): "Note that for even rather small len(x), the total number of permutations of x is larger than the period of most random number generators; this implies that most permutations of a long sequence can never be generated." \$\endgroup\$ Commented Jul 27, 2012 at 17:06
3
\$\begingroup\$

Python 94

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

Other python answers use random.shuffle(). The documentation of the python random module states:

Note that for even rather small len(x), the total number of permutations of x is larger than the period of most random number generators; this implies that most permutations of a long sequence can never be generated.

answered Jul 27, 2012 at 17:46
\$\endgroup\$
2
  • \$\begingroup\$ Do a lambda instead; I think it would be shorter. Also note that you can do return[x... as opposed to return [x.... Same with permutations(a) if -- it could be permutations(a)if. \$\endgroup\$ Commented Feb 12, 2017 at 21:42
  • \$\begingroup\$ lambda a: [x for x in __import__("itertools").permutations(a) if x==tuple(sorted(a))][0] is 88 bytes \$\endgroup\$ Commented Nov 6, 2019 at 18:11
3
\$\begingroup\$

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"
answered May 28, 2012 at 1:56
\$\endgroup\$
3
\$\begingroup\$

C++11, 150 characters

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

Just.. made for fun.

answered Jun 4, 2016 at 15:34
\$\endgroup\$
5
  • 1
    \$\begingroup\$ std::random_shuffle is not uniform. In the clarifications it is stated: "Also, the shuffling has to be uniform" \$\endgroup\$ Commented Jun 4, 2016 at 21:30
  • \$\begingroup\$ Okay... i didn't know it was not uniform. \$\endgroup\$ Commented Jun 5, 2016 at 2:23
  • \$\begingroup\$ It relies on rand() which is not uniform -- see open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3924.pdf . Not many other people are seem to be following so meh i guess it's not a big deal. \$\endgroup\$ Commented Jun 6, 2016 at 0:46
  • \$\begingroup\$ So if I use a fully random one like using srand(time(0)) then does it count? \$\endgroup\$ Commented Jun 6, 2016 at 0:54
  • \$\begingroup\$ Problem is that rand is not guaranteed to have good quality of random numbers let alone uniformity, some produce non-random low-order bits. I guess it doesn't nor should matter in the end. I only got 8 more bytes using a uniform distributor with std::shuffle and so forth, good enough for me. \$\endgroup\$ Commented Jun 8, 2016 at 3:52
2
\$\begingroup\$

Python (69 chars)

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

Sorts integers in increasing numeric order. Note that recursive solutions, like

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

will fail due to stack overflow for even small inputs (say N>5), because Python does not do tail-call optimisation.

answered Feb 3, 2011 at 14:14
\$\endgroup\$
2
\$\begingroup\$

D without custom comparator: 59 Characters

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

More Legibly:

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

D with custom comparator: 69 Characters

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

More Legibly:

R f(alias p, R)(R r)
{
 while(!isSorted!p(r))
 r.randomShuffle();
 return r;
}
answered Feb 3, 2011 at 17:58
\$\endgroup\$
2
\$\begingroup\$

Scala 73:

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

In Scala, we can check whether the compiler did a tail-call optimization:

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

and yes, it did. However, for a short List of 100 values:

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

took nearly 4 months to complete. ;)

answered May 28, 2012 at 4:00
\$\endgroup\$
2
\$\begingroup\$

C# (184 chars)

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();}

It's not really nice to do this in C#. You have to support generics to support both value and reference types. There is no array shuffle function or function to check if something is sorted.

Does anybody got any tips to make this better?

Edit Version that only sorts 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();}
answered Jun 2, 2012 at 10:36
\$\endgroup\$
2
\$\begingroup\$

GNU/BASH 65

b(){ IFS=$'\n';echo "$*"|sort -C&&echo "$*"||b $(shuf -e "$@");}
answered Oct 13, 2013 at 18:22
\$\endgroup\$
1
  • \$\begingroup\$ Hmm, can I get a special exception to the return the array rule since bash functions can only literally return an unsigned byte? \$\endgroup\$ Commented Oct 16, 2013 at 2:03
2
\$\begingroup\$

Javascript 291 characters

min

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}

un-min

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;
}
answered Oct 15, 2013 at 18:00
\$\endgroup\$
1
  • \$\begingroup\$ I have a feeling I've said this before, but you can remove all the vars. Just make them all implicit globals, it's just about making the code as short as possible. \$\endgroup\$ Commented Jun 3, 2016 at 18:24
2
\$\begingroup\$

C++14, 158 bytes

#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;};
answered Jun 4, 2016 at 22:09
\$\endgroup\$
1
  • \$\begingroup\$ you can reduce <algorithm> to <regex>; the latter includes the former automatically, also, you can remove whitespaces in the two #includes \$\endgroup\$ Commented Sep 4, 2022 at 8:07
2
\$\begingroup\$

Python - 61 chars

Recursive

from random import*;f=lambda l:l==sorted(l)or shuffle(l)>f(l)
answered Feb 2, 2011 at 22:52
\$\endgroup\$
6
  • \$\begingroup\$ Your function returns True or False, not the array. \$\endgroup\$ Commented Feb 3, 2011 at 13:49
  • 2
    \$\begingroup\$ Also note that recursive solutions are doomed to failure even for small inputs. \$\endgroup\$ Commented Feb 3, 2011 at 14:00
  • 1
    \$\begingroup\$ @hallvabo: I actually want to write a tail-recursive solution in Scheme, which won't deplete your stack, of course. \$\endgroup\$ Commented Feb 3, 2011 at 15:35
  • \$\begingroup\$ @hallvabo, Alexandru had already done the obvious Python solution, so I was just going for something different here. Of course the recursive solution is just for fun and not a serious contender \$\endgroup\$ Commented Feb 3, 2011 at 19:48
  • \$\begingroup\$ from random import* might be shorter. \$\endgroup\$ Commented Feb 12, 2017 at 21:43
2
\$\begingroup\$

Jelly, 6 bytes, language postdates challenge

ẊŒ¿’$¿

Try it online!

Explanation

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

Œ¿ assigns a number to each permutation of a list; 1 is sorted, 2 has the last two elements exchanged, etc., up to the factorial of the list length (which is the list in reverse order). So for a sorted list, this has the value 1, and we can decrement it using in order to produce a "not sorted" test that's usable as a Boolean in a while loop condition. The $ is to cause the condition to parse as a group.

answered Feb 16, 2017 at 17:48
\$\endgroup\$
2
\$\begingroup\$

PowerShell, (削除) 85 (削除ここまで) (削除) 82 (削除ここまで) (削除) 56 (削除ここまで) (削除) 55 (削除ここまで) 52 bytes

-26 bytes thanks to mazzy's suggestions
-1 byte thanks to AdmBorkBork
-3 bytes thanks to mazzy

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

Try it online!

PowerShell does have a relatively cheap array comparison by casting them to strings and comparing that.

answered Nov 7, 2019 at 20:30
\$\endgroup\$
2
  • 2
    \$\begingroup\$ Move your param initialization into your for initialization to save a byte -- for($l=$args; \$\endgroup\$ Commented Nov 8, 2019 at 15:04
  • 1
    \$\begingroup\$ nice. -ne casts the right operator to a scalar type of the left operator. so, you can save a few bytes: Try it online! \$\endgroup\$ Commented Nov 8, 2019 at 17:07
2
\$\begingroup\$

Go 1.20+, 95 bytes

import(."math/rand";."sort")
func f[T Interface](I T){for!IsSorted(I){Shuffle(I.Len(),I.Swap)}}

Attempt This Online!

Expects input to implement sort.Interface, which wants:

  • Len() int: gets the number of elements.
  • Less(i, j int) bool: checks whether the element at index i is less than the element at index j.
  • Swap(i, j int): swaps elements at indexes i and j.

Why is this 1.20+? See below.

Go, 158 bytes, seeded ints (pre-1.20)

import(."math/rand";."sort";."time")
func f(I[]int)[]int{Seed(Now().Unix())
for!IntsAreSorted(I){Shuffle(len(I),func(i,j int){I[i],I[j]=I[j],I[i]})}
return I}

Attempt This Online!

Go, 131 bytes, unseeded ints (pre-1.20), truly random (post-1.20)

import(."math/rand";."sort")
func f(I[]int)[]int{for!IntsAreSorted(I){Shuffle(len(I),func(i,j int){I[i],I[j]=I[j],I[i]})}
return I}

Attempt This Online!

This solution is marked as both "unseeded" and "truly random" due to a change in Go v1.20 that changed the global, default random number generator to be seeded "randomly" rather than be default, deterministic rand.Seed(1) in pre-1.20 versions.

answered Mar 23, 2023 at 13:20
\$\endgroup\$
2
\$\begingroup\$

JavaScript, (削除) 98 (削除ここまで) 92 chars

More precisely ECMAScript 2015 (ES6)

Minified:

let b=r=>{for(;!r.every((o,t)=>o==[...r].sort()[t]);)r.sort(()=>Math.random()-.5);return r};

Invocation: console.log(b([3, 2, 1, 5, 67, 4, 6, 5, 6, 4]))

Not minified:

let bogoSort = (myArray) => {
 while (!myArray.every((v, i) => v == [...myArray].sort()[i])) { 
 myArray.sort(() => Math.random() -0.5) 
 }
 return myArray
}

Explanation:

  • myArray.every() is an element-wise compare function. Comparing shuffled with sorted array
  • someArray.sort() sorts in place so saving assignments, but also needs cloning for the sorted array
  • [...myArray] clones the array (array destructuring)
  • () => (Math.random() > .5) ? 1 : -1 is a custom compare function. Coin flip whether to order an element in front or behind
answered Mar 23, 2023 at 12:47
\$\endgroup\$
1
\$\begingroup\$

Python, 71 characters

from random import*
def b(l):
 while l!=sorted(l):shuffle(l)
 return(l)

Not the shortest one, but it works.

Ungolfed:

from random import *
def bogosort(list):
 while list != sorted(list):
 shuffle(list)
 return(list)

Usage:

Input: b([1, 7, 3, 9, 2])

Output: [1, 2, 3, 7, 9]

answered Jun 3, 2016 at 17:13
\$\endgroup\$
2
  • \$\begingroup\$ Return isn't a function, you don't need parenthesis... \$\endgroup\$ Commented Feb 12, 2017 at 21:25
  • \$\begingroup\$ you can use l<sorted(l) instead of != \$\endgroup\$ Commented Feb 12, 2017 at 23:10
1
\$\begingroup\$

Matlab, 59 bytes

Relatively straight forward approach:

x=input('');while~issorted(x);x=x(randperm(numel(x)));end;x
answered Jun 3, 2016 at 22:14
\$\endgroup\$
1
\$\begingroup\$

J, 22 bytes

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

This is a recursive, tacit monad using an agenda. Here's how it works:

Let y be our list. First, the verb on the right of the agenda is -:/:~. This a verb graciously provided by Leaky Nun. It matches (-:) whether or not the input is sorted (/:~) using a monadic hook. ((f g) y = y f (g y)) This returns a one or a zero accordingly. The left hand side of the agenda is a gerund of two verbs: on the right is the identity verb ], and on the left is where the recursion takes place. The agenda selects either the identity verb at position 1 if the list is sorted, and the longer verb at position 0 if the list isn't sorted.

$:@({~?~@#) calls $: (the longest verb it is contained in) atop the result of {~?~@# on y. This shuffles the list, as ?~@# takes the permutations of the length of y, being randomly-sorted indices of y. {~, in a monadic hook, returns a list from y whose indices are the right arg. This shuffled list is then called again with the agenda, and repeats until it is sorted.

answered Jun 4, 2016 at 16:08
\$\endgroup\$
1
\$\begingroup\$

C++, 166 bytes

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;}

This should work on all STL containers that have begin() and 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;
}
answered Mar 22, 2019 at 21:15
\$\endgroup\$
1
\$\begingroup\$

APL (Dyalog Extended), 15 bytes

(?⍨∘≢⊇⊢)⍣{⍺≡∧⍺}

Try it online!

answered Mar 22, 2019 at 21:22
\$\endgroup\$
1
1
\$\begingroup\$

Brachylog, 5 bytes

∈&ṣ≤1

Try it online!

When I first saw ais523's Brachylog answer (as opposed to his Jelly answer, because if I'm not mistaken user62131 was also him), I wondered, what if it used backtracking instead of recursion? So at first, I tried ṣ≤1. Turns out, since choosing something at random doesn't produce multiple outputs so much as it just produces one output nondeterministically, the shuffle predicate can't be backtracked to, so running that will simply fail unless you're lucky enough to shuffle it right on the first try. After that, I tried pṣ≤1, which worked most of the time, but since a finitely long list has finitely many permutations, it still failed at random sometimes. After having abandoned the goal of achieving length reduction, I finally came up with this:

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

(Demonstration of randomness)

Although it actually can be a bit shorter if we take some liberties with I/O...

Brachylog, 4 bytes

⊆ṣ≤1

Try it online!

In order for the output to be useful, the input must not contain any duplicate elements, because in addition to sorting the input, this bogosort predicate adds in a random number of duplicate elements and zeroes. (Hypothetically, it could add in anything, but it just kind of doesn't.) Ordinarily I wouldn't bother mentioning something so far from correctly functioning, but I feel it's in the spirit of the challenge.

⊆ An ordered superset of the input
 ṣ shuffled randomly
 ≤1 which is increasing
 is the output.
answered Mar 22, 2019 at 22:44
\$\endgroup\$
1
\$\begingroup\$

Perl 6, 28 bytes

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

Try it online!

Anonymous code block that shuffles the list until it is sorted. Note that it sorts the list at least once, which is allowed. And no, the {.pick(*)} can't be replaced with *.pick(*)

answered Mar 23, 2019 at 0:41
\$\endgroup\$
1
\$\begingroup\$

Pyth, 11 bytes

Wn=Q.SQSQ;Q

Pretty happy with this, probably can be golfed a bit more

Explanation


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

Try it online!

answered Nov 5, 2019 at 15:37
\$\endgroup\$
1
  • \$\begingroup\$ You can shorten =Q.SQ to =.SQ for -1 byte (works with other operators too, like =QhQ-> =hQ) \$\endgroup\$ Commented Dec 3, 2019 at 8:39
1
2

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.