ใช้การเรียงลำดับการนอนหลับ


74

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 หมายเลข) เพื่อให้สภาพการแข่งขันไม่เคยเกิดขึ้น และสมมติว่าสภาพการแข่งขันไม่เคยเกิดขึ้น


3
สิ่งที่นับรวมกับความยาว? เสร็จสิ้นโปรแกรมรวมถึง IO หรือเพียงแค่ขั้นตอนที่เกี่ยวข้อง?
Konrad Rudolph

8
มีปัญหากับสิ่งนี้ ขึ้นอยู่กับลำดับของรายการคุณอาจไม่ได้อ่านรายการทั้งหมดก่อนที่จะพิมพ์ค่าแรก ตัวอย่างเช่นรายการขนาดใหญ่ที่ใช้เวลาอ่าน 45 วินาทีค่าแรกคือ 2 และค่าสุดท้ายคือ 1 เธรดที่จะพิมพ์ 1 อาจถูกดำเนินการหลังจากพิมพ์ 2 โอ๊ะโอ - ผลลัพธ์ไม่ได้เรียงอย่างถูกต้อง อาจมีวิธีแก้ไขปัญหาบางประการ - การสร้างเธรดแล้วเริ่มต้นหลังจากอ่านรายการทั้งหมด (แต่จะนำไปสู่โค้ดที่ยาวกว่าเมื่อเทียบกับกอล์ฟ) ฉันสงสัยว่ามีใครสามารถจัดหาสนามกอล์ฟที่จัดการปัญหานี้ได้หรือไม่ ... ฉันจะลองดู
โทมัสโอเวนส์

11
อนึ่งสิ่งที่ทำให้ขั้นตอนวิธีนี้จริงๆที่น่าสนใจก็คือว่ามีอยู่จริงการใช้งานในชีวิตจริง ตัวอย่างเช่นการเรียงลำดับดีเอ็นเอ (การเรียงลำดับ Sanger) ขึ้นอยู่กับบางสิ่งเช่นนี้ในการเรียงลำดับชิ้นส่วนดีเอ็นเอตามความยาวของพวกเขา ความแตกต่างคือการดำเนินการหาลำดับทางร่างกายไม่ใช่ในคอมพิวเตอร์
Konrad Rudolph

12
ฉันเกลียดที่จะเป็นหนึ่งในสายฝนในขบวนพาเหรดของทุกคน แต่นี่ไม่ใช่เพียงแค่ลดความซับซ้อนลงในตัวกำหนดตารางเวลาระบบปฏิบัติการในแบบที่อาจเป็น O (N ^ 2)?
Random832

1
ฉันคิดว่ามีอัลกอริทึมการเรียงลำดับทางกายภาพที่ใช้เวลา O (n) แต่วัตถุทางกายภาพ O (n) เราสามารถใช้เทียนหลอมและหลอดเพื่อทำมันได้ en.wikipedia.org/wiki/Spaghetti_sort
Ming-Tang

คำตอบ:


17

ชนิดของความพยายามที่อ่อนแอPerl , 59 55 52 38 32 ตัวอักษร :

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 หรือเมื่อมีการประกาศคุณสมบัติ 'พูด' คุณสามารถแทนที่printฟังก์ชันด้วยsayการบันทึกอักขระในแต่ละอินสแตนซ์ เห็นได้ชัดว่าdieทั้งคู่ยุติกระบวนการทางแยกและเขียนผลลัพธ์มันยังคงเป็นทางออกที่สั้นที่สุด


คุณสามารถเรียกใช้perl-Eเพื่อเปิดใช้งานคุณลักษณะ 5.010 เช่นsay
mbx

(fork&&die sleep$_)for@aทำงานเกินไป
malkaroee

20

C , 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
เยี่ยมมากฉันต้องเรียนรู้ opemp
Nils

ฉันจะเรียกว่า 93 ตัวอักษร (โดยไม่ต้องแยกวิเคราะห์บรรทัดคำสั่งและอื่น ๆ ) แต่มันน่าประทับใจมากที่คุณสามารถทำได้ด้วยตัวละครพิเศษเพียง 34 ตัวใน C!
Rex Kerr

1
@KonradRudolph - คุณสามารถบันทึก 6 for(;c>=0;--c){int x=atoi(v[c]);ไบต์จะย้อนกลับ: ไม่แน่ใจว่าได้รับอนุญาตหรือไม่
owacoder

15

Ruby 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}เพื่อพิมพ์ผลงาน
Howard

@ วิธี: จับที่ดีขอบคุณ!
Ventero

@Ventero ฉันแค่เรียนรู้ Ruby เท่านั้นและฉันต้องการทราบว่าคุณจะใช้งานฟังก์ชันแลมบ์ดานี้ได้อย่างไรหรือเฉพาะเจาะจงมากขึ้นว่าคุณให้อินพุตนี้อย่างไร เป็นไปได้หรือไม่ที่จะทำงานกับ IRB ขอบคุณ!
Ben Hili

14

JavaScript , 65 ตัวอักษร(ขึ้นอยู่กับว่าคุณใช้console.logหรืออย่างอื่นในการแสดงผลลัพธ์)

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

นี่ถือว่าaเป็นอาร์เรย์ของจำนวนเต็มที่ไม่เป็นลบและmap()มีอยู่ในอาเรย์ต้นแบบ (JavaScript 1.6+)


1
คุณสามารถโกนอักขระสองหรือสามตัวโดยคูณด้วย 10 (หรือ 9) แทนที่จะเป็น 1,000 โดยไม่ลดทอนความถูกต้อง
Konrad Rudolph

12
หากหนึ่งวินาทีมีจุดประสงค์เพื่อคงไว้คุณสามารถใช้1e3แทนได้
Joey

2
@Tomalak alertเป็นเอาต์พุตการบล็อกของpromptJavaScript เป็นอินพุตการบล็อกของ JavaScript และconfirmเป็นการปิดกั้นอินพุตไบนารีของ JavaScript หาก JS ถูกเขียนบนบรรทัดคำสั่งการโทรเหล่านั้นจะเป็นการโทรที่คุณจะใช้
zzzzBov

1
@zzzzBov การใช้เอาต์พุตการบล็อกอาจเป็นความคิดที่ไม่ดีสำหรับงานนี้
Peter Taylor

2
@zzzzBov เป็นคำสั่งที่พวกเขาถูกเรียกซึ่งฉันเป็นห่วง - เว้นแต่ว่าข้อมูลจำเพาะของ JS มีการรับประกันที่แข็งแกร่งเกี่ยวกับลำดับที่ thunks setTimeout-enqueued ที่ถูกเรียก
Peter Taylor

13

APL ( 15 13)

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

มันทำอะไร:

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

ฉันเห็นกล่องแทน 3 ตัวอักษร
กำหนด

8
@ArtemIce: ควรจะมีสามกล่อง (ล่าม) สองคือตัวแปร I / O (การอ่านจะรับอินพุตและเขียนลงในมันพิมพ์เอาต์พุต) และหนึ่งอยู่ในชื่อของ⎕DLฟังก์ชันซึ่งเป็นโหมดสลีป
marinus

9

สี่ครั้งใน Erlang:

เอาท์พุทไปยังคอนโซลได้ใช้เสรีภาพในการทำสิ่งนี้9ms * Numberเนื่องจากมันมีมากพอที่จะทำให้มันใช้งานได้ (ทดสอบบนบอร์ดฝังตัว Atom = ช้า):

ต้องการ 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
คุณจะต้องระบุWithDegreeOfParallelismให้สิ่งนี้ทำงานได้ตามรหัสnum_threadsใน OpenMP C ของฉัน
Konrad Rudolph

120 bytes: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 โปรดทราบว่าคุณต้องเข้าร่วมเธรดอีกครั้งหากคุณต้องการให้โปรแกรมของคุณมีพฤติกรรมที่คาดหวัง
Yet Another Geek

ทำไม? เธรดที่ยาวที่สุดที่รันอยู่จะทำให้กระบวนการยังมีชีวิตอยู่
MrPaulch

7

Python - 81 93 148 150 153

Tweaking @ BiggAl's code เนื่องจากเป็นเกมที่เรากำลังเล่นอยู่ ....

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

รับอินพุตผ่านบรรทัดคำสั่ง ala

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

เช่นเดียวกับ python golfs หลายจุดมีจุดที่รหัสมีขนาดเล็กพอที่ตัวแปรนามแฝงเพื่อย่อชื่อไม่ได้บันทึกตัวละคร

อันนี้ขี้ขลาดแม้ว่าเพราะมันเป็นนามแฝง sys และเกลียวทั้งเป็น t ดังนั้น sys.argv กลายเป็น t.argv สั้นกว่าจาก foo import * และการประหยัดอักขระสุทธิ! อย่างไรก็ตามฉันคิดว่ากุยโดจะไม่พอใจ ...

หมายเหตุถึงตนเองเรียนรู้ c และหยุดเล่นกอล์ฟในหลาม ศักดิ์สิทธิ์วัวนี่มันสั้นกว่าทางออก C!


ฉันจัดการเพื่อปรับแต่งบางอย่าง แต่การจัดรูปแบบไม่ปรากฏขึ้นอย่างดีในความคิดเห็นดังนั้นฉันจึงได้คำตอบของตัวเอง daemonไม่จำเป็นต้องตั้งค่าเว้นแต่คุณจะเริ่มต้นเป็น daemon และสั้นกว่าที่จะใช้ args ตำแหน่ง esp ถ้าคุณนามแฝงNoneถึงN
theheadofabroom

โอ้และอันแรกไม่ได้ผลสำหรับฉันภายใต้ 2.7.1 ตามที่jดูเหมือนจะจบลงFalse- ผลข้างเคียงของการพยายามทำมากเกินไปในหนึ่งบรรทัด?
theheadofabroom

ฉันไม่คิดว่าคุณจะสามารถนำเข้าหลายโมดูลไปยังนามแฝงเดียวกันได้ - ฉันคิดว่ามีประโยชน์หลายอย่างสำหรับสิ่งที่ฉันมีคลาสย่อยหลายคลาสของคลาสพื้นฐานที่กำหนดเองเดียวกันซึ่งอยู่ในโมดูลย่อยแยกกัน ถ้าเราสามารถโกนทิ้งอีก 30 มันสั้นกว่าทุบตี ... แต่ฉันไม่คิดว่ามันจะเกิดขึ้น
theheadofabroom

อารเหตุผลที่ฉันไม่รู้เพราะคุณทำไม่ได้ - ฉันลองใช้มันและการทำเกลียวไม่ได้ใช้ชื่อแทนมันเรียกว่าการทำเกลียว มันคือ sys ที่ใช้นามแฝงกับ t ... คุณลองใช้งานมันได้หรือไม่ มันเป็นเพียง 2 ตัวอักษรพิเศษสำหรับแต่ละตัวที่จะนำเข้าas t,sและจากนั้นเปลี่ยนเพื่อใช้sสำหรับsys
theheadofabroom

1
ทำไมคุณไม่ใช้printฟังก์ชั่นแทนsys.stdout.write?
แกะบินได้

6

เพื่อความสนุกนี่คือเวอร์ชัน ColdFusion (8+) ;-) มีอักขระ 109 ตัวที่ไม่นับการตัดบรรทัดและการเยื้องบรรทัดที่ฉันเพิ่มเพื่อความชัดเจน

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

สิ่งนี้จะถือว่า<cfoutput>มีผล สามารถบันทึกอักขระได้สองสามตัวโดยเขียนทุกบรรทัดในบรรทัดเดียว


6

Java (aka ไม่เคยชนะที่ codegolf): 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();
    }
}

@ Joey ขอบคุณสำหรับการตั้งค่าตรง
trutheality

ชั้นเรียนสามารถเป็นแบบไม่สาธารณะได้ซึ่งช่วยประหยัด 7 ตัวอักษร
Daniel Lubarov

1
คุณสามารถประกาศthrows Throwableและกำจัดcatchประโยคได้
Daniel Lubarov

ฉันคิดว่าคุณสามารถบันทึก 2 ไบต์โดยการแทนที่ด้วยLong.parseLong Long.valueOf
HyperNeutrino

ฉันรู้ว่ามันใช้เวลา 6.5 ปีแล้ว แต่คุณสามารถตีกอล์ฟบางส่วนได้publicและfinalสามารถถอดออกได้ class M{public static void mainสามารถinterface M{static void main(Java 8+); Long.parseLong(a)สามารถเป็นnew Long(a)(ทำให้เกิดการ165 ไบต์ )
Kevin Cruijssen

5

Javascript - 52 ตัวอักษร

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

ยินดีต้อนรับสู่ CodeGolf.SE! ฉันได้จัดรูปแบบให้คุณตอบโดยเฉพาะอย่างยิ่งการเยื้องรหัสของคุณโดยสี่ช่องว่างเพื่อให้มันแสดงเป็นรหัส คุณจะพบความช่วยเหลือในการจัดรูปแบบอื่น ๆ ในแถบด้านข้างของหน้าแก้ไข
dmckee

5

Scala - 42 40 ตัวอักษร (กรณีพิเศษ)

หากคุณมีเธรดพูลอย่างน้อยขนาดของจำนวนองค์ประกอบรายการ:

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

Scala - 72 ตัวอักษร (ทั่วไป)

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

afaik ที่คุณไม่ได้ใช้{}เมื่ออยู่ในบรรทัดเดียว
แกะบินได้

@flying sheep - คุณสามารถละเว้น{}ด้วยคำสั่งเดียวแต่คุณยังต้องการมันเพื่อจัดกลุ่มสิ่งต่าง ๆ คั่นด้วย;หนึ่งบรรทัดหรือไม่ และคุณสามารถเขียนคำสั่งหลายบรรทัดโดยไม่มี{}ในบางกรณี (เช่น / อื่น ๆ )
Rex Kerr

โอ้ฉันไม่ได้หมายความว่าคุณสามารถละเว้นพวกเขา แต่คุณสามารถใช้()สำหรับหนึ่งสมุทรแทน ฉันคิดว่ามันเป็นเรื่องของรสนิยมที่นั่น (ฉันแค่ไม่เข้าใจว่าทำไมได้รับ()การสนับสนุนเลยเมื่อ{}แทนที่พวกเขาอาจจะไม่ทำให้ผู้ใช้ Java เปลี่ยนทันที) Scala เจ๋ง แต่การกำหนดบล็อคโค้ดโดยการเยื้องนั้นดีกว่าอย่างชัดเจน (และดังนั้นสงครามทางศาสนาก็เกิดขึ้น;))
แกะบิน

@flying sheep - คุณเข้าใจผิด คุณสามารถใช้()สำหรับคำสั่งเดียว ลองป้อน(1 to 9).map(i => {val j = i+1; i*j})ใน REPL (1 to 9).map(i => (val j = i+1; i*j))แล้วดูว่าเกิดอะไรขึ้นถ้าคุณใช้
Rex Kerr

จริง แต่ฉันอ้างถึงเฉพาะสำนวนและสิ่งต่าง ๆ ขออภัยฉันเกลียดการเขียนสิ่งต่าง ๆ โดยไม่สามารถใช้ linebreaks;)
แกะบิน

4

Haskell - 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

สิ่งนี้อาจทำให้สั้นลงได้โดยการป้อนข้อมูลลงบน stdin หากเป็นตัวเลือก แต่มันก็ช้าและอย่างใดอย่างหนึ่งก็ยังคง 104 อักขระสำหรับฟังก์ชันนั้น


4

Befunge-98, 38 31 bytes

ฉันรู้ว่านี่เป็นความท้าทายที่เก่าแก่ แต่เมื่อเร็ว ๆ นี้ฉันเพิ่งค้นพบทั้งภาษา sleepsort และ 2D มีความคิดเกี่ยวกับวิธีการรวมพวกเขาและมองหาสถานที่ที่จะโพสต์ดังนั้นที่นี่เราอยู่

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

IP หลักจะอ่านตัวเลข ( &) จากนั้นจะชนกับtโคลนอันใดอันหนึ่งคือดำเนินการในบรรทัดและรอบเดียวกันอ่านตัวเลขใหม่และสร้าง childs ใหม่จนกว่าจะถึง EOF ซึ่งจะยุติลำดับ กระบวนการลูกทั้งหมดติดค้างในวงปิด ( vและ^คอลัมน์ที่สาม) จนกระทั่ง IP หลักเสร็จสิ้นการอ่านอินพุตและดำเนินการตามลำดับของคำสั่ง'<21pซึ่งทำให้อักขระ<อยู่ที่ตำแหน่ง (1,2) เขียนทับ^และปล่อยทั้งหมด กระบวนการลูกซึ่งเริ่มวงจรพร้อมกันลด 1 หมายเลขของพวกเขาในแต่ละรอบ เนื่องจากความเร็วในการดำเนินการของ IP ที่แตกต่างกันจะถูกซิงโครไนซ์กันก่อนจึงจะยุติ (และพิมพ์ค่า) ตามลำดับเรียงลำดับรายการอินพุต


26 ไบต์โดยการเลื่อนโฟลว์คอนโทรลไปรอบ ๆ
Jo King

3

สายไปงานเลี้ยงเล็กน้อย:

Maple - 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];

(ต้องใช้รุ่น Maple 15 และคาดว่าจะเรียงลำดับรายการเป็น L)


3

C, 70 69 ตัวอักษร

ไม่รอให้กระบวนการของเด็กกลับมาทำงานได้

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


2

Bash (38):

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

แก้ไข: ทศนิยมจาก stdin คั่นด้วยช่องว่างหรือขึ้นบรรทัดใหม่


2

Haskell, 90

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

ฉันหวังว่านี่จะเป็นไปตามข้อกำหนดทั้งหมด



1

เพียงแค่ปรับแต่งบางอย่างจากรุ่นของ @rmckenzie:

Python หน่วงเวลาการเริ่มเธรด 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 โดยไม่ชักช้า 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()

จัดการ optimisations อีกไม่กี่ใช้Timerแทนซึ่งมีการเรียกร้องที่รัดกุมมากขึ้นและลบออกจำเป็นที่จะต้องนำเข้าThread timeวิธีการเธรดเริ่มต้นที่ล่าช้าจะได้ประโยชน์จากรายการความเข้าใจเนื่องจากไม่จำเป็นต้องกำหนดค่าเริ่มต้นรายการแยกกันตั้งแต่เริ่มต้นถึงแม้ว่าจะมีอักขระสองตัวที่ยาวกว่า ( "["+"]"+" "-":") มากกว่า for for loop ดังนั้นจึงไม่มีประโยชน์โดยไม่ต้องเริ่มล่าช้า แทนที่จะเป็นตัวสร้างหรือคุณไม่ได้สร้างเธรดตัวจับเวลาจนกว่าคุณจะผ่านตัวกำเนิด

ใครบ้างที่มีการเพิ่มประสิทธิภาพ


เคล็ดลับกับasช่วย แต่ใน 2.7.1 คุณสามารถนำเข้าโมดูลหนึ่งเป็นนามแฝงและหลังจากการเล่นเกี่ยวกับคุณไม่ได้คุณต้องimport mod1,mod2 as a,b import mod1 as a, mod2 as bมันยังช่วยรักษาตัวละครได้ไม่กี่ตัว แต่ก็ไม่ได้แก้อะไรทั้งหมดที่ฉันคิดว่ามันเป็น ... และในความเป็นจริงมันจะดีกว่าถ้าปล่อยให้ระบบเป็น sys นามแฝงการทำเกลียวยังช่วยได้ ...


คุณทำให้ฉันชนะมีการอัพเดท ฉันชอบ x = []; x + = [] ไม่รู้ว่าคุณสามารถทำได้ ....
arrdem

... คุณสามารถทำเช่นนี้ใน 128 ถ้าคุณปล่อยช่องว่างระหว่าง: [คำสั่ง] ในลูปของคุณและ f (x) ... อย่างใดที่ฉันได้มันถึง 127 แต่ฉันคิดว่านั่นไม่ใช่การนับบรรทัดใหม่ขั้นสุดท้าย (ซึ่ง ถูกต้องใน CG) คิดว่าฉันจะให้การอัปเดตแก่คุณแทนที่จะเป็นเครื่องมือและขโมยรหัสของคุณ
arrdem

@rmckenzie ไปเพื่อมันฉันขโมยของคุณ ฉันสนใจที่จะเห็น CG'd python เสมอ - ฉันรู้สึกว่าฉันกำลังทำสิ่งที่ผิดปกติมากเมื่อพิจารณาถึงเป้าหมายของภาษา ...
theheadofabroom

ใช่ฉันตกใจอย่างแท้จริงกับวิธีการที่หลามมากที่สุดกอล์ฟอยู่ใน ... ในราคาของ "พื้นกระจก" ของตัวละคร ตรวจสอบสิ่งนี้: นำเข้าเกลียว, sys เป็น t
arrdem

1

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
test30

1

สนิม - 150 ไบต์

และนี่คือเหตุผลที่คุณไม่เขียนรหัสกอล์ฟใน Rust มันมีความละเอียดมากกว่า Java;) ขึ้นอยู่กับลังภายนอก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

ชนิดที่น่าเบื่อพอร์ตของ C # เพียงเพื่อเริ่มต้นกับภาษาอีกครั้ง:

F # - 90 ตัวอักษร

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

หรือ 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))แทน
Neil


0

VB.NET 100 ไบต์

เนื่องจาก VB.Net ต้องการ lambdas บรรทัดเดียวเพื่อให้มีคำสั่งเดียวเท่านั้นโค้ดนี้จึงต้องมีหลายบรรทัด:

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

Mathematica, 34 หรือ 36 ไบต์

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

เพียงต่อท้ายรายการที่จะเรียงลำดับท้ายรหัสนี้และประเมินผล ถ้ามันจะต้องมีการกำหนดฟังก์ชั่นที่ถูกต้องแล้วมันต้องใช้สองไบต์พิเศษ:

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

0

C ++ 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;}

Ungolfed และการใช้งาน:

#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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.