Dừng lại, đứng đó, nơi bạn đang có!


35

Thử thách

Viết hàm lấy một tham số: một số nguyên t. Chức năng của bạn phải dừng chương trình của bạn trong tvài giây trước khi tiếp tục, tương tự như time.sleep(t)trong Python và WAIT ttrong BBC BASIC.

Bạn không được sử dụng bất kỳ chức năng chờ tích hợp hoặc bất kỳ chức năng tích hợp nào để thực thi mã sau một thời gian nhất định và chương trình của bạn phải tiếp tục sau tvài giây.

Để kiểm tra chức năng của bạn, có dung sai 0,1 giây nhiều hơn hoặc ít hơn mức đã cho t trên máy của bạn: phương sai giữa các máy tính đều ổn.

Nếu câu trả lời của bạn được thách thức bởi bất cứ ai, bạn phải cung cấp ảnh (screenshotted) bằng chứng cho thấy chức năng của bạn hoạt động một cách chính xác cho t=1, t=5t=25 . Bạn cũng có thể cung cấp các chi tiết của máy tính để mọi người có thể cố gắng sao chép nó trên máy của họ.

Chương trình của bạn nên và sẽ được chạy trên máy tính có tốc độ xung nhịp là 1.6 GHz trở lên.

Chiến thắng

Chương trình ngắn nhất sẽ thắng.

Tiền thưởng

Tiền thưởng sẽ đi ra chương trình ngắn nhất dừng chương trình mà không sử dụng vòng lặp kiểm tra thời gian đã trôi qua. Nếu bạn đang chạy cho tiền thưởng này, hãy thêm một chú thích nói rằng câu trả lời của bạn là dành cho tiền thưởng.

Bảng xếp hạng

/* 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>


Điều gì sẽ xảy ra nếu ngôn ngữ lập trình lựa chọn của chúng tôi ( ho hay ho ) chỉ hỗ trợ thời gian chính xác đến 1 giây?
Doorknob

@Doorknob Vâng, đầu vào là một số nguyên, vậy là tốt
Beta Decay

3
@Doorknob có lẽ bạn có thể đo thời gian thực hiện bên ngoài chương trình của mình, ví dụ: đầu ra gỡ lỗi và xem dấu thời gian của DebugView.
Thomas Weller

1
Là tiêu đề và BBC BASICví dụ là một tài liệu tham khảo cho chương trình truyền hình Sherlock hay tôi đang đọc quá nhiều về điều này?
Gây tử vong vào

1
Ít nhất nó cũng khiến bạn nhận ra rằng tiêu đề của bạn không chính xác;)
Fatalize

Câu trả lời:


36

mã máy x86_64, 10 byte

Mã thập phân của mã:

48 69 c9 ca fc 59 38 e2 fe c3

Mã nguồn (có thể được lắp ráp bởi ml64Visual Studio):

    TITLE   heh

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

Thực hiện một vòng lặp trống, bắt đầu từ giá trị được chỉ định xuống 0. Tôi đã chọn hệ số nhân 945421514 theo kinh nghiệm bằng thử nghiệm và lỗi, cho đến khi chương trình thử nghiệm của tôi cho kết quả khả quan.

Chương trình thử nghiệm (chờ 10 lần cho mỗi khoảng thời gian 1, 5 và 25 giây):

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

Kết quả:

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

Tôi đã chạy chương trình này trên máy tính Windows mà không có gì khác để làm. Nếu nó chạy một số ứng dụng, thời gian chờ đợi sẽ thất thường hơn.

Tốc độ CPU là 3,9 GHz. Có vẻ như mã này chỉ đủ tốt cho công nghệ PC hiện tại - nếu tần số xung nhịp khoảng 8,8 GHz, hệ số nhân sẽ không phù hợp với int 32 bit đã ký.


PS Vì câu trả lời này không kiểm tra thời gian đã trôi qua, nó là một ứng cử viên cho tiền thưởng.


4
Điều này thật tuyệt: D
Beta Decay

12
3900 GHz? Ái chà! Có lẽ là MHz?
WayToDoor

2
@WayToDoor Đã sửa! Cũng thêm một số thông tin thú vị liên quan đến điều đó.
anatolyg

1
Nguồn là 142 byte, vì vậy đó là những gì câu trả lời này nên được ghi là.
Peter Taylor

3
@PeterTaylor 142 byte trong ngôn ngữ lắp ráp ; ít hơn nhiều trong mã máy . Đây là những ngôn ngữ khác nhau; theo tôi, mã máy thú vị hơn (tuy nhiên, ngôn ngữ lắp ráp sẽ tốt hơn trong thử thách [nguồn bị hạn chế]). Vấn đề với mã máy là nó không phải là ASCII và tôi nghĩ đó không phải là vấn đề lớn. Một vấn đề liên quan được thảo luận ở đây ; Tôi (hoặc bạn) nên bắt đầu một cuộc thảo luận về mã máy ở đó?
anatolyg

21

Bash, 29 25 24 23 19 byte

w()(ping -t$1 1.2)

Kiểm tra độ chính xác ( time) trong đó $1= 1 giây:

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

Cảm ơn Dennis đã cạo số byte xuống còn 19 từ 23!

EDIT : Tôi đã thay đổi IP để tránh pingtrên Linux ping 0,0.0.0, đây là thiết bị loopback.


Làm thế nào điều này hoạt động

ping có thời gian chờ mặc định là 1 giây, vì vậy, khi liên hệ với địa chỉ IP không tồn tại, ping không thể tiếp tục cho đến khi hết thời gian hoặc đã nhận được phản hồi từ IP.

-tnói pingđể thử $1số lần trên địa chỉ IP giả này, buộc pingphải mất $1vài giây để hoàn thành ping.


Nó đủ điều kiện nhận tiền thưởng! Không có vòng lặp!


Golfed: w()(ping -t$1 0.0)(Chúng tôi phải có các pings khác nhau ; yêu cầu của tôi -w$1và nhận được phản hồi từ localhost.)
Dennis

Phải, sau đó nó chỉ phải hoạt động trên OS X mà không có/dev/lo
georgeunix

Thay đổi 0,0 thành 1,2 trên Linux
georgeunix

Trên OS X w 10, tôi 10.02 sec realsử dụng time.
georgeunix 27/08/2015

w()(ping -w$1 1.2)hoạt động như một lá bùa.
Dennis

18

Matlab, 33 byte

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

Hoặc bạn cũng có thể sử dụng điều này trong Octave: thử trực tuyến

Matlab, 31 byte

Theo đề xuất của @flawr , nó có thể được thực hiện với một hàm ẩn danh (cần được gán tên để sử dụng nó):

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

Thí dụ:

>> 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
Nếu một hàm xử lý chưa được gán cũng ổn, bạn cũng có thể sử dụng@(t)eval('tic;while toc<t,end')
flawr

@flawr Wow! Thủ thuật rất hay, sử dụng evalđể đóng gói một số câu lệnh trong một hàm ẩn danh. Cảm ơn!
Luis Mendo

Vâng, đôi khi đó là một mẹo hữu ích, nhưng bạn vẫn không thể gán giá trị cho các biến ngay cả trong eval. Tôi vẫn đang làm việc trên một cách để xử lý chức năng lạm dụng cho các chức năng đệ quy =) PS: Bạn không nhất thiết phải gán một tên cho chức năng xử lý, đôi khi bạn cũng có thể vượt qua xử lý trực tiếp như một đối số chức năng khác, ví dụ như cho bsxfun.
flawr

+1, nhưng phiên bản chức năng ẩn danh không hoạt động trong Octave (v 3.8.1). Nó không nhận ra tbiến bên trong eval.
pawel.boczarski

11

Java, 63 62 byte

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

Không có gì đáng ngạc nhiên - chỉ cần lấy số lượng nano giây kể từ 1/1/1970 nhiều lần và kiểm tra xem một giây đã trôi qua chưa.

Đã lưu 1 byte nhờ Ypnypn và aditsu.


25
Yay! Một chương trình Java dưới 100 byte; D
Beta Decay

5
@BetaDecay Ngoại trừ nó không thực sự là một chương trình.
dùng253751

1
Không ai đề cập đến bạn có thể rút ngắn nó với một cho? for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);
aditsu

Có chuyện gì với t->?
Sáng

1
@Lum Đó là một biểu thức lambda , thường được sử dụng trong Java 8.
TNT

8

Mẻ, 27 byte

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

Một thủ thuật lô phổ biến, vì lô không có chức năng ngủ.

Không có vòng lặp, vì vậy tiền thưởng đủ điều kiện


Golf: set/ac=%1+1tiết kiệm 2 byte.
stevefestl

7

Hàng hóa 64 BASIC, 19 16 byte

1000 FORI=1TO930*N:NEXT:RETURN

Với một cuộc gọi N=<number-of-secods>:GOSUB1000 .

Tuy nhiên, tôi không thể cung cấp đủ độ chính xác. Bởi vì C64 có khoảng 1 MHz tốc độ CPU, Tôi nhớ đó là tốt, đủ để làm cho một sản phẩm nào FOR- NEXTvòng lặp 1000 lần để nó là khoảng 1 giây.

Trên thực tế, có hai phiên bản chính của máy: PAL 0.985 MHz và NTSC 1.023 MHz (tất cả dữ liệu từ Trang Wikipedia C64 ). Như tôi đã có phiên bản NTSC, nó được yêu cầu chạy vòng lặp khoảng 930 lần.

Các thử nghiệm với chương trình sau ( Ngiây, do người dùng cung cấp 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

trong đó TI$một biến hệ thống chứa chuỗi ( hhmmssđịnh dạng) với thời gian trôi qua từ lần đặt lại trước (độ chính xác 1 giây, tuy nhiên cũng phụ thuộc vào tốc độ CPU, do đó, điều này không hoàn toàn phù hợp, vì đó là cùng một đồng hồ).

nhập mô tả hình ảnh ở đây

Ảnh chụp màn hình được thực hiện với trình giả lập C64 trực tuyến http://codeazur.com.br/ ware / fc64_final / .

Chương trình này ( 1000chỉ dòng ) chiếm 16 19 byte trong bộ nhớ, như đã được kiểm tra với PRINT FRE(0)+65535cả hai trước khi nhập mã (38908 byte) và sau ( 38893 38889 byte). PRINT FRE(0)trả về bộ nhớ trống cho chương trình BASIC ( 65535nên thêm giá trị âm và hằng số , nhưng thực tế nó không thành vấn đề).

Bởi vì chương trình này không kiểm tra thời gian trôi qua trong một vòng lặp, nên nó đủ điều kiện nhận tiền thưởng.


Tôi nhớ rằng tôi đã thực hiện một thử nghiệm làm thế nào TI$biến là chính xác và nó là khoảng 1 giây mỗi ca. Chênh lệch 2 giờ với đồng hồ tham chiếu (bên ngoài C64), do đó độ chính xác là đủ. Điều tôi không chắc chắn là giá trị 950, tuy nhiên, nó sẽ là bất kỳ giá trị nào khác <1000 (mà tôi chắc chắn), nó vẫn là cùng một lượng byte
Voitcus

Tôi nghĩ rằng Jbiến nào đó nên là một phần của mã thực sự, không phải là một phần của chương trình thử nghiệm - vì vậy nó sẽ đợi trong N giây, không chỉ 1 giây. Tôi không biết cách tích hợp nó vào cú pháp của BASIC.
anatolyg

@anatolyg Hừm, bạn nói đúng, nó sẽ giống như 1000 FOR I=1 TO N:FOR I=1 TO 950:NEXT I:NEXTJ:RETURNvới một cuộc gọi, vd. 200 N=5:GOSUB 1000. Ngoài ra tôi đã nhận thấy OP yêu cầu một chức năng . Tôi sẽ cố gắng sửa nó
Voitcus

@anatolyg Tôi đã sửa, nó sử dụng GOSUB- RETURNstatement, vì không có chức năng nào trong BASIC
Voitcus

@Voitcus Thậm chí không DEF FNgiống như trong BBC BASIC?
Beta Decay

7

JavaScript ES6, 50 45 40 byte

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

cái này sử dụng các hàm tự thực thi, không biết tại sao +new Datenó không hoạt động.


Sử dụng

Tôi đã thử nghiệm điều này với Safari Nightly nhưng nó cũng sẽ hoạt động trên Firefox. Đã thử nghiệm với:

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

Bạn có thể chạy nó bằng cách bao quanh nó bằng dấu ngoặc đơn:

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

Hoặc bằng cách đặt tên cho nó:

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

Giải trình

Đây là logic chính đằng sau chương trình:

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

Phiên bản tôi đang sử dụng sử dụng cùng logic:

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

Đây là một khối có thể được thực thi hoặc lưu trữ vào một biến (do đó trở thành một hàm được đặt tên). Dennis và Mr Đồng thuận đồng ý rằng chỉ tính khối là chấp nhận được :)

Giải trình:

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

Dùng thử trực tuyến


1
Đồng thuận trên Meta là các hàm không phải được đặt tên, vì vậy tôi cho rằng một khối còn lại trên ngăn xếp cũng có thể sử dụng được như lambda.
Dennis

6

JavaScript, 68 54 51 42

Tôi nghĩ rằng không cần ảnh chụp màn hình. Nhưng tôi nghi ngờ bạn có thể chơi golf này thậm chí nhiều hơn ...

Phiên bản mới: Cuối cùng tôi đã tránh được newvà sử dụng Datehai lần:

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

Các phiên bản cũ hơn:

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
Hiện tại không cần ảnh chụp màn hình :) Chỉ khi ai đó thách thức chương trình này
Beta Decay

5

PHP, 171 177 84 79 65 64 62 byte

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


Cách sử dụng:
Gọi hàm như vậy:
php -d error_reporting=0 -r "require 'script.php'; a(5);echo 'Hello, World!';"
Trong đó 5 là thời gian tính bằng giây, chương trình sẽ đợi trước khi tiếng vang "Xin chào, Thế giới!".


Giải thích:
Lúc đầu, hàm lấy thời gian hiện tại tính bằng mili giây. Sau đó, hàm thực hiện một vòng lặp cho đến khi Thời gian hiện tại nhỏ hơn lần đầu tiên + đầu vào. Sau đó "Xin chào thế giới!" bị dội lại.

Nhật ký:
Đã lưu 113 byte nhờ Voitcus
Đã lưu 2 byte nhờ vào trục


1
Đó là - xem hướng dẫn , $get_as_floattham số. Đồng thời xóa $t, $s- bạn không cần chúng (xem mã của tôi)
Voitcus

1
1e6 = 1000000 một triệu. echo 1e6;công trinh. Nhưng vâng - nhận được số float là số giây, vậy $e=microtime(1)+$i;là đủ
Voitcus

2
Một bí quyết làm việc cho bạn
Voitcus

1
@Voitcus cảm ơn sự giúp đỡ của bạn!
jrenk

1
Bạn có thể lưu thêm 2 byte (3 byte trên PHP 7): 3v4l.org/fU11Y
axiac

5

Julia, 33 20 byte

t->watch_file(".",t)

Chỉ hoạt động trong Julia v0.4 do thay đổi chữ ký hàm của watch_file. Xác định hàm ẩn danh với một tham số duy nhất t(ab) sử dụng tham số thời gian chờ trong watch_filehàm.

Đây là một ứng cử viên cho tiền thưởng!

Trình diễn bằng 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

Câu trả lời trước (33 byte), cũng hoạt động ổn định ở Julia

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

4

R, 48 byte

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

Trình diễn:

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
Tôi không nghĩ rằng bạn cần bao gồm f=số byte, các đoạn chức năng là tốt.
Solomon Ucko

4

PHP, 39 byte

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

(Lưu ý rằng tôi thực sự có thể rút ngắn được điều này nếu cần một chương trình đầy đủ bằng cách tận dụng các đối số được truyền trên dòng lệnh. Xuống đến 35 )

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

Chương trình được sử dụng để thử nghiệm:

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

Các kết quả:

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

nhập mô tả hình ảnh ở đây


Mặc dù tôi đủ điều kiện nhận tiền thưởng, tôi hầu như không chạy với một số mục khác!


Đúng, số byte của bạn vẫn ổn
Beta Decay

4

Windows CMD, 22 byte

ping -w 1000 -n %1 1.1

Điều này sử dụng không có vòng lặp (nhãn và goto) vì vậy điều này đủ điều kiện cho tiền thưởng

Nó gửi tping tới 1.0.0.1 (không hợp lệ) và chờ đợi thời gian chờ trong 1000 ms


3

JavaScript ES6, 40 byte

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

Đã thử nghiệm như sau:

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

Bạn có thể giải thích những gì elapsed(STOP, t)không? DỪNG và trôi qua là gì?
Beta Decay

elapsedđo thời gian để đối số đầu tiên chạy, trong trường hợp này, STOPlần lượt chỉ là đoạn mã đầu tiên. Các arg thứ hai trôi qua là các arg được truyền tới STOP.
Dendrobium

3

TI-BASIC (84 + SE), 21 byte

Phương thức nhập : T:prgmT. Đây là tương đương gần nhất của một chức năng trong TI-BASIC. Chương trình:

For(A,1,841Ans
End

Tất cả độ chính xác có được thông qua thử và sai; việc định thời gian với đồng hồ bấm giờ hoạt động cho tất cả các trường hợp thử nghiệm đã cho trong vòng một phần hai giây.

Thông tin thiết bị:

RAM FREE   23312
ARC FREE  889802


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

W00T đủ điều kiện nhận tiền thưởng!


1
Bạn có biết: tốc độ của các For(vòng lặp máy tính của bạn phụ thuộc vào số lượng biến chữ tồn tại không? Nhiều biến số làm tắc nghẽn VAT và có thể mất tới 20% thời gian của bạn. Các biến hệ thống (ví dụ n , Xmin) là miễn dịch.
lirtosiast

@ThomasKwa Huh! Hấp dẫn. Tôi sẽ hiệu chỉnh lại với một máy tính sạch khi tôi có thời gian để truyền tệp.
Conor O'Brien


2

PureBasic, 92 byte

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

Đó là ngắn nhất tôi có thể nghĩ ra. Tôi nghi ngờ đây sẽ là lâu nhất ở đây ...

Để kiểm tra:

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

2

PowerShell, 75 byte

Các cuộc gọi thủ tục mô tả dài. Yay cho rõ ràng trong một ngôn ngữ. :)

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

Được gọi trong một chương trình với cái gì đó như

Get-Date
w(15)
Get-Date

Ngoài ra, nếu chúng tôi cho phép các chương trình bên ngoài được gọi thay thế, chúng tôi có thể giảm xuống còn 59 Byte bằng cách sau:

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

Điều này sẽ được gọi trong một chương trình như sau (giả sử ở trên sẽ được lưu dưới dạng "Wait-function.ps1" và được lưu trong cùng một thư mục):

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

Tuy nhiên, những gì chúng ta tiết kiệm được khi viết chức năng / chương trình không chỉ bị ghi đè bởi sự dư thừa cần thiết để thực sự thực hiện nó. Thở dài.


2

Python, 66 byte

Lưu ý, việc triển khai của tôi không gọi hàm thời gian sẵn có, cũng không sử dụng tính năng lập lịch.

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

Và vâng, nó đủ điều kiện để nhận tiền thưởng.


Không, điều này không hợp lệ: Bạn không được sử dụng bất kỳ chức năng chờ tích hợp nào hoặc bất kỳ chức năng tích hợp nào để thực thi mã sau một thời gian nhất định
Beta Decay

@BetaDecay: Theo hiểu biết của tôi, Queue (). Get không phải là "hàm tích hợp để thực thi mã sau một thời gian nhất định". Hãy giải thích tại sao điều này sẽ đủ điều kiện là một.
Abhijit

Nhiều câu trả lời khác có mã sử dụng thời gian chờ cho những thứ khác, vì vậy điều này cũng tốt.
Solomon Ucko


2

Bình thường, 19 byte

Nhập cảnh muộn nhưng sau khi tìm thấy .d0trong các tài liệu tối qua, tôi quyết định cho nó đi.

DCNK.d0W<-.d0KNJ1))

Xác định hàm lặp cho đến khi hết thời gian N giây.

Thử nó ở đây .


Tốt đẹp. Tôi đã nhận DCNJ+.dZN#Ig.dZJB)), đó cũng là 19 byte.
hakr14

2

RProgN 2 , 13 byte

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

Giải thích

°°°)*™+]³]™>:
°°°             # 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?

Tiền thưởng đặc biệt nói rằng "không sử dụng vòng lặp kiểm tra bao nhiêu thời gian đã trôi qua ", điều này không làm được. Điều này đặt thời gian mục tiêu và tiếp tục kiểm tra xem nó có vượt qua thời gian mục tiêu đó hay không, do đó, nó đủ điều kiện nhận tiền thưởng.

Hãy thử trực tuyến!


1

Tcl , 53 byte

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

Hãy thử trực tuyến!

Giải thích

Lệnh clock millisecondscó thể được giảm xuống clock mil, với dấu ngoặc đầu tiên thoát, nó sẽ được hiểu tại mỗi vòng lặp và chỉ một lần. Vì nó đo được mili giây, chúng ta cần nhiều hơn 1000 hoặc 1e3 để tiết kiệm 1 Byte.


1

C # (Trình biên dịch tương tác Visual C #) + /u:System.Threading, 36 byte

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

Hãy thử trực tuyến!

Tạo một semaphore không có dung lượng và cố gắng lấy nó trong số giây đã chỉ định.

Tôi nhận ra tôi đang "chờ đợi" một cái gì đó ở đây. Đối với tôi điều này có vẻ giống như giải pháp ping / timeout hơn làThread.Sleep . Mã cố gắng để có được một tài nguyên mà nó không thể có được và ngừng thử sau một giới hạn.

===

Dưới đây là một biến thể bắt đầu một Task bằng một vòng lặp vô hạn, sau đó chờ cho nó hoàn thành với thời gian chờ. Tất cả các không gian tên được yêu cầu được bao gồm theo mặc định, nhưng giải pháp dài hơn một vài byte so với ở trên.

C # (Trình biên dịch tương tác Visual C #) , 40 byte

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

Hãy thử trực tuyến!


0

05AB1E , 22 byte

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

Hãy thử trực tuyến.

LƯU Ý: Tùy thuộc vào số lượng micro giây trong giây hiện tại đã trôi qua, dung sai có thể lớn hơn 0,1 giây một chút. Nhưng vì gần như một nửa câu trả lời có vấn đề tương tự, tôi nghĩ rằng nó được cho phép.

Giải trình:

05AB1E không có bất kỳ nội dung nào trong thời điểm hiện tại. Tuy nhiên, nó có một nội trang cho năm hiện tại / tháng / ngày / giờ / phút / giây / micro giây như các nội dung riêng biệt. Vì chỉ sử dụng giây có khả năng bao quanh từ 59 đến 0 gây ra sự cố, tôi cần cả phút và giây, khiến cho mã thậm chí dài hơn hầu hết các câu trả lời trong các ngôn ngữ không mã hóa.

ž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 byte

INPUT T
DIALOG"",,,T

Mở hộp thoại tự động đóng lại sau Tvài giây. Tôi không chắc chắn nếu điều này được tính là "chức năng chờ được tích hợp", nhưng tôi nghĩ rằng điều này cũng hợp lệ như việc sử dụngping .

Một chương trình 37 byte thay thế chắc chắn không gian lận:

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

Làm cho màu mờ dần của màn hình thay đổi thành 0 (alpha = 0, red = 0, green = 0, blue = 0) (không có hiệu ứng) dần dần T vài giây, sau đó đợi cho hình ảnh động đó kết thúc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.