задача
Используя любой тип распараллеливания, подождите несколько периодов, чтобы общее время сна составляло не менее минуты (но не более полутора минут).
Программа / функция должна завершиться в течение 10 секунд и вернуть (любым способом и в любом формате) два значения: общее истекшее время и общее выполненное время ожидания. Оба значения времени должны иметь точность не менее 0,1 секунды.
Это похоже на концепцию человеко-часов : работа, которая занимает 60 часов, может быть выполнена всего за 6 часов, если 10 работников разделят работу. Здесь у нас может быть 60 секунд времени ожидания, например, в 10 параллельных потоках, поэтому для завершения всей работы потребуется всего 6 секунд.
пример
Программа MyProgram создает 14 потоков, каждый поток спит 5 секунд:
MyProgram
→ [5.016,70.105]
Время выполнения превышает 5 секунд, а общее время ожидания превышает 70 секунд из-за служебной нагрузки.
Ответы:
Dyalog APL,
65272321 байтТо есть:
Объяснение:
⎕DL&¨9/7
: раскрутить 9 потоков, каждый из которых ждет 7 секунд.⎕DL
возвращает фактическое количество времени, потраченное на ожидание, в секундах, которое будет таким же, как его аргумент дает или принимает несколько миллисекунд.⎕TSYNC
: дождитесь завершения всех потоков и получите результат для каждого потока.(⌈/,+/)
: возвращает самое длинное время выполнения одного отдельного потока (во время выполнения которого все другие потоки закончили, так что это фактическое время выполнения), за которым следует сумма времени выполнения всех потоков.Попробуйте онлайн!
источник
Python 2, 172 байта
Это требует операционной системы с точностью времени более 1 секунды для правильной работы (другими словами, любой современной ОС). Создается 8 потоков, каждый из которых спит по 9 секунд, в результате чего время выполнения в реальном времени составляет ~ 9 секунд, а время параллельной работы ~ 72 секунды.
Хотя в официальной документации сказано, что
Thread
конструктор должен вызываться с помощью аргументов с ключевыми словами, я все же осторожен и в любом случае использую позиционные аргументы. Первый аргумент (group
) должен бытьNone
, а второй аргумент является целевой функцией.nneonneo указал в комментариях, что доступ к атрибуту (например,
f.t
) короче, чем доступ по индексу списка (напримерt[0]
). К сожалению, в большинстве случаев несколько байтов, полученных в результате этого, будут потеряны из-за необходимости создания объекта, который позволяет создавать пользовательские атрибуты во время выполнения. К счастью, функции поддерживают пользовательские атрибуты во время выполнения, поэтому я использую это, сохраняя общее время вt
атрибутеf
.Попробуйте онлайн
Спасибо DenkerAffe за трюк -5 байтов
exec
.Спасибо kundor за -7 байт, указав, что аргумент потока не нужен.
Спасибо nneonneo за -7 байтов от разных улучшений.
источник
f()
и два последних аргументаThread
(таким образом удаляя 7 символов) и используя,t.append(m()-n)
чтобы избежать присвоения локальной переменнойt
(используя на 5 символов больше, чем+=
.)t
сt=[0]
, заменить добавление наt[0]+=m()-n
и заменитьsum(t)
наt[0]
.import threading as H,time as t
; сохранить еще два байта с помощьюz=H.Thread
иmap(z.join,r)
; сохраните еще два байта, сохранив общее время как атрибут (напримерT.z+=m()-n
)Утилиты Bash + GNU, 85
Принудительное использование
time
исполняемого файла вместо встроенной оболочки путем добавления префикса к\
.Добавляется в файл
j
, который должен быть пустым или отсутствовать в начале.источник
if [ $1 -lt 9 ];then { ./a $(( $1 + 1 )) &};sleep 7;fi
или что-то такое? Это противоречит правилам или что-то, чего я не понимаю в спецификации? [редактировать; Я пропустил требование для вывода. Ох, это делает это интересным!](($1<9))&&$0 $[$1+1]&sleep 7
Go - 189 байт
Спасибо @cat!
Выходы (мс): 160,9939 мс , 60001 (160 мс для ожидания 60,001 с)
источник
@Rob In some languages the obvious solution is already (close to) the shortest. Besides, one way to view code-golf challenges is finding the shortest solution in EACH language. Otherwise Jelly will win most of the time... So: go ahead.
не означает, что вы не должны пытаться сыграть в гольф свой ответ, но это нормально, если он не победит. Можете ли вы добавить решение для игры в гольф?tot
что-то подобноеq
.Баш
19611711493 байтаОбновлен для поддержки большей точности времени благодаря интеграции предложений от @manatwork и @Digital Trauma, а также нескольких других оптимизаций пространства:
Обратите внимание, что это предполагает, что
j
файл отсутствует в начале.источник
function s
→s()
,b=`date +%s`
→b=$SECONDS
,expr $t + $i
→$[t+i]
,`cat j`
→$(<j)
и вообще см. Советы по игре в гольф в Bash о том, как уменьшить это до значения: pastebin.com/DDqUaDug5↵5↵5↵…
записи+5+5+5…
- затем загрузите все это непосредственно в арифметическую оценку иb=`date +%s`
→b=$SECONDS
.bash
и в случае целочисленной арифметики, все решение необходимо переписать, чтобы использовать внешний инструмент для расчета. Обычноbc
: pastebin.com/eYFEVUuzJavaScript (ES6), 148 байт
Обещает ждать 9 раз в течение 7 секунд в общей сложности 63 секунды (на самом деле 63,43, когда я пытаюсь), но на самом деле, когда я пытаюсь, только 7,05 секунды реального времени.
источник
C, 127 байт (вращается процессор)
Это решение вращает процессор вместо сна и подсчитывает время с помощью
times
функции POSIX (которая измеряет время процессора, потребляемое родительским процессом и всеми ожидаемыми дочерними процессами).Он запускает 7 процессов, которые вращаются по 9 секунд каждый, и выводит окончательное время в C часах (в большинстве систем 100 тактов = 1 секунда).
Образец вывода:
что означает 9,06 секунд реального времени и 63,47 секунд общего времени процессора.
Для
-std=c90 -m32
достижения наилучших результатов скомпилируйте с помощью (принудительное использование 32-битного кода на 64-битной машине).источник
PowerShell v4, 144 байта
Устанавливает
$d
равнымGet-Date
и очищает любые существующие истории заданий сGet-Job | Remove-Job
. Затем мы1..20|%{...}
выполняем цикл и выполняем каждую итерацию,Start-Job
передавая ему блок сценария{$x=date;sleep 3;((date)-$x).ticks/1e7}
для задания (то есть каждое задание будет выполнять этот блок сценария). Мы направляем этот вывод для>$null
подавления обратной связи (т. Е. Имени задания, статуса и т. Д.), Которая возвращается.Блок сценария устанавливается
$x
наGet-Date
, затемStart-Sleep
на3
несколько секунд, затем принимает новоеGet-Date
чтение, вычитает$x
, получает.Ticks
и делит на,1e7
чтобы получить секунды (с точностью).Вернемся к основной теме, пока любая работа по-прежнему
-S
татус"Running"
, мы вращаемся внутри пустойwhile
петли. Как только это будет сделано, мы будемGet-Job
извлекать объекты для всех существующих заданий, направлять те, вReceive-Job
которые будет извлекать эквивалент STDOUT (то есть то, что они выводят),-join
результаты вместе с ними+
и направлятьiex
(Invoke-Expression
и аналогичноeval
). Это выведет итоговое время ожидания плюс накладные расходы.Последняя строка похожа в том, что она получает новую дату, вычитает исходную отметку даты
$d
, получает.Ticks
и делит1e7
для вывода общего времени выполнения.NB
Хорошо, так что это немного изгиба правил. По-видимому, при первом выполнении PowerShell необходимо загрузить несколько сборок .NET с диска для различных операций с потоками, поскольку они не загружены с профилем оболочки по умолчанию. Последующие исполнения, поскольку сборки уже находятся в памяти, работают нормально. Если вы оставите окно оболочки в бездействии достаточно долго, вы получите встроенную сборку мусора PowerShell и разгрузите все эти сборки, в результате чего следующее выполнение займет много времени, так как он перезагружает их. Я не уверен, что можно обойти это.
Вы можете увидеть это во время выполнения в следующих запусках. Я запустил новую оболочку, перешел к своему каталогу по гольфу и выполнил сценарий. Первый запуск был ужасным, но второй (выполненный немедленно) работал нормально. Затем я оставил оболочку на несколько минут бездействующей, чтобы позволить сборке мусора, и затем этот цикл снова стал длительным, но последующие циклы снова работают нормально.
Пример работает
источник
Javascript (ES6),
212203145 байтЭтот код создает 10 изображений с интервалом времени ровно 6 секунд каждое при загрузке.
Время выполнения чуть выше (из-за накладных расходов).
Этот код перезаписывает все в документе!
Это предполагает, что вы используете однобайтовую кодировку для обратных ссылок, которая необходима для того, чтобы механизм Javascript не отключался.
В качестве альтернативы, если вы не хотите тратить 6 секунд на ожидание, вот решение длиной в 1 байт, которое заканчивается менее чем за секунду:
Разница в том, что этот код ожидает 600 мс на 100 изображениях. Это даст огромное количество накладных расходов.
Старая версия (203 байта):
Этот код создает 10 фреймов с интервалом времени ровно 6 секунд каждый вместо создания 10 изображений.
Оригинальная версия (212 байт):
источник
Руби, 92
источник
Javascript (ES6),
10892 байтаЯ делаю новый ответ, так как он использует немного другой подход.
Он генерирует огромное количество
setTimeout
s, которые почти все выполняются с 4 мс между ними.Каждый интервал составляет 610 миллисекунд, в общей сложности 99 интервалов.
Обычно он выполняется в течение 610 мс, общее время выполнения составляет около 60,5 секунд.
Это было проверено на Google Chrome версии 51.0.2704.84 m, на Windows 8.1 x64.
Старая версия (108 байт):
источник
Царапина - 164 байта (16 блоков)
Смотрите это в действии здесь .
Использует переменную с именем 't' и спрайт с именем 's'. Спрайт создает своих клонов, каждый из которых ожидает 8 секунд, и увеличивает переменную, синхронизирующую все время ожидания. В конце указывается общее время выполнения и общее время ожидания (например,
65.488 8.302
).источник
Clojure,
135120111109 байтОтформатированная версия с именованными переменными:
выход (в наносекундах):
Изменен формат. Спасибо Адам, я мог пропустить эту спецификацию формата в вопросе, когда я читал ее.
Изменено на nanoTime для игры в гольф.
Спасибо Cliffroot, я полностью забыл о научных обозначениях и не могу поверить, что я не видел
apply
. Я думаю, что использовал это в чем-то, что я вчера играл в гольф, но никогда не писал. Вы спасли мне 2 байта.источник
7e3
вместо7000
и использоватьapply
вместоreduce
Ржавчина,
257, 247 байтЯ использую то же время, что и в ответе Mego на Python.
На самом деле единственный немного умный бит использует ii, чтобы получить длительность 0 секунд.
Печать:
Ungolfed:
Редактировать: старый добрый цикл немного короче
источник
JavaScript (ES6, используя WebWorkers),
233215 байтовUPD: заменил способ выполнения работника из строки на более компактный и кросс-браузерный в аспекте политик кросс-происхождения. Не будет работать в Safari, если в нем все еще есть
webkitURL
объектURL
, и в IE.источник
{ "message": "Uncaught SecurityError: Failed to construct 'Worker': Script at 'data:application/javascript,a%3Dnew%20Date()%3BsetTimeout(()%3D%3EpostMessage(new%20Date()-a)%2C5e3)' cannot be accessed from origin 'null'.", "filename": "http://stacksnippets.net/js", "lineno": 13, "colno": 45 }
Python 2, 130 байт
Это вывод ответа Мего, но он достаточно отличается, так что я подумал, что это должен быть отдельный ответ. Протестировано для работы на Windows.
По сути, он разветвляет 9 потоков, которые спят в течение 7 секунд, в то время как родитель спит в течение 8. Затем он распечатывает время. Образец вывода:
В Windows
time.clock
измеряет время ожидания после первого звонка.источник
time.clock()
ведет себя по-разному на платформах Windows и UNIX / Linux .Perl 6,
7271 байтТам может быть более короткий способ сделать это
это выводы
источник
Mathematica, 109 байт
Анонимная функция. Требуется лицензия с 7+ ядрами для запуска. Занимает 9 секунд в реальном времени и 63 секунды в режиме ядра, без учета накладных расходов. Убедитесь, что предыдущие операторы выполняются только один раз (чтобы они не пытались перезапустить ядра). Тестирование:
источник
Javascript (ES6), 105 байт
Обновленная версия: 106 байт Заимствовано у @Ismael Miguel, поскольку у него была прекрасная идея уменьшить время сна и увеличить интервалы.
Javascript Ungolfed, 167 байтов
источник
d+=t()-s;if(!c)alert([t()-i,d])
вы можете написатьd+=t()-s;c||alert([t()-i,d])
, что сэкономит несколько байтов. Кроме того , если вы удалите функцию и переписать все это, вы можете конкурировать с моим 92-байтовым длительным решением:for(c=8,i=(t=Date.now)(d=0);c--;)setTimeout((c,s)=>{d+=t()-s;c||alert([t()-i,d])},8e3,c,t())
. И да, этот также длиной 92 байта.Ява,
358 343 337 316313 байти без золота
пожалуйста, не пытайтесь сделать это дома, так как это решение не безопасно.
Редактировать:
Я принял предложения @A Boschman и @ Adám, и теперь моей программе требуется менее 10 секунд для запуска, и она короче на 15 байтов.
источник
Thread.
статические вызовы метода sleep ()? Кроме того, не прекратит ли эта программа чуть более 10 секунд, дисквалифицируя ее?static long t
. Я упоминаю об этом только потому, что спецификация гласит: «Оба значения времени должны иметь точность не менее 0,1 секунды».long
передs
и добавить,s
в,static long t,i,s;
чтобы сохранить несколько байтов.С (с нитями),
339336335 байтисточник
C90 (OpenMP), 131 байт (+ 17 для переменной env) = 148 байт
Пример вывода:
Примечания:
7091 находится в циклах (100 / сек), поэтому программа работала в течение 70 секунд
Может быть намного короче, если бы я нашел способ заставить работать таймер, отличный от omp_get_wtime (), потому что тогда я мог бы также удалить оператор include.
Запустить с OMP_NUM_THREADS = 9
источник
Common Lisp (SBCL) 166 байт:
Это просто порождает потоки, которые спят, а затем атомарно увеличивают время, которое требуется, с внешним циклом, который вращается, ожидая, что общее время будет больше 60000 тиков (то есть 60 секунд на sbcl). Счетчик хранится в списке из-за ограничений типов мест, которые может изменить atomic-incf. Это может закончиться, прежде чем завершится на более быстрых машинах.
Ungolfed:
источник
Perl, 101 байт
Форкс 7 дочерних процессов, каждый из которых ждет 9 секунд.
Пример вывода:
источник
Groovy,
158143 персонажаОбразец прогона:
источник
Эликсир, 168 байт
Образец прогона:
Выходными данными является общее время ожидания, за которым следует время, в течение которого программа работала, в микросекундах.
Программа порождает 14
Task
с, и ждет каждого из них, сопоставляя их, а затем находит сумму их прошедшего времени. Он использует Эрлангаtimer
для измерения времени.источник
Haskell,
278271262246 байт!
измеряет время, затраченное действиемa
(второй аргумент) и применяетb
(первый аргумент) к результату.w
это функция сна.main
измеряется сам, и результат печатается (print!...
).#
естьreplicateM
повторение данного действия N раз (и возвращениеt
из-за игры в гольф).Внутри измеряемой части 9 потоков (
replicate 9 $ forkIO ...
) спят в течение5^10
миллисекунд (9,765625 секунд) и отправляют результат (writeChan
) в канал, созданный основным потоком (newChan
), который суммирует 9 результатов и печатает итог (getChanContents >>= print . sum . take 9
).Выход:
источник
Python 2, 132 байта
Использует пул процессов, чтобы порождать 9 процессов и дать каждому спать в течение 7 секунд.
Сначала выводится общее накопленное время сна, а затем фактическое время выполнения:
источник
Рубин (с
parallel
жемчужиной),123116 байтИзменить: Добавлена ссылка "Time.now" из ответа Руби гистократ.
источник
Matlab, 75 байт
Краткое объяснение:
parfor
создает параллельный цикл for, распределенный по пулу рабочих.tic
иtoc
измерять прошедшее время (и, по моему мнению, это одна из лучших функций MATLAB). Последняя строка (массив с общим временем ожидания и прошедшим в реальном времени) выводится, поскольку она не заканчивается точкой с запятой.Обратите внимание, что это создает колоссальные 9 полноценных процессов MATLAB. Тогда есть вероятность, что эта конкретная программа не будет завершена в течение выделенных 10 секунд на вашем компьютере. Тем не менее, я думаю, что с установкой MATLAB, в которой нет наборов инструментов, за исключением установленного набора инструментов для параллельных вычислений, установленного в высокопроизводительной системе с SSD, можно завершить работу в течение 10 секунд. При необходимости вы можете настроить параметры, чтобы меньше процессов спало больше.
источник
b
, вероятно, только потому, что у вас уже было что-то в вашей рабочей области. У меня нет проблем на 2015b с использованиемparfor q=b