Является ли решение судоку слишком сложно? Даже версия грубой силы ? Вот упражнение по кодированию, которое немного проще. Я надеюсь. :-П
Напишите самую короткую функцию для реализации bogosort. В частности, ваша функция должна:
- Возьмите массив (или эквивалент вашего языка) в качестве ввода
- Проверьте, находятся ли его элементы в отсортированном порядке; если это так, вернуть массив
- Если нет, перетасуйте элементы и начните снова
Самый короткий вход побеждает. В случае связи предпочтительнее использовать функцию, которая поддерживает пользовательский компаратор (и / или генератор псевдослучайных чисел). Любые оставшиеся связи решаются в пользу более раннего представления.
Пояснения: Вы можете использовать любой тип элемента, если хотите, если, конечно, есть какой-то способ их заказать. Кроме того, перетасовка должна быть равномерной; ничего из этого «я просто быстро сортирую и назову это перетасованным» бизнесом. :-)
Ответы:
APL (Дьялог), 20
объяснение
⍵
является (правым) аргументом⍵≡⍵[⍋⍵]
: Проверяет,⍵
равна ли сортируемая величина⍵
самому себе:⍵
: Если да, то возвращает⍵
∇⍵[?⍨⍴⍵]
: Иначе, генерирует массив от 1 до⍴⍵
(длина⍵
) в случайном порядке, переупорядочивает в⍵
соответствии с этим (⍵[...]
) и применяет функцию к нему (∇
)Внезапно вернуться к этой проблеме и ...
APL (Дьялог), 19
Просто мысль о сортировке массива в проверке делает его бессмысленным (не говоря о том, что Bogosort имеет смысл), более точная реализация будет
∧/2≤/⍵
, и это приведет к снижению количества символов.источник
Perl 6: 23 символа
источник
[<=]
проверяет, отсортирован ли список:,[<=] (1, 2, 3,) == (1 <= 2 <= 3) == (1 <= 2) and (2 <= 3)
и.pick(n)
выбирает из списка n случайных элементов, и.pick(*)
позволяет Perl выбирать все элементы. use.perl.org/~masak/journal/40459pick
раньше, не говоря уже о[<=]
. Где в документации те?[]
это оператор сокращения, который переводит оператор в квадратные скобки. Например,[<=] 1, 2, 3
есть1 <= 2 <= 3
(и да, вы делаете такие диапазоны в Perl 6). В этом случае он используется для определения порядка элементов..pick(*)
метод перемешивает список (pick(N)
выбираетN
элементы из списка)..=
вызывает метод и присваивает результат переменной. Что касается документации - на данный момент существует только спецификация Perl 6 - feather.perl6.nl/syn , но она существует.APL (22)
Использование:
Объяснение:
⍋⍵
: возвращает индексы элементов в отсортированном порядке, поэтому⍋30 10 20
дает2 1 3
(⍳X←⍴⍵)≡⍋⍵:⍵
Сохраните длину входного списка в X. Если диапазон[1..X]
равен порядку отсортированного индекса, список отсортирован, поэтому верните его.⋄∇⍵[X?X]
: если это не так, рекурсивно использовать перемешанный массив.источник
Рубин - 33 персонажа
источник
g=proc{|l|0until l.sort==l.shuffle!}
f=->l{l.sort!=l.shuffle!?redo:l}
(Ruby 1.9)redo
работает,proc
но не в классическом методе сdef...end
? Я думал, чтоredo
работает только с петлями?redo
[…] передает управление обратно в начало процесса или лямбды». Это просто так.Математика ,
4037С пробелами:
источник
#//.l_/;Sort@l!=l:>RandomSample@l&
J -
3427например:
Часть {~? ~ @ # Тасует ввод:
источник
Python 61
Сортировка на месте.
источник
from random import*
может сохранить символPython 94
Другие ответы Python используют random.shuffle (). Документация случайного модуля Python гласит:
источник
return[x...
в отличие отreturn [x...
. То же самое сpermutations(a) if
- это может бытьpermutations(a)if
.lambda a: [x for x in __import__("itertools").permutations(a) if x==tuple(sorted(a))][0]
составляет 88 байтовК,
3125{while[~x~x@<x;x:x@(-#x)?#x];x}
,
,
источник
Python (69 символов)
Сортирует целые числа в порядке возрастания чисел. Обратите внимание, что рекурсивные решения, такие как
from random import*;f=lambda a:a>sorted(a)and(shuffle(a)or f(a))or a
потерпит неудачу из-за переполнения стека даже для небольших входных данных (скажем, N> 5), потому что Python не выполняет оптимизацию хвостового вызова.
источник
D без пользовательского компаратора: 59 символов
Более разборчиво:
D с пользовательским компаратором: 69 символов
Более разборчиво:
источник
Скала 73:
В Scala мы можем проверить, выполнял ли компилятор оптимизацию хвостового вызова:
и да, это так. Однако для краткого списка из 100 значений:
Потребовалось почти 4 месяца, чтобы завершить. ;)
источник
C # (184 символа)
Это не очень приятно делать в C #. Вы должны поддерживать дженерики для поддержки как значений, так и ссылочных типов. Нет функции перемешивания массива или функции, чтобы проверить, отсортировано ли что-либо.
У кого-нибудь есть советы, как сделать это лучше?
Редактировать версию, которая только сортирует int (134 символа):
источник
GNU / BASH 65
источник
C ++ 11, 150 символов
Просто .. сделано для удовольствия.
источник
Питон - 61 символ
рекурсивный
источник
from random import*
может быть короче.PowerShell ,
8582565552 байта-26 байт благодаря предложениям mazzy
-1 байт благодаря AdmBorkBork
-3 байт благодаря mazzy
Попробуйте онлайн!
PowerShell имеет сравнительно дешевое сравнение массивов, приводя их к строкам и сравнивая их.
источник
param
инициализацию в своюfor
инициализацию, чтобы сохранить байт -for($l=$args;
-ne
приводит правый оператор к скалярному типу левого оператора. Итак, вы можете сохранить несколько байтов: попробуйте онлайн!Javascript 291 символов
мин
ун-мин
источник
var
s. Просто сделайте их неявными глобальными переменными, просто код будет максимально коротким.Matlab, 59 байт
Относительно прямой подход:
источник
J, 22 байта
Это рекурсивная, молчаливая монада, использующая повестку дня. Вот как это работает:
Позвольте
y
быть нашим списком. Во-первых, глагол справа от повестки дня-:/:~
. Этот глагол любезно предоставлен Лики Нун . Он соответствует (-:
) независимо от того, отсортирован ли ввод (/:~
) с использованием монадического хука. ((f g) y = y f (g y)
) Это возвращает один или ноль соответственно. Левая часть повестки дня представляет собой герунду из двух глаголов: справа - глагол тождества]
, а слева - место, где происходит рекурсия. По вопросам повестки дня выбирает либо личность глагола в позиции ,1
если список будет отсортирован, и больше глагола в положении ,0
если список не отсортирован.$:@({~?~@#)
звонки$:
(самый длинный глагол, в котором он содержится) поверх результата{~?~@#
ony
. Это перемешивает список, так как?~@#
принимает перестановки длиныy
, будучи случайным образом отсортированными индексамиy
.{~
в монадическом хуке возвращает списокy
, индексами которого являются правильные аргументы. Этот перетасованный список затем вызывается снова с повесткой дня и повторяется, пока он не будет отсортирован.источник
C ++ 14, 158 байт
источник
Желе , 6 байтов, языковые проблемы
Попробуйте онлайн!
объяснение
Œ¿
присваивает номер каждой перестановке списка; 1 отсортировано, 2 имеет два последних замененных элемента и т. Д., Вплоть до факториала длины списка (который является списком в обратном порядке). Таким образом, для отсортированного списка это значение равно 1, и мы можем уменьшить его, используя’
для создания «не отсортированного» теста, который можно использовать в качестве логического значения в условии цикла while. Это$
вызывает условие для анализа в группе.источник
C ++, 166 байт
Мех.
Это должно работать на всех контейнерах STL, которые имеют
begin()
иend()
.Ungolfed:
источник
APL (Dyalog Extended) , 15 байт
Попробуйте онлайн!
источник
?⍨∘≢⍛⊇⍨⍣{⍺≡∧⍺}
Брахилог , 5 байт
Попробуйте онлайн!
Когда я впервые увидел ответ Brachylog от ais523 (в отличие от его ответа Jelly, потому что, если я не ошибаюсь, user62131 также был им), я подумал: а что, если вместо рекурсии будет использоваться возврат назад? Итак, сначала я попробовал
ṣ≤₁
. Оказывается, поскольку случайный выбор чего-либо не приводит к множественным выводам, а только к тому, что один вывод недетерминированно, к предикатуṣ
шаффла нельзя вернуться, поэтому запуск, который просто не удастся, если вам не повезет правильно перетасовать его с первой попытки. После этого я попробовалpṣ≤₁
, что сработало большую часть времени, но, поскольку конечный длинный список содержит конечное число перестановок, иногда он по-прежнему терпел неудачу. После того как я отказался от цели сокращения длины, я наконец-то придумал:(Демонстрация случайности)
Хотя на самом деле это может быть немного короче, если мы возьмем некоторые свободы с I / O ...
Брахилог , 4 байта
Попробуйте онлайн!
Чтобы выходные данные были полезными, входные данные не должны содержать дублирующихся элементов, поскольку в дополнение к сортировке входных данных этот предикат bogosort добавляет случайное количество дублирующих элементов и нули. (Гипотетически, это может добавить что угодно, но это как бы не так.) Обычно я бы не стал упоминать что-то настолько далекое от правильного функционирования, но я чувствую, что это в духе задачи.
источник
Perl 6 , 28 байт
Попробуйте онлайн!
Блок анонимного кода, который перемешивает список до его сортировки. Обратите внимание, что он сортирует список хотя бы один раз, что разрешено. И нет, его
{.pick(*)}
нельзя заменить*.pick(*)
источник
Pyth , 11 байт
Довольно доволен этим, наверное, можно еще немного поиграть в гольф
объяснение
Попробуйте онлайн!
источник
=Q.SQ
до=.SQ
-1 байт (работает и с другими операторами, например=QhQ
->=hQ
)Japt ,
119 байтПопытайся
источник
Brachylog (v2), 5 байт
Попробуйте онлайн!
Функция представления. (Ссылка TIO использует аргумент командной строки, который автоматически превращает функцию в полную программу.)
объяснение
Prolog (язык, на котором компилируется Brachylog) является хвостово-рекурсивным, поэтому эта функция в конечном итоге компилируется в узкий цикл.
источник
C (203 символа, без входного цикла: только функция)
Это то же самое, что и ниже, где мы также читаем массив из stdin и записываем отсортированный массив. Так как Q попросил функцию, а не целую программу ...
С (296 символов)
Компиляция может дать предупреждение (неявные объявления). Ограничение размера массива Hardencoded 999 элементов. Хрупкое.
если нет необходимости предварительно проверять, отсортирован ли массив, это можно сделать в 284.
С (251 символ, было 284)
(используя глобальные переменные вместо аргументов функций).
источник