Sleep Sort - алгоритм целочисленной сортировки, который я нашел в Интернете. Он открывает выходной поток, и для каждого входного числа параллельно задерживается число секунд и выводится это число. Из-за задержек наибольшее число будет выведено последним. Я оцениваю это имеет O (n + m), где n - количество элементов, а m - наибольшее число.
Вот оригинальный код на Bash
#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait
Вот псевдокод
sleepsort(xs)
output = []
fork
for parallel x in xs:
sleep for x seconds
append x to output
wait until length(output) == length(xs)
return output
Ваша задача - реализовать функцию Sleep Sort на выбранном вами языке программирования. Вы можете пренебречь любыми факторами параллелизма, такими как состояние гонки, и никогда не блокировать какие-либо общие ресурсы. Самый короткий код выигрывает. Определение функции учитывает длину кода.
Список ввода ограничен только неотрицательными целыми числами, и ожидается, что длина списка ввода будет достаточно большой (протестируйте не менее 10 чисел), чтобы условия гонки никогда не возникали. и предполагая, что условия гонки никогда не случаются.
Ответы:
Этакая неудачная попытка Perl ,
5955523832 персонажа :map{fork||exit print sleep$_}@a
Barebones: 25 символов:
... если вы не возражаете против результатов сортировки:
map{fork||die sleep$_}@a
Со всеми отделками:
(для максимального соответствия требованиям, 44 символа)
sub t{map{fork||exit print sleep$_}@_;wait}
Если вы позволите Perl ждать вас, 39 символов:
sub t{map{fork||exit print sleep$_}@_}
И снова, если не возражаете
die()
, 32 символа ...sub t{map{fork||die sleep$_}@_}
Обратите внимание, что в Perl 6, или когда объявлена функция 'say', можно заменить
print
функциюsay
, сохраняя символ в каждом экземпляре. Очевидно, что, посколькуdie
оба завершают разветвленный процесс и записывают вывод, это остается самым коротким решением.источник
perl-E
чтобы включить 5.010 функций, таких какsay
(fork&&die sleep$_)for@a
тоже работаетC , 127 символов, довольно очевидное решение:
(Составлено
gcc -std=c99 -fopenmp sort.c
и игнорируется все предупреждения.)источник
for(;c>=0;--c){int x=atoi(v[c]);
. Не уверен, что это разрешено.Ruby 1.9, 32 символа
Как функция:
Если мы можем просто использовать предопределенную переменную, она сокращается до 25 символов:
источник
Thread.new{p sleep i}
распечатки вывода.JavaScript , 65 символов (в зависимости от того, используете ли вы
console.log
или что-то еще для вывода результата)Предполагается, что
a
это массив неотрицательных целых чисел, которыйmap()
существует в прототипе массива (JavaScript 1.6+).источник
1e3
вместо этого.alert
- блокирующий выводprompt
JavaScript, блокирующий вводconfirm
JavaScript и блокирующий двоичный ввод JavaScript. Если бы JS записывался в командной строке, это были бы вызовы, которые вы бы использовали.APL (
1513)Что оно делает:
источник
⎕DL
функции, которая является sleep.Четыре попытки в Эрланге:
Вывод на консоль позволил себе сделать это каждый,
9ms * Number
поскольку этого достаточно, чтобы заставить его работать (протестировано на встроенной плате Atom = медленно):Нужно 60 символов
Вывод на консоль полный не-Erlangish, поэтому
P
вместо этого мы отправляем сообщение для обработки :Необходимо 55 символов
Отправка через некоторое время также может быть выполнена по-другому (это работает даже с
1ms * Number
):Требуется 41 символ
На самом деле это немного несправедливо, поскольку встроенная функция
send_after
запаздывает и требуетerlang:
префикса пространства имен , если мы считаем это пространство имен импортированным (сделано на уровне модуля):Необходимо 34 символа
источник
C # - 137 символов
Вот ответ в C # (обновленный со степенями параллелизма как прокомментировано)
источник
WithDegreeOfParallelism
чтобы это работало, аналогично тому, какnum_threads
в моем коде OpenMP C.void m(int[] l){foreach(var i in l){var t=new Thread(()=>{Thread.Sleep(int.Parse(s));Console.Write(s);});t.Start();}}}
Питон - 81
93148150153Настройка кода @ BiggAl, так как это игра, в которую мы играем ....
... или 97
175с отложенным началом резьбыПринимает ввод через командную строку, аля
Как и во многих питон-гольфах, наступает момент, когда код достаточно компактен, чтобы псевдонимы переменных для сокращения имен даже не сохраняли символы.
Хотя это и забавно, потому что он псевдоним sys и создает потоки ОБА как t, поэтому sys.argv становится t.argv. Короче, чем от импорта foo *, и чистая экономия символов! Однако я полагаю, что Гвидо не будет доволен ...
Примечание для самостоятельного изучения c и прекращения игры в гольф на питоне.СВЯТАЯ КОРОВА, ЭТО МЕНЬШЕ, ЧЕМ РЕШЕНИЕ C!источник
daemon
не требует настройки, если вы не запускаете это как демон, и короче использовать позиционные аргументы, esp. если вы псевдонимNone
наN
j
кажется,False
побочным эффектом попытки сделать слишком много в одной строке?as t,s
а затем изменитьs
наsys
print
функцию вместоsys.stdout.write
?Для забавы, вот версия ColdFusion (8+) ;-) В ней 109 символов, не считая переносы строк и отступы, которые я добавил для удобочитаемости здесь.
Это предполагает, что
<cfoutput>
это в силе. Несколько символов можно сохранить, написав все в одной строке.источник
Ява (иначе никогда не выигрывает в Codegolf):
234211187 символовungolfed:
источник
throws Throwable
и избавиться отcatch
оговорки.Long.parseLong
наLong.valueOf
.public
иfinal
могут быть удалены;class M{public static void main
может бытьinterface M{static void main
(Java 8+);Long.parseLong(a)
может бытьnew Long(a)
(в результате получается 165 байтов )Javascript - 52 символа
источник
Скала -
4240 символов (особый случай)Если у вас есть пул потоков, по крайней мере, размер числа элементов списка:
Скала - 72 символа (общее)
источник
{}
оставаясь на одной линии.{}
одно утверждение , но оно все равно необходимо для группировки вещей, разделенных;
одной строкой или нет. И{}
в некоторых случаях вы можете писать многострочные операторы (например, если / еще).()
вместо этого вы можете использовать их для однострочников. это вопрос вкуса, я думаю. (я просто не понимаю, почему()
вообще поддерживается, когда{}
их заменяют. возможно, чтобы не отталкивать пользователей java мгновенно). Scala - это круто, но определение блоков кода с помощью отступов явно лучше. (и так начинается религиозная война;))()
для отдельных заявлений. Попробуйте войти(1 to 9).map(i => {val j = i+1; i*j})
в REPL и посмотрите, что произойдет, если вы используете(1 to 9).map(i => (val j = i+1; i*j))
.Хаскель - 143 персонажа
Вероятно, это можно было бы сделать короче, приняв ввод в stdin, если бы это была опция, но уже поздно, и в любом случае, для самой функции это все еще 104 символа.
источник
Befunge-98,
3831 байтЯ знаю, что это старая проблема, но я недавно обнаружил как спящие, так и двумерные языки, подумал о том, как их объединить, и искал место для его публикации, так что мы здесь.
Основной IP-адрес читает число (
&
), а затем обращается к тому,t
кто его клонирует: один переходит на ту же строку и циклически повторяет, считывает новые числа и генерирует новые дочерние элементы, пока не достигнет EOF, который завершает последовательность. Все дочерние процессы застревают в замкнутом цикле (v
и^
в третьем столбце) до тех пор, пока основной IP не завершит чтение ввода и не выполнит последовательность команд'<21p
, которая переводит символ<
в положение (1,2), перезаписывает^
и освобождает все дочерние процессы, которые начинают одновременно цикл, уменьшая на 1 их число на каждой итерации. Так как скорость выполнения различных IP-адресов синхронизируется в befunge, они будут завершаться (и печатать свои значения) по порядку, сортируя входной список.источник
Немного опоздал на вечеринку:
Клен -
9183 символаВ 91:
В 83:
(Для этого требуется версия Maple 15 и ожидается, что список будет отсортирован в L)
источник
C
7069 символовНе ждет возврата дочерних процессов, иначе работает.
источник
PHP 57 байт
pcntl_fork () доступен только в Linux.
источник
Баш (38):
Изменить: Плавающая точка от стандартного ввода, разделенных пробелами или переводами строки.
источник
Хаскелл, 90
Я надеюсь, что это соответствует всем требованиям.
источник
𝔼𝕊𝕄𝕚𝕟, 11 символов / 22 байта
Try it here (Firefox only).
שĤ⇀ôa
это выглядит круто.источник
Просто некоторые изменения из версии @rmckenzie:
Python отложил начало потока в
155152114108107:Python без задержки в
130128969593:Управлял еще несколькими оптимизациями, используя
Timer
вместоThread
него более лаконичный вызов и устранял необходимость в импортеtime
. Метод запуска с отложенным потоком выигрывает от понимания списка, так как устраняет необходимость отдельно инициализировать список в начале, хотя он на два символа длиннее ("["+"]"+" "-":"
), чем цикл for, поэтому он бесполезен без отложенного запуска, и вы должны быть осторожны при использовании списка а не генератор, или вы фактически не создаете потоки таймера, пока не разберетесь с генератором.У кого-нибудь еще есть оптимизация?
Трюк с
as
подсказками, но в 2.7.1 вы можете импортировать только один модуль в псевдоним, и после некоторой игры с ним вы даже не сможетеimport mod1,mod2 as a,b
, вы должны это сделатьimport mod1 as a, mod2 as b
. Он по-прежнему сохраняет несколько символов, но это не совсем лекарство - все, о чем я думал ... И на самом деле лучше оставить sys в качестве sys. Псевдоним потоков все еще помогает, хотя ...источник
Clojure, 54
(defn s[n](doseq[i n](future(Thread/sleep i)(prn i))))
источник
defn
(его скобки + список аргументов: от 54 до 43 chrs), или использоватьfn
вместоdefn
=> len- = 2, так что я бы сказал в clj его 43: DРжавчина - 150 байт
И именно поэтому вы не пишете гольф в Rust, он более многословен, чем Java;). Зависит от внешнего ящика
crossbeam
, было бы еще хуже без него.Полная тестовая программа:
источник
Скучно, порт C #, просто чтобы снова начать работать с языком:
F # - 90 символов
источник
JavaScript, 74
или 71/65 символов с нестандартностью:
источник
function(a){a.map(function(v){setTimeout(console.log,v,v)})}
по крайней мере, в одном браузере работало по 60 байт. Конечно, в эти дни вы бы написалиa=>a.map(v=>setTimeout(console.log,v,v))
вместо.Tcl 8,6, 41 символ
Вы должны убить это с
^C
источник
VB.NET 100 байт
Поскольку VB.Net требует, чтобы однострочные лямбды содержали только одну инструкцию, этот код должен иметь несколько строк:
Ungolfed:
Однако я не уверен, что вы подсчитываете операторы импорта в счетчиках байтов, потому что, если вы их не учитываете, я мог бы написать так:
VB.NET 71 байт
Ungolfed:
источник
Groovy, 47 байтов
Предполагается, что номера приведены в командной строке ...
источник
Mathematica, 34 или 36 байт
Просто добавьте список к концу этого кода и оцените. Если оно должно быть допустимым определением функции, тогда требуется два дополнительных байта:
источник
C ++ 11, 229 байт
Ungolfed и использование:
источник