Halt, steh da, wo du bist!


35

Herausforderung

Schreiben Sie eine Funktion, die einen Parameter akzeptiert: eine Ganzzahl t. Ihre Funktion muss Ihr Programm für tSekunden anhalten, bevor Sie fortfahren können, ähnlich wie time.sleep(t)in Python und WAIT tin BBC BASIC.

Sie dürfen nach einer bestimmten Zeit keine eingebauten Wartefunktionen oder eingebauten Funktionen zum Ausführen von Code verwenden, und Ihr Programm muss nach tSekunden fortgesetzt werden.

Zum Testen Ihrer Funktion gibt es eine Toleranz von 0,1 Sekunden mehr oder weniger als tauf Ihrem eigenen Computer angegeben: Abweichungen zwischen Computern sind in Ordnung.

Wenn Ihre Antwort von niemandem in Frage gestellt wird, müssen Sie einen Nachweis fotografischen (screenshotted) sehen vor , dass Ihre Funktion korrekt arbeitet t=1, t=5und t=25. Sie können auch die Details Ihres Computers angeben, damit die Benutzer versuchen können, sie auf ihrem eigenen Computer zu replizieren.

Ihr Programm sollte und wird auf einem Computer mit einer Taktrate von 1,6 GHz oder höher ausgeführt.

Gewinnen

Das kürzeste Programm gewinnt.

Kopfgeld

Eine Prämie geht an das kürzeste Programm, das das Programm stoppt, ohne eine Schleife zu verwenden, um zu prüfen, wie viel Zeit verstrichen ist. Wenn Sie sich für diese Prämie bewerben, fügen Sie eine Fußnote hinzu, die besagt, dass Ihre Antwort für die Prämie gilt.

Bestenliste

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


Was ist, wenn unsere Programmiersprache ( Husten ) nur eine Genauigkeit von 1 Sekunde unterstützt?
Türklinke

@Doorknob Nun, die Eingabe ist eine Ganzzahl, das ist also in Ordnung
Beta Decay

3
@Doorknob Vielleicht können Sie die Ausführungszeit außerhalb Ihres Programms messen, z. B. die Ausgabe debuggen und die Zeitstempel von DebugView anzeigen.
Thomas Weller

1
Ist der Titel und das BBC BASICBeispiel ein Verweis auf die Fernsehsendung Sherlock oder lese ich zu viel darüber?
Fatalize

1
Zumindest hast du
gemerkt

Antworten:


36

x86_64-Maschinencode, 10 Byte

Hexdump des Codes:

48 69 c9 ca fc 59 38 e2 fe c3

Quellcode (kann ml64von Visual Studio zusammengestellt werden):

    TITLE   heh

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

Führt eine leere Schleife aus, beginnend mit dem angegebenen Wert bis 0. Ich habe den Multiplikator 945421514 empirisch durch Ausprobieren ausgewählt, bis mein Testprogramm zufriedenstellende Ergebnisse lieferte.

Testprogramm (wartet 10 Mal für jede Dauer von 1, 5 und 25 Sekunden):

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

Das Ergebnis:

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

Ich habe dieses Programm auf einem Windows-Computer ausgeführt, der sonst nichts zu tun hat. Wenn einige Anwendungen ausgeführt werden, sind die Wartezeiten unregelmäßiger.

Die CPU-Geschwindigkeit beträgt 3,9 GHz. Es scheint, dass dieser Code für die aktuelle PC-Technologie kaum gut genug ist - wenn die Taktfrequenz etwa 8,8 GHz beträgt, passt der Multiplikator nicht in ein vorzeichenbehaftetes 32-Bit-Int.


PS Da diese Antwort nicht prüft, wie viel Zeit vergangen ist, ist sie ein Kandidat für das Kopfgeld.


4
Das ist cool: D
Beta Decay

12
3900 GHz? Woah! Vielleicht MHz?
WayToDoor

2
@WayToDoor behoben! Fügte auch einige lustige Infos dazu hinzu.
Anatolyg

1
Die Quelle ist 142 Bytes, deshalb sollte diese Antwort als gewertet werden.
Peter Taylor

3
@PeterTaylor 142 Bytes in Assemblersprache ; viel weniger im Maschinencode . Das sind verschiedene Sprachen; Meiner Meinung nach macht Maschinencode mehr Spaß (Assemblersprache wäre jedoch bei einer [eingeschränkten Quellen] -Herausforderung besser). Das Problem mit Maschinencode ist, dass es kein ASCII-Code ist, und ich denke, dass es kein großes Problem ist. Ein verwandtes Problem wird hier diskutiert . Soll ich (oder Sie) dort eine Diskussion über Maschinencode beginnen?
Anatolyg

21

Bash, 29 25 24 23 19 Bytes

w()(ping -t$1 1.2)

Genauigkeitstest ( time) mit $1= 1 Sekunde:

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

Vielen Dank, Dennis, dass du die Anzahl der Bytes von 23 auf 19 gesenkt hast!

BEARBEITEN : Ich habe die IP geändert, um pingunter Linux Ping 0.0.0.0 zu vermeiden , das das Loopback-Gerät ist.


Wie das geht

ping Das Standard-Timeout beträgt 1 Sekunde. Wenn Sie also eine nicht vorhandene IP-Adresse kontaktieren, kann der Ping-Vorgang erst fortgesetzt werden, wenn das Timeout abgelaufen ist oder eine Antwort von der IP-Adresse eingegangen ist.

-tGibt pingan, $1wie oft versucht werden soll, diese gefälschte IP-Adresse pingzu verwenden, wobei $1Sekunden erforderlich sind , um den Ping-Vorgang abzuschließen.


Es ist für die Prämie berechtigt! Keine Schleife!


Golfed: w()(ping -t$1 0.0)(Wir müssen verschiedene pings haben; meins erfordert -w$1und erhält eine Antwort von localhost.)
Dennis

Richtig, dann muss es nur auf OS X arbeiten , ohne/dev/lo
georgeunix

Ändere 0.0 auf 1.2 unter Linux
georgeunix

Unter OS X, für w 10, werde ich 10.02 sec realmit time.
Georgeunix

w()(ping -w$1 1.2)klappt wunderbar.
Dennis

18

Matlab, 33 Bytes

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

Oder Sie können dies auch in Octave verwenden: Probieren Sie es online aus

Matlab, 31 Bytes

Wie von @flawr vorgeschlagen , kann es mit einer anonymen Funktion durchgeführt werden (es sollte ein Name vergeben werden, um es zu verwenden):

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

Beispiel:

>> 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
Wenn ein nicht zugewiesenes Funktionshandle ebenfalls in @(t)eval('tic;while toc<t,end')
Ordnung

@flawr Wow! Sehr schöner Trick, mit evaldem man mehrere Anweisungen in eine anonyme Funktion packen kann. Vielen Dank!
Luis Mendo

Ja, das ist manchmal ein nützlicher Trick, aber Sie können Variablen auch innerhalb von eval keine Werte zuweisen. Ich arbeite noch daran, Funktionshandles für rekursive Funktionen zu missbrauchen =) PS: Sie müssen dem Funktionshandle nicht unbedingt einen Namen zuweisen, manchmal können Sie das Handle auch direkt als Argument an eine andere Funktion übergeben, z bsxfun.
Fehler

+1, aber die anonyme Funktionsversion funktioniert nicht in Octave (v 3.8.1). tVariable in eval wird nicht erkannt .
pawel.boczarski

11

Java, 63 62 Bytes

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

Kein Wunder - einfach die Anzahl der Nanosekunden seit dem 1.1.1970 mehrmals erfassen und prüfen, ob eine Sekunde verstrichen ist.

Dank Ypnypn und aditsu 1 Byte gespeichert.


25
Yay! Ein Java-Programm mit weniger als 100 Bytes; D
Beta Decay

5
@BetaDecay Außer es ist eigentlich kein Programm.
user253751

1
Hat nicht jemand erwähnt, dass Sie es mit einem für kürzen können? for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);
Aditsu

Was ist mit dem t->?
Luminous

1
@Luminous Es ist ein Lambda-Ausdruck , der üblicherweise in Java 8 verwendet wird.
TNT

8

Batch, 27 Bytes

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

Ein beliebter Batch-Trick, da Batch keine Sleep-Funktion hatte.

Keine Schlaufe, also prämienberechtigt


Golf: set/ac=%1+1Spart 2 Bytes.
Stevefestl

7

Commodore 64 BASIC, 19 16 Bytes

1000 FORI=1TO930*N:NEXT:RETURN

Mit einem Anruf N=<number-of-secods>:GOSUB1000.

Ich kann jedoch keine ausreichende Genauigkeit liefern. Da C64 etwa 1 MHz CPU - Geschwindigkeit hatte, ich erinnere mich gut genug war , eine leere zu machen FOR- NEXTSchleife 1000 mal so , dass es etwa 1 Sekunde.

Tatsächlich gab es zwei Hauptversionen der Maschine: PAL 0.985 MHz und NTSC 1.023 MHz (alle Daten von C64 Wikipedia Page ). Da ich die NTSC-Version hatte, musste die Schleife ungefähr 930 Mal ausgeführt werden.

Tests mit folgendem Programm ( NSekunden, vom Benutzer eingegeben 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

Dabei TI$handelt es sich um eine Systemvariable, die einen String ( hhmmssFormat) mit der Zeit enthält, die seit dem letzten Zurücksetzen verstrichen ist (1 Sekunde Genauigkeit, jedoch auch abhängig von der CPU-Geschwindigkeit, dies ist also nicht ganz relevant, da es sich um dieselbe Uhr handelt).

Bildbeschreibung hier eingeben

Screenshot erstellt mit dem Online-C64-Emulator http://codeazur.com.br/stuff/fc64_final/ .

Dieses Programm ( 1000nur Zeile ) belegt 16 bis 19 Bytes im Speicher. Dies wurde PRINT FRE(0)+65535sowohl vor dem Eingeben des Codes (38908 Bytes) als auch nach dem Eingeben ( 38893 bis 38889 Bytes) getestet. PRINT FRE(0)Gibt den freien Speicher für das BASIC-Programm zurück (es ist ein negativer Wert, und es 65535sollte eine Konstante hinzugefügt werden, aber das spielt keine Rolle).

Da dieses Programm die in einer Schleife verstrichene Zeit nicht testet, ist es für eine Prämie qualifiziert.


Ich erinnere mich, dass ich einen Test durchgeführt habe, wie TI$genau die Variable ist. 2 Stunden Unterschied zur Referenzuhr (außerhalb von C64), daher ist die Genauigkeit ausreichend. Was ich nicht sicher bin, ist der Wert 950, aber wäre es ein anderer Wert <1000 (was ich sicher bin), ist es immer noch die gleiche Menge an Bytes
Voitcus

Ich denke, die JVariable sollte irgendwie Teil des realen Codes sein, nicht Teil des Testprogramms - also würde sie N Sekunden warten, nicht nur 1 Sekunde. Ich weiß jedoch nicht, wie ich es in die BASIC-Syntax integrieren soll.
Anatolyg

@anatolyg Hm, du hast recht, es sollte so etwas sein wie 1000 FOR I=1 TO N:FOR I=1 TO 950:NEXT I:NEXTJ:RETURNbei einem Anruf zB. 200 N=5:GOSUB 1000. Auch mir ist aufgefallen, dass das OP eine Funktion benötigt . Ich werde versuchen, es zu beheben
Voitcus

@anatolyg Ich habe korrigiert, es verwendet GOSUB- RETURNAussage, da es in BASIC keine Funktionen gibt
Voitcus

@Voitcus Nicht mal DEF FNwie in BBC BASIC?
Beta Decay

7

JavaScript ES6, 50 45 40 Bytes

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

Dies verwendet selbstausführende Funktionen, nicht sicher, warum +new Datenicht funktioniert.


Verwendung

Ich habe dies mit Safari Nightly getestet, aber es wird auch mit Firefox funktionieren. Getestet mit:

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

Sie können es ausführen, indem Sie es in Klammern setzen:

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

Oder indem Sie es benennen:

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

Erläuterung

Hier ist die Hauptlogik hinter dem Programm:

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

Die von mir verwendete Version verwendet dieselbe 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
   );
}

6

CJam, 15

{e3es+{_es>}g;}

Dies ist ein Block, der ausgeführt oder in einer Variablen gespeichert werden kann (wodurch eine benannte Funktion entsteht). Dennis und Mr Consensus sind sich einig, dass es akzeptabel ist, nur den Block zu zählen :)

Erläuterung:

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

Probieren Sie es online aus


1
Einigkeit über Meta ist, dass Funktionen nicht benannt werden müssen, daher würde ich argumentieren, dass ein auf dem Stapel verbleibender Block genauso verwendbar ist wie ein Lambda.
Dennis

6

JavaScript, 68 54 51 42

Ich denke, es wird kein Screenshot benötigt. Aber ich vermute, Sie könnten noch mehr Golf spielen ...

Neue Version: Ich habe es jetzt endlich geschafft, zweimal zu vermeiden newund zu verwenden Date:

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

Ältere Versionen:

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
Es wird jetzt kein Screenshot benötigt :) Nur wenn jemand dieses Programm in Frage stellt
Beta Decay

5

PHP, 171 177 84 79 65 64 62 Bytes

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


Verwendung:
Rufen Sie die Funktion folgendermaßen auf:
php -d error_reporting=0 -r "require 'script.php'; a(5);echo 'Hello, World!';"
Wobei 5 die Zeit in Sekunden ist, die das Programm warten soll, bis es "Hello, World!"


Erläuterung:
Die Funktion ermittelt zunächst die aktuelle Zeit in Millisekunden. Dann führt die Funktion eine Schleife durch, bis die aktuelle Zeit kleiner als das erste Mal + die Eingabe ist. Danach "Hallo Welt!" wird wiedergegeben.

Log:
113 Bytes dank Voitcus
gespeichert 2 Bytes dank Axiac gespeichert


1
Es ist - siehe Handbuch , $get_as_floatParameter. Entfernen Sie auch $t, $s- Sie brauchen sie nicht (siehe meinen Code)
Voitcus

1
1e6 = 1000000 eine Million. echo 1e6;funktioniert. Aber ja - es ist die Anzahl der Sekunden, $e=microtime(1)+$i;die man benötigt , um sich zu
bewegen

2
Eine funktionierende Geige für Sie
Voitcus

1
@Voitcus danke für deine Hilfe!
Juni

1
Sie können 2 weitere Bytes (3 Bytes bei PHP 7) speichern
axiac

5

Julia, 33 20 Bytes

t->watch_file(".",t)

Funktioniert nur in Julia v0.4 aufgrund von Änderungen in der Funktionssignatur von watch_file. Definiert eine anonyme Funktion mit einem einzelnen Parameter t, der (ab) den Timeout-Parameter in der watch_fileFunktion verwendet.

Dies ist ein Kandidat für das Kopfgeld!

Demonstration mit der 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

Vorherige Antwort (33 Bytes), funktioniert auch in Julia Stall

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

4

R, 48 Bytes

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

Demonstration:

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
Ich glaube nicht, dass Sie f=die Anzahl der Bytes angeben müssen, Funktionsausschnitte sind in Ordnung.
Solomon Ucko

4

PHP, 39 Bytes

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

(Beachten Sie, dass ich dies tatsächlich verkürzen kann, wenn ein vollständiges Programm erforderlich ist, indem ich die in der Befehlszeile übergebenen Argumente ausnütze. Bis zu 35 )

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

Programm zum Testen:

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

Ergebnisse:

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

Bildbeschreibung hier eingeben


Obwohl ich mich für das Kopfgeld qualifiziere, bin ich mit einigen anderen Einsendungen kaum im Rennen!


Ja, Ihre Byteanzahl ist in Ordnung
Beta Decay

4

Windows CMD, 22 Byte

ping -w 1000 -n %1 1.1

Dies verwendet keine Schleife (label und goto), so dass dies für die Prämie qualifiziert ist

Es sendet tPings an 1.0.0.1 (ungültig) und wartet 1000 ms auf eine Antwort


3

JavaScript ES6, 40 Byte

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

Getestet mit:

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

Kannst du erklären, was elapsed(STOP, t)macht? Was sind STOP und verstrichen?
Betazerfall

elapsedmisst die Zeit, die das erste Argument benötigt hat, um ausgeführt zu werden. Dies ist STOPwiederum nur das erste Code-Snippet. Das zweite abgelaufene Argument ist das Argument, an das übergeben wird STOP.
Dendrobium

3

TI-BASIC (84 + SE), 21 Bytes

Eingabemethode: T:prgmT. Dies ist das nächste Äquivalent einer Funktion in TI-BASIC. Programm:

For(A,1,841Ans
End

Alle Genauigkeit wird durch Ausprobieren erreicht. Das Timing mit einer Stoppuhr funktioniert für alle gegebenen Testfälle innerhalb einer Zwanzigstelsekunde.

Geräteinformation:

RAM FREE   23312
ARC FREE  889802


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

W00T berechtigt zu einer Prämie!


1
Wussten Sie, dass die Geschwindigkeit der For(Schleifen Ihres Rechners von der Anzahl der Buchstabenvariablen abhängt? Weitere Variablen belasten die Mehrwertsteuer und können bis zu 20% Ihrer Zeit in Anspruch nehmen. Systemvariablen (zB n , Xmin) sind immun.
Lirtosiast

@ThomasKwa Huh! Interessant. Ich werde mit einem sauberen Taschenrechner neu kalibrieren, wenn ich Zeit habe, Dateien zu übertragen.
Conor O'Brien

2

Python, 57 Bytes

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

Funktion aufrufen y()


2

PureBasic, 92 Bytes

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

Es ist das kürzeste, an das ich denken kann. Ich vermute, dass dies auch hier die längste sein wird ...

Zu testen:

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

2

PowerShell, 75 Byte

Lange, beschreibende Prozeduraufrufe. Yay für Klarheit in einer Sprache. :)

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

Wird in einem Programm mit so etwas wie aufgerufen

Get-Date
w(15)
Get-Date

Wenn wir stattdessen externe Programme aufrufen dürfen, können wir alternativ mit den folgenden Schritten auf 59 Bytes reduzieren :

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

Dies würde in einem Programm wie folgt aufgerufen (vorausgesetzt, das oben Gesagte wird als "wait-function.ps1" gespeichert und im selben Ordner gespeichert):

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

Was wir beim Schreiben der Funktion / des Programms sparen, ist jedoch mehr als überfordert durch den Überschuss, der zur tatsächlichen Ausführung erforderlich ist. Le seufzt.


2

Python, 66 Bytes

Beachten Sie, dass meine Implementierung weder eine eingebaute Zeitfunktion aufruft noch die Planungsfunktion verwendet.

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

Und ja, es kann Kopfgeld gezahlt werden.


Nein, dies ist ungültig: Sie dürfen keine eingebauten
Beta Decay

@BetaDecay: Nach meinem Verständnis ist Queue (). Get keine "eingebaute Funktion zum Ausführen von Code nach einer bestimmten Zeit". Bitte erläutern Sie, warum dies als eine qualifizieren würde.
Abhijit

Viele andere Antworten haben Code, der Timeouts für andere Dinge verwendet, daher sollte dies auch in Ordnung sein.
Solomon Ucko


2

Pyth, 19 Bytes

Verspätete Einreise, aber nachdem ich .d0gestern Abend in den Dokumenten nachgesehen hatte, entschloss ich mich, es zu versuchen.

DCNK.d0W<-.d0KNJ1))

Definiert eine Funktion, die eine Schleife durchläuft, bis die Zeit abgelaufen ist N Sekunden .

Probieren Sie es hier aus .


Nett. Ich habe DCNJ+.dZN#Ig.dZJB)), das sind auch 19 Bytes.
Hakr14

2

RProgN 2 , 13 Bytes

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

Erklärt

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

Das Kopfgeld sagt ausdrücklich "ohne eine Schleife zu benutzen, die prüft, wie viel Zeit vergangen ist ", was dies nicht tut. Dadurch wird eine Zielzeit festgelegt, und es wird weiterhin überprüft, ob diese Zielzeit überschritten wurde, sodass die Prämie gewährt werden kann.

Probieren Sie es online!


1

Tcl , 53 Bytes

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

Probieren Sie es online!

Erklärt

Der Befehl clock millisecondskann auf clock mildie erste geschützte Klammer reduziert werden. Er wird bei jeder Schleife interpretiert und nur einmal ausgeführt. Da es Millisekunden misst, müssen wir mit 1000 oder 1e3 multiplizieren, was 1 Byte spart.


1

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

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

Probieren Sie es online!

Erstellt ein Semaphor ohne Kapazität und versucht, es für die angegebene Anzahl von Sekunden abzurufen.

Mir ist klar, dass ich hier auf etwas "warte". Dies scheint mir eher die Lösung für Ping / Timeout zu sein alsThread.Sleep . Der Code versucht, eine Ressource abzurufen, die er nicht abrufen kann, und beendet den Versuch nach einem Limit.

===

Unten sehen Sie eine Variante, die eine TaskEndlosschleife startet und darauf wartet, dass sie mit einer Zeitüberschreitung abgeschlossen wird. Alle erforderlichen Namespaces sind standardmäßig enthalten, die Lösung ist jedoch einige Bytes länger als die oben angegebene.

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

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

Probieren Sie es online!


0

05AB1E , 22 Bytes

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

Probieren Sie es online aus.

HINWEIS: Je nachdem, wie viele Mikrosekunden in der aktuellen Sekunde bereits vergangen sind, kann die Toleranz etwas größer als 0,1 Sekunden sein. Aber da fast die Hälfte der Antworten ähnliche Probleme hat, dachte ich, dass es erlaubt ist.

Erläuterung:

05AB1E hat zur Zeit keine eingebauten. Es verfügt jedoch über eine integrierte Funktion für das aktuelle Jahr / Monat / Tag / Stunden / Minuten / Sekunden / Mikrosekunden als separate integrierte Funktion. Da nur die Verwendung von Sekunden möglicherweise Probleme mit dem Umlauf von 59 auf 0 verursachen kann, benötige ich sowohl die Minuten als auch die Sekunden, wodurch der Code leider noch länger ist als die meisten Antworten in Nicht-Codegolf-Sprachen.

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

INPUT T
DIALOG"",,,T

Öffnet ein Dialogfeld, das nach TSekunden automatisch geschlossen wird . Ich bin mir nicht sicher, ob dies als "eingebaute Wartefunktion" gilt, aber ich denke, dies ist genauso gültig wie die Verwendung von ping.

Ein alternatives 37-Byte-Programm, das definitiv nicht schummelt:

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

Bewirkt, dass sich die Farbe der Bildschirmüberblendung über TSekunden allmählich auf 0 ändert (Alpha = 0, Rot = 0, Grün = 0, Blau = 0) (kein Effekt) und wartet, bis diese Animation beendet ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.