Wyzwanie
Napisz funkcję, która przyjmuje jeden parametr: liczbę całkowitą t
. Twoja funkcja musi zatrzymać program na t
kilka sekund przed kontynuowaniem, podobnie jak time.sleep(t)
w Pythonie i WAIT t
BBC 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 t
kilku sekundach.
Do testowania twojej funkcji istnieje tolerancja 0,1 sekundy większa lub mniejsza niż podana t
na 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=5
i 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>
BBC BASIC
przykład odnoszą się do programu telewizyjnego Sherlock, czy też czytam w tym zbyt wiele?Odpowiedzi:
kod maszynowy x86_64, 10 bajtów
Hexdump kodu:
Kod źródłowy (może być złożony przez
ml64
Visual Studio):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):
Wynik:
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.
źródło
Bash,
2925242319 bajtówTest dokładności (
time
) gdzie$1
= 1 sekunda:Dzięki Dennis za golenie bajtu odliczanie do 19 z 23!
EDYCJA : Zmieniłem adres IP, aby uniknąć
ping
pingowania 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.-t
każeping
spróbować$1
kilka razy na tym fałszywym adresie IP, zmuszającping
do poświęcenia$1
kilku sekund na zakończenie pingowania.Kwalifikuje się do nagrody! Bez pętli!
źródło
w()(ping -t$1 0.0)
(Musimy mieć różneping
s; moje wymaga-w$1
i otrzymuje odpowiedź od localhost.)/dev/lo
w 10
, dostaję10.02 sec real
użyciutime
.w()(ping -w$1 1.2)
działa jak marzenie.Matlab, 33 bajty
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ć):
Przykład:
źródło
@(t)eval('tic;while toc<t,end')
eval
na spakowaniu kilku instrukcji w anonimowej funkcji. Dzięki!bsxfun
. Dla .t
zmiennej wewnątrz eval.Java,
6362 bajtyNic 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.
źródło
for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);
t->
?Partia, 27 bajtów
Popularna sztuczka wsadowa, ponieważ partia nie miała funkcji uśpienia.
Brak pętli, więc nagroda kwalifikuje się
źródło
set/ac=%1+1
oszczędza 2 bajty.Commodore 64 BASIC, 19
16bajtówZ 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
-NEXT
pę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 (
N
sekundy dostarczone przez użytkownika wINPUT
):gdzie
TI$
jest zmienną systemową zawierającą łańcuch (hhmmss
format) 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).Zrzut ekranu wykonany za pomocą emulatora C64 online http://codeazur.com.br/stuff/fc64_final/ .
Ten program (
1000
tylko wiersz ) zajmuje1619 bajtów pamięci, co przetestowanoPRINT FRE(0)+65535
zarówno przed wpisaniem kodu (38908 bajtów), jak i po (3889338889 bajtów).PRINT FRE(0)
zwraca wolną pamięć dla programu BASIC (jest to wartość ujemna i65535
należ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.
źródło
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ści950
, ale czy byłaby to jakakolwiek inna wartość <1000 (co jestem pewien), to wciąż ta sama ilość bajtówJ
zmienna 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.1000 FOR I=1 TO N:FOR I=1 TO 950:NEXT I:NEXTJ:RETURN
z połączeniem np.200 N=5:GOSUB 1000
. Zauważyłem również, że OP wymaga funkcji . Spróbuję to naprawićGOSUB
-RETURN
instrukcji, ponieważ w języku BASIC nie ma żadnych funkcjiDEF FN
jak w BBC BASIC?JavaScript ES6,
504540 bajtówużywa to samo-wykonujących się funkcji, nie wiadomo, dlaczego
+new Date
nie działa.Stosowanie
Przetestowałem to w Safari Nightly, ale będzie działać również w przeglądarce Firefox. Testowane z:
Możesz go uruchomić, otaczając go nawiasami:
Lub nazywając to:
Wyjaśnienie
Oto główna logika programu:
Wersja, której używam, wykorzystuje tę samą logikę:
źródło
CJam, 15
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:
Wypróbuj online
źródło
JavaScript,
68 54 5142Myś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ąć
new
i użyćDate
dwukrotnie:Starsza wersja:
źródło
PHP,
1711778479656462 bajtówUż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
źródło
$get_as_float
parametr. Również usunąć$t
,$s
- nie są potrzebne (patrz mój kod)echo 1e6;
Prace. Ale tak - uzyskanie liczby zmiennoprzecinkowej to liczba sekund, więc$e=microtime(1)+$i;
wystarczyJulia,
3320 bajtówDział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 wwatch_file
funkcji.To kandydat do nagrody!
Demonstracja z wykorzystaniem Julia REPL:
Poprzednia odpowiedź (33 bajty), również działająca w stajni Julii
źródło
R, 48 bajtów
Demonstracja:
źródło
f=
liczbę bajtów, fragmenty funkcji są w porządku.PHP, 39 bajtów
(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 )
Program używany do testowania:
Wyniki:
Mimo, że kwalifikuję się do nagrody, prawie nie biorę udziału w niektórych innych zgłoszeniach!
źródło
Windows CMD, 22 bajty
Nie używa pętli (etykieta i goto), więc kwalifikuje się do nagrody
Wysyła
t
sygnały ping do 1.0.0.1 (niepoprawne) i czeka na odpowiedź przez 1000 msźródło
JavaScript ES6, 40 bajtów
Testowane z następującymi:
źródło
elapsed(STOP, t)
robi? Czym są STOP i co upłynęło?elapsed
mierzy czas potrzebny na uruchomienie pierwszego argumentu, w tym przypadkuSTOP
, który z kolei jest tylko pierwszym fragmentem kodu. Drugi arg, który upłynął, to arg przekazany doSTOP
.TI-BASIC (84 + SE), 21 bajtów
Metoda wprowadzania:
T:prgmT
. Jest to najbliższy odpowiednik funkcji w TI-BASIC. Program: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:
W00T kwalifikuje się do nagrody!
źródło
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.Python, 57 bajtów
Funkcja połączenia
y()
źródło
PureBasic, 92 bajty
To najkrótszy, jaki mogę wymyślić. Podejrzewam, że tutaj też będzie najdłużej ...
Testować:
źródło
PowerShell, 75 bajtów
Długie opisowe wywołania procedur. Yay dla jasności w języku. :)
Wywoływany w programie z czymś takim
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:
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):
To, co oszczędzamy na pisaniu funkcji / programu, jest jednak więcej niż zblokowane przez nadmiar potrzebny do faktycznego jego wykonania. Le westchnienie.
źródło
Python, 66 bajtów
Uwaga: moja implementacja nie wywołuje wbudowanej funkcji czasu ani nie korzysta z funkcji planowania.
I tak, kwalifikuje się do nagrody.
źródło
Sód , 55 bajtów
Uruchom i zobacz rozwinięty: http://HciumLang.com/Hcium/index.php?code=9f4e2bdb292b14b150fba63677a11a79
źródło
Pyth, 19 bajtów
Późne wejście, ale po znalezieniu
.d0
w dokumentacji ostatniej nocy postanowiłem spróbować.Definiuje funkcję, która zapętla się do upływu czasu
N
sekundach.Wypróbuj tutaj .
źródło
DCNJ+.dZN#Ig.dZJB))
, czyli 19 bajtów.RProgN 2 , 13 bajtów
Wyjaśnił
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!
źródło
Tcl , 53 bajty
Wypróbuj online!
Wyjaśnił
Komenda
clock milliseconds
może zostać zredukowana doclock 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.źródło
C # (interaktywny kompilator Visual C #) + /u:System.Threading, 36 bajtów
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ę
Task
od 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
Wypróbuj online!
źródło
05AB1E , 22 bajty
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.
źródło
SmileBASIC, 20 bajtów
Otwiera okno dialogowe, które zamyka się automatycznie po
T
kilku sekundach. Nie jestem pewien, czy liczy się to jako „wbudowana funkcja oczekiwania”, ale myślę, że jest to tak samo ważne jak używanieping
.Alternatywny 37-bajtowy program, który zdecydowanie nie oszukuje:
Powoduje, że kolor zanikania ekranu zmienia się stopniowo na 0 (alfa = 0, czerwony = 0, zielony = 0, niebieski = 0) (brak efektu) stopniowo w ciągu
T
kilku sekund, a następnie czeka na zakończenie animacji.źródło