หยุดยืนอยู่ตรงที่คุณอยู่!


35

ท้าทาย

เขียนฟังก์ชั่นซึ่งจะใช้เวลาหนึ่งพารามิเตอร์: tจำนวนเต็ม ฟังก์ชั่นของคุณจะต้องหยุดโปรแกรมของคุณเป็นtเวลาไม่กี่วินาทีก่อนดำเนินการต่อคล้ายกับtime.sleep(t)ใน Python และWAIT tใน BBC BASIC

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

สำหรับการทดสอบฟังก์ชั่นของคุณนั้นมีความคลาดเคลื่อนที่ยอมรับได้น้อยกว่า 0.1 วินาทีtในเครื่องของคุณ: ความแตกต่างระหว่างคอมพิวเตอร์นั้นดี

ถ้าคำตอบของคุณจะถูกท้าทายโดยทุกคนที่คุณจะต้องให้การถ่ายภาพ (screenshotted) พิสูจน์ให้เห็นว่าการทำงานของคุณทำงานอย่างถูกต้องสำหรับt=1, และt=5 t=25คุณอาจให้รายละเอียดของคอมพิวเตอร์ของคุณเพื่อให้ผู้อื่นสามารถลองทำซ้ำบนเครื่องของตนเอง

โปรแกรมของคุณควรและจะทำงานบนคอมพิวเตอร์ที่มีความเร็วสัญญาณนาฬิกา 1.6 GHz หรือสูงกว่า

การชนะ

โปรแกรมที่สั้นที่สุดชนะ

เงินรางวัล

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

ลีดเดอร์บอร์ด

/* Configuration */

var QUESTION_ID = 55293; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 30525;

/* App */

var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;

function answersUrl(index) {
  return "http://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

function commentUrl(index, answers) {
  return "http://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}

function getAnswers() {
  jQuery.ajax({
    url: answersUrl(answer_page++),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      answers.push.apply(answers, data.items);
      answers_hash = [];
      answer_ids = [];
      data.items.forEach(function(a) {
        a.comments = [];
        var id = +a.share_link.match(/\d+/);
        answer_ids.push(id);
        answers_hash[id] = a;
      });
      if (!data.has_more) more_answers = false;
      comment_page = 1;
      getComments();
    }
  });
}

function getComments() {
  jQuery.ajax({
    url: commentUrl(comment_page++, answer_ids),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      data.items.forEach(function(c) {
        if (c.owner.user_id === OVERRIDE_USER)
          answers_hash[c.post_id].comments.push(c);
      });
      if (data.has_more) getComments();
      else if (more_answers) getAnswers();
      else process();
    }
  });  
}

getAnswers();

var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;

var OVERRIDE_REG = /^Override\s*header:\s*/i;

function getAuthorName(a) {
  return a.owner.display_name;
}

function process() {
  var valid = [];
  
  answers.forEach(function(a) {
    var body = a.body;
    a.comments.forEach(function(c) {
      if(OVERRIDE_REG.test(c.body))
        body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
    });

    var patt = new RegExp(/[Bb]ounty/);
    var res = patt.test(body);
    var bountyyn = "no";

    if (res) {
      bountyyn = "yes";
    }
    
    var match = body.match(SCORE_REG);
    if (match)
      valid.push({
        user: getAuthorName(a),
        size: +match[2],
        language: match[1],
        link: a.share_link,
        bounty: bountyyn
      });
    
  });
  
  valid.sort(function (a, b) {
    var aB = a.size,
        bB = b.size;
    return aB - bB
  });

  var languages = {};
  var place = 1;
  var lastSize = null;
  var lastPlace = 1;
  valid.forEach(function (a) {
    if (a.size != lastSize)
      lastPlace = place;
    lastSize = a.size;
    ++place;
    
    var answer = jQuery("#answer-template").html();
    answer = answer.replace("{{PLACE}}", lastPlace + ".")
                   .replace("{{NAME}}", a.user)
                   .replace("{{LANGUAGE}}", a.language)
                   .replace("{{SIZE}}", a.size)
                   .replace("{{LINK}}", a.link)
                   .replace("{{BOUNTY}}", a.bounty);
    answer = jQuery(answer);
    jQuery("#answers").append(answer);

    var lang = a.language;
    if (/<a/.test(lang)) lang = jQuery(lang).text();
    
    languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
  });

  var langs = [];
  for (var lang in languages)
    if (languages.hasOwnProperty(lang))
      langs.push(languages[lang]);

  langs.sort(function (a, b) {
    if (a.lang > b.lang) return 1;
    if (a.lang < b.lang) return -1;
    return 0;
  });

  for (var i = 0; i < langs.length; ++i)
  {
    var language = jQuery("#language-template").html();
    var lang = langs[i];
    language = language.replace("{{LANGUAGE}}", lang.lang)
                       .replace("{{NAME}}", lang.user)
                       .replace("{{SIZE}}", lang.size)
                       .replace("{{LINK}}", lang.link);
    language = jQuery(language);
    jQuery("#languages").append(language);
  }

}
body { text-align: left !important}

#answer-list {
  padding: 10px;
  width: 400px;
  float: left;
}

#language-list {
  padding: 10px;
  width: 290px;
  float: left;
}

table thead {
  font-weight: bold;
}

table td {
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
  <h2>Leaderboard</h2>
  <table class="answer-list">
    <thead>
      <tr><td></td><td>Author</td><td>Language</td><td>Size</td><td>Bounty?</td></tr>
    </thead>
    <tbody id="answers">

    </tbody>
  </table>
</div>
<div id="language-list">
  <h2>Winners by Language</h2>
  <table class="language-list">
    <thead>
      <tr><td>Language</td><td>User</td><td>Score</td></tr>
    </thead>
    <tbody id="languages">

    </tbody>
  </table>
</div>
<table style="display: none">
  <tbody id="answer-template">
    <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td>{{BOUNTY}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>
<table style="display: none">
  <tbody id="language-template">
    <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>


จะเกิดอะไรขึ้นถ้าภาษาโปรแกรมที่เราเลือก ( ไอแก้ไอ ) สนับสนุนการใช้เวลาให้แม่นยำถึง 1 วินาทีเท่านั้น?
Doorknob

@Doorknob การป้อนข้อมูลเป็นจำนวนเต็มดังนั้นก็ดี
Beta Decay

3
@Doorknob บางทีคุณสามารถวัดเวลาดำเนินการนอกโปรแกรมของคุณได้เช่นเอาท์พุทดีบั๊กและดูการประทับเวลาของ DebugView
โทมัสเวลเลอร์

1
ชื่อและBBC BASICตัวอย่างอ้างอิงถึงรายการโทรทัศน์Sherlockหรือฉันกำลังอ่านเรื่องนี้มากเกินไปหรือไม่?
ลดขนาด

1
อย่างน้อยก็ทำให้คุณรู้ว่าชื่อของคุณนั้นไม่ถูกต้อง;)
ทำให้เสียชีวิต

คำตอบ:


36

x86_64 รหัสเครื่อง 10 ไบต์

Hexdump ของรหัส:

48 69 c9 ca fc 59 38 e2 fe c3

รหัสที่มา (สามารถประกอบโดยml64Visual Studio):

    TITLE   heh

PUBLIC  mywait
_TEXT   SEGMENT
mywait  PROC
    imul rcx, 945421514
myloop:
    loop myloop
    ret
mywait  ENDP
_TEXT   ENDS
END

ดำเนินการวนรอบที่ว่างเปล่าเริ่มต้นจากค่าที่ระบุลงไปที่ 0 ฉันเลือกตัวคูณ 945421514 สังเกตุโดยการทดลองและข้อผิดพลาดจนกระทั่งโปรแกรมการทดสอบของฉันออกผลลัพธ์ที่น่าพอใจ

โปรแกรมทดสอบ (รอ 10 ครั้งสำหรับแต่ละช่วงเวลา 1, 5 และ 25 วินาที):

#include <stdio.h>
#include <time.h>

extern "C" void mywait(int);

int main()
{
    int durations[] = {1, 5, 25};
    for (int duration: durations)
    {
        for (int i = 0; i < 10; ++i)
        {
            clock_t before = clock();
            mywait(duration);
            clock_t after = clock();
            printf("%f\n", (after - before) / (double)CLOCKS_PER_SEC);
        }
    }
    getchar(); // now take a screenshot
}

ผลลัพธ์:

1.003000
1.000000
1.004000
1.006000
1.005000
0.998000
0.995000
1.000000
1.005000
1.004000
4.999000
5.003000
5.035000
5.010000
4.992000
5.003000
5.003000
5.019000
5.026000
4.989000
25.041000
24.993000
25.049000
24.988000
25.038000
24.948000
25.007000
25.014000
25.053000
25.021000

ฉันรันโปรแกรมนี้บนคอมพิวเตอร์ Windows ที่ไม่มีอะไรให้ทำอีกแล้ว ถ้ามันรันบางแอพพลิเคชั่นเวลาที่รอจะผิดปกติมากขึ้น

ความเร็วของ CPU คือ 3.9 GHz ดูเหมือนว่ารหัสนี้จะดีพอสำหรับเทคโนโลยีพีซีปัจจุบัน - หากความถี่สัญญาณนาฬิกาอยู่ที่ประมาณ 8.8 GHz ตัวคูณจะไม่พอดีกับ int 32- บิตที่เซ็นชื่อ


ป.ล. เนื่องจากคำตอบนี้ไม่ได้ตรวจสอบว่าเวลาผ่านไปนานเท่าใดจึงเป็นผู้สมัครรับรางวัล


4
นี่มันเจ๋งมาก: D
Beta Decay

12
3900 GHz ว้าว! อาจจะ MHz
WayToDoor

2
@WayToDoor แก้ไขแล้ว! เพิ่มข้อมูลความสนุกที่เกี่ยวข้องกับสิ่งนั้นด้วย
anatolyg

1
แหล่งที่มาคือ 142 ไบต์ดังนั้นนั่นคือสิ่งที่คำตอบนี้ควรได้รับคะแนนเป็น
Peter Taylor

3
@PeterTaylor 142 ไบต์ในภาษาประกอบ ; มากน้อยในรหัสเครื่อง ภาษาเหล่านี้แตกต่างกัน ในความคิดของฉันรหัสเครื่องสนุกกว่า (อย่างไรก็ตามภาษาแอสเซมบลีจะดีกว่าในการท้าทาย [จำกัด แหล่งที่มา] ปัญหาของรหัสเครื่องคือไม่ใช่ ASCII และฉันคิดว่าไม่ใช่ปัญหาใหญ่ ปัญหาที่เกี่ยวข้องจะกล่าวถึงที่นี่ ; ฉัน (หรือคุณ) ควรเริ่มการสนทนาเกี่ยวกับรหัสเครื่องที่นั่นหรือไม่
Anatolyg

21

Bash, 29 25 24 23 19 ไบต์

w()(ping -t$1 1.2)

การทดสอบความแม่นยำ ( time) โดยที่$1= 1 วินาที:

real    0m1.012s
user    0m0.001s
sys     0m0.002s

ขอบคุณเดนนิสที่โกนหนวดไบต์นับถอยหลังถึง 19 จาก 23!

แก้ไข : ฉันเปลี่ยน IP เพื่อหลีกเลี่ยงpingบน Linux pinging 0.0.0.0 ซึ่งเป็นอุปกรณ์ลูปแบ็ค


วิธีนี้ใช้ได้ผล

ping มีค่าเริ่มต้นการหมดเวลา 1 วินาทีดังนั้นเมื่อติดต่อที่อยู่ IP ที่ไม่มีอยู่ ping จะไม่สามารถดำเนินการต่อไปจนกว่าจะหมดเวลาใช้งานหรือได้รับการตอบกลับจาก IP

-tบอกpingให้ลอง$1จำนวนครั้งในที่อยู่ IP ปลอมนี้บังคับpingให้ใช้เวลาไม่$1กี่วินาทีในการ ping


มันมีสิทธิ์ได้รับรางวัล! ไม่มีการวนซ้ำ!


Golfed: w()(ping -t$1 0.0)(เราจะต้องมีpings ที่แตกต่างกัน; เหมืองต้องการ-w$1และได้รับการตอบกลับจาก localhost.)
Dennis

ขวาแล้วมันต้องทำงานบน OS X ไม่มี/dev/lo
georgeunix

เปลี่ยน 0.0 เป็น 1.2 บน Linux
georgeunix

สำหรับ OS X w 10ฉัน10.02 sec realใช้timeอยู่
georgeunix

w()(ping -w$1 1.2)ทำงานเหมือนจับใจ
เดนนิส

18

Matlab, 33 ไบต์

function f(t)
tic;while toc<t,end

หรือคุณสามารถใช้สิ่งนี้ใน Octave: ลองออนไลน์

Matlab, 31 ไบต์

ตามที่แนะนำโดย @flawrสามารถทำได้ด้วยฟังก์ชันที่ไม่ระบุชื่อ (ควรกำหนดชื่อเพื่อใช้งาน):

@(t)eval('tic;while toc<t,end')

ตัวอย่าง:

>> f=@(t)eval('tic;while toc<t,end');
>> tic, f(2), toc
Elapsed time is 2.000323 seconds.

5
Tic ... Toc ... Tic ... Toc
Caridorc

4
หากหมายเลขอ้างอิงของฟังก์ชันที่ไม่ได้รับการกำหนดก็โอเคเช่นกันคุณสามารถใช้@(t)eval('tic;while toc<t,end')
ข้อบกพร่อง

@ flawr ว้าว! เคล็ดลับที่ดีมากที่ใช้evalในการแพ็คหลายคำสั่งในฟังก์ชั่นที่ไม่ระบุชื่อ ขอบคุณ!
Luis Mendo

ใช่บางครั้งก็เป็นเคล็ดลับที่มีประโยชน์ แต่คุณก็ยังไม่สามารถกำหนดค่าให้กับตัวแปรได้แม้จะอยู่ใน Eval ฉันยังคงทำงานเกี่ยวกับวิธีที่จะล่วงละเมิดจับฟังก์ชั่นสำหรับการทำงานซ้ำ =) PS: bsxfunคุณไม่จำเป็นต้องมีการกำหนดชื่อให้กับฟังก์ชั่นการจัดการที่บางครั้งคุณยังสามารถผ่านการจับโดยตรงเป็นอาร์กิวเมนต์ฟังก์ชั่นอื่นเช่นสำหรับ
ข้อบกพร่อง

+1 แต่รุ่นฟังก์ชั่นที่ไม่ระบุชื่อไม่ทำงานใน Octave (v 3.8.1) มันไม่สามารถรับรู้tตัวแปรภายใน eval
pawel.boczarski

11

Java, 63 62 ไบต์

t->{for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);}

ไม่มีอะไรน่าแปลกใจ - แค่คว้าจำนวนนาโนวินาทีตั้งแต่ 1/1/1970 หลายครั้งและตรวจสอบว่าวินาทีผ่านไปแล้วหรือยัง

บันทึก 1 ไบต์ขอบคุณ Ypnypn และ aditsu


25
เย้! โปรแกรม Java ที่มีขนาดต่ำกว่า 100 ไบต์ D
Beta Decay

5
@BetaDecay ยกเว้นว่าไม่ใช่โปรแกรมจริงๆ
253751

1
ไม่มีใครพูดถึงคุณสามารถย่อให้สั้นลงด้วยเพื่อ for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);
aditsu

กับt->อะไร
ส่องสว่าง

1
@Luminous เป็นนิพจน์แลมบ์ดาที่ใช้กันทั่วไปใน Java 8
TNT

8

รุ่นที่ 27 ไบต์

set /a c=%1+1
ping -n %c% 0

เคล็ดลับชุดยอดนิยมเนื่องจากชุดไม่ได้มีฟังก์ชั่นการนอนหลับ

ไม่มีลูปจึงมีสิทธิ์ได้รับรางวัลมากมาย


กอล์ฟ: set/ac=%1+1บันทึก 2 ไบต์
stevefestl

7

ผู้บังคับการเรือ 64 BASIC, 19 16ไบต์

1000 FORI=1TO930*N:NEXT:RETURN

N=<number-of-secods>:GOSUB1000ด้วยการโทร

อย่างไรก็ตามฉันไม่สามารถให้ความแม่นยำที่เพียงพอ เพราะ C64 มีเกี่ยวกับความเร็วของ CPU 1 MHz ผมจำได้ว่ามันเป็นที่ดีพอที่จะทำให้ที่ว่างเปล่าFOR- NEXTวง 1000 ครั้งเพื่อให้มันเป็นเรื่องเกี่ยวกับ 1 วินาที

ในความเป็นจริงมีสองเวอร์ชันหลักของเครื่องคือ PAL 0.985 MHz และ NTSC 1.023 MHz (ข้อมูลทั้งหมดจากC64 Wikipedia Page ) เนื่องจากฉันมีเวอร์ชัน NTSC จึงจำเป็นต้องเรียกใช้ลูปประมาณ 930 ครั้ง

ทดสอบด้วยโปรแกรมต่อไปนี้ ( Nวินาทีจัดทำโดยผู้ใช้ในINPUT):

10 INPUT N
20 PRINT TI$
30 GOSUB 1000
40 PRINT TI$
50 END
1000 FOR I=1 TO 930*N:NEXT I:RETURN

โดยที่TI$ตัวแปรของระบบมีสตริง ( hhmmssรูปแบบ) ซึ่งมีเวลาที่ผ่านไปจากการรีเซ็ตครั้งล่าสุด (ความแม่นยำ 1 วินาทีอย่างไรก็ตามยังขึ้นอยู่กับความเร็วของ CPU ดังนั้นสิ่งนี้จึงไม่เกี่ยวข้องเลยทีเดียวเพราะเป็นนาฬิกาเดียวกัน)

ป้อนคำอธิบายรูปภาพที่นี่

ทำด้วยออนไลน์ C64 จำลองภาพหน้าจอhttp://codeazur.com.br/stuff/fc64_final/

โปรแกรมนี้ (บรรทัด1000เท่านั้น) มีหน่วยความจำ16 19 ไบต์ตามที่ทดสอบกับPRINT FRE(0)+65535ทั้งคู่ก่อนพิมพ์รหัส (38908 ไบต์) และหลัง ( 38893 38889 ไบต์) PRINT FRE(0)ส่งคืนหน่วยความจำที่ว่างสำหรับโปรแกรม BASIC (เป็นค่าลบและ65535ควรเพิ่มค่าคงที่แต่ในความเป็นจริงมันไม่สำคัญ)

เนื่องจากโปรแกรมนี้ไม่ได้ทดสอบเวลาที่ผ่านไปในการวนซ้ำมันจึงมีสิทธิ์ได้รับรางวัล


ฉันจำได้ว่าฉันได้ทำการทดสอบTI$ความแม่นยำของตัวแปรและประมาณ 1 วินาทีต่อ ca ความแตกต่าง 2 ชั่วโมงกับนาฬิกาอ้างอิง (นอก C64) ดังนั้นความแม่นยำจึงเพียงพอ สิ่งที่ฉันไม่แน่ใจคือค่า950อย่างไรก็ตามมันจะเป็นค่าอื่น ๆ <1,000 (ซึ่งฉันแน่ใจ) ก็ยังคงเป็นจำนวนไบต์เดียวกัน
Voitcus

ฉันคิดว่าJตัวแปรควรเป็นส่วนหนึ่งของรหัสจริงไม่ใช่ส่วนหนึ่งของโปรแกรมทดสอบ - ดังนั้นมันจะรอเป็นเวลา N วินาทีไม่ใช่แค่ 1 วินาที ฉันไม่ทราบวิธีรวมเข้ากับไวยากรณ์พื้นฐานของ
anatolyg

@ anatolyg หืมมมใช่แล้วมันควรจะเป็นแบบที่1000 FOR I=1 TO N:FOR I=1 TO 950:NEXT I:NEXTJ:RETURNมีการโทรเช่น 200 N=5:GOSUB 1000. นอกจากนี้ผมได้สังเกตเห็นสหกรณ์ต้องมีฟังก์ชั่น ฉันจะพยายามแก้ไข
Voitcus

@anatolyg ฉันแก้ไขแล้วมันใช้GOSUB- RETURNคำสั่งเนื่องจากไม่มีฟังก์ชั่นในภาษา BASIC
Voitcus

@Voitcus ไม่DEF FNเหมือนใน BBC BASIC เหรอ?
Beta Decay

7

JavaScript ES6, 50 45 40 ไบต์

n=>{for(g=Date.now,z=g();z+n*1e3>g(););}

สิ่งนี้ใช้ฟังก์ชันการดำเนินการด้วยตนเองไม่แน่ใจว่าทำไม+new Dateไม่ทำงาน


การใช้

ฉันได้ทำการทดสอบนี้กับ Safari Nightly แล้ว แต่มันจะใช้ได้กับ Firefox ด้วย ทดสอบกับ:

(
  n=>{for(g=Date.now,z=g();z+n*1e3>g(););}
)(1); // 1 is the delay is seconds
console.log( 'foo' );

คุณสามารถเรียกใช้โดยล้อมรอบด้วยวงเล็บ:

( n=>{for(g=Date.now,z=g();z+n*1e3>g(););} )(5)

หรือโดยการตั้งชื่อ:

const wait=n=>{for(g=Date.now,z=g();z+n*1e3>g(););}
wait(5)

คำอธิบาย

นี่คือตรรกะหลักที่อยู่เบื้องหลังโปรแกรม:

function (n) {
    var start = Date.now();   // Save start time (ms)
    while (                   // while is synchronous, it'll block the code execution until it has finished
           start + (n * 1000) // This is the end time (start + delay)
            > Date.now()      // When the current time is 1 ms past the target end time, stop. resuming the code execution
          );
}

รุ่นที่ฉันใช้นั้นใช้ตรรกะแบบเดียวกัน:

n=>{ // Function with argument n, { is required if the functions is not just an expression
   for(           // For will also block code execution
                  // This first part is used to define variables
      g=Date.now, // Add an alias for Date.now as "g"
      z=g()       // get current time and store in z
      ;           // Next part, condition
      z + n*1e3   // Target end time, ( start + delay (converted to seconds) ) 1e3 is 1000 but in big e notation
      ;           // Is required for a valid for loop
   );
}

6

CJam, 15

{e3es+{_es>}g;}

นี่คือบล็อกที่สามารถเรียกใช้งานหรือเก็บไว้ในตัวแปรได้ (ซึ่งกลายเป็นฟังก์ชันที่มีชื่อ) Dennis และ Mr Consensus ยอมรับว่าการนับเฉพาะบล็อกนั้นเป็นที่ยอมรับ :)

คำอธิบาย:

e3       multiply the argument by 1000 (to get milliseconds)
es       get the current timestamp in milliseconds
+        add the values, obtaining the stopping time
{…}g     do…while
  _      duplicate the stopping time
  es>    check if we reached that time yet (loop condition)
;        discard the stopping time

ลองออนไลน์


1
ฉันทามติเกี่ยวกับ Meta ก็คือฟังก์ชั่นไม่จำเป็นต้องตั้งชื่อดังนั้นฉันขอยืนยันว่าบล็อกที่เหลืออยู่ในสแต็กนั้นใช้ได้เหมือนกับแลมบ์ดา
Dennis

6

JavaScript, 68 54 51 42

ฉันคิดว่าไม่ต้องการภาพหน้าจอ แต่ฉันสงสัยว่าคุณจะตีกอล์ฟได้มากกว่านี้ ...

เวอร์ชันใหม่: ในที่สุดฉันก็สามารถหลีกเลี่ยงnewและใช้งานได้Dateสองครั้ง:

f=t=>{for(x=(d=Date.now)();d()<x+t*1e3;);}

รุ่นเก่ากว่า:

f=t=>{for(x=new Date();(new Date()|0)<x|0+t*1e3;);}

f=t=>{x=(new Date())|0;while((new Date()|0)<x+t*1e3);}

f=t=>{x=new Date().getSeconds();while(new Date().getSeconds()<x+t);}

1
ไม่ต้องใช้สกรีนช็อตตอนนี้ :) เฉพาะเมื่อมีคนท้าทายโปรแกรมนี้
เบต้าผุ

5

PHP, 171 177 84 79 65 64 62 ไบต์

<?php function a($i){for($f=microtime,$e=$f(1)+$i;$f(1)<$e;);}


การใช้งาน:
เรียกใช้ฟังก์ชั่นดังนี้:
php -d error_reporting=0 -r "require 'script.php'; a(5);echo 'Hello, World!';"
โดยที่ 5 คือเวลาในหน่วยวินาทีที่โปรแกรมควรรอก่อนที่มันจะสะท้อน "Hello, World!"


คำอธิบาย:
ในตอนแรกฟังก์ชันรับเวลาปัจจุบันเป็นมิลลิวินาที จากนั้นฟังก์ชันจะวนซ้ำจนกระทั่งเวลาปัจจุบันมีขนาดเล็กลงจากนั้นเป็นครั้งแรก + อินพุต หลังจากนั้น "Hello World!" ได้รับเสียงสะท้อน

บันทึก:
บันทึกแล้ว 113 ไบต์ขอบคุณ Voitcus
บันทึก 2 ไบต์ขอบคุณ axiac


1
มันถูก - ดูคู่มือ , $get_as_floatพารามิเตอร์ ลบออก$tด้วย$s- คุณไม่ต้องการพวกเขา (ดูรหัสของฉัน)
Voitcus

1
1e6 = 1000000 หนึ่งล้าน echo 1e6;โรงงาน แต่ใช่ - การลอยตัวเป็นจำนวนวินาทีดังนั้น$e=microtime(1)+$i;จะเพียงพอ
Voitcus

2
ซอทำงานสำหรับคุณ
Voitcus

1
@Voitcus ขอบคุณสำหรับความช่วยเหลือของคุณ!
jrenk

1
คุณสามารถบันทึกเพิ่มเติม 2 ไบต์ (3 ไบต์บน PHP 7): 3v4l.org/fU11Y
axiac

5

จูเลีย33 33ไบต์

t->watch_file(".",t)

จะทำงานเฉพาะในจูเลีย v0.4 watch_fileเนื่องจากมีการเปลี่ยนแปลงในการทำงานของลายเซ็น กำหนดฟังก์ชั่นที่ไม่ระบุชื่อด้วยพารามิเตอร์เดียวtที่ (ab) ใช้พารามิเตอร์หมดเวลาในwatch_fileฟังก์ชั่น

นี่คือผู้สมัครรับรางวัล!

การสาธิตโดยใช้ Julia REPL:

julia> f=t->watch_file(".",t)
(anonymous function)

julia> @elapsed f(1)
1.002134983

julia> @elapsed f(5)
5.006161965

julia> @elapsed f(25)
25.026096192

คำตอบก่อนหน้า (33 ไบต์) ซึ่งทำงานใน Julia เสถียรเช่นกัน

t->(b=time();while b+t>time()end)

4

R, 48 ไบต์

f=function(t){a={g=Sys.time}();while(g()<a+t){}}

สาธิต:

t0 <- Sys.time();f(1); Sys.time() - t0 
## Time difference of 1.000272 secs

t0 <- Sys.time();f(5); Sys.time() - t0 
## Time difference of 5.011189 secs

t0 <- Sys.time();f(25); Sys.time() - t0 
## Time difference of 25.00848 secs

1
ฉันไม่คิดว่าคุณจะต้องรวมf=จำนวนไบต์ไว้ตัวอย่างฟังก์ชั่นก็ใช้ได้
โซโลมอน Ucko

4

PHP, 39 ไบต์

function a($a){while($i++<.4583e8*$a);}

(โปรดทราบว่าฉันสามารถทำให้โปรแกรมสั้นลงได้หากต้องการโปรแกรมเต็มรูปแบบโดยใช้ประโยชน์จากข้อโต้แย้งที่ส่งผ่านบรรทัดคำสั่งจนถึง35 )

<?php while($i++<.4583e8*$argv[1]);

โปรแกรมที่ใช้สำหรับการทดสอบ:

<?php function a($a){while($i++<.4583e8*$a);}

record(1);
record(5);
record(25);

function record($t)
{
    $time = microtime_float();
    a($t);
    echo microtime_float() - $time."\n";
}

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

ผล:

JamesWebster:Documents jameswebster$ php A.php
1.0093479156494
4.9945771694183
24.971961975098

ป้อนคำอธิบายรูปภาพที่นี่


แม้ว่าฉันจะมีสิทธิ์ได้รับรางวัล แต่ฉันก็แทบจะไม่ลงแข่งกับรายการอื่น ๆ !


อ๋อจำนวนไบต์ของคุณก็โอเค
Beta Decay

4

Windows CMD, 22 ไบต์

ping -w 1000 -n %1 1.1

สิ่งนี้ใช้ไม่วนซ้ำ (ฉลากและข้ามไป) ดังนั้นสิ่งนี้จึงมีคุณสมบัติเหมาะสมสำหรับการรับรางวัล

ส่งtPing ไปที่ 1.0.0.1 (ไม่ถูกต้อง) และรอการตอบกลับเป็น 1,000 มิลลิวินาที


3

JavaScript ES6, 40 ไบต์

t=>{for(t=(d=Date.now)()+t*1e3;d()<t;);}

ทดสอบกับสิ่งต่อไปนี้:

elapsed=(f,t,b=(d=Date.now)())=>(f(t),console.log(d()-b+"ms elapsed")) // accepts func, delay
STOP=t=>{for(t=(d=Date.now)()+t*1e3;d()<t;);}
elapsed(STOP,1)  // prints 1000ms elapsed
elapsed(STOP,5)  // prints 5000ms elapsed
elapsed(STOP,25) // prints 25000ms elapsed

คุณช่วยอธิบายอะไรได้elapsed(STOP, t)บ้าง? STOP และผ่านไปคืออะไร
สลายตัวเบต้า

elapsedวัดเวลาที่ใช้อาร์กิวเมนต์แรกเพื่อเรียกใช้ในกรณีนี้STOPซึ่งเป็นเพียงข้อมูลโค้ดแรก STOPหาเรื่องที่สองที่จะผ่านไปเป็นหาเรื่องที่ผ่านมา
Dendrobium

3

TI-BASIC (84 + SE), 21 ไบต์

วิธีการป้อนข้อมูล: T:prgmT. นี่เป็นฟังก์ชันที่ใกล้เคียงที่สุดใน TI-BASIC โปรแกรม:

For(A,1,841Ans
End

ความแม่นยำทั้งหมดนั้นได้จากการทดลองและข้อผิดพลาด การจับเวลาด้วยนาฬิกาจับเวลาใช้งานได้กับทุกกรณีทดสอบที่กำหนดภายในยี่สิบวินาที

ข้อมูลอุปกรณ์:

RAM FREE   23312
ARC FREE  889802


 TI-84 Plus Silver Edition
          2.55MP
PROD #: 0A-3-02-37
ID: 0A3DC-C3469-FFE8

W00T มีสิทธิ์ได้รับรางวัล!


1
คุณรู้หรือไม่: ความเร็วของFor(ลูปเครื่องคิดเลขของคุณขึ้นอยู่กับตัวแปรตัวอักษรที่มีอยู่จำนวนเท่าใด ตัวแปรเพิ่มเติมอุดตันภาษีมูลค่าเพิ่มและอาจใช้เวลามากถึง 20% ตัวแปรของระบบ (เช่นn , Xmin) มีภูมิคุ้มกัน
lirtosiast

@ThomasKwa Huh! น่าสนใจ ฉันจะปรับเทียบกับเครื่องคิดเลขที่สะอาดเมื่อฉันมีเวลาในการถ่ายโอนไฟล์
Conor O'Brien


2

PureBasic ขนาด 92 ไบต์

Procedure z(t)
t=t*1e3+ElapsedMilliseconds()
While t>ElapsedMilliseconds():Wend
EndProcedure

มันสั้นที่สุดที่ฉันนึกได้ ฉันสงสัยว่านี่จะยาวที่สุดที่นี่ด้วย ...

ทดสอบ:

OpenConsole()
i=Val(Input())
s=ElapsedMilliseconds()
z(i)
PrintN(Str(ElapsedMilliseconds()-s))
Input()

2

PowerShell, 75 ไบต์

การเรียกโพรซีเดอร์แบบยาวและเป็นคำอธิบาย Yay เพื่อความชัดเจนในภาษา :)

function w{param($i);$n=(Get-Date).AddSeconds($i);while($n-gt(Get-Date)){}}

เรียกได้ว่าภายในโปรแกรมที่มีอะไรทำนองนี้

Get-Date
w(15)
Get-Date

อีกทางเลือกหนึ่งถ้าเราอนุญาตให้เรียกใช้โปรแกรมภายนอกแทนเราสามารถลดขนาดได้ถึง59 ไบต์ด้วยสิ่งต่อไปนี้:

$n=(Get-Date).AddSeconds($args[0]);while($n-lt(Get-Date)){}

สิ่งนี้จะถูกเรียกภายในโปรแกรมดังนี้ (สมมุติว่าด้านบนจะถูกบันทึกเป็น "wait-function.ps1" และบันทึกในโฟลเดอร์เดียวกัน):

Get-Date
& ((Split-Path $MyInvocation.InvocationName) + "\wait-function.ps1 15")
Get-Date

สิ่งที่เราบันทึกไว้ในการเขียนฟังก์ชั่น / โปรแกรมเป็นมากกว่าการอุดตันโดยส่วนเกินที่จำเป็นในการดำเนินการจริง เลอถอนหายใจ


2

Python ขนาด 66 ไบต์

หมายเหตุการใช้งานของฉันไม่เรียกใช้ฟังก์ชั่นเวลา inbuilt หรือใช้คุณสมบัติการตั้งเวลา

def S(t):
 try:__import__("Queue").Queue().get(1,t)
 except:pass

และใช่มันมีสิทธิ์ได้รับรางวัล


ไม่, ไม่ถูกต้อง: คุณต้องไม่ใช้ฟังก์ชั่นที่รออยู่หรือ
Beta Decay

@BetaDecay: ตามความเข้าใจของฉัน Queue (). get ไม่ใช่ "ฟังก์ชั่นสำหรับการรันโค้ดหลังจากเวลาที่กำหนด" โปรดอธิบายว่าทำไมสิ่งนี้จึงมีคุณสมบัติเป็นหนึ่ง
อภิสิทธิ์

คำตอบอื่น ๆ อีกมากมายมีรหัสที่ใช้การหมดเวลาสำหรับสิ่งอื่น ๆ ดังนั้นควรแก้ไขด้วย
โซโลมอน Ucko


2

Pyth, 19 ไบต์

การเข้ามาสาย แต่หลังจากพบ.d0ในเอกสารเมื่อคืนฉันตัดสินใจที่จะไป

DCNK.d0W<-.d0KNJ1))

กำหนดฟังก์ชั่นที่ลูปจนกว่าเวลาที่ผ่านไปคือNวินาที

ลองมันนี่


ดี ฉันได้DCNJ+.dZN#Ig.dZJB))ซึ่งก็คือ 19 ไบต์
hakr14

2

RProgN 2 , 13 ไบต์

°°°)*™+]³]™>:

อธิบาย

°°°)*™+]³]™>:
°°°             # Push 3 tens to the stack.
   )*           # Get the product of the entire stack, including the implicit input. This is the shortest way to multiply the input by 1000.
     ™+         # Add it to the current time in miliseconds.
       ]        # Duplicate it to use as a (throwaway) conditional.
        ³   :   # Create a function using the next 3 concepts, and while the top of the stack is truthy, execute it.
         ]      # Duplicate the target time
          ™>    # Is it larger than the current time?

ค่าหัวบอกเป็นพิเศษว่า "โดยไม่ต้องใช้การตรวจสอบลูปว่าเวลาผ่านไปนานเท่าไหร่แล้ว " ซึ่งสิ่งนี้ไม่ทำ นี้จะกำหนดเวลาเป้าหมายและตรวจสอบว่ามันผ่านเวลาเป้าหมายนั้นจึงมีสิทธิ์ได้รับรางวัล

ลองออนไลน์!


1

Tcl , 53 ไบต์

proc W t {while "\[clock mil]-[clock mil]<$t*1e3" {}}

ลองออนไลน์!

อธิบาย

คำสั่งclock millisecondsสามารถลดลงได้clock milด้วยวงเล็บที่ 1 ที่หนีออกมามันจะถูกตีความที่แต่ละวงและไม่มีหนึ่งครั้ง เมื่อวัดเป็นมิลลิวินาทีเราต้องคูณด้วย 1,000 หรือ 1e3 ซึ่งประหยัดได้ 1 ไบต์


1

C # (Visual C # Interactive คอมไพเลอร์) + /u:System.Threading, 36 ไบต์

x=>new SemaphoreSlim(0).Wait(x*1000)

ลองออนไลน์!

สร้างเซมาฟอร์โดยไม่มีความจุและพยายามรับตามจำนวนวินาทีที่ระบุ

ฉันรู้ว่าฉัน "รอ" กำลังทำอะไรบางอย่างที่นี่ ให้ฉันนี้ดูเหมือนจะมากขึ้นเช่นการแก้ปัญหา ping / Thread.Sleepหมดเวลาเมื่อเทียบกับ รหัสพยายามรับทรัพยากรที่ไม่สามารถรับและหยุดพยายามหลังจากที่มีการ จำกัด

===

ด้านล่างนี้เป็นรูปแบบที่เริ่มต้น Taskด้วยวงวนไม่สิ้นสุดแล้วรอจนกว่าจะหมดเวลา เนมสเปซที่ต้องการทั้งหมดนั้นถูกรวมไว้โดยค่าเริ่มต้น แต่การแก้ปัญหานั้นมีความยาวมากกว่าสองสามไบต์

C # (Visual C # Interactive คอมไพเลอร์) , 40 ไบต์

x=>Task.Run(()=>{for(;;);}).Wait(x*1000)

ลองออนไลน์!


0

05AB1E , 22 ไบต์

žcžb60*+[Džcžb60*+αIQ#

ลองออนไลน์

หมายเหตุ: ขึ้นอยู่กับจำนวนไมโครวินาทีในวินาทีที่ผ่านมาความคลาดเคลื่อนอาจมากกว่า 0.1 วินาทีเล็กน้อย แต่เนื่องจากเกือบครึ่งคำตอบมีปัญหาคล้ายกันฉันคิดว่าได้รับอนุญาต

คำอธิบาย:

05AB1E ไม่มี builtins ใด ๆ สำหรับเวลาปัจจุบัน อย่างไรก็ตามมันมี builtin สำหรับปี / เดือน / วัน / ชั่วโมง / นาที / วินาที / microseconds ปัจจุบันเป็น builtins ที่แยกจากกัน เนื่องจากใช้เวลาเพียงไม่กี่วินาทีเท่านั้นที่จะสามารถแก้ไขปัญหาที่ก่อให้เกิดปัญหาจาก 59 ถึง 0 ฉันต้องการทั้งนาทีและวินาทีทำให้รหัสยาวกว่าคำตอบส่วนใหญ่ในภาษาที่ไม่มี codegolfing อย่างน่าเสียดาย

žc                # Push the current seconds
  žb              # Push the current minutes
    60*           # Multiply it by 60
       +          # Add them together
[                 # Start an infinite loop:
 D                #  Duplicate the initial (minutes*60 + seconds) from before the loop
  žcžb60*+        #  Push the current (minutes*60 + seconds) again
          α       #  And take the absolute difference between the two
           IQ     #  And if this is equal to the input:
             #    #   Stop the infinite loop

0

SmileBASIC ขนาด 20 ไบต์

INPUT T
DIALOG"",,,T

เปิดกล่องโต้ตอบที่ปิดโดยอัตโนมัติหลังจากไม่Tกี่วินาที ฉันไม่แน่ใจว่าสิ่งนี้นับว่าเป็น "ฟังก์ชั่นการรอคอย" หรือไม่ แต่ฉันคิดว่านี่เป็นเพียงการใช้งานที่ถูกต้องpingแต่ฉันคิดว่านี่เป็นเพียงเป็นที่ถูกต้องกับการใช้

โปรแกรม 37- ไบต์ทางเลือกที่ไม่โกงแน่นอน:

INPUT T
FADE.,T*60WHILE FADECHK()WEND

ทำให้หน้าจอเปลี่ยนสีซีดจางเป็น 0 (alpha = 0, red = 0, green = 0, blue = 0) (ไม่มีเอฟเฟกต์) ค่อย ๆ เป็นTวินาทีจากนั้นรอให้ภาพเคลื่อนไหวนั้นเสร็จสิ้น

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