Стой, стой там, где ты есть!


35

Вызов

Напишите функцию, которая принимает один параметр: целое число t. Ваша функция должна остановить вашу программу на tнесколько секунд, прежде чем продолжить, как time.sleep(t)в Python и WAIT tBBC BASIC.

Вы не должны использовать какие-либо встроенные функции ожидания или любые встроенные функции для выполнения кода через определенное время, и ваша программа должна возобновить работу через tнесколько секунд.

Для тестирования вашей функции допускается отклонение на 0,1 секунды больше или меньше значения, заданного tна вашем компьютере: различия между компьютерами вполне приемлемы .

Если кто-то оспаривает ваш ответ, вы должны предоставить фотографическое (снимок экрана) доказательство того, что ваша функция работает правильно t=1, t=5и t=25. Вы также можете предоставить информацию о вашем компьютере, чтобы люди могли попытаться воспроизвести его на своем компьютере.

Ваша программа должна и будет работать на компьютере с тактовой частотой 1,6 ГГц или выше.

выигрыш

Самая короткая программа выигрывает.

премия

Щедрость отправится в самую короткую программу, которая останавливает программу без использования цикла, проверяющего, сколько времени прошло. Если вы участвуете в конкурсе за эту награду, добавьте сноску, в которой говорится, что ваш ответ - за награду.

Leaderboard

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


Что если выбранный нами язык программирования ( кашель ) поддерживает только точность с точностью до 1 секунды?
Ручка двери

@ Doorknob Ну, входные данные являются целыми числами, так что все в порядке
Beta Decay

3
@Doorknob, возможно, вы можете измерить время выполнения вне вашей программы, например, отладочный вывод и посмотреть метки времени DebugView.
Томас Веллер

1
Название и BBC BASICпример - ссылка на сериал Шерлок, или я читаю слишком много в этом?
Fatalize

1
Ну, по крайней мере, это заставило вас понять, что ваш титул был неточным;)
Fatalize

Ответы:


36

машинный код x86_64, 10 байт

Hexdump кода:

48 69 c9 ca fc 59 38 e2 fe c3

Исходный код (может быть собран ml64Visual Studio):

    TITLE   heh

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

Выполняет пустой цикл, начиная с указанного значения до 0. Я выбрал множитель 945421514 опытным путем методом проб и ошибок, пока моя тестовая программа не выдала удовлетворительные результаты.

Тестовая программа (10 раз для каждой продолжительности 1, 5 и 25 секунд):

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

Результат:

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

Я запустил эту программу на компьютере с Windows, которому больше нечего делать. Если он запускает некоторые приложения, время ожидания более неустойчиво.

Скорость процессора составляет 3,9 ГГц. Кажется, что этот код едва ли достаточно хорош для современной технологии ПК - если тактовая частота составляет около 8,8 ГГц, множитель не поместится в 32-разрядный тип со знаком.


PS Поскольку этот ответ не проверяет, сколько времени прошло, он является кандидатом на получение награды.


4
Это круто: D
Beta Decay

12
3900 ГГц? Вау! Может МГц?
WayToDoor

2
@WayToDoor Исправлено! Также добавлена ​​интересная информация, связанная с этим.
Анатолий

1
Источником является 142 байта, так что это то, что этот ответ должен быть оценен.
Питер Тейлор

3
@PeterTaylor 142 байта на ассемблере ; намного меньше в машинном коде . Это разные языки; на мой взгляд, машинный код более увлекательный (однако, язык ассемблера был бы лучше в [ограниченном исходном коде] вызове). Проблема с машинным кодом заключается в том, что это не ASCII, и я думаю, что это не большая проблема. Связанный вопрос обсужден здесь ; Должен ли я (или вы) начать обсуждение машинного кода там?
Анатолий

21

Баш, 29 25 24 23 19 байт

w()(ping -t$1 1.2)

Проверка точности ( time) где $1= 1 секунда:

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

Спасибо Деннису за то, что он сбил счетчик байтов до 23 с 23!

РЕДАКТИРОВАТЬ : я изменил IP, чтобы избежать pingна Linux пинг 0.0.0.0, который является устройством обратной связи.


Как это работает

ping время ожидания по умолчанию равно 1 секунде, поэтому при соединении с IP-адресом, который не существует, ping не может продолжаться, пока не истечет время ожидания или он не получит ответ от IP.

-tговорит, что pingнужно попробовать $1количество раз на этом фальшивом IP-адресе, заставляя pingпотратить $1секунды, чтобы завершить пинг.


Это право на награду! Нет петли!


Гольф: w()(ping -t$1 0.0)(У нас должны быть разные pings; мой требует -w$1и получает ответ от localhost.)
Деннис

Правильно, тогда он должен работать только на OS X без/dev/lo
georgeunix

Измените 0.0 на 1.2 в Linux
georgeunix

На OS X w 10я 10.02 sec realиспользую time.
georgeunix

w()(ping -w$1 1.2)работает как шарм.
Деннис

18

Matlab, 33 байта

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

Или вы также можете использовать это в Octave: попробуйте онлайн

Matlab, 31 байт

Как предполагает @flawr , это можно сделать с помощью анонимной функции (для ее использования необходимо назначить имя):

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

Пример:

>> f=@(t)eval('tic;while toc<t,end');
>> tic, f(2), toc
Elapsed time is 2.000323 seconds.

5
Тик ... Ток ... Тик ... Ток
Каридорк

4
Если дескриптор неназначенной функции тоже в порядке, вы также можете использовать@(t)eval('tic;while toc<t,end')
flawr

@ Flawr Ух ты! очень хороший трюк, использующий evalдля упаковки нескольких операторов в анонимную функцию. Благодарность!
Луис Мендо

Да, это иногда полезный трюк, но вы все равно не можете присвоить значения переменным даже в eval. Я все еще работаю над способом злоупотребления дескрипторами функций для рекурсивных функций =) PS: Вам не обязательно присваивать имя дескриптору функции, иногда вы также можете передать дескриптор непосредственно в качестве аргумента другой функции, например, для bsxfun.
flawr

+1, но версия анонимной функции не работает в Octave (v 3.8.1). Он не может распознать tпеременную внутри eval.
pawel.boczarski

11

Java, 63 62 байта

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

Ничего удивительного - просто захватывает количество наносекунд с 01.01.1970 несколько раз и проверяет, прошла ли секунда.

Сохранено 1 байт благодаря Ypnypn и aditsu.


25
Ура! Java-программа размером менее 100 байт; D
бета-распад

5
@BetaDecay За исключением того, что это на самом деле не программа.
user253751

1
Разве кто-то не упомянул, что вы можете сократить его с помощью? for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);
aditsu

Что с t->?
Световой

1
@Luminous Это лямбда-выражение , обычно используемое в Java 8.
TNT

8

Пакет, 27 байт

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

Популярный пакетный прием, так как пакетный режим не имеет функции сна.

Без цикла, так что право на получение награды


Гольф: set/ac=%1+1экономит 2 байта.
Stevefestl

7

Commodore 64 BASIC, 19 16 байт

1000 FORI=1TO930*N:NEXT:RETURN

С вызовом N=<number-of-secods>:GOSUB1000.

Однако я не могу обеспечить достаточную точность. Поскольку C64 имел около 1 МГц скорости процессора, я помню , это было достаточно хорошо , чтобы сделать пустой FOR- NEXTцикл 1000 раз , так что это было около 1 секунды.

Фактически было две основные версии машины: PAL 0,985 МГц и NTSC 1,023 МГц (все данные со страницы C64 Wikipedia ). Поскольку у меня была версия NTSC, требовалось запустить цикл около 930 раз.

Тесты с помощью следующей программы (в Nсекундах, предоставленных пользователем в 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

где TI$- системная переменная, содержащая строку ( hhmmssформат) со временем, прошедшим с момента последнего сброса (с точностью до 1 секунды, но также в зависимости от скорости процессора, поэтому это не совсем актуально, потому что это одни и те же часы).

введите описание изображения здесь

Снимок экрана сделан с помощью онлайн-эмулятора C64 http://codeazur.com.br/stuff/fc64_final/ .

Эта программа ( 1000только строка ) занимает 16 19 байт в памяти, что было проверено PRINT FRE(0)+65535как до ввода кода (38908 байт), так и после ( 38893 38889 байт). PRINT FRE(0)возвращает свободную память для программы BASIC (это отрицательное значение и 65535должна быть добавлена константа , но на самом деле это не имеет значения).

Поскольку эта программа не проверяет время, прошедшее в цикле, она получает право на вознаграждение.


Я помню, я выполнил тест, насколько TI$переменная является точной, и это было около 1 секунды на ок. Разница в 2 часа с эталонными часами (за пределами C64), поэтому точности достаточно. То, что я не уверен, это значение 950, однако, будет ли это любое другое значение <1000 (что я уверен), это все тот же объем байтов
Voitcus

Я думаю, что Jпеременная должна каким-то образом быть частью реального кода, а не частью программы тестирования - поэтому она будет ждать N секунд, а не только 1 секунду. Я не знаю, как интегрировать его в синтаксис Бейсика.
Анатолий

@anatolyg Хм, вы правы, это должно быть что-то вроде 1000 FOR I=1 TO N:FOR I=1 TO 950:NEXT I:NEXTJ:RETURNзвонка, например. 200 N=5:GOSUB 1000, Также я заметил, что ОП требует функции . Я постараюсь это исправить
Voitcus

@anatolyg Я исправил, он использует GOSUB- RETURNоператор, так как в Бейсике нет функций
Voitcus

@ Voitcus Даже не DEF FNкак в BBC BASIC?
бета-распад

7

JavaScript ES6, 50 45 40 байт

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

здесь используются самовыполняющиеся функции, но я не уверен, почему +new Dateне работает.


использование

Я протестировал это с Safari Nightly, но он также будет работать и в Firefox. Протестировано с:

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

Вы можете запустить его, заключив его в круглые скобки:

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

Или назвав это:

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

объяснение

Вот основная логика программы:

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

Версия, которую я использую, использует ту же логику:

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

Это блок, который может быть выполнен или сохранен в переменной (таким образом, становится именованной функцией). Деннис и мистер Консенсус согласны с тем, что считать только блок допустимо :)

Объяснение:

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

Попробуйте онлайн


1
Мета-консенсус заключается в том, что функции не должны называться по имени, поэтому я бы сказал, что блок, оставленный в стеке, так же удобен, как и лямбда.
Деннис

6

JavaScript, 68 54 51 42

Я думаю, что скриншот не нужен. Но я подозреваю, что вы могли бы сыграть в гольф еще больше ...

Новая версия: мне теперь наконец удалось избежать newи использовать Dateдважды:

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

Старые версии:

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
Скриншот сейчас не нужен :) Только если кто-то оспаривает эту программу
Beta Decay

5

PHP, 171 177 84 79 65 64 62 байта

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


Использование:
Вызовите функцию следующим образом:
php -d error_reporting=0 -r "require 'script.php'; a(5);echo 'Hello, World!';"
где 5 - время в секундах, в течение которого программа должна ждать, пока она не отобразит «Hello, World!».


Объяснение:
Сначала функция получает текущее время в миллисекундах. Затем функция выполняет цикл, пока текущее время не станет меньше, чем в первый раз + вход. Впоследствии "Привет, мир!" получает эхо.

Log:
Сохранено 113 байтов благодаря Voitcus.
Сохранено 2 байта благодаря Axiac.


1
Это - см. Руководство , $get_as_floatпараметр. Также удалите $t, $s- они вам не нужны (см. Мой код)
Voitcus

1
1e6 = 1000000 один миллион. echo 1e6;работает. Но да - получение в виде числа с плавающей точкой - это количество секунд, так $e=microtime(1)+$i;что этого будет достаточно
Voitcus


1
@ Voitcus спасибо за вашу помощь!
Джренк

1
Вы можете сохранить еще 2 байта (3 байта в PHP 7): 3v4l.org/fU11Y
axiac

5

Юлия, 33 20 байт

t->watch_file(".",t)

Работает только в Julia v0.4 из-за изменения сигнатуры функции watch_file. Определяет анонимную функцию с одним параметром, tкоторый (ab) использует параметр тайм-аута в watch_fileфункции.

Это кандидат на награду!

Демонстрация с использованием 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

Предыдущий ответ (33 байта), также работает в конюшне Юлии

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

4

R, 48 байтов

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

Демонстрация:

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
Я не думаю, что вам нужно включать f=в число байтов, фрагменты функции в порядке.
Соломон Уцко

4

PHP, 39 байт

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

(Обратите внимание, что на самом деле я могу сделать это короче, если потребуется полная программа, используя аргументы, передаваемые в командной строке. До 35 )

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

Программа, используемая для тестирования:

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

Полученные результаты:

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

введите описание изображения здесь


Несмотря на то, что я имею право на получение награды, я вряд ли участвую в конкурсе с другими участниками!


Да, ваш счетчик байтов в порядке
Beta Decay

4

Windows CMD, 22 байта

ping -w 1000 -n %1 1.1

При этом не используется цикл (label и goto), поэтому это соответствует критериям для вознаграждения

Он отправляет tэхо-запросы на 1.0.0.1 (недействительно) и ожидает ответа в течение 1000 мс


3

JavaScript ES6, 40 байт

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

Протестировано со следующим:

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

Можете ли вы объяснить, что elapsed(STOP, t)делает? Что такое СТОП и что прошло?
Бета-распад

elapsedизмеряет время, необходимое для запуска первого аргумента, в данном случае STOP, который, в свою очередь, является только первым фрагментом кода. Второй аргумент, который истек - это аргумент, переданный STOP.
Дендробиум

3

TI-BASIC (84 + SE), 21 байт

Входной метод: T:prgmT. Это ближайший эквивалент функции в TI-BASIC. Программа:

For(A,1,841Ans
End

Вся точность достигается методом проб и ошибок; синхронизация с секундомером работает для всех заданных тестовых случаев с точностью до двадцатой секунды.

Информация об устройстве:

RAM FREE   23312
ARC FREE  889802


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

W00T имеет право на награду!


1
Знаете ли вы: скорость For(циклов вашего калькулятора зависит от того, сколько буквенных переменных существует? Другие переменные засоряют НДС и могут занять до 20% вашего времени. Системные переменные (например, n , Xmin) являются иммунными.
lirtosiast

@ThomasKwa Ха! Интересный. Я перекалибрую с помощью чистого калькулятора, когда у меня будет время для передачи файлов.
Конор О'Брайен

2

Python, 57 байт

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

Функция вызова y()


2

PureBasic, 92 байта

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

Это самое короткое, о чем я могу думать. Я подозреваю, что это будет самым длинным здесь ...

Тестировать:

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

2

PowerShell, 75 байт

Длинные, описательные вызовы процедур. Yay для ясности в языке. :)

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

Вызывается в программе с чем-то вроде

Get-Date
w(15)
Get-Date

В качестве альтернативы, если нам разрешено вместо этого вызывать внешние программы, мы можем получить до 59 байт с помощью следующего:

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

Это будет вызвано в программе следующим образом (предполагается, что вышеупомянутое будет сохранено как «wait-function.ps1» и сохранено в той же папке):

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

Однако то, что мы сохраняем при написании функции / программы, более чем перекрыто избытком, необходимым для ее фактического выполнения. Ле вздох


2

Python, 66 байт

Обратите внимание, что моя реализация не вызывает встроенную функцию времени и не использует функцию планирования.

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

И да, он имеет право на награду.


Нет, это недействительно: Вы не должны использовать какие-либо встроенные функции ожидания или любые встроенные функции для выполнения кода через определенное время
Beta Decay

@BetaDecay: Насколько я понимаю, Queue (). Get не является «встроенными функциями для выполнения кода через определенное время». Пожалуйста, объясните, почему это можно квалифицировать как единое.
Абхиджит

У многих других ответов есть код, который использует тайм-ауты для других вещей, так что это тоже должно быть хорошо.
Соломон Уко


2

Pyth, 19 байт

Поздний вход, но после нахождения .d0в документах прошлой ночью я решил попробовать.

DCNK.d0W<-.d0KNJ1))

Определяет функцию, которая зацикливается до истечения времени, равного Nсекундам.

Попробуй это здесь .


Ницца. Я получил DCNJ+.dZN#Ig.dZJB)), что тоже 19 байтов.
hakr14

2

RProgN 2 , 13 байт

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

Разъяснения

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

Щедрость специально говорит "без использования цикла, проверяющего, сколько времени прошло », чего не происходит. Это устанавливает целевое время и продолжает проверять, прошло ли это целевое время, таким образом, оно имеет право на вознаграждение.

Попробуйте онлайн!


1

Tcl , 53 байта

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

Попробуйте онлайн!

Разъяснения

команда clock milliseconds может быть уменьшена до clock mil, с экранированной 1-й скобкой, она будет интерпретироваться в каждом цикле и без одного раза. Поскольку он измеряет миллисекунды, нам нужно умножить на 1000 или 1e3, что экономит 1 байт.


1

C # (интерактивный компилятор Visual C #) + /u:System.Threading, 36 байт

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

Попробуйте онлайн!

Создает семафор без емкости и пытается получить его в течение указанного количества секунд.

Я понимаю, что я "жду" чего-то здесь. Для меня это больше похоже на решение пинг / тайм-аут, а неThread.Sleep . Код пытается получить ресурс, который он не может получить, и прекращает попытки после ограничения.

===

Ниже приведен вариант, который начинает Task с бесконечного цикла, а затем ожидает его завершения с истечением времени ожидания. Все необходимые пространства имен включены по умолчанию, но решение на несколько байтов длиннее, чем приведенное выше.

C # (интерактивный компилятор Visual C #) , 40 байт

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

Попробуйте онлайн!


0

05AB1E , 22 байта

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

Попробуйте онлайн.

ПРИМЕЧАНИЕ. В зависимости от того, сколько микросекунд в текущей секунде уже прошло, допуск может быть немного больше 0,1 с. Но так как почти в два раза ответы имеют похожие проблемы, я решил, что это разрешено.

Объяснение:

05AB1E не имеет встроенных функций на данный момент. Однако он имеет встроенную функцию для текущего года / месяца / дня / часов / минут / секунд / микросекунд как отдельные встроенные функции. Поскольку только использование секунд может потенциально обернуться от 59 до 0, вызывая проблемы, мне нужны и минуты, и секунды, что, к сожалению, делает код даже длиннее, чем большинство ответов на языках, не использующих код-гольф.

ž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 байтов

INPUT T
DIALOG"",,,T

Открывает диалоговое окно, которое автоматически закрывается после T несколько секунд. Я не уверен, считается ли это «встроенной функцией ожидания», но я думаю, что это так же верно, как использованиеping .

Альтернативная 37-байтовая программа, которая определенно не обманывает:

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

Вызывает постепенное изменение цвета замирания экрана на 0 (альфа = 0, красный = 0, зеленый = 0, синий = 0) (без эффекта) T, а затем ожидает завершения анимации.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.