Zatrzymaj się, stój tam, gdzie jesteś!

35

Wyzwanie

Napisz funkcję, która przyjmuje jeden parametr: liczbę całkowitą t. Twoja funkcja musi zatrzymać program na tkilka sekund przed kontynuowaniem, podobnie jak time.sleep(t)w Pythonie i WAIT tBBC BASIC.

Nie wolno używać żadnych wbudowanych funkcji oczekiwania ani żadnych wbudowanych funkcji do wykonywania kodu po pewnym czasie, a program musi zostać wznowiony po tkilku sekundach.

Do testowania twojej funkcji istnieje tolerancja 0,1 sekundy większa lub mniejsza niż podana tna twoim komputerze: różnice między komputerami są w porządku.

Jeśli ktokolwiek kwestionuje twoją odpowiedź, musisz dostarczyć fotograficzny (zrzut ekranu) dowód, że twoja funkcja działa poprawnie dla t=1, t=5i t=25. Możesz także podać szczegóły swojego komputera, aby ludzie mogli spróbować go replikować na własnym komputerze.

Twój program powinien i będzie działał na komputerze, którego częstotliwość zegara wynosi 1,6 GHz lub więcej.

Zwycięski

Najkrótszy program wygrywa.

Hojność

Nagroda zostanie przyznana za najkrótszy program, który zatrzymuje program bez użycia pętli sprawdzającej, ile czasu minęło. Jeśli ubiegasz się o tę nagrodę, dodaj przypis mówiący, że Twoja odpowiedź dotyczy nagrody.

Tabela liderów

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

Rozpad beta
źródło
Co się stanie, jeśli nasz wybrany język programowania ( kaszel ) pozwala jedynie uzyskać czas do dokładności 1 sekundy?
Klamka
@Doorknob Cóż, wejście jest liczbą całkowitą, więc nie ma problemu
Beta Decay
3
@ Dooobnob może być w stanie zmierzyć czas wykonywania poza programem, np. Wyniki debugowania i spojrzeć na znaczniki czasu DebugView.
Thomas Weller,
1
Czy tytuł i BBC BASICprzykład odnoszą się do programu telewizyjnego Sherlock, czy też czytam w tym zbyt wiele?
Fatalize
1
Przynajmniej zrozumiałeś, że twój tytuł był niedokładny;)
Fatalize

Odpowiedzi:

36

kod maszynowy x86_64, 10 bajtów

Hexdump kodu:

48 69 c9 ca fc 59 38 e2 fe c3

Kod źródłowy (może być złożony przez ml64Visual Studio):

    TITLE   heh

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

Wykonuje pustą pętlę, zaczynając od określonej wartości do 0. Wybrałem multiplikator 945421514 empirycznie metodą prób i błędów, dopóki mój program testowy nie uzyska zadowalających wyników.

Program testowy (czeka 10 razy dla każdego z czasów 1, 5 i 25 sekund):

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

Wynik:

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

Uruchomiłem ten program na komputerze z systemem Windows, który nie ma nic innego do roboty. Jeśli uruchamia niektóre aplikacje, czasy oczekiwania są bardziej zmienne.

Szybkość procesora wynosi 3,9 GHz. Wygląda na to, że ten kod nie jest wystarczająco dobry dla obecnej technologii PC - jeśli częstotliwość zegara wynosi około 8,8 GHz, mnożnik nie będzie pasował do 32-bitowej int ze znakiem.


PS Ponieważ ta odpowiedź nie sprawdza, ile czasu minęło, jest to kandydat do nagrody.

anatolig
źródło
4
To jest fajne: D
Beta Decay
12
3900 GHz? Łał! Może MHz?
WayToDoor
2
@WayToDoor Naprawiono! Dodano również zabawne informacje z tym związane.
anatolyg
1
Źródło ma 142 bajty, więc taką odpowiedź należy ocenić jako.
Peter Taylor
3
@PeterTaylor 142 bajty w języku asemblera ; znacznie mniej w kodzie maszynowym . To są różne języki; moim zdaniem kod maszynowy jest bardziej zabawny (jednak język asemblera byłby lepszy w wyzwaniu [z ograniczonym źródłem]). Problem z kodem maszynowym polega na tym, że nie jest to ASCII i myślę, że nie jest to duży problem. Temat pokrewny omówiono tutaj ; powinienem (lub ty) rozpocząć dyskusję na temat kodu maszynowego?
anatolyg
21

Bash, 29 25 24 23 19 bajtów

w()(ping -t$1 1.2)

Test dokładności ( time) gdzie $1= 1 sekunda:

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

Dzięki Dennis za golenie bajtu odliczanie do 19 z 23!

EDYCJA : Zmieniłem adres IP, aby uniknąć pingpingowania w Linuksie 0.0.0.0, które jest urządzeniem pętli zwrotnej.


Jak to działa

ping ma domyślny limit czasu wynoszący 1 sekundę, więc podczas kontaktowania się z nieistniejącym adresem IP ping nie może być kontynuowany, dopóki nie upłynie limit czasu lub nie otrzyma odpowiedzi z adresu IP.

-tkaże pingspróbować $1kilka razy na tym fałszywym adresie IP, zmuszając pingdo poświęcenia $1kilku sekund na zakończenie pingowania.


Kwalifikuje się do nagrody! Bez pętli!

georgeunix
źródło
Gra w golfa: w()(ping -t$1 0.0)(Musimy mieć różne pings; moje wymaga -w$1i otrzymuje odpowiedź od localhost.)
Dennis
Tak, to musi działać tylko na OS X bez no/dev/lo
georgeunix
Zmień 0,0 na 1,2 w systemie Linux
georgeunix
Na OS X, dla w 10, dostaję 10.02 sec realużyciu time.
georgeunix
w()(ping -w$1 1.2)działa jak marzenie.
Dennis
18

Matlab, 33 bajty

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

Możesz także użyć tego w Octave: wypróbuj online

Matlab, 31 bajtów

Jak sugeruje @flawr , można tego dokonać za pomocą anonimowej funkcji (należy jej przypisać nazwę, aby z niej skorzystać):

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

Przykład:

>> f=@(t)eval('tic;while toc<t,end');
>> tic, f(2), toc
Elapsed time is 2.000323 seconds.
Luis Mendo
źródło
5
Tic ... Toc ... Tic ... Toc
Caridorc
4
Jeśli nieprzypisany uchwyt funkcji też jest w porządku, możesz także użyć@(t)eval('tic;while toc<t,end')
flawr
@flawr Wow! bardzo fajna sztuczka, polegająca evalna spakowaniu kilku instrukcji w anonimowej funkcji. Dzięki!
Luis Mendo
Tak, czasami jest to użyteczna sztuczka, ale nadal nie można przypisywać wartości do zmiennych nawet w ramach eval. Nadal pracuję nad sposobem nadużywania uchwytów funkcji dla funkcji rekurencyjnych =) PS: Nie musisz koniecznie przypisywać nazwy do uchwytu funkcji, czasem możesz również przekazać uchwyt bezpośrednio jako argument innej funkcji, np bsxfun. Dla .
flawr
+1, ale anonimowa wersja funkcji nie działa w Octave (v 3.8.1). Nie rozpoznaje tzmiennej wewnątrz eval.
pawel.boczarski
11

Java, 63 62 bajty

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

Nic dziwnego - wystarczy kilka razy pobrać liczbę nanosekund od 1/1/1970 i sprawdzić, czy minęła sekunda.

Zaoszczędzono 1 bajt dzięki Ypnypn i aditsu.

TNT
źródło
25
Tak! Program Java poniżej 100 bajtów; D
Beta Decay
5
@BetaDecay Tyle, że tak naprawdę nie jest to program.
user253751,
1
Czy ktoś nie wspomniał, że można to skrócić za pomocą? for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);
aditsu
Co oznacza t->?
Luminous
1
@Luminous Jest to wyrażenie lambda , powszechnie używane w Javie 8.
TNT
8

Partia, 27 bajtów

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

Popularna sztuczka wsadowa, ponieważ partia nie miała funkcji uśpienia.

Brak pętli, więc nagroda kwalifikuje się

tomkandy
źródło
Golf: set/ac=%1+1oszczędza 2 bajty.
stevefestl
7

Commodore 64 BASIC, 19 16 bajtów

1000 FORI=1TO930*N:NEXT:RETURN

Z rozmowy N=<number-of-secods>:GOSUB1000.

Nie mogę jednak zapewnić wystarczającej dokładności. Ponieważ C64 miał około 1 MHz szybkości procesora, pamiętam, że był wystarczająco dobry, aby puste FOR- NEXTpętlę 1000 razy, tak aby było to około 1 sekundę.

W rzeczywistości istniały dwie główne wersje maszyny: PAL 0,985 MHz i NTSC 1,023 MHz (wszystkie dane ze strony Wikipedii C64 ). Ponieważ miałem wersję NTSC, wymagane było uruchomienie pętli około 930 razy.

Testy z użyciem następującego programu ( Nsekundy dostarczone przez użytkownika w 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

gdzie TI$jest zmienną systemową zawierającą łańcuch ( hhmmssformat) z czasem, który upłynął od ostatniego resetu (dokładność 1 sekundy, jednak zależy również od szybkości procesora, więc nie jest to całkiem istotne, ponieważ jest to ten sam zegar).

wprowadź opis zdjęcia tutaj

Zrzut ekranu wykonany za pomocą emulatora C64 online http://codeazur.com.br/stuff/fc64_final/ .

Ten program ( 1000tylko wiersz ) zajmuje 16 19 bajtów pamięci, co przetestowano PRINT FRE(0)+65535zarówno przed wpisaniem kodu (38908 bajtów), jak i po ( 38893 38889 bajtów). PRINT FRE(0)zwraca wolną pamięć dla programu BASIC (jest to wartość ujemna i 65535należy dodać stałą , ale tak naprawdę to nie ma znaczenia).

Ponieważ ten program nie sprawdza czasu, który upłynął w pętli, kwalifikuje się do nagrody.

Voitcus
źródło
Pamiętam, że wykonałem test TI$dokładności zmiennej i wynosił on około 1 sekundy na ok. 2 godziny różnicy z zegarem odniesienia (poza C64), więc dokładność jest wystarczająca. Nie jestem pewien co do wartości 950, ale czy byłaby to jakakolwiek inna wartość <1000 (co jestem pewien), to wciąż ta sama ilość bajtów
Voitcus
Myślę, że Jzmienna powinna w jakiś sposób być częścią prawdziwego kodu, a nie częścią programu testującego - więc czekałaby na N sekund, a nie tylko 1 sekundę. Nie wiem jednak, jak zintegrować go ze składnią BASIC.
anatolyg
@anatolyg Hm, masz rację, powinno to być coś 1000 FOR I=1 TO N:FOR I=1 TO 950:NEXT I:NEXTJ:RETURNz połączeniem np. 200 N=5:GOSUB 1000. Zauważyłem również, że OP wymaga funkcji . Spróbuję to naprawić
Voitcus
@anatolyg Poprawiłem, używa GOSUB- RETURNinstrukcji, ponieważ w języku BASIC nie ma żadnych funkcji
Voitcus
@Voitcus Nawet nie tak DEF FNjak w BBC BASIC?
Beta Decay
7

JavaScript ES6, 50 45 40 bajtów

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

używa to samo-wykonujących się funkcji, nie wiadomo, dlaczego +new Datenie działa.


Stosowanie

Przetestowałem to w Safari Nightly, ale będzie działać również w przeglądarce Firefox. Testowane z:

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

Możesz go uruchomić, otaczając go nawiasami:

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

Lub nazywając to:

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

Wyjaśnienie

Oto główna logika programu:

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

Wersja, której używam, wykorzystuje tę samą logikę:

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
źródło
6

CJam, 15

{e3es+{_es>}g;}

Jest to blok, który można wykonać lub zapisać w zmiennej (stając się w ten sposób nazwaną funkcją). Dennis i pan Consensus zgadzają się, że liczenie tylko bloku jest dopuszczalne :)

Wyjaśnienie:

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

Wypróbuj online

aditsu
źródło
1
Konsensus w sprawie Meta jest taki, że funkcje nie muszą być nazywane, więc argumentowałbym, że blok pozostawiony na stosie jest tak samo użyteczny jak lambda.
Dennis
6

JavaScript, 68 54 51 42

Myślę, że nie jest potrzebny zrzut ekranu. Ale podejrzewam, że możesz jeszcze bardziej zagrać w golfa ...

Nowa wersja: Teraz w końcu udało mi się uniknąć newi użyć Datedwukrotnie:

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

Starsza wersja:

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);}
wada
źródło
1
Zrzut ekranu nie jest już potrzebny :) Tylko jeśli ktoś rzuci wyzwanie temu programowi
Beta Decay
5

PHP, 171 177 84 79 65 64 62 bajtów

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


Użycie:
Wywołaj funkcję w taki sposób:
php -d error_reporting=0 -r "require 'script.php'; a(5);echo 'Hello, World!';"
gdzie 5 to czas w sekundach, program powinien poczekać, aż usłyszy echo „Witaj, świecie!”.


Objaśnienie:
Na początku funkcja pobiera bieżący czas w milisekundach. Następnie funkcja wykonuje pętlę, aż bieżący czas będzie mniejszy niż za pierwszym razem + wejście. Następnie „Hello World!” odbija się echem.

Log:
Zapisano 113 bajtów dzięki Voitcus
Zapisano 2 bajty dzięki axiac

Jrenk
źródło
1
Jest - patrz instrukcja , $get_as_floatparametr. Również usunąć $t, $s- nie są potrzebne (patrz mój kod)
Voitcus
1
1e6 = 1000000 jeden milion. echo 1e6;Prace. Ale tak - uzyskanie liczby zmiennoprzecinkowej to liczba sekund, więc $e=microtime(1)+$i;wystarczy
Voitcus
2
Skrzypce pracy dla Ciebie
Voitcus
1
@Voitcus dzięki za pomoc!
jrenk
1
Możesz zapisać jeszcze 2 bajty (3 bajty w PHP 7): 3v4l.org/fU11Y
axiac
5

Julia, 33 20 bajtów

t->watch_file(".",t)

Działa tylko w Julii v0.4 ze względu na zmiany w sygnaturze funkcji watch_file. Definiuje anonimową funkcję z jednym parametremt który (ab) używa parametru limitu czasu w watch_filefunkcji.

To kandydat do nagrody!

Demonstracja z wykorzystaniem 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

Poprzednia odpowiedź (33 bajty), również działająca w stajni Julii

t->(b=time();while b+t>time()end)
kvill
źródło
4

R, 48 bajtów

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

Demonstracja:

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
źródło
1
Nie sądzę, że musisz uwzględniać f=liczbę bajtów, fragmenty funkcji są w porządku.
Solomon Ucko
4

PHP, 39 bajtów

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

(Zauważ, że faktycznie mogę to skrócić, jeśli wymagany jest pełny program, korzystając z argumentów przekazanych w wierszu poleceń. Zejście do 35 )

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

Program używany do testowania:

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

Wyniki:

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

wprowadź opis zdjęcia tutaj


Mimo, że kwalifikuję się do nagrody, prawie nie biorę udziału w niektórych innych zgłoszeniach!

James Webster
źródło
Tak, twoja liczba bajtów jest w porządku
rozpad bety
4

Windows CMD, 22 bajty

ping -w 1000 -n %1 1.1

Nie używa pętli (etykieta i goto), więc kwalifikuje się do nagrody

Wysyła tsygnały ping do 1.0.0.1 (niepoprawne) i czeka na odpowiedź przez 1000 ms

Grant Davis
źródło
3

JavaScript ES6, 40 bajtów

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

Testowane z następującymi:

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
źródło
Czy możesz wyjaśnić, co elapsed(STOP, t)robi? Czym są STOP i co upłynęło?
Beta Decay
elapsedmierzy czas potrzebny na uruchomienie pierwszego argumentu, w tym przypadku STOP, który z kolei jest tylko pierwszym fragmentem kodu. Drugi arg, który upłynął, to arg przekazany do STOP.
Dendrobium
3

TI-BASIC (84 + SE), 21 bajtów

Metoda wprowadzania: T:prgmT. Jest to najbliższy odpowiednik funkcji w TI-BASIC. Program:

For(A,1,841Ans
End

Całą dokładność uzyskuje się metodą prób i błędów; odmierzanie czasu za pomocą stopera działa dla wszystkich podanych przypadków testowych z dokładnością do dwudziestej sekundy.

Informacje o urządzeniu:

RAM FREE   23312
ARC FREE  889802


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

W00T kwalifikuje się do nagrody!

Conor O'Brien
źródło
1
Czy wiesz, że: szybkość For(pętli kalkulatora zależy od liczby zmiennych literowych? Więcej zmiennych zapycha podatek VAT i może zająć około 20% czasu. Zmienne systemu (na przykład N , Xmin) jest odporny.
lirtosiast
@ThomasKwa Huh! Ciekawy. Przeprowadzę ponowną kalibrację za pomocą czystego kalkulatora, gdy będę miał czas na przesłanie plików.
Conor O'Brien
2

Python, 57 bajtów

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

Funkcja połączenia y()

niebieski
źródło
2

PureBasic, 92 bajty

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

To najkrótszy, jaki mogę wymyślić. Podejrzewam, że tutaj też będzie najdłużej ...

Testować:

OpenConsole()
i=Val(Input())
s=ElapsedMilliseconds()
z(i)
PrintN(Str(ElapsedMilliseconds()-s))
Input()
Fozzedout
źródło
2

PowerShell, 75 bajtów

Długie opisowe wywołania procedur. Yay dla jasności w języku. :)

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

Wywoływany w programie z czymś takim

Get-Date
w(15)
Get-Date

Alternatywnie, jeśli zamiast tego możemy wywoływać programy zewnętrzne, możemy przejść do 59 bajtów, wykonując następujące czynności:

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

Zostanie to wywołane w programie w następujący sposób (zakładając, że powyższe zostanie zapisane jako „wait-function.ps1” i zapisane w tym samym folderze):

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

To, co oszczędzamy na pisaniu funkcji / programu, jest jednak więcej niż zblokowane przez nadmiar potrzebny do faktycznego jego wykonania. Le westchnienie.

AdmBorkBork
źródło
2

Python, 66 bajtów

Uwaga: moja implementacja nie wywołuje wbudowanej funkcji czasu ani nie korzysta z funkcji planowania.

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

I tak, kwalifikuje się do nagrody.

Abhijit
źródło
Nie, to nieważne: Nie możesz używać żadnych wbudowanych funkcji oczekiwania ani żadnych wbudowanych funkcji do wykonania kodu po pewnym czasie
Rozpad Beta
@BetaDecay: Zgodnie z moim rozumieniem, kolejka (). Get nie jest „wbudowaną funkcją do wykonywania kodu po pewnym czasie”. Wyjaśnij, dlaczego kwalifikuje się jako jeden.
Abhijit,
Wiele innych odpowiedzi zawiera kod, który wykorzystuje limity czasu dla innych rzeczy, więc to też powinno być w porządku.
Solomon Ucko
2

Pyth, 19 bajtów

Późne wejście, ale po znalezieniu .d0w dokumentacji ostatniej nocy postanowiłem spróbować.

DCNK.d0W<-.d0KNJ1))

Definiuje funkcję, która zapętla się do upływu czasu N sekundach.

Wypróbuj tutaj .

Rozpad beta
źródło
Miły. Mam DCNJ+.dZN#Ig.dZJB)), czyli 19 bajtów.
hakr14
2

RProgN 2 , 13 bajtów

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

Wyjaśnił

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

Nagroda mówi konkretnie „bez użycia pętli sprawdzającej, ile czasu minęło ”, czego nie robi. To ustawia czas docelowy i sprawdza, czy minął ten czas docelowy, a zatem kwalifikuje się do nagrody.

Wypróbuj online!

ATaco
źródło
1

Tcl , 53 bajty

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

Wypróbuj online!

Wyjaśnił

Komenda clock millisecondsmoże zostać zredukowana do clock mil, dzięki ucieczce 1. nawiasowi, będzie interpretowana przy każdej pętli, i bez w / o tylko raz. Ponieważ mierzy milisekundy, musimy pomnożyć przez 1000 lub 1e3, co pozwala zaoszczędzić 1 bajt.

David
źródło
1

C # (interaktywny kompilator Visual C #) + /u:System.Threading, 36 bajtów

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

Wypróbuj online!

Tworzy semafor bez pojemności i próbuje uzyskać go przez określoną liczbę sekund.

Zdaję sobie sprawę, że „czekam” na coś tutaj. Wydaje mi się, że jest to bardziej rozwiązanie ping / limit czasu niżThread.Sleep . Kod próbuje uzyskać zasób, którego nie może uzyskać, i przestaje próbować po przekroczeniu limitu.

===

Poniżej znajduje się odmiana, która rozpoczyna się Taskod nieskończonej pętli, a następnie czeka, aż zakończy się limit czasu. Wszystkie wymagane przestrzenie nazw są domyślnie dołączone, ale rozwiązanie jest o kilka bajtów dłuższe niż powyższe.

C # (interaktywny kompilator Visual C #) , 40 bajtów

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

Wypróbuj online!

dana
źródło
0

05AB1E , 22 bajty

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

Wypróbuj online.

UWAGA: W zależności od tego, ile mikrosekund w bieżącej sekundzie już minęło, tolerancja może być nieco większa niż 0,1 sekundy. Ale ponieważ prawie o połowę odpowiedzi mają podobne problemy, pomyślałem, że jest to dozwolone.

Wyjaśnienie:

05AB1E nie ma żadnych wbudowanych funkcji na bieżący czas. Ma jednak wbudowane wbudowane funkcje dla bieżącego roku / miesiąca / dnia / godzin / minut / sekund / mikrosekund. Ponieważ tylko użycie sekund może potencjalnie obejść od 59 do 0 powodując problemy, potrzebuję zarówno minut, jak i sekund, dzięki czemu kod jest nawet dłuższy niż większość odpowiedzi w językach niekodujących kodu.

ž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
źródło
0

SmileBASIC, 20 bajtów

INPUT T
DIALOG"",,,T

Otwiera okno dialogowe, które zamyka się automatycznie po Tkilku sekundach. Nie jestem pewien, czy liczy się to jako „wbudowana funkcja oczekiwania”, ale myślę, że jest to tak samo ważne jak używanie ping.

Alternatywny 37-bajtowy program, który zdecydowanie nie oszukuje:

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

Powoduje, że kolor zanikania ekranu zmienia się stopniowo na 0 (alfa = 0, czerwony = 0, zielony = 0, niebieski = 0) (brak efektu) stopniowo w ciągu Tkilku sekund, a następnie czeka na zakończenie animacji.

12Me21
źródło