Zaimplementuj tryb uśpienia


74

Sleep Sort to algorytm sortowania liczb całkowitych, który znalazłem w Internecie. Otwiera strumień wyjściowy i dla każdej liczby wejściowej równolegle opóźnia liczbę sekund i wysyła tę liczbę. Ze względu na opóźnienia najwyższa liczba zostanie wyprowadzona na końcu. Szacuję, że ma O (n + m), gdzie n to liczba elementów, a m to najwyższa liczba.

Oto oryginalny kod w Bash

#!/bin/bash
function f() {
    sleep "$1"
    echo "$1"
}
while [ -n "$1" ]
do
    f "$1" &
    shift
done
wait

Oto pseudokod

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

Twoim zadaniem jest wdrożenie funkcji Sleep Sort jako funkcji w wybranym języku programowania. Możesz pominąć wszelkie czynniki współbieżności, takie jak warunki wyścigu i nigdy nie blokować żadnych wspólnych zasobów. Najkrótszy kod wygrywa. Definicja funkcji liczy się do długości kodu.

Lista wejściowa jest ograniczona tylko do nieujemnych liczb całkowitych, a długość listy wejściowej powinna być odpowiednio długa (przetestuj co najmniej 10 liczb), aby warunki wyścigu nigdy się nie zdarzyły. i zakładając, że warunki wyścigowe nigdy się nie zdarzają.


3
Co liczy się do długości? Kompletne programy, w tym IO czy tylko odpowiednia rutyna?
Konrad Rudolph

8
Problem z tym. W zależności od kolejności listy, możesz nie przeczytać całej listy przed wydrukowaniem pierwszej wartości. Na przykład duża lista, której odczyt zajmuje 45 sekund, pierwsza wartość to 2, a ostatnia to 1. Wątek do wydrukowania 1 może zostać wykonany po wydrukowaniu 2. Ups - dane wyjściowe nie są już poprawnie sortowane. Mogą istnieć pewne obejścia - tworzenie wątków, a następnie uruchamianie ich po przeczytaniu całej listy (ale doprowadzi to do dłuższego kodu, w przeciwieństwie do golfa). Zastanawiam się, czy ktoś może zapewnić golfa, który rozwiązuje ten potencjalny problem ... Spróbuję.
Thomas Owens,

11
Nawiasem mówiąc, tym, co sprawia, że ​​ten algorytm jest naprawdę interesujący, jest faktyczne istnienie rzeczywistych aplikacji. Na przykład sekwencjonowanie DNA (sekwencjonowanie Sanger) zależy od czegoś takiego do sortowania fragmentów DNA według ich długości (i bardziej ogólnie, każda elektroforeza robi coś podobnego). Różnica polega na tym, że sekwencjonowanie odbywa się fizycznie, a nie na komputerze.
Konrad Rudolph

12
Nienawidzę być tym, który padnie na paradę wszystkich, ale czy to nie tylko odciąża złożoność harmonogramu systemu operacyjnego w sposób prawdopodobnie O (N ^ 2)?
Random832

1
Myślę, że istnieją algorytmy sortowania fizycznego, które zajmują czas O (n), ale obiekty fizyczne O (n). Możemy do tego użyć topliwych świec i tuby. pl.wikipedia.org/wiki/Spaghetti_sort
Ming-Tang

Odpowiedzi:


17

Rodzaj kiepskiej próby Perla , 59 55 52 38 32 znaków :

map{fork||exit print sleep$_}@a

Gołe kości: 25 znaków:

... jeśli nie masz nic przeciwko sortowaniu wyników jako wyniku wyjściowego:

map{fork||die sleep$_}@a

Ze wszystkimi dodatkami:

(dla maksymalnej zgodności z wyzwaniem, 44 znaki)

sub t{map{fork||exit print sleep$_}@_;wait}

Jeśli pozwolisz Perlowi na ciebie czekać, 39 znaków:

sub t{map{fork||exit print sleep$_}@_}

I znowu, jeśli nie masz nic przeciwko die(), 32 znaki ...

sub t{map{fork||die sleep$_}@_}

Zauważ, że w Perlu 6 lub gdy deklarowana jest funkcja „powiedz”, można zastąpić tę printfunkcję say, zapisując znak w każdym przypadku. Oczywiście, ponieważ dieoba kończą rozwidlony proces i zapisują dane wyjściowe, pozostaje to najkrótsze rozwiązanie.


możesz nadal uruchomić, perl-Eaby włączyć funkcje 5.010, takie jaksay
mbx

(fork&&die sleep$_)for@ateż działa
malkaroee

20

C , 127 znaków, dość oczywiste rozwiązanie:

main(int c,char**v){
#pragma omp parallel for num_threads(c)
for(int i=1;i<c;++i){int x=atoi(v[i]);sleep(x);printf("%d ",x);}}

(Kompilowany gcc -std=c99 -fopenmp sort.ci ignorujący wszystkie ostrzeżenia.)


4
Fajnie, naprawdę muszę się nauczyć opanowania
Nils

Nazwałbym to 93 znakami (bez analizy wiersza poleceń itp.), Ale imponujące jest to, że możesz to zrobić tylko w 34 dodatkowych znakach w C!
Rex Kerr

1
@KonradRudolph - Można zapisać 6 bajtów cofać: for(;c>=0;--c){int x=atoi(v[c]);. Nie jestem pewien, czy to dozwolone.
owacoder

15

Ruby 1.9, 32 znaki

Jako funkcja:

s=->a{a.map{|i|fork{p sleep i}}}

Jeśli możemy po prostu użyć predefiniowanej zmiennej, zmniejsza się ona do 25 znaków:

a.map{|i|fork{p sleep i}}

1
Możesz zapisać sporo znaków, Thread.new{p sleep i}drukując dane wyjściowe.
Howard

@ Howard: Dobry chwyt, dzięki!
Ventero

@ Ventero, tylko uczę się Ruby i chciałbym wiedzieć, jak uruchomiłbyś tę funkcję lambda, a dokładniej, jak dajesz temu wkład. Czy można uruchomić IRB? Dzięki!
Ben Hili

14

JavaScript , 65 znaków (w zależności od tego, czy używasz, console.logczy czegoś innego do wyświetlania wyniku)

a.map(function(v){setTimeout(function(){console.log(v)},v*1000)})

Zakłada się, że ajest to tablica liczb całkowitych nieujemnych i map()istnieje w prototypie macierzy (JavaScript 1.6+).


1
Prawdopodobnie możesz ogolić dwa lub nawet trzy znaki, mnożąc je przez 10 (lub 9) zamiast 1000, bez uszczerbku dla poprawności.
Konrad Rudolph

12
Jeśli jedna sekunda ma pozostać, prawdopodobnie możesz użyć 1e3zamiast tego.
Joey

2
@ Tomalak, alertjest blokującym wyjściem promptJavaScript, blokuje wejście confirmJavaScript i blokuje wejście binarne JavaScript. Gdyby JS miał być napisany w linii poleceń, byłyby to wywołania, których użyłbyś.
zzzzBov

1
@zzzzBov, użycie blokowania wyjścia prawie na pewno byłoby złym pomysłem do tego zadania.
Peter Taylor,

2
@zzzzBov, martwię się o to, w jakiej kolejności są wywoływane - chyba że specyfikacja JS ma mocne gwarancje co do kolejności, w której wywoływane są kolejki ustawione w kolejce setTimeout.
Peter Taylor,

13

APL ( 15 13)

{⎕←⍵⊣⎕DL⍵}&¨⎕

Co to robi:

¨⎕       : for each element of the input
&        : do on a separate thread
⎕DL⍵    : wait approx. ⍵ seconds
⎕←⍵     : output ⍵

Widzę pola zamiast 3 znaków.
defhlt

8
@ArtemIce: Powinny być trzy pola (quady). Dwie z nich to zmienna I / O (odczyt, który pobiera, a zapis do niej wypisuje dane wyjściowe), a jedna to nazwa ⎕DLfunkcji, która jest trybem uśpienia.
marinus

9

Cztery próby w Erlang:

Wyjdź na konsolę, skorzystaj z tej możliwości, 9ms * Numberponieważ jest to wystarczająco dużo, aby działało (testowane na płycie wbudowanej Atom = wolno):

Potrzebuje 60 znaków

s(L)->[spawn(fun()->timer:sleep(9*X),io:write(X)end)||X<-L].

Dane wyjściowe na konsolę są całkowicie nienawistne, więc Pzamiast tego wysyłamy komunikat do przetworzenia :

Potrzebuje 55 znaków

s(P,L)->[spawn(fun()->timer:sleep(9*X),P!X end)||X<-L].

Wysyłanie po pewnym czasie można również wykonać inaczej (działa to nawet z 1ms * Number):

Potrzebuje 41 znaków

s(P,L)->[erlang:send_after(X,P,X)||X<-L].

W rzeczywistości jest to trochę niesprawiedliwe, ponieważ wbudowana funkcja send_afterjest opóźniona i wymaga erlang:prefiksu przestrzeni nazw , jeśli weźmiemy pod uwagę tę przestrzeń nazw zaimportowaną (wykonaną na poziomie modułu):

Potrzebuje 34 znaków

s(P,L)->[send_after(X,P,X)||X<-L].

7

C # - 137 znaków

Oto odpowiedź w języku C # (zaktualizowana o stopnie równoległości zgodnie z komentarzem)

void ss(int[]xs){xs.AsParallel().WithDegreeOfParallelism(xs.Length).Select(x=>{Thread.Sleep(x);return x;}).ForAll(Console.WriteLine);}

1
Musisz określić, WithDegreeOfParallelismaby to działało, analogicznie jak num_threadsw moim kodzie OpenMP C.
Konrad Rudolph

120 bajtów:void m(int[] l){foreach(var i in l){var t=new Thread(()=>{Thread.Sleep(int.Parse(s));Console.Write(s);});t.Start();}}}
MrPaulch

@MrPaulch Pamiętaj, że musisz ponownie dołączyć do wątków, jeśli chcesz, aby Twój program miał oczekiwane zachowanie
Yet Another Geek

Dlaczego? Najdłużej działający wątek utrzyma proces przy życiu.
MrPaulch

7

Python - 81 93 148 150 153

Poprawianie kodu @ BiggAl, ponieważ w tę grę gramy ....

import threading as t,sys
for a in sys.argv[1:]:t.Timer(int(a),print,[a]).start()

... lub 97 175 z opóźnionym uruchomieniem wątku

import threading as t,sys
for x in [t.Timer(int(a),print,[a]) for a in sys.argv[1:]]:x.start()

Pobiera dane z wiersza poleceń, ala

./sleep-sort\ v0.py 1 7 5 2 21 15 4 3 8

Podobnie jak w przypadku wielu golfów pythonowych, pojawia się moment, w którym kod jest na tyle zwarty, że aliasing zmiennych w celu skrócenia nazw nawet nie zapisuje znaków.

Ten jest jednak funky, ponieważ alias sys i wątki ZARÓWNO jako t, więc sys.argv staje się t.argv. Krótszy niż z importu foo * i oszczędności postaci netto! Jednak przypuszczam, że Guido nie byłby zadowolony ...

Uwaga do samodzielnego uczenia się c i zaprzestania gry w python. ŚWIĘTA KRÓWKA JEST KRÓTSZE NIŻ ROZWIĄZANIE C!


Udało mi się wprowadzić kilka poprawek, ale formatowanie nie wyświetla się ładnie w komentarzach, więc zrobiłem własną odpowiedź. daemonnie wymaga ustawiania, chyba że uruchamiasz go jako demon, a użycie argumentów pozycyjnych jest krótsze, szczególnie. Jeśli alias NonedoN
theheadofabroom

Aha, a pierwszy nie działa dla mnie pod 2.7.1, co jwydaje się skończyć jako False- efekt uboczny próby zrobienia zbyt wiele w jednej linii?
theheadofabroom

cholera, nie zdawałem sobie sprawy, że możesz zaimportować wiele modułów do tego samego aliasu - naprawdę mogłem wymyślić kilka zastosowań dla tego, w którym mam wiele podklas tej samej niestandardowej klasy podstawowej, leżących w osobnych podmodułach. Jeśli uda nam się ogolić kolejne 30, będzie to krótsze niż uderzenie ... Ale nie sądzę, żeby tak się stało.
theheadofabroom

Argh, powodem, dla którego nie wiedziałem, jest to, że nie możesz - po prostu próbowałem go uruchomić, a wątkowanie nie jest aliasy, to tylko nazywane wątkiem. To sys jest aliasowany do t ... Próbowałeś to uruchomić? To tylko dodatkowe 2 znaki na każdym choć importować as t,s, a następnie zmienić w użyciu sdlasys
theheadofabroom

1
dlaczego nie użyjesz tej printfunkcji zamiast sys.stdout.write?
latające owce

6

Dla zabawy, oto wersja ColdFusion (8+) ;-) Ma 109 znaków, nie licząc zawijania linii i wcięć, które dodałem tutaj dla czytelności.

<cfloop array="#a#" index="v">
  <cfthread><cfthread action="sleep" duration="#v*1000#"/>#v#</cfthread>
</cfloop>

Zakłada się, że <cfoutput>to działa. Kilka znaków można zapisać, pisząc wszystko w jednym wierszu.


6

Java (aka nigdy nie wygrywa w codegolf): 234 211 187 znaków

public class M{public static void main(String[]s){for(final String a:s)new Thread(){public void run(){try{sleep(Long.parseLong(a));}catch(Exception e){}System.out.println(a);}}.start();}}

bez golfa:

public class M {
    public static void main(String[] s) {
        for(final String a:s) new Thread(){
            public void run() {
                try {
                    sleep(Long.parseLong(a));
                } catch(Exception e){}
                System.out.println(a);
            }
        }.start();
    }
}

@Joey dzięki za proste ustawienie.
trutheality

Klasa może być niepubliczna, oszczędzając 7 znaków.
Daniel Lubarov

1
Możesz także zadeklarować throws Throwablei pozbyć się catchklauzuli.
Daniel Lubarov

Myślę, że możesz zapisać 2 bajty, zastępując Long.parseLongje Long.valueOf.
HyperNeutrino,

Wiem, że minęło 6,5 roku, ale możesz grać w golfa w niektórych częściach: publici finalmożna je usunąć; class M{public static void mainmoże być interface M{static void main(Java 8+); Long.parseLong(a)może być new Long(a)(co daje 165 bajtów )
Kevin Cruijssen

5

JavaScript - 52 znaki

for(i in a)setTimeout("console.log("+a[i]+")",a[i])

Witamy w CodeGolf.SE! Sformatowałem dla ciebie odpowiedź, w szczególności wcięcie kodu o cztery spacje, aby był wyświetlany jako kod. Inną pomoc dotyczącą formatowania znajdziesz na pasku bocznym strony edycji.
dmckee

5

Scala - 42 40 znaków (przypadek specjalny)

Jeśli masz pulę wątków, co najmniej rozmiar liczby elementów listy:

a.par.map{i=>Thread.sleep(i);println(i)}

Scala - 72 znaki (ogólnie)

a.map(i=>new Thread{override def run{Thread.sleep(i);println(i)}}.start)

afaik, którego nie używasz {}podczas pobytu na jednej linii.
latające owce

@ flying sheep - Możesz pominąć {}jedną instrukcję , ale nadal potrzebujesz jej do grupowania rzeczy oddzielonych ;, jedną linią lub nie. W {}niektórych przypadkach możesz pisać instrukcje wieloliniowe (na przykład if / else).
Rex Kerr

och, nie chodziło mi o to, że można je pominąć, ale że zamiast tego można ich użyć ()w liniach jednokreskowych. myślę, że to kwestia gustu. (Po prostu tak naprawdę nie rozumiem, dlaczego ()w ogóle są wspierani, gdy są {}zastępowani. Może nie od razu wyobcują użytkowników Java). Scala jest fajna, ale definiowanie bloków kodu przez wcięcie jest wyraźnie lepsze. (i tak następuje wojna religijna;))
latanie owiec

@ latające owce - jesteś źle poinformowany. Możesz użyć ()do pojedynczych instrukcji. Spróbuj (1 to 9).map(i => {val j = i+1; i*j})wpisać REPL, a następnie sprawdź, co się stanie, jeśli użyjesz (1 to 9).map(i => (val j = i+1; i*j)).
Rex Kerr

to prawda, ale mówiłem tylko o wyrażeniach i innych rzeczach. Przepraszam, nie znoszę pisać rzeczy bez możliwości łamania linii;)
latające owce

4

Haskell - 143 znaki

import Control.Concurrent
import System
d=threadDelay
f x=d(10^6*x)>>print x
g s=mapM(forkIO.f)s>>d(10^6*maximum s+1)
main=getArgs>>=g.map read

Prawdopodobnie można by to skrócić, przyjmując wejście na stdin, gdyby to była opcja, ale jest już późno i tak czy inaczej, nadal ma 104 znaki dla samej funkcji.


4

Befunge-98, 38 31 bajtów

Wiem, że to stare wyzwanie, ale niedawno odkryłem zarówno sleepsort, jak i języki 2D, wpadłem na pomysł, jak je połączyć i szukałem miejsca, aby je opublikować, więc oto jesteśmy.

&#vt6j@p12<'
v:^ >$.@
>:!#^_1-

Główny adres IP odczytuje liczbę ( &), a następnie uderza w to, tktóry go klonuje: jeden przechodzi do tej samej linii i wykonuje cykle, odczytuje nowe liczby i generuje nowe potomki, aż osiągnie EOF, który kończy sekwencję. Wszystkie procesy potomne utkną w zamkniętej pętli ( vi ^trzeciej kolumny), dopóki główny adres IP nie zakończy odczytu danych wejściowych i nie wykona sekwencji poleceń '<21p, która umieszcza znak <w pozycji (1,2), zastępując ^i zwalniając wszystkie procesy potomne, które zaczynają się cyklicznie, zmniejszając o 1 ich liczbę przy każdej iteracji. Ponieważ szybkość wykonywania różnych adresów IP jest zsynchronizowana w befunge, będą one kończyć (i drukować swoją wartość) w kolejności, sortując listę danych wejściowych.


26 bajtów , przesuwając nieco strumień sterowania.
Jo King

3

Trochę późno na imprezę:

Klon - 91 83 znaków

W 91:

M:=():use Threads in p:=proc(n)Sleep(n);:-M:=M,n;end:Wait(map(i->Create(p(i)),L)[])end:[M];

W 83:

M:=():use Threads in Wait(seq(Create(proc(n)Sleep(n);:-M:=M,n end(i)),i=L))end:[M];

(Wymaga wersji 15 Maple i oczekuje, że lista zostanie posortowana w L)


3

C, 70 69 znaków

Nie czeka na powrót procesów potomnych, w przeciwnym razie działa.

main(n) {
    while(~scanf("%d",&n)?fork()||!printf("%d\n",n,sleep(n)):0);
}

2

PHP 57 bajtów

<?for(;$i=fgets(STDIN);)pcntl_fork()?:die($i.usleep($i));

pcntl_fork () jest dostępny tylko w Linuksie.


2

Bash (38):

xargs -P0 -n1 sh -c 'sleep $0;echo $0'

Edycja: zmiennoprzecinkowy od standardowego, oddzielony spacjami lub znakami nowej linii.


2

Haskell, 90

import Control.Concurrent
s::[Int]->IO()
s=mapM_(\x->forkIO$threadDelay(x*9999)>>print x)

Mam nadzieję, że spełnia wszystkie wymagania.



1

Tylko kilka poprawek z wersji @rmckenzie:

Python opóźniony start wątku w 155 152 114 108 107:

import sys, threading as t
for x in [t.Timer(int(a),sys.stdout.write,[a]) for a in sys.argv[1:]]:x.start()

Python bez opóźnienia 130 128 96 95 93:

import sys,threading as t
for a in sys.argv[1:]:t.Timer(int(a),sys.stdout.write,[a]).start()

Zarządzałem kilkoma dodatkowymi optymalizacjami, używając Timerzamiast Thread, który ma bardziej zwięzłe wywołanie i wyeliminował potrzebę importowania time. Metoda opóźnionego startu wątku korzysta ze zrozumienia listy, ponieważ eliminuje potrzebę oddzielnego inicjowania listy na początku, chociaż jest ona o dwa znaki dłuższa ( "["+"]"+" "-":") niż pętla for, więc jest bezużyteczna bez opóźnionego startu i należy uważać, aby użyć listy zamiast generatora, albo tak naprawdę nie tworzysz wątków timera, dopóki nie poruszysz generatora.

Czy ktoś jeszcze ma jakieś optymalizacje?


Sztuczka z pomocą aspomaga, ale w wersji 2.7.1 możesz zaimportować tylko jeden moduł do aliasu, a po niektórych zabawach o tobie nie możesz, nawet import mod1,mod2 as a,bmusisz import mod1 as a, mod2 as b. Wciąż oszczędza kilka postaci, ale to nie jest lekarstwo - wszystko, co myślałem, że to było ... I w rzeczywistości lepiej zostawić sys jako sys. Aliasing wątków wciąż pomaga ...


pokonałeś mnie, masz awans. Lubię x = []; x + = []. Nie wiedziałem, że możesz to zrobić ...
arrdem

... możesz to zrobić w 128, jeśli stracisz spacje między: [instrukcja] w swojej pętli if (x) ... jakoś dostałem to do 127, ale myślę, że to nie licząc ostatniej nowej linii (która jest legalny w CG). Pomyślałem, że dam wam aktualizację, a nie narzędzie i kradzież kodu.
arrdem

@rmckenzie idź po to, ukradłem twoje. Zawsze interesuje mnie Python z CG - mam wrażenie, że robię coś bardzo przewrotnego, biorąc pod uwagę cele języka ...
theheadofabroom

Tak, jestem szczerze zszokowany tym, jak czytelna jest większość golfów pythonowych ... kosztem „szklanej podłogi” postaci. Sprawdź to: importuj wątki, sys jako t
arrdem

1

Clojure, 54

(defn s[n](doseq[i n](future(Thread/sleep i)(prn i))))


możesz pozbyć się kilku znaków, wstawiając pominięcie defn(nawiasy + lista argumentów: od 54 do 43 znaków), lub użyj fnzamiast defn=> len- = 2, więc powiedziałbym, że w clj jest to 43: D
test30

1

Rdza - 150 bajtów

I dlatego nie piszesz golfa w Rust, jest bardziej gadatliwy niż Java;). Zależy od zewnętrznej skrzynki crossbeam, bez niej byłoby jeszcze gorzej.

|x|{extern crate crossbeam;crossbeam::scope(|s|for&v in x{s.spawn(move||{std::thread::sleep(std::time::Duration::from_secs(v));println!("{}",v)});})}

Pełny program testowy:

fn main() {
    let z =
    |x|{extern crate crossbeam;crossbeam::scope(|s|for&v in x{s.spawn(move||{std::thread::sleep(std::time::Duration::from_secs(v));println!("{}",v)});})}
    ;
    z(&[4, 2, 3, 5, 7, 8, 9, 1, 6, 10])
}

0

Trochę nudne, port C #, żeby znów zacząć korzystać z języka:

F # - 90 znaków

PSeq.withDegreeOfParallelism a.Length a|>PSeq.iter(fun x->Thread.Sleep(x);printfn "%A" x)

0

JavaScript, 74

function(a){for(i=0;i<a.length;i++)setTimeout('alert('+a[i]+')',a[i]*1e3)}

lub 71/65 znaków o niestandardowym charakterze:

function(a){a.map(function(v){setTimeout('console.log('+v+')',v*1e3)})}

Nawet w 2011 roku myślę, że function(a){a.map(function(v){setTimeout(console.log,v,v)})}mógł działać w co najmniej jednej przeglądarce na 60 bajtów. Oczywiście teraz piszesz a=>a.map(v=>setTimeout(console.log,v,v))zamiast tego.
Neil


0

VB.NET 100 bajtów

Ponieważ VB.Net wymaga, aby lambda w jednym wierszu zawierały tylko jedną instrukcję, ten kod musi zawierać wiele wierszy:

Array.ForEach(i, Async Sub(x)
Await Threading.Tasks.Task.Delay(x*1000)
Console.WriteLine(x)
End Sub)

Nie golfowany:

Option Strict Off

Sub Main(i() as String)
    Array.ForEach(i, Async Sub(x)
                         Await Threading.Tasks.Task.Delay(x * 1000)
                         Console.WriteLine(x)
                     End Sub)
End Sub

Jednak nie jestem pewien, czy policzymy instrukcje importu w liczbie bajtów, ponieważ jeśli ich nie policzymy, mógłbym napisać:

VB.NET 71 bajtów

a.ForEach(i, Async Sub(x)
Await t.Delay(x*1000)
c.WriteLine(x)
End Sub)

Nie golfowany:

Option Strict Off
Imports t = System.Threading.Tasks.Task
Imports c = System.Console
Imports a = System.Array

Sub Main(i() as String)
    a.ForEach(i, Async Sub(x)
                     Await t.Delay(x * 1000)
                     c.WriteLine(x)
                 End Sub)
End Sub

0

Groovy, 47 bajtów

Zakłada, że ​​liczby są podane w wierszu poleceń ...

args.each{i->Thread.start{sleep(i*22)print i}}


0

Mathematica, 34 lub 36 bajtów

RunScheduledTask[Print@#,{#,1}]&/@

Wystarczy dołączyć listę do posortowania na końcu tego kodu i ocenić. Jeśli musi to być poprawna definicja funkcji, zajmuje dwa dodatkowe bajty:

RunScheduledTask[Print@#,{#,1}]&/@#&

0

C ++ 11, 229 bajtów

#import<future>
#import<iostream>
using namespace std;int main(int a,char**v){auto G=new future<void>[a];while(--a){G[a]=move(async([=](){this_thread::sleep_for(chrono::seconds(atoi(v[a])));cout<<v[a]<<" "<<flush;}));}delete[]G;}

Niegolfowane i użytkowanie:

#import<future>
#import<iostream>
using namespace std;
int main(int a,char**v){
 auto G=new future<void>[a];
 while(--a){
  G[a]=move(async(
   [=](){
    this_thread::sleep_for(chrono::seconds(atoi(v[a])));
    cout<<v[a]<<" "<<flush;
   }
  ));
 }
 delete[]G;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.