Herausforderung
Schreiben Sie eine Funktion, die einen Parameter akzeptiert: eine Ganzzahl t
. Ihre Funktion muss Ihr Programm für t
Sekunden anhalten, bevor Sie fortfahren können, ähnlich wie time.sleep(t)
in Python und WAIT t
in 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 t
Sekunden fortgesetzt werden.
Zum Testen Ihrer Funktion gibt es eine Toleranz von 0,1 Sekunden mehr oder weniger als t
auf 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=5
und 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>
BBC BASIC
Beispiel ein Verweis auf die Fernsehsendung Sherlock oder lese ich zu viel darüber?Antworten:
x86_64-Maschinencode, 10 Byte
Hexdump des Codes:
Quellcode (kann
ml64
von Visual Studio zusammengestellt werden):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):
Das Ergebnis:
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.
quelle
Bash,
2925242319 BytesGenauigkeitstest (
time
) mit$1
= 1 Sekunde:Vielen Dank, Dennis, dass du die Anzahl der Bytes von 23 auf 19 gesenkt hast!
BEARBEITEN : Ich habe die IP geändert, um
ping
unter 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.-t
Gibtping
an,$1
wie oft versucht werden soll, diese gefälschte IP-Adresseping
zu verwenden, wobei$1
Sekunden erforderlich sind , um den Ping-Vorgang abzuschließen.Es ist für die Prämie berechtigt! Keine Schleife!
quelle
w()(ping -t$1 0.0)
(Wir müssen verschiedeneping
s haben; meins erfordert-w$1
und erhält eine Antwort von localhost.)/dev/lo
w 10
, werde ich10.02 sec real
mittime
.w()(ping -w$1 1.2)
klappt wunderbar.Matlab, 33 Bytes
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):
Beispiel:
quelle
@(t)eval('tic;while toc<t,end')
eval
dem man mehrere Anweisungen in eine anonyme Funktion packen kann. Vielen Dank!bsxfun
.t
Variable in eval wird nicht erkannt .Java,
6362 BytesKein 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.
quelle
for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);
t->
?Batch, 27 Bytes
Ein beliebter Batch-Trick, da Batch keine Sleep-Funktion hatte.
Keine Schlaufe, also prämienberechtigt
quelle
set/ac=%1+1
Spart 2 Bytes.Commodore 64 BASIC, 19
16BytesMit 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
-NEXT
Schleife 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 (
N
Sekunden, vom Benutzer eingegebenINPUT
):Dabei
TI$
handelt es sich um eine Systemvariable, die einen String (hhmmss
Format) 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).Screenshot erstellt mit dem Online-C64-Emulator http://codeazur.com.br/stuff/fc64_final/ .
Dieses Programm (
1000
nur Zeile ) belegt16 bis19 Bytes im Speicher. Dies wurdePRINT FRE(0)+65535
sowohl vor dem Eingeben des Codes (38908 Bytes) als auch nach demEingeben(38893 bis38889 Bytes) getestet.PRINT FRE(0)
Gibt den freien Speicher für das BASIC-Programm zurück (es ist ein negativer Wert, und es65535
sollte 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.
quelle
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 Wert950
, aber wäre es ein anderer Wert <1000 (was ich sicher bin), ist es immer noch die gleiche Menge an BytesJ
Variable 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.1000 FOR I=1 TO N:FOR I=1 TO 950:NEXT I:NEXTJ:RETURN
bei einem Anruf zB.200 N=5:GOSUB 1000
. Auch mir ist aufgefallen, dass das OP eine Funktion benötigt . Ich werde versuchen, es zu behebenGOSUB
-RETURN
Aussage, da es in BASIC keine Funktionen gibtDEF FN
wie in BBC BASIC?JavaScript ES6,
504540 BytesDies verwendet selbstausführende Funktionen, nicht sicher, warum
+new Date
nicht funktioniert.Verwendung
Ich habe dies mit Safari Nightly getestet, aber es wird auch mit Firefox funktionieren. Getestet mit:
Sie können es ausführen, indem Sie es in Klammern setzen:
Oder indem Sie es benennen:
Erläuterung
Hier ist die Hauptlogik hinter dem Programm:
Die von mir verwendete Version verwendet dieselbe Logik:
quelle
CJam, 15
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:
Probieren Sie es online aus
quelle
JavaScript,
68 54 5142Ich 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
new
und zu verwendenDate
:Ältere Versionen:
quelle
PHP,
1711778479656462 BytesVerwendung:
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
quelle
$get_as_float
Parameter. Entfernen Sie auch$t
,$s
- Sie brauchen sie nicht (siehe meinen Code)echo 1e6;
funktioniert. Aber ja - es ist die Anzahl der Sekunden,$e=microtime(1)+$i;
die man benötigt , um sich zuJulia,
3320 BytesFunktioniert nur in Julia v0.4 aufgrund von Änderungen in der Funktionssignatur von
watch_file
. Definiert eine anonyme Funktion mit einem einzelnen Parametert
, der (ab) den Timeout-Parameter in derwatch_file
Funktion verwendet.Dies ist ein Kandidat für das Kopfgeld!
Demonstration mit der Julia REPL:
Vorherige Antwort (33 Bytes), funktioniert auch in Julia Stall
quelle
R, 48 Bytes
Demonstration:
quelle
f=
die Anzahl der Bytes angeben müssen, Funktionsausschnitte sind in Ordnung.PHP, 39 Bytes
(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 )
Programm zum Testen:
Ergebnisse:
Obwohl ich mich für das Kopfgeld qualifiziere, bin ich mit einigen anderen Einsendungen kaum im Rennen!
quelle
Windows CMD, 22 Byte
Dies verwendet keine Schleife (label und goto), so dass dies für die Prämie qualifiziert ist
Es sendet
t
Pings an 1.0.0.1 (ungültig) und wartet 1000 ms auf eine Antwortquelle
JavaScript ES6, 40 Byte
Getestet mit:
quelle
elapsed(STOP, t)
macht? Was sind STOP und verstrichen?elapsed
misst die Zeit, die das erste Argument benötigt hat, um ausgeführt zu werden. Dies istSTOP
wiederum nur das erste Code-Snippet. Das zweite abgelaufene Argument ist das Argument, an das übergeben wirdSTOP
.TI-BASIC (84 + SE), 21 Bytes
Eingabemethode:
T:prgmT
. Dies ist das nächste Äquivalent einer Funktion in TI-BASIC. Programm:Alle Genauigkeit wird durch Ausprobieren erreicht. Das Timing mit einer Stoppuhr funktioniert für alle gegebenen Testfälle innerhalb einer Zwanzigstelsekunde.
Geräteinformation:
W00T berechtigt zu einer Prämie!
quelle
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.Python, 57 Bytes
Funktion aufrufen
y()
quelle
PureBasic, 92 Bytes
Es ist das kürzeste, an das ich denken kann. Ich vermute, dass dies auch hier die längste sein wird ...
Zu testen:
quelle
PowerShell, 75 Byte
Lange, beschreibende Prozeduraufrufe. Yay für Klarheit in einer Sprache. :)
Wird in einem Programm mit so etwas wie aufgerufen
Wenn wir stattdessen externe Programme aufrufen dürfen, können wir alternativ mit den folgenden Schritten auf 59 Bytes reduzieren :
Dies würde in einem Programm wie folgt aufgerufen (vorausgesetzt, das oben Gesagte wird als "wait-function.ps1" gespeichert und im selben Ordner gespeichert):
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.
quelle
Python, 66 Bytes
Beachten Sie, dass meine Implementierung weder eine eingebaute Zeitfunktion aufruft noch die Planungsfunktion verwendet.
Und ja, es kann Kopfgeld gezahlt werden.
quelle
Hassium , 55 Bytes
Führen Sie den folgenden Befehl aus und lesen Sie den erweiterten Code : http://HassiumLang.com/Hassium/index.php?code=9f4e2bdb292b14b150fba63677a11a79
quelle
Pyth, 19 Bytes
Verspätete Einreise, aber nachdem ich
.d0
gestern Abend in den Dokumenten nachgesehen hatte, entschloss ich mich, es zu versuchen.Definiert eine Funktion, die eine Schleife durchläuft, bis die Zeit abgelaufen ist
N
Sekunden .Probieren Sie es hier aus .
quelle
DCNJ+.dZN#Ig.dZJB))
, das sind auch 19 Bytes.RProgN 2 , 13 Bytes
Erklärt
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!
quelle
Tcl , 53 Bytes
Probieren Sie es online!
Erklärt
Der Befehl
clock milliseconds
kann aufclock mil
die 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.quelle
C # (Visual C # Interactive Compiler) + /u:System.Threading, 36 Byte
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 als
Thread.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
Task
Endlosschleife 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
Probieren Sie es online!
quelle
05AB1E , 22 Bytes
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.
quelle
SmileBASIC, 20 Bytes
Öffnet ein Dialogfeld, das nach
T
Sekunden 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 vonping
.Ein alternatives 37-Byte-Programm, das definitiv nicht schummelt:
Bewirkt, dass sich die Farbe der Bildschirmüberblendung über
T
Sekunden allmählich auf 0 ändert (Alpha = 0, Rot = 0, Grün = 0, Blau = 0) (kein Effekt) und wartet, bis diese Animation beendet ist.quelle