Стоп, стоїть там, де ти є!


35

Виклик

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

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

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

Якщо ваша відповідь оскаржене ким - небудь, ви повинні надати фотографічне (screenshotted) доказ того, що ваша функція правильно працює t=1, t=5і t=25. Ви також можете надати реквізити свого комп'ютера, щоб люди могли спробувати його тиражувати на власній машині.

Ваша програма повинна і працюватиме на комп'ютері, тактова частота якого становить 1,6 ГГц або вище.

Перемога

Виграє найкоротша програма.

Баунті

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

Таблиця лідерів

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

@Doorknob Ну вхід є цілим числом, тож це нормально
Beta Decay

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

1
Чи назва та BBC BASICприклад посилання на телешоу Шерлок чи я занадто багато читаю в цьому?
Фаталізувати

1
Ну, принаймні, це змусило вас зрозуміти, що ваш титул був неточним;)
Підтвердьте,

Відповіді:


36

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

Шестнадцятковий код:

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-бітний int.


PS Оскільки ця відповідь не перевіряє, скільки часу минуло, він є кандидатом на винагороду.


4
Це круто: D
бета-розпад

12
3900 ГГц? Вух! Може, МГц?
WayToDoor

2
@WayToDoor виправлено! Також додали цікаву інформацію, пов’язану з цим.
anatolyg

1
Джерело - 142 байти, тому саме ця відповідь має бути оцінена.
Пітер Тейлор

3
@PeterTaylor 142 байти в мові складання ; набагато менше в машинному коді . Це різні мови; на мою думку, машинний код є більш цікавим (однак, мова складання буде кращою у проблемі [з обмеженим джерелом]). Проблема машинного коду полягає в тому, що це не ASCII, і я думаю, що це не велика проблема. Пов'язаний з цим питання обговорюється тут ; я повинен (або ви) розпочати дискусію щодо машинного коду там?
anatolyg

21

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

w()(ping -t$1 1.2)

Тест на точність ( time), де $1= 1 секунда:

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

Дякую Деннісу за те, що поголив кількість байтів до 19 з 23!

EDIT : Я змінив IP-адресу, щоб уникнути того, pingщоб Linux pinging 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.)
Dennis

Правильно, тоді він повинен працювати лише на ОС X з no/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

Матлаб, 33 байти

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

Або ви також можете використовувати це в Octave: спробуйте в Інтернеті

Матлаб, 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
Tic ... Toc ... Tic ... Toc
Caridorc

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

Нічого дивного - просто схоплює кількість наносекунд з 1.01.1970 р. Кілька разів і перевіряє, чи пройшла секунда.

Збережено 1 байт завдяки Ypnypn та aditsu.


25
Так! Програма Java нижче 100 байт; D
бета-розпад

5
@BetaDecay За винятком того, що це насправді не програма.
користувач253751

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 секунду за ca. 2 години різниці з опорним годинником (за межами C64), тому точності достатньо. Що я не впевнений, це значення 950, однак це було б будь-яке інше значення <1000 (в чому я впевнений), це все одно така ж кількість байтів
Voitcus,

Я думаю, що Jзмінна якось повинна бути частиною реального коду, а не частиною програми тестування - так це зачекало б N секунд, а не лише 1 секунду. Я не знаю, як інтегрувати його в синтаксис BASIC.
anatolyg

@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заяву, оскільки в BASIC немає функцій
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
Консенсус щодо Meta полягає в тому, що функції не потрібно називати, тому я б стверджував, що блок, залишений на стеці, такий же корисний, як і лямбда.
Денніс

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 - час у секундах, програма повинна почекати, перш ніж вона лунатиме "Привіт, світ!".


Пояснення:
Спочатку функція отримує поточний час у мілісекундах. Тоді функція робить цикл, поки поточний Час не буде меншим, ніж перший час + вхід. Після цього "Здрастуйте, світ!" отримує відлуння.

Журнал:
Збережено 113 байт завдяки Voitcus
Збережено 2 байти завдяки аксіаку


1
Це - див. Інструкцію , $get_as_floatпараметр. Також видаліть $t, $s- вони вам не потрібні (див. Мій код)
Voitcus

1
1e6 = 1000000 один мільйон. echo 1e6;працює. Але так - отримувати як float - це кількість секунд, так $e=microtime(1)+$i;було б достатньо
Voitcus


1
@Voitcus дякую за вашу допомогу!
jrenk

1
Ви можете зберегти ще 2 байти (3 байти на PHP 7): 3v4l.org/fU11Y
аксіак

5

Юлія, 33 роки 20 байт

t->watch_file(".",t)

Працює лише в Julia v0.4 через зміни функції підпису watch_file . Визначає анонімну функцію з одним параметром, tякий (ab) використовує параметр timeout у watch_fileфункції.

Це кандидат на винагороду!

Демонстрація за допомогою Юлії 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)робить? Що таке STOP та минуло?
Бета-розпад

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 Ху! Цікаво. Я повторно відкалібруватися за допомогою чистого калькулятора, коли матиму час для передачі файлів.
Conor O'Brien

2

Пітон, 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 байт

Довгі описові описи процедури. Так, для ясності мови. :)

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

Пітон, 66 байт

Зауважте, моя реалізація ні викликає вбудовану функцію часу, ні використовує функцію планування.

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

І так, він підходить для щедрості.


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

@BetaDecay: Як я розумію, черга (). Get не є "вбудованою функцією для виконання коду через певний час". Поясніть, будь ласка, чому це може бути визначено як одне.
Abhijit

У багатьох інших відповідях є код, який використовує тайм-аути для інших речей, тому це має бути добре.
Соломон Учко


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 mil1-ої дужки, що увійшла, вона буде інтерпретована в кожному циклі, і без одного разу. Оскільки він вимірює мілісекунди, нам потрібно кратно по 1000 або 1e3, що економить 1 байт.


1

C # (Visual C # Interactive Compiler) + /u:System.Threading, 36 байт

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

Спробуйте в Інтернеті!

Створює семафор без ємності і намагається отримати його за вказану кількість секунд.

Я усвідомлюю, що я тут "чекаю" на щось. Мені це здається більше схожим на рішення ping / timeoutThread.Sleep . Код намагається отримати ресурс, який він не може отримати, і припиняє спроби після обмеження.

===

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

C # (Visual C # Interactive Compiler) , 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.