स्लीप सॉर्ट को लागू करें


74

स्लीप सॉर्ट एक पूर्णांक छँटाई एल्गोरिथ्म है जो मैंने इंटरनेट पर पाया। यह एक आउटपुट स्ट्रीम खोलता है, और समानांतर में प्रत्येक इनपुट नंबर के लिए, संख्या सेकंड के लिए देरी और उस नंबर को आउटपुट करता है। देरी के कारण, उच्चतम संख्या अंतिम रूप से आउटपुट की जाएगी। मेरा अनुमान है कि इसमें O (n + m) है, जहाँ n तत्वों की संख्या है और m उच्चतम संख्या है।

यहाँ बैश में मूल कोड है

#!/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

आपका काम अपनी पसंद की प्रोग्रामिंग भाषा में एक समारोह के रूप में स्लीप सॉर्ट को लागू करना है। आप किसी भी संगामिति कारकों जैसे कि दौड़ की स्थिति की उपेक्षा कर सकते हैं और कभी भी किसी साझा संसाधनों को लॉक नहीं कर सकते। सबसे छोटा कोड जीतता है। फ़ंक्शन की परिभाषा कोड लंबाई की ओर गिना जाता है।

इनपुट सूची केवल गैर-नकारात्मक पूर्णांकों तक सीमित है, और इनपुट सूची की लंबाई यथोचित लंबे (कम से कम 10 नंबर का परीक्षण) की उम्मीद है, इसलिए दौड़ की स्थिति कभी भी नहीं होती है। और यह मानते हुए कि दौड़ की स्थिति कभी नहीं होगी।


3
लंबाई की ओर क्या मायने रखता है? IO या सिर्फ प्रासंगिक दिनचर्या सहित पूरा कार्यक्रम?
कोनराड रुडोल्फ

8
इसके साथ एक समस्या है। सूची के आदेश के आधार पर, पहले मूल्य मुद्रित होने से पहले आप पूरी सूची नहीं पढ़ सकते हैं। उदाहरण के लिए, एक बड़ी सूची जिसे पढ़ने में 45 सेकंड लगते हैं, पहला मान 2 है और अंतिम मान 1 है। 2 को प्रिंट करने के बाद 1 को मुद्रित करने के लिए थ्रेड निष्पादित किया जा सकता है। ओह - आउटपुट अब ठीक से सॉर्ट नहीं किया गया है। कुछ वर्कअराउंड हो सकते हैं - थ्रेड्स बनाना और फिर उन्हें पूरी सूची पढ़ने के बाद शुरू करना (लेकिन इससे गोल्फ के मुकाबले लंबा कोड हो जाएगा)। मुझे आश्चर्य है कि अगर कोई व्यक्ति एक गोल्फ प्रदान कर सकता है जो इस संभावित मुद्दे को संबोधित करता है ... तो मैं कोशिश करूंगा
थॉमस ओवेन्स

11
संयोग से, इस एल्गोरिथ्म को वास्तव में दिलचस्प बनाता है कि वास्तव में वास्तविक जीवन में मौजूद हैं। उदाहरण के लिए, डीएनए अनुक्रमण (सेंगर अनुक्रमण) अपनी लंबाई (और आमतौर पर, हर वैद्युतकणसंचलन कुछ ऐसा ही करता है) के अनुसार डीएनए टुकड़े को सॉर्ट करने के लिए कुछ इस तरह पर निर्भर करता है। अंतर यह है कि अनुक्रमण कंप्यूटर में नहीं, बल्कि शारीरिक रूप से किया जाता है।
कोनराड रुडोल्फ

12
मुझे हर किसी की परेड पर बारिश होने से नफरत है, लेकिन यह ओएस शेड्यूलर पर सिर्फ एक तरह से जटिलता नहीं है जो कि शायद हे (एन ^ 2) है?
रैंडम 832

1
मुझे लगता है कि भौतिक प्रकार के एल्गोरिदम हैं जो ओ (एन) समय लेते हैं लेकिन ओ (एन) भौतिक वस्तुएं हैं। खैर, हम पिघलने वाली मोमबत्तियों और इसे करने के लिए एक ट्यूब का उपयोग कर सकते हैं। en.wikipedia.org/wiki/Spaghetti_sort
मिंग-तांग

जवाबों:


17

लंगड़ा एक तरह का पर्ल का प्रयास, 59 55 52 38 32 वर्ण :

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

नंगे पैर: 25 वर्ण:

... यदि आप मरने के उत्पादन के रूप में सॉर्ट परिणाम बुरा नहीं है:

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

सभी छंटनी के साथ:

(अधिकतम चुनौती अनुपालन के लिए, 44 अक्षर)

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

यदि आप प्रतिफल के लिए प्रतीक्षा करते हैं, तो 39 वर्ण:

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

और फिर, अगर आप बुरा नहीं मानते हैं die(), तो 32 अक्षर ...

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

ध्यान दें कि पर्ल 6 में, या जब 'कहो' फीचर घोषित किया जाता है, तो प्रत्येक उदाहरण में एक चरित्र को सहेजते हुए printफ़ंक्शन को बदलना संभव है say। जाहिर है क्योंकि dieदोनों ने कांटे की प्रक्रिया को समाप्त कर दिया है और आउटपुट लिखते हैं, यह सबसे छोटा समाधान है।


आप perl-E5.010 सुविधाएँ सक्षम करने के लिए रन-स्टिल कर सकते हैं जैसेsay
mbx

(fork&&die sleep$_)for@aभी काम करता है
malkaroee

20

सी , 127 वर्ण, बल्कि स्पष्ट समाधान:

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);}}

( gcc -std=c99 -fopenmp sort.cसभी चेतावनियों के साथ संकलित और अनदेखा।)


4
कूल I को वास्तव
Nils

मैं उस 93 अक्षरों (कमांड-लाइन पार्सिंग और ऐसे बिना) को कॉल करूंगा, लेकिन यह प्रभावशाली है कि आप सी में केवल 34 अतिरिक्त पात्रों में ऐसा कर सकते हैं!
रेक्स केर

1
@KonradRudolph - आप 6 बाइट्स को पीछे की तरफ जाने से बचा सकते हैं for(;c>=0;--c){int x=atoi(v[c]);:। यकीन नहीं होता है कि अनुमति दी है।
उल्लू का घोड़ा

15

रूबी 1.9, 32 अक्षर

एक समारोह के रूप में:

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

अगर हम सिर्फ एक पूर्वनिर्धारित चर का उपयोग कर सकते हैं, तो यह 25 वर्णों तक कम हो जाता है:

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

1
Thread.new{p sleep i}आउटपुट प्रिंट करने के लिए आप कुछ चार्ट को सहेज सकते हैं ।
हावर्ड

@ हॉवर्ड: अच्छा कैच, धन्यवाद!
वेंचरो

@ वेंटरो, मैं केवल रूबी को सीख रहा हूं और मैं जानना चाहता हूं कि आप इस लैंबडा फ़ंक्शन को कैसे चलाएंगे या अधिक विशेष रूप से आप इसे कैसे इनपुट देंगे। क्या आईआरबी के साथ चलना संभव है? धन्यवाद!
बेन हिली

14

जावास्क्रिप्ट , 65 वर्ण (आप console.logपरिणाम के उत्पादन के लिए उपयोग करते हैं या कुछ और इस पर निर्भर करता है )

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

यह मानता है कि aगैर-नकारात्मक पूर्णांकों की एक सरणी है और यह map()सरणी प्रोटोटाइप (जावास्क्रिप्ट 1.6+) पर मौजूद है।


1
आप सही से समझौता किए बिना, 1000 के बजाय 10 (या 9) के साथ गुणा करके संभवतः दो या तीन पात्रों को बंद कर सकते हैं।
कोनराड रुडोल्फ

12
यदि एक सेकेंड रहने का इरादा है, तो आप संभवतः 1e3इसके बजाय उपयोग कर सकते हैं ।
जॉय

2
@Tomalak, alertजावास्क्रिप्ट का ब्लॉकिंग आउटपुट है, promptजावास्क्रिप्ट का ब्लॉकिंग इनपुट है, और confirmजावास्क्रिप्ट का ब्लॉकिंग बाइनरी इनपुट है। यदि JS को कमांड लाइन पर लिखा जाना है, तो वे कॉल वे होंगे जो आप उपयोग करेंगे।
zzzzBov

1
@zzzzBov, ब्लॉकिंग आउटपुट का उपयोग करना निश्चित रूप से इस कार्य के लिए एक बुरा विचार होगा।
पीटर टेलर

2
@zzzzBov, यह वह क्रम है जिसमें उन्हें बुलाया जाता है जिसके बारे में मैं चिंतित हूं - जब तक कि जेएस की युक्ति उस आदेश के बारे में मजबूत गारंटी नहीं देती है जिसमें सेटटाइमआउट-एन्केक्ड थ्रक्स कहते हैं।
पीटर टेलर

13

एपीएल ( १५ १३)

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

यह क्या करता है:

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

मुझे 3 पात्रों के बजाय बॉक्स दिखाई दे रहे हैं।
13

8
@ArtemIce: वहाँ तीन बक्से (quads) माना जाता है। दो I / O वैरिएबल हैं (इसे पढ़कर इनपुट मिलता है, और इसे आउटपुट प्रिंट करता है), और एक ⎕DLफंक्शन के नाम पर है जो स्लीप है।
मारिनस

9

एरलांग में चार प्रयास:

कंसोल के आउटपुट, ने प्रत्येक को ऐसा करने के लिए स्वतंत्रता दी है 9ms * Numberक्योंकि यह काम करने के लिए पर्याप्त है (एटम एम्बेडेड बोर्ड पर परीक्षण = धीमा):

60 चरस चाहिए

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

कंसोल के लिए आउटपुट कुल संयुक्त राष्ट्र-एरलैंगिश है, इसलिए हम Pइसके बजाय प्रक्रिया के लिए एक संदेश भेजते हैं :

55 चरस चाहिए

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

एक समय के बाद भेजना भी अलग तरह से किया जा सकता है (यह काम भी करता है 1ms * Number):

41 चर की जरूरत है

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

वास्तव में यह थोड़ा अनुचित है क्योंकि बिल्ट इन फंक्शन send_afterदेर से आने वाला है और erlang:हमें नाम स्थान पूर्वसर्ग की जरूरत है , अगर हम इस नाम स्थान को आयातित मानते हैं (मॉड्यूल स्तर पर)

34 चरस चाहिए

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

7

C # - 137 वर्ण

यहाँ C # में एक उत्तर है (टिप्पणी के रूप में समानता की डिग्री के साथ अद्यतन)

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

1
आपको मेरे OpenMP C कोड में WithDegreeOfParallelism, इसे काम करने के लिए निर्दिष्ट करना होगा num_threads
कोनराड रुडोल्फ

120 बाइट्स: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 ध्यान दें कि आपको थ्रेड्स में फिर से शामिल होने की आवश्यकता है, यदि आप चाहते हैं कि आपका प्रोग्राम अपेक्षित व्यवहार करे
फिर भी

क्यों? सबसे लंबे समय तक चलने वाला धागा प्रक्रिया को जीवित रखेगा।
मृपचूल

7

अजगर - 81 93 148 150 153

Tweaking @ BiggAl का कोड, क्योंकि वह गेम जो हम खेल रहे हैं ...।

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

... या 97 175 देरी से शुरू होने वाले धागे के साथ

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

कमांड लाइन, अला के माध्यम से इनपुट लेता है

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

कई अजगर गोल्फों के साथ, एक बिंदु आता है जहां कोड पर्याप्त कॉम्पैक्ट होता है जो नामों को छोटा करने के लिए वेरिएबल्स को भी वर्णों को सहेजता नहीं है।

यह एक अजीब बात है क्योंकि यह एलियास एस और बीओटीएच को टी के रूप में फैलाता है, इसलिए एसआईएस.गर्गव टी.गर्गव बन जाता है। फू आयात * की तुलना में कम है, और एक शुद्ध चरित्र बचत! हालांकि मुझे लगता है कि Guido प्रसन्न नहीं होगा ...

स्वयं पर ध्यान दें - सी जानें और अजगर में गोल्फ को रोकें। HOLY गाय इस C हल से दूर है!


मैं कुछ मोड़ बनाने में कामयाब रहा, लेकिन प्रारूपण टिप्पणियों में अच्छी तरह से दिखाई नहीं देता है इसलिए मैंने अपना जवाब दिया। daemonजब तक आप इसे डेमॉन के रूप में शुरू नहीं कर रहे हैं, तब तक इसे सेट करने की आवश्यकता नहीं है, और यह स्थितीय आर्ग, एस्प का उपयोग करने के लिए छोटा है। यदि आप NoneN
12

ओह और पहला वाला 2.7.1 के तहत मेरे लिए काम नहीं करता, जैसा jकि अंत में लगता है False- एक पंक्ति में बहुत अधिक करने की कोशिश करने का एक दुष्परिणाम?
theheadofabroom

बकवास मुझे नहीं पता था कि आप एक ही उपनाम के लिए कई मॉड्यूल आयात कर सकते हैं - मैं वास्तव में इसके लिए कुछ उपयोगों के बारे में सोच सकता हूं जहां मेरे पास एक ही कस्टम बेस क्लास के कई उपवर्ग हैं जो अलग उप-मॉड्यूल में झूठ बोलते हैं। अगर हम एक और 30 शेव कर सकते हैं तो यह बैश से कम है ... लेकिन मुझे नहीं लगता कि ऐसा होगा।
theheadofabroom

अरघ का कारण मुझे नहीं पता था क्योंकि आप नहीं कर सकते हैं - मैंने बस इसे चलाने की कोशिश की और थ्रेडिंग को अलियास नहीं किया, इसे सिर्फ थ्रेडिंग कहा जाता है। यह sys कि t को aliased है ... क्या आपने इसे चलाने की कोशिश की? यह आयात करने के लिए प्रत्येक हालांकि पर केवल एक अतिरिक्त 2 वर्ण है as t,sऔर फिर उपयोग करने के लिए बदलने sके लिएsys
theheadofabroom

1
आप printइसके बजाय फ़ंक्शन का उपयोग क्यों नहीं करते sys.stdout.write?
उड़ान भेड़

6

मज़े के लिए, यहाँ एक कोल्डफ़्यूज़न (8+) संस्करण ;-) इसमें 109 वर्ण हैं जो लाइन रैप्स और इंडेंटेशन की गिनती नहीं करते हैं, जो मैंने यहाँ सुगमता के लिए जोड़ा है।

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

यह मानता है कि <cfoutput>प्रभाव में है। यह सब एक पंक्ति में लिखकर कुछ पात्रों को बचाया जा सकता है।


6

जावा (उर्फ कोडगोल्फ में कभी नहीं जीतता): 234 211 187 वर्ण

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();}}

ungolfed:

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();
    }
}

@ सीधे सेट करने के लिए धन्यवाद।
सच्चाई

वर्ग गैर-सार्वजनिक हो सकता है, 7 वर्णों की बचत कर सकता है।
डैनियल लुबरोव

1
आप भी घोषणा कर सकते हैं throws Throwableऔर catchखंड से छुटकारा पा सकते हैं ।
डैनियल लुबरोव

मुझे लगता है कि आप की जगह 2 बाइट्स बचा सकता है Long.parseLongके साथ Long.valueOf
हाइपरन्यूट्रिनो 15

मुझे पता है कि यह 6.5 साल हो गया है, लेकिन आप कुछ हिस्सों को गोल्फ कर सकते हैं: publicऔर finalहटाया जा सकता है; class M{public static void mainहो सकता है interface M{static void main(जावा 8+); Long.parseLong(a)हो सकता है new Long(a)( 165 बाइट्स के परिणामस्वरूप )
केविन क्रूज़सेन

5

जावास्क्रिप्ट - 52 वर्ण

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

CodeGolf.SE में आपका स्वागत है! मैंने आपके लिए इसका उत्तर स्वरूपित किया है, विशेष रूप से अपने कोड को चार स्थान से इंडेंट करने के लिए इसे कोड के रूप में प्रदर्शित करने के लिए। आपको संपादन पृष्ठ के साइडबार में अन्य स्वरूपण सहायता मिलेगी।
dmckee

5

स्काला - 42 40 अक्षर (विशेष मामला)

यदि आपके पास थ्रेड पूल कम से कम सूची तत्वों की संख्या का आकार है:

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

स्काला - 72 अक्षर (सामान्य)

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

{}जब आप एक पंक्ति में रहते हैं तो उपयोग नहीं करते हैं ।
उड़ान भेड़

@ भेड़ पालन - आप {}एक बयान के साथ छोड़ सकते हैं , लेकिन आपको अभी भी समूह की चीजों को अलग करने की आवश्यकता है ;, एक पंक्ति या नहीं। और आप {}कुछ मामलों में (यदि / उदाहरण के लिए) बिना मल्टी-लाइन स्टेटमेंट लिख सकते हैं ।
रेक्स केर

ओह, मेरा मतलब यह नहीं था कि आप उन्हें छोड़ सकते हैं, लेकिन ()इसके बजाय आप वन-लाइनर्स का उपयोग कर सकते हैं । यह वहाँ स्वाद की बात है, मुझे लगता है। (मैं बस वास्तव में नहीं मिलता है (), जब {}उन्हें समर्थन किया जाता है तो सभी का समर्थन क्यों किया जाता है। शायद जावा उपयोगकर्ताओं को तत्काल नहीं छोड़ना चाहिए)। स्काला शांत है, लेकिन इंडेंटेशन द्वारा कोड ब्लॉकों को परिभाषित करना स्पष्ट रूप से बेहतर है। (और इसलिए, धार्मिक युद्ध शुरू हो जाता है;))
उड़ान भेड़

@ भेड़ पालना - तुम गलत समझ रहे हो। आप ()एकल कथनों के लिए उपयोग कर सकते हैं । (1 to 9).map(i => {val j = i+1; i*j})REPL में प्रवेश करने का प्रयास करें और फिर देखें कि यदि आप उपयोग करते हैं तो क्या होता है (1 to 9).map(i => (val j = i+1; i*j))
रेक्स केर

सच है, लेकिन मैं केवल अभिव्यक्ति और सामान के लिए संदर्भित करता हूं। क्षमा करें, मैं लाइनब्रीक्स का उपयोग किए बिना लेखन सामग्री से नफरत करता हूं;)
उड़ान भेड़

4

हास्केल - 143 अक्षर

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

यह शायद एक स्टड पर इनपुट लेने से छोटा किया जा सकता है अगर यह एक विकल्प था, लेकिन यह देर से और किसी भी तरह से है, यह अभी भी फ़ंक्शन के लिए 104 वर्ण है।


4

Befunge-98, 38 31 बाइट्स

मुझे पता है कि यह एक पुरानी चुनौती है, लेकिन मैंने अभी हाल ही में स्लीपर्स और 2 डी दोनों भाषाओं की खोज की थी, उन्हें कैसे संयोजित करना है, इसके बारे में एक विचार था, और इसे पोस्ट करने के लिए एक जगह की तलाश थी, इसलिए यहां हम हैं।

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

मुख्य आईपी एक नंबर ( &) पढ़ता है , फिर tइसे किन क्लोनों से टकराता है: एक ही लाइन और साइकल पर आगे बढ़ता है, नए नंबर पढ़ता है और नए चिल्ड पैदा करता है जब तक कि यह ईओएफ तक नहीं पहुंचता है जो अनुक्रम को समाप्त करता है। सभी बच्चे प्रक्रियाओं एक बंद लूप (में अटक vऔर ^तीसरे स्तंभ के) जब तक मुख्य आईपी इनपुट पढ़ चुकी है और आदेश के अनुक्रम को निष्पादित करता '<21pहै, जो चरित्र डालता <स्थिति (1,2) में, अधिलेखन ^और सभी को मुक्त कराने के बच्चे की प्रक्रिया, जो एक साथ चक्र में शुरू होती है, प्रत्येक पुनरावृत्ति में उनकी संख्या 1 से कम करती है। चूंकि अलग-अलग आईपी की निष्पादन गति बेफ़ुज में सिंक्रनाइज़ की जाती है, इसलिए वे इनपुट सूची को क्रमबद्ध करते हुए (और उनके मूल्य को प्रिंट करेंगे)।


26 बाइट्स नियंत्रण प्रवाह को थोड़ा बढ़ाकर।
जो राजा

3

पार्टी में थोड़ी देर:

मेपल - 91 83 वर्ण

91 में:

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

83 में:

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

(यह मेपल संस्करण 15 की जरूरत है, और सूची में एल की छंटनी की उम्मीद है)


3

सी, 70 69 चरस

बच्चे की प्रक्रियाओं के लौटने का इंतजार नहीं करता, अन्यथा काम करता है।

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

2

PHP 57 बाइट्स

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

pcntl_fork () केवल linux के अंतर्गत उपलब्ध है।


2

बैश (38):

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

संपादित करें: स्टड से फ्लोटिंग-पॉइंट, रिक्त स्थान या नईलाइन्स द्वारा अलग किया गया।


2

हास्केल, 90

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

मुझे उम्मीद है कि यह सभी आवश्यकताओं को पूरा करता है।



1

बस @rmckenzie के संस्करण से कुछ ट्विक करना:

पायथन विलंबित थ्रेड प्रारंभ होता है 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()

में देरी के बिना अजगर 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()

के Timerबजाय का उपयोग करते हुए कुछ और अधिक अनुकूलन का प्रबंधन किया Thread, जिसमें अधिक संक्षिप्त कॉल है और आयात करने की आवश्यकता को हटा दिया है time। विलंबित थ्रेड प्रारंभ विधि सूची बोध से लाभ करती है क्योंकि यह प्रारंभ में सूची को अलग करने की आवश्यकता को हटा देती है, हालांकि यह दो वर्णों से लंबा है ( "["+"]"+" "-":") लूप की तुलना में अधिक लंबा है, इसलिए यह बिना देरी किए प्रारंभ है, और आपको सूची का उपयोग करने के लिए सावधान रहना होगा एक जनरेटर के बजाय, या आप वास्तव में टाइमर धागे नहीं बना रहे हैं जब तक कि आप जनरेटर के माध्यम से चंक नहीं करते हैं।

क्या किसी और के पास कोई अनुकूलन है?


चाल के साथ asमदद करता है, लेकिन 2.7.1 में आप केवल एक मॉड्यूल को एक उपनाम में आयात कर सकते हैं, और कुछ के बारे में खेलने के बाद भी import mod1,mod2 as a,bआप नहीं कर सकते हैं import mod1 as a, mod2 as b। यह अभी भी कुछ पात्रों को बचाता है, लेकिन काफी इलाज नहीं है-मुझे लगा कि यह सब कुछ था ... और वास्तव में यह sys के रूप में sys को छोड़ने के लिए बेहतर है। अलियासिंग थ्रेडिंग अभी भी हालांकि मदद करता है ...


तुमने मुझे हरा दिया, एक परवरिश की। मुझे x = []; x + = [] पसंद है। नहीं पता था कि आप ऐसा कर सकते हैं ....
बजे

... आप इसे 128 में कर सकते हैं यदि आप अपने पाश और f (x) में: [कथन] के बीच रिक्त स्थान को ढीला करते हैं ... किसी तरह मुझे यह 127 में मिला, लेकिन मुझे लगता है कि अंतिम नई पंक्ति की गिनती नहीं है (जो कि सीजी में वैध है)। सोचा था कि मैं आपको एक टूल होने और आपका कोड चुराने के बजाय अपडेट दे दूंगा।
arrdem

@rmckenzie इसके लिए जाओ, मैंने तुम्हारी चोरी की। मुझे हमेशा CG'd अजगर को देखने में दिलचस्पी है - मुझे ऐसा लगता है कि मैं भाषा के लक्ष्यों पर विचार करते हुए बहुत विकृत हो रहा हूँ ...
theheadofabroom

हाँ, मैं ईमानदारी से हैरान हूँ कि वर्णों के "कांच के फर्श" की कीमत पर सबसे अधिक योग्य गोल्फ खिलाड़ी कैसे बने रहते हैं। इसे बाहर की जाँच करें: आयात सूत्रण, sys के रूप में t
arrdem

1

क्लोजर, 54

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


आप कुछ पात्रों को हटाकर defn(इसकी कोष्ठक + तर्क सूची: 54 से 43 बजे तक) को छोड़ कर या " > लेन- = 2 के fnबजाय का उपयोग करके कुछ वर्णों से छुटकारा पा सकते हैं , defnइसलिए मैं कहूँगा कि मैं अपने 43: D
test30

1

जंग - 150 बाइट्स

और यही कारण है कि आप जंग में गोल्फ को कोड नहीं करते हैं, यह जावा की तुलना में अधिक क्रिया है;)। बाहरी टोकरा पर निर्भर करता है crossbeam, यह इसके बिना भी बदतर होगा।

|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)});})}

पूरा परीक्षण कार्यक्रम:

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

बोरिंग की तरह, सी # का बंदरगाह, बस फिर से भाषा के साथ शुरू करने के लिए:

एफ # - 90 अक्षर

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

0

जावास्क्रिप्ट, 74

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

या गैर-मानकता के साथ 71/65 वर्ण:

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

2011 में भी मुझे लगता है कि function(a){a.map(function(v){setTimeout(console.log,v,v)})}60 बाइट्स के लिए कम से कम एक ब्राउज़र में काम किया होगा। बेशक इन दिनों आप a=>a.map(v=>setTimeout(console.log,v,v))इसके बजाय लिखेंगे ।
नील


0

VB.NET 100 बाइट्स

क्योंकि VB.Net को केवल एक स्टेटमेंट को रखने के लिए सिंगल लाइन लैम्ब्डा की आवश्यकता होती है, इस कोड में कई लाइनें होती हैं:

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

Ungolfed:

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

हालाँकि मुझे यकीन नहीं है कि अगर आप बाइट काउंट्स में इम्पोर्टेन्ट स्टेटमेंट गिनते हैं क्योंकि अगर आप उन्हें नहीं गिनेंगे तो मैं यह लिख सकता हूँ:

VB.NET 71 बाइट्स

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

Ungolfed:

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

ग्रूवी, 47 बाइट्स

मान लें कि कमांड लाइन पर नंबर दिए गए हैं ...

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


0

गणितज्ञ, 34 या 36 बाइट्स

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

सूची को इस कोड के अंत में क्रमबद्ध करने और मूल्यांकन करने के लिए संलग्न करें। यदि इसे एक मान्य फ़ंक्शन परिभाषा की आवश्यकता है तो इसमें दो अतिरिक्त बाइट्स लगते हैं:

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

0

सी ++ 11, 229 बाइट्स

#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;}

अधूरा और उपयोग:

#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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.