Czy rozwiązywanie Sudoku jest zbyt trudne? Nawet wersja z brutalną siłą ? Oto ćwiczenie kodowania, które jest trochę łatwiejsze. Mam nadzieję. :-P
Napisz najkrótszą funkcję, aby zaimplementować bogosort. W szczególności twoja funkcja powinna:
- Weź tablicę (lub odpowiednik twojego języka) jako dane wejściowe
- Sprawdź, czy jego elementy są posortowane; jeśli tak, zwróć tablicę
- Jeśli nie, potasuj elementy i zacznij od nowa
Najkrótszy wpis wygrywa. W przypadku remisu preferowana jest funkcja obsługująca niestandardowy komparator (i / lub generator liczb pseudolosowych). Wszelkie pozostałe powiązania są rozwiązywane przez faworyzowanie wcześniejszego zgłoszenia.
Wyjaśnienia: Możesz użyć dowolnego typu elementu, o ile oczywiście istnieje sposób na ich zamówienie. Ponadto tasowanie musi być jednolite; nic z tego „po prostu posortuję to i nazwałbym to przetasowaniem”. :-)
Odpowiedzi:
APL (Dyalog), 20
Wyjaśnienie
⍵
jest (prawy) argument⍵≡⍵[⍋⍵]
: sprawdza, czy⍵
posortowane jest⍵
samo:⍵
: Jeśli tak, to zwróć⍵
∇⍵[?⍨⍴⍵]
: W przeciwnym razie wygeneruj tablicę od 1 do⍴⍵
(długość⍵
) w kolejności losowej, uporządkuj⍵
zgodnie z tym (⍵[...]
) i zastosuj do niej funkcję (∇
)Nagle przeglądam ten problem i ...
APL (Dyalog), 19
Samo myślenie o posortowaniu tablicy w czeku sprawia, że jest to trochę bezcelowe (nie mówiąc, że Bogosort ma sens), byłaby bardziej dokładna implementacja
∧/2≤/⍵
, a to bywa, że obniża liczbę znaków.źródło
Perl 6: 23 znaków
źródło
[<=]
sprawdza, czy lista jest posortowana:[<=] (1, 2, 3,) == (1 <= 2 <= 3) == (1 <= 2) and (2 <= 3)
i.pick(n)
wybiera n losowych elementów z listy i.pick(*)
pozwala Perlowi wybrać wszystkie elementy. use.perl.org/~masak/journal/40459pick
używanego, a co dopiero[<=]
. Gdzie są w dokumentacji?[]
to operator redukujący, który przenosi operatora między nawiasami kwadratowymi. Na przykład[<=] 1, 2, 3
jest1 <= 2 <= 3
(i tak, robisz takie zakresy w Perlu 6). W tym przypadku służy do ustalenia, czy elementy są w porządku..pick(*)
Metoda przetasowuje listę (pick(N)
wybieraN
elementy z listy)..=
wywołuje metodę i przypisuje wynik do zmiennej. Co do dokumentacji - cóż, na razie istnieje tylko specyfikacja Perla 6 - feather.perl6.nl/syn , ale istnieje.APL (22)
Stosowanie:
Wyjaśnienie:
⍋⍵
: zwraca indeksy pozycji w posortowanej kolejności, więc⍋30 10 20
daje2 1 3
(⍳X←⍴⍵)≡⍋⍵:⍵
Zachowaj długość listy danych wejściowych w X. Jeśli zakres[1..X]
jest równy posortowanej kolejności indeksu, lista jest sortowana, więc ją zwróć.⋄∇⍵[X?X]
: jeśli tak nie jest, powtórz z tasowaną tablicą.źródło
Ruby - 33 znaki
źródło
g=proc{|l|0until l.sort==l.shuffle!}
f=->l{l.sort!=l.shuffle!?redo:l}
(Ruby 1.9)redo
działaproc
metodą klasyczną, ale nie klasycznądef...end
? Myślałem, żeredo
działa tylko z pętlami?redo
[…] przenosi kontrolę z powrotem na początek proc lub lambda”. Po prostu tak jest.Mathematica ,
4037Z białymi znakami:
źródło
#//.l_/;Sort@l!=l:>RandomSample@l&
J -
3427na przykład:
Część {~? ~ @ # Tasuje dane wejściowe:
źródło
Python 61
Sortuje na miejscu.
źródło
from random import*
może uratować char.Python 94
Inne odpowiedzi w Pythonie używają random.shuffle (). Dokumentacja losowego modułu python stwierdza:
źródło
return[x...
inaczejreturn [x...
. To samo zpermutations(a) if
- może byćpermutations(a)if
.lambda a: [x for x in __import__("itertools").permutations(a) if x==tuple(sorted(a))][0]
ma 88 bajtówK,
3125{while[~x~x@<x;x:x@(-#x)?#x];x}
.
.
źródło
Python (69 znaków)
Sortuje liczby całkowite w kolejności numerycznej. Zauważ, że rozwiązania rekurencyjne, takie jak
from random import*;f=lambda a:a>sorted(a)and(shuffle(a)or f(a))or a
zawiedzie z powodu przepełnienia stosu nawet dla małych danych wejściowych (powiedzmy N> 5), ponieważ Python nie wykonuje optymalizacji wywołania ogona.
źródło
D bez niestandardowego komparatora: 59 znaków
Bardziej czytelnie:
D z niestandardowym komparatorem: 69 znaków
Bardziej czytelnie:
źródło
Scala 73:
W Scali możemy sprawdzić, czy kompilator wykonał optymalizację wywołania ogona:
i tak się stało. Jednak w przypadku krótkiej listy 100 wartości:
zajęło prawie 4 miesiące. ;)
źródło
C # (184 znaki)
To nie jest naprawdę miłe robić to w C #. Musisz obsługiwać ogólne, aby obsługiwać zarówno typy wartości, jak i typy referencyjne. Nie ma funkcji losowej tablicy ani funkcji sprawdzającej, czy coś jest posortowane.
Czy ktoś ma jakieś wskazówki, aby to poprawić?
Edytuj wersję, która sortuje tylko int (134 znaki):
źródło
GNU / BASH 65
źródło
C ++ 11, 150 znaków
Po prostu ... stworzony dla zabawy.
źródło
Python - 61 znaków
Rekurencyjne
źródło
from random import*
może być krótszy.PowerShell ,
8582565552 bajtów-26 bajtów dzięki sugestiom Mazzy
-1 bajtów dzięki AdmBorkBork
-3 bajtów dzięki mazzy
Wypróbuj online!
PowerShell ma stosunkowo tanie porównanie tablic, rzutując je na łańcuchy i porównując.
źródło
param
inicjalizację do swojejfor
inicjalizacji, aby zapisać bajt -for($l=$args;
-ne
rzutuje prawy operator na skalarny typ lewego operatora. więc możesz zaoszczędzić kilka bajtów: Wypróbuj online!Javascript 291 znaków
min
un-min
źródło
var
s. Po prostu uczyń je wszystkimi niejawnymi globalsami, wystarczy, aby kod był jak najkrótszy.Matlab, 59 bajtów
Względnie proste podejście:
źródło
J, 22 bajty
Jest to rekurencyjna, milcząca monada wykorzystująca porządek obrad. Oto jak to działa:
Pozwól
y
nam być naszą listą. Po pierwsze, czasownik po prawej stronie porządku dziennego to-:/:~
. To czasownik łaskawie podany przez Leaky Nun . Dopasowuje (-:
), czy dane wejściowe są sortowane (/:~
) za pomocą monadycznego haka. ((f g) y = y f (g y)
) Zwraca odpowiednio jeden lub zero. Po lewej stronie porządku dziennego znajduje się gerund dwóch czasowników: po prawej stronie jest czasownik tożsamości]
, a po lewej następuje rekursja. Agenda wybiera albo czasownik tożsamości na pozycji,1
jeśli lista jest posortowana, a dłuższy czasownik na pozycji,0
jeśli lista nie jest posortowana.$:@({~?~@#)
wywołań$:
(najdłuższy czasownik, w którym się znajduje) na szczycie wyniku{~?~@#
ony
. To przetasowuje listę, podobnie jak?~@#
permutacje długościy
, będąc losowo posortowanymi wskaźnikamiy
.{~
, w monadycznym haczyku, zwraca listę, zy
której indeksów jest odpowiedni argument. Ta przetasowana lista jest następnie ponownie wywoływana z porządkiem obrad i powtarza się, aż zostanie posortowana.źródło
C ++ 14, 158 bajtów
źródło
Galaretka , 6 bajtów, wyzwanie dla postdate języka
Wypróbuj online!
Wyjaśnienie
Œ¿
przypisuje liczbę do każdej permutacji listy; 1 jest sortowane, 2 ma wymieniane dwa ostatnie elementy itd., Aż do silni długości listy (która jest listą w odwrotnej kolejności). Tak więc dla posortowanej listy ma ona wartość 1 i możemy ją zmniejszyć za pomocą’
w celu wygenerowania testu „nieposortowanego”, który można wykorzystać jako wartość logiczną w pętli while. Spowoduje$
to, że warunek zostanie przeanalizowany jako grupa.źródło
C ++, 166 bajtów
Meh
Powinno to działać na wszystkich kontenerach STL, które mają
begin()
iend()
.Nie golfowany:
źródło
APL (Dyalog Extended) , 15 bajtów
Wypróbuj online!
źródło
?⍨∘≢⍛⊇⍨⍣{⍺≡∧⍺}
Brachylog , 5 bajtów
Wypróbuj online!
Kiedy po raz pierwszy zobaczyłem odpowiedź Brachylog ais523 (w przeciwieństwie do jego odpowiedzi Jelly, bo jeśli się nie mylę, użytkownik 62131 był również nim), zastanawiałem się, co by było, gdyby używał cofania zamiast rekurencji? Na początku próbowałem
ṣ≤₁
. Okazuje się, że ponieważ losowe wybranie czegoś nie daje wielu wyników, ponieważ powoduje tylko jedno wyjście w sposób nieokreślony, predykatu losowaniaṣ
nie można cofnąć, więc uruchomienie nie powiedzie się, chyba że masz szczęście, aby to poprawnie przetasować za pierwszym razem. Potem próbowałempṣ≤₁
, co działało przez większość czasu, ale ponieważ skończona długa lista ma skończenie wiele permutacji, nadal czasami zawodziła losowo. Po porzuceniu celu zmniejszenia długości w końcu wpadłem na to:(Demonstracja losowości)
Chociaż w rzeczywistości może być nieco krótszy, jeśli weźmiemy trochę wolności z I / O ...
Brachylog , 4 bajty
Wypróbuj online!
Aby dane wyjściowe były użyteczne, dane wejściowe nie mogą zawierać żadnych zduplikowanych elementów, ponieważ oprócz sortowania danych wejściowych ten predykat bogosort dodaje losową liczbę zduplikowanych elementów i zer. (Hipotetycznie może dodać wszystko, ale po prostu tak nie jest.) Zwykle nie zawracałbym sobie głowy wspominaniem czegoś tak dalekiego od prawidłowego funkcjonowania, ale czuję, że jest to zgodne z duchem wyzwania.
źródło
Perl 6 , 28 bajtów
Wypróbuj online!
Anonimowy blok kodu, który przetasowuje listę aż do jej posortowania. Pamiętaj, że sortuje listę co najmniej raz, co jest dozwolone. I nie,
{.pick(*)}
nie można tego zastąpić*.pick(*)
źródło
Pyth , 11 bajtów
Zadowolony z tego, prawdopodobnie można grać w golfa jeszcze trochę
Wyjaśnienie
Wypróbuj online!
źródło
=Q.SQ
do=.SQ
-1 bajtu (działa również z innymi operatorami, takimi jak=QhQ
->=hQ
)Japt ,
119 bajtówSpróbuj
źródło
Brachylog (v2), 5 bajtów
Wypróbuj online!
Podanie funkcji. (Łącze TIO używa argumentu wiersza poleceń, który automatycznie pakuje funkcję w pełny program.)
Wyjaśnienie
Prolog (język, w którym kompiluje się Brachylog) jest rekurencyjny, więc ta funkcja kończy się kompilacją w ciasną pętlę.
źródło
C (203 znaków, brak pętli wejściowej: tylko func)
Jest to to samo co poniżej, w którym czytamy również tablicę ze standardowego wejścia i wypisujemy posortowaną tablicę. Ponieważ Q poprosił o funkcję, a nie cały program ...
C (296 znaków)
Kompilacja może dać ostrzeżenie (niejawne deklaracje). Hardencoded limit rozmiaru tablicy 999 elementów. Kruchy.
jeśli nie ma potrzeby wstępnego sprawdzania, czy tablica jest posortowana, można to zrobić w 284.
C (251 znaków, było 284)
(używając globali zamiast argumentów funkcji).
źródło