Berhenti, berdirilah di sana di mana Anda berada!

35

Tantangan

Tulis fungsi yang mengambil satu parameter: integer t. Fungsi Anda harus menghentikan program Anda selama beberapa tdetik sebelum melanjutkan, mirip dengan time.sleep(t)Python dan WAIT tdi BBC BASIC.

Anda tidak boleh menggunakan fungsi menunggu bawaan atau fungsi bawaan untuk menjalankan kode setelah waktu tertentu, dan program Anda harus melanjutkan setelah tdetik.

Untuk menguji fungsi Anda, ada toleransi 0,1 detik lebih atau kurang dari yang diberikan tpada mesin Anda sendiri: varians antar komputer baik-baik saja.

Jika jawaban Anda ditantang oleh siapa pun, Anda harus memberikan bukti fotografis (screenshotted) bahwa fungsi Anda berfungsi dengan benar t=1, t=5dan t=25. Anda juga dapat memberikan rincian komputer Anda sehingga orang dapat mencoba untuk mereplikasi di komputer mereka sendiri.

Program Anda harus dan akan dijalankan pada komputer yang kecepatan clock-nya 1,6 GHz atau lebih tinggi.

Kemenangan

Program terpendek menang.

Karunia

Hadiah akan keluar ke program terpendek yang menghentikan program tanpa menggunakan loop memeriksa berapa banyak waktu yang telah berlalu. Jika Anda sedang dalam menjalankan hadiah ini, tambahkan catatan kaki yang mengatakan bahwa jawaban Anda adalah untuk hadiah itu.

Papan peringkat

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

Peluruhan Beta
sumber
Bagaimana jika bahasa pemrograman pilihan kita ( batuk batuk ) hanya mendukung mendapatkan waktu ke akurasi 1 detik?
Gagang Pintu
@ Doorknob Yah inputnya adalah bilangan bulat, jadi tidak apa-apa
Beta Decay
3
@Doorknob mungkin Anda dapat mengukur waktu eksekusi di luar program Anda, mis. Debug output dan lihat prangko waktu DebugView.
Thomas Weller
1
Apakah judul dan BBC BASICcontohnya merujuk pada acara tv Sherlock atau apakah saya terlalu banyak membaca tentang ini?
Fatalkan
1
Yah setidaknya itu membuat Anda menyadari bahwa judul Anda tidak eksak;)
Fatalize

Jawaban:

36

kode mesin x86_64, 10 byte

Hexdump kode:

48 69 c9 ca fc 59 38 e2 fe c3

Kode sumber (dapat dikumpulkan oleh ml64Visual Studio):

    TITLE   heh

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

Melakukan loop kosong, mulai dari nilai yang ditentukan hingga 0. Saya memilih pengganda 945421514 secara empiris dengan coba-coba, hingga program pengujian saya mengeluarkan hasil yang memuaskan.

Program uji (tunggu 10 kali untuk masing-masing durasi 1, 5 dan 25 detik):

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

Hasil:

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

Saya menjalankan program ini di komputer Windows yang tidak ada hubungannya. Jika menjalankan beberapa aplikasi, waktu tunggu lebih tidak menentu.

Kecepatan CPU adalah 3,9 GHz. Tampaknya kode ini hampir tidak cukup baik untuk teknologi PC saat ini - jika frekuensi clock sekitar 8,8 GHz, pengali tidak akan cocok dengan int 32-bit yang ditandatangani.


NB Karena jawaban ini tidak memeriksa berapa lama waktu telah berlalu, itu adalah kandidat untuk hadiah.

anatolyg
sumber
4
Ini keren: D
Beta Decay
12
3900 GHz? Wow ! Mungkin MHz?
WayToDoor
2
@WayToDoor Tetap! Juga menambahkan beberapa info menyenangkan terkait itu.
anatolyg
1
Sumbernya adalah 142 byte, jadi jawaban ini harus diberi skor.
Peter Taylor
3
@PeterTaylor 142 byte dalam bahasa assembly ; apalagi dalam kode mesin . Ini adalah bahasa yang berbeda; dalam kode mesin pendapat saya lebih menyenangkan (namun, bahasa assembly akan lebih baik dalam tantangan [sumber terbatas]). Masalah dengan kode mesin adalah bahwa itu bukan ASCII, dan saya pikir itu bukan masalah besar. Masalah terkait dibahas di sini ; haruskah saya (atau Anda) memulai diskusi tentang kode mesin di sana?
anatolyg
21

Bash, 29 25 24 23 19 byte

w()(ping -t$1 1.2)

Tes akurasi ( time) di mana $1= 1 detik:

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

Terima kasih Dennis karena telah memangkas hitungan byte menjadi 19 dari 23!

EDIT : Saya telah mengubah IP untuk menghindari pingpada Linux pinging 0.0.0.0, yang merupakan perangkat loopback.


Bagaimana ini bekerja?

ping memiliki batas waktu default 1 detik, jadi, saat menghubungi alamat IP yang tidak ada, ping tidak dapat dilanjutkan sampai batas waktu berlalu, atau mendapat balasan dari IP.

-tmemberitahu pinguntuk mencoba $1beberapa kali pada alamat IP palsu ini, memaksa pinguntuk mengambil $1detik untuk menyelesaikan ping.


Ini memenuhi syarat untuk hadiah! Tidak ada loop!

georgeunix
sumber
Golf: w()(ping -t$1 0.0)(Kita harus punya pings yang berbeda ; milikku membutuhkan -w$1dan mendapat balasan dari localhost.)
Dennis
Benar, maka itu hanya harus bekerja pada OS X tanpa/dev/lo
georgeunix
Ubah 0,0 ke 1,2 di Linux
georgeunix
Pada OS X, untuk w 10, saya mulai 10.02 sec realmenggunakan time.
georgeunix
w()(ping -w$1 1.2)bekerja seperti pesona.
Dennis
18

Matlab, 33 byte

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

Atau Anda juga dapat menggunakan ini di Octave: coba online

Matlab, 31 byte

Seperti yang disarankan oleh @ flawr , ini dapat dilakukan dengan fungsi anonim (harus diberi nama untuk menggunakannya):

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

Contoh:

>> f=@(t)eval('tic;while toc<t,end');
>> tic, f(2), toc
Elapsed time is 2.000323 seconds.
Luis Mendo
sumber
5
Tic ... Toc ... Tic ... Toc
Caridorc
4
Jika pegangan fungsi yang tidak ditetapkan juga ok, Anda juga bisa menggunakan@(t)eval('tic;while toc<t,end')
flawr
@ flawr Wow! Trik yang sangat bagus, gunakan evaluntuk mengemas beberapa pernyataan dalam fungsi anonim. Terima kasih!
Luis Mendo
Ya, itu kadang-kadang trik yang berguna, tetapi Anda masih tidak dapat menetapkan nilai ke variabel bahkan dalam eval. Saya masih bekerja pada cara untuk menyalahgunakan pegangan fungsi untuk fungsi rekursif =) PS: Anda tidak harus menetapkan nama ke gagang fungsi, kadang-kadang Anda juga dapat meneruskan gagang secara langsung sebagai argumen ke fungsi lain, misalnya untuk bsxfun.
flawr
+1, tetapi versi fungsi anonim tidak berfungsi di Oktaf (v 3.8.1). Gagal mengenali tvariabel di dalam eval.
pawel.boczarski
11

Java, 63 62 byte

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

Tidak ada yang mengejutkan - hanya meraih jumlah nanodetik sejak 1/1/1970 beberapa kali dan memeriksa apakah yang kedua telah berlalu.

Disimpan 1 byte berkat Ypnypn dan aditsu.

TNT
sumber
25
Yay! Program Java di bawah 100 byte; D
Beta Decay
5
@ BetaDecay Kecuali itu sebenarnya bukan program.
user253751
1
Tidakkah ada orang yang menyebutkan Anda dapat mempersingkat dengan for? for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);
aditsu
Ada apa dengan ini t->?
Luminous
1
@ Luminous Ini adalah ekspresi lambda , yang biasa digunakan di Jawa 8.
TNT
8

Batch, 27 Bytes

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

Trik batch populer, karena batch tidak memiliki fungsi tidur.

Tidak ada loop, jadi hadiah memenuhi syarat

Tomkandy
sumber
Golf: set/ac=%1+1menghemat 2 byte.
stevefestl
7

Commodore 64 BASIC, 19 16 byte

1000 FORI=1TO930*N:NEXT:RETURN

Dengan sebuah panggilan N=<number-of-secods>:GOSUB1000.

Namun, saya tidak dapat memberikan akurasi yang cukup. Karena C64 memiliki sekitar 1 MHz kecepatan CPU, saya ingat itu cukup baik untuk membuat kosong FOR- NEXTlingkaran 1000 kali sehingga itu sekitar 1 detik.

Bahkan ada dua versi utama dari mesin: PAL 0,985 MHz dan NTSC 1,023 MHz (semua data dari C64 Wikipedia Page ). Karena saya memiliki versi NTSC, itu diperlukan untuk menjalankan loop sekitar 930 kali.

Tes dengan program berikut ( Ndetik, disediakan oleh pengguna di 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

di mana TI$adalah variabel sistem yang berisi string ( hhmmssformat) dengan waktu berlalu dari reset terakhir (akurasi 1 detik, namun juga tergantung pada kecepatan CPU, jadi ini tidak cukup relevan, karena itu jam yang sama).

masukkan deskripsi gambar di sini

Cuplikan layar dibuat dengan emulator C64 online http://codeazur.com.br/stuff/fc64_final/ .

Program ini ( 1000hanya baris ) menempati 16 19 byte dalam memori, sebagaimana diuji dengan PRINT FRE(0)+65535baik sebelum mengetik kode (38908 byte) dan setelah ( 38893 38889 byte). PRINT FRE(0)mengembalikan memori bebas untuk program BASIC (ini adalah nilai negatif dan konstan 65535harus ditambahkan, tetapi sebenarnya tidak masalah).

Karena program ini tidak menguji waktu yang berlalu dalam satu lingkaran, itu memenuhi syarat untuk hadiah.

Voitcus
sumber
Saya ingat saya memang melakukan tes caranya TI$ variabel akurat dan itu sekitar 1 detik per ca. Perbedaan 2 jam dengan jam referensi (di luar C64), jadi akurasinya cukup. Apa yang saya tidak yakin adalah nilainya 950, apakah itu nilai lain <1000 (yang saya yakin), itu masih jumlah byte yang sama
Voitcus
saya pikir J variabel entah bagaimana harus menjadi bagian dari kode nyata, bukan bagian dari program pengujian - jadi itu akan menunggu selama N detik, bukan hanya 1 detik. Saya tidak tahu bagaimana mengintegrasikannya ke dalam sintaksis BASIC.
anatolyg
@anatolyg Hm, Anda benar, seharusnya seperti 1000 FOR I=1 TO N:FOR I=1 TO 950:NEXT I:NEXTJ:RETURNpanggilan misalnya. 200 N=5:GOSUB 1000. Saya juga telah memperhatikan OP membutuhkan fungsi . Saya akan mencoba memperbaikinya
Voitcus
@ anatolyg Saya telah memperbaiki, menggunakan GOSUB- RETURNpernyataan, karena tidak ada fungsi di BASIC
Voitcus
@Vitcus Bahkan tidak DEF FNsuka di BBC BASIC?
Beta Decay
7

JavaScript ES6, 50 45 40 byte

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

ini menggunakan fungsi self-executing, tidak yakin mengapa +new Datetidak berfungsi.


Pemakaian

Saya sudah menguji ini dengan Safari Nightly tetapi juga akan berfungsi di Firefox. Diuji dengan:

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

Anda dapat menjalankannya dengan mengelilinginya dengan tanda kurung:

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

Atau dengan menamainya:

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

Penjelasan

Inilah logika utama di balik program:

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

Versi yang saya gunakan menggunakan logika yang sama:

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
   );
}
Downgoat
sumber
6

CJam, 15

{e3es+{_es>}g;}

Ini adalah blok yang dapat dieksekusi atau disimpan ke dalam variabel (sehingga menjadi fungsi bernama). Dennis dan Mr Consensus setuju bahwa menghitung hanya blok saja yang dapat diterima :)

Penjelasan:

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

Cobalah online

aditsu
sumber
1
Konsensus tentang Meta adalah bahwa fungsi tidak harus dinamai, jadi saya berpendapat bahwa blok yang tersisa di stack sama bermanfaatnya dengan lambda.
Dennis
6

JavaScript, 68 54 51 42

Saya pikir tidak diperlukan tangkapan layar. Tapi saya curiga Anda bisa bermain golf ini lebih ...

Versi baru: Saya sekarang akhirnya berhasil menghindari newdan menggunakan Datedua kali:

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

Versi yang lebih lama:

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);}
cacat
sumber
1
Tidak diperlukan tangkapan layar sekarang :) Hanya jika seseorang menentang program ini
Pembusukan Beta
5

PHP, 171 177 84 79 65 64 62 byte

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


Penggunaan:
Panggil fungsi seperti ini:
php -d error_reporting=0 -r "require 'script.php'; a(5);echo 'Hello, World!';"
Di mana 5 adalah waktu dalam detik, program harus menunggu sebelum menggema "Halo, Dunia!".


Penjelasan:
Pada awalnya fungsi mendapatkan waktu saat ini dalam milidetik. Kemudian fungsi melakukan loop sampai Waktu saat ini lebih kecil dari waktu pertama + input. Setelah itu "Halo Dunia!" digaungkan.

Log:
Disimpan 113 byte berkat Voitcus
Disimpan 2 byte berkat aksioma

jrenk
sumber
1
Ini - lihat manual , $get_as_floatparameter. Hapus juga $t, $s- Anda tidak membutuhkannya (lihat kode saya)
Voitcus
1
1e6 = 10.00000 satu juta. echo 1e6;bekerja. Tapi ya - mendapatkan float adalah jumlah detik, jadi $e=microtime(1)+$i;itu sudah cukup
Voitcus
2
Sebuah biola bekerja untuk Anda
Voitcus
1
@Vitcus terima kasih atas bantuan Anda!
jrenk
1
Anda dapat menyimpan 2 byte lagi (3 byte pada PHP 7): 3v4l.org/fU11Y
axiac
5

Julia, 33 20 byte

t->watch_file(".",t)

Hanya berfungsi di Julia v0.4 karena perubahan fungsi tanda tangan dari watch_file. Menentukan fungsi anonim dengan satu parameter tyang (ab) menggunakan parameter batas waktu dalam watch_filefungsi.

Ini adalah kandidat untuk hadiah!

Demonstrasi menggunakan 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

Jawaban sebelumnya (33 byte), juga berfungsi di Julia stable

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

R, 48 byte

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

Demonstrasi:

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
jbaums
sumber
1
Saya tidak berpikir Anda perlu memasukkan f=dalam hitungan byte, potongan fungsi baik-baik saja.
Solomon Ucko
4

PHP, 39 byte

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

(Perhatikan bahwa saya benar-benar bisa mendapatkan ini lebih pendek jika program penuh diperlukan dengan mengambil keuntungan dari argumen yang diteruskan pada baris perintah. Turun ke 35 )

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

Program yang digunakan untuk pengujian:

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

Hasil:

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

masukkan deskripsi gambar di sini


Meskipun saya memenuhi syarat untuk mendapatkan hadiah itu, saya sulit dalam menjalankannya dengan beberapa entri lainnya!

James Webster
sumber
Yap, jumlah byte Anda baik
Beta Decay
4

Windows CMD, 22 byte

ping -w 1000 -n %1 1.1

Ini tidak menggunakan loop (label dan goto) sehingga ini memenuhi syarat untuk hadiah

Ia mengirim tping ke 1.0.0.1 (tidak valid) dan menunggu respons untuk 1000 ms

Grant Davis
sumber
3

JavaScript ES6, 40 byte

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

Diuji dengan yang berikut:

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
Dendrobium
sumber
Bisakah Anda menjelaskan apa elapsed(STOP, t)? Apa itu STOP dan berlalu?
Beta Decay
elapsedmengukur waktu yang dibutuhkan argumen pertama untuk dijalankan, dalam hal ini STOP,, yang pada gilirannya hanyalah cuplikan kode pertama. Arg kedua yang telah berlalu adalah arg yang diteruskan ke STOP.
Dendrobium
3

TI-BASIC (84 + SE), 21 byte

Metode input: T:prgmT. Ini setara dengan fungsi terdekat dalam TI-BASIC. Program:

For(A,1,841Ans
End

Semua akurasi diperoleh melalui coba-coba; mengatur waktu dengan stopwatch berfungsi untuk semua kasus uji yang diberikan dalam sepersepuluh detik.

Informasi perangkat:

RAM FREE   23312
ARC FREE  889802


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

W00T berhak atas hadiah!

Conor O'Brien
sumber
1
Tahukah Anda: kecepatan For(putaran kalkulator Anda tergantung pada berapa banyak variabel huruf yang ada? Lebih banyak variabel menyumbat PPN dan dapat memakan waktu hingga 20% dari waktu Anda. Variabel sistem (misalnya n , Xmin) kebal.
lirtosiast
@ThomasKwa Huh! Menarik. Saya akan kalibrasi ulang dengan kalkulator bersih ketika saya punya waktu untuk mentransfer file.
Conor O'Brien
2

Python, 57 byte

import time
b=time.time
def y(i):
 x=b()
 while x+i>b():x

Fungsi panggilan y()

Biru
sumber
2

PureBasic, 92 byte

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

Itu yang terpendek yang bisa saya pikirkan. Saya menduga ini akan menjadi yang terpanjang di sini juga ...

Untuk menguji:

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

PowerShell, 75 byte

Panggilan prosedur deskriptif yang panjang. Yay untuk kejelasan dalam bahasa. :)

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

Disebut dalam suatu program dengan sesuatu seperti

Get-Date
w(15)
Get-Date

Atau, jika kita diizinkan untuk memanggil program eksternal, kita bisa turun ke 59 Bytes dengan yang berikut:

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

Ini akan dipanggil dalam program sebagai berikut (menganggap di atas untuk disimpan sebagai "wait-function.ps1" dan disimpan dalam folder yang sama):

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

Apa yang kita simpan secara tertulis fungsi / program lebih dari musnah oleh kelebihan yang dibutuhkan untuk benar-benar menjalankannya. Le menghela nafas.

AdmBorkBork
sumber
2

Python, 66 byte

Catatan, implementasi saya tidak memanggil fungsi waktu bawaan, atau menggunakan fitur penjadwalan.

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

Dan ya, itu memenuhi syarat untuk hadiah.

Abhijit
sumber
Tidak, ini tidak valid: Anda tidak boleh menggunakan fungsi menunggu apa pun atau
Beta Decay
@ BetaDecay: Sesuai pemahaman saya, Antrian (). Get bukanlah "fungsi bawaan untuk mengeksekusi kode setelah waktu tertentu". Tolong jelaskan mengapa ini memenuhi syarat sebagai satu.
Abhijit
Banyak jawaban lain memiliki kode yang menggunakan batas waktu untuk hal-hal lain, jadi ini juga tidak masalah.
Solomon Ucko
2

Pyth, 19 byte

Masuk terlambat tetapi setelah menemukan .d0di dokumen tadi malam saya memutuskan untuk mencobanya.

DCNK.d0W<-.d0KNJ1))

Menentukan fungsi yang loop hingga waktu yang berlalu N detik.

Coba di sini .

Peluruhan Beta
sumber
Bagus. Saya mendapat DCNJ+.dZN#Ig.dZJB)), yang juga 19 byte.
hakr14
2

RProgN 2 , 13 byte

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

Dijelaskan

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

Bounty secara khusus mengatakan "tanpa menggunakan loop memeriksa berapa banyak waktu yang telah berlalu ", yang ini tidak dilakukan. Ini menetapkan waktu target, dan terus memeriksa apakah itu melewati waktu target itu, sehingga memenuhi syarat untuk hadiah.

Cobalah online!

ATaco
sumber
1

Tcl , 53 byte

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

Cobalah online!

Dijelaskan

Perintah clock millisecondsdapat dikurangi menjadi clock mil, dengan lolos braket 1, itu akan ditafsirkan pada setiap loop, dan tanpa satu kali saja. Karena mengukur milidetik, kita perlu mengalikan 1000 atau 1e3 yang menghemat 1 Byte.

David
sumber
1

C # (Visual C # Interactive Compiler) + /u:System.Threading, 36 byte

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

Cobalah online!

Membuat semaphore tanpa kapasitas dan mencoba mendapatkannya selama jumlah detik yang ditentukan.

Saya sadar saya sedang "menunggu" sesuatu di sini. Bagi saya ini sepertinya solusi ping / timeout yang bertentanganThread.Sleep . Kode mencoba mendapatkan sumber daya yang tidak bisa didapat dan berhenti mencoba setelah batas.

===

Di bawah ini adalah variasi yang memulai a Taskdengan infinite loop, kemudian menunggu sampai selesai dengan batas waktu. Semua ruang nama yang diperlukan disertakan secara default, tetapi solusinya beberapa byte lebih lama daripada yang di atas.

C # (Visual C # Interactive Compiler) , 40 byte

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

Cobalah online!

dana
sumber
0

05AB1E , 22 byte

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

Cobalah online.

CATATAN: Tergantung pada berapa banyak mikrodetik dalam detik saat ini telah berlalu, toleransi mungkin sedikit lebih besar dari 0,1 detik. Tetapi karena hampir separuh jawaban memiliki masalah yang sama, saya pikir itu diperbolehkan.

Penjelasan:

05AB1E tidak memiliki bawaan untuk saat ini. Namun memiliki builtin untuk tahun / bulan / hari / jam / menit / detik / mikrodetik saat ini sebagai builtin yang terpisah. Karena hanya menggunakan detik yang berpotensi membungkus sekitar 59 hingga 0 menyebabkan masalah, saya memerlukan menit dan detik, membuat kode lebih lama daripada kebanyakan jawaban dalam bahasa non-codegolfing sayangnya.

ž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
Kevin Cruijssen
sumber
0

SmileBASIC, 20 byte

INPUT T
DIALOG"",,,T

Membuka kotak dialog yang menutup secara otomatis setelah Tdetik. Saya tidak yakin apakah ini dianggap sebagai "fungsi menunggu yang dibangun", tapi saya pikir ini sama validnya dengan menggunakan ping.

Program 37 byte alternatif yang pasti tidak curang:

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

Menyebabkan warna layar pudar berubah menjadi 0 (alfa = 0, merah = 0, hijau = 0, biru = 0) (tidak ada efek) secara bertahap selama beberapa Tdetik, kemudian menunggu animasi itu selesai.

12Me21
sumber