Dur, olduğun yerde dur!


35

Meydan okuma

Bir parametre alan bir fonksiyon yazın: bir tamsayı t. Göreviniz Python ve BBC BASIC'deki gibi tdevam etmeden önce programınızı saniyeler içinde durdurmalıdır .time.sleep(t)WAIT t

Herhangi bir bekleme fonksiyonunu veya belirli bir süre sonra kod yürütmek için herhangi bir yerleşik fonksiyonu kullanmamalısınız ve programınız tsaniyeler sonra devam etmelidir .

İşlevinizi test etmek için, tkendi makinenizdekinden 0,1 saniye daha az veya daha az tolerans vardır : bilgisayarlar arasındaki farklılıklar iyidir.

Cevabınız herkes tarafından sorgulanması halinde, kendi işlevi için doğru şekilde çalıştığını fotoğrafik (screenshotted) ispat etmeli t=1, t=5ve t=25. Ayrıca, bilgisayarınızın ayrıntılarını, insanların kendi makinelerinde çoğaltmaya çalışabilmelerini sağlayabilirsiniz.

Programınız, saat hızı 1,6 GHz veya daha yüksek olan bir bilgisayarda çalıştırılmalıdır.

Kazanan

En kısa program kazanır.

cömertlik

Bir ödül programı durdurur kısa programa gidecek olmadan geçtikten ne kadar zaman kontrol bir döngü kullanarak. Bu ödül için yarışıyorsanız, cevabınızın ödül için olduğunu söyleyen bir dipnot ekleyin.

Liderler Sıralaması

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


Tercih ettiğimiz programlama dili ( öksürük öksürüğü ) yalnızca 1 saniyelik kesinliğe ulaşmayı destekliyorsa ne olur ?
Doorknob

@Doorknob Girdi bir tamsayı, bu yüzden sorun değil
Beta Decay

3
@Doorknob belki programınızın dışındaki yürütme zamanını ölçebilir, örneğin hata ayıklama çıktısı alabilir ve DebugView'ün zaman damgalarına bakabilirsiniz.
Thomas Weller,

1
Başlık ve BBC BASICörnek Sherlock TV şovuna referans mı, yoksa çok mu okuyorum?
15’te

1
En azından unvanının tam olmadığını fark
etmeni sağladı

Yanıtlar:


36

x86_64 makine kodu, 10 bayt

Kodun Hexdump:

48 69 c9 ca fc 59 38 e2 fe c3

Kaynak kodu ( ml64Visual Studio tarafından birleştirilebilir ):

    TITLE   heh

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

Belirtilen değerden 0'a kadar boş bir döngü gerçekleştirir. Test programım tatmin edici sonuçlar verene kadar çarpanı 945421514'ü deneysel ve hatalı olarak seçtim.

Test programı (1, 5 ve 25 saniye sürelerinin her biri için 10 kez bekler):

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

Sonuç:

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

Bu programı, yapacak başka bir şeyi olmayan bir Windows bilgisayarda çalıştırdım. Bazı uygulamaları çalıştırıyorsa, bekleme süreleri daha kararsızdır.

CPU hızı 3,9 GHz'dir. Görünüşe göre bu kod mevcut PC teknolojisi için yeterince iyi görünüyor - saat frekansı yaklaşık 8.8 GHz ise, çarpan imzalı bir 32 bit int'e sığmayacak.


Not: Bu cevap ne kadar zaman geçtiğini kontrol etmediğinden, ödül için bir adaydır.


4
Bu çok havalı: D
Beta Çürüğü

12
3900 GHz? Woah! Belki MHz?
WayToDoor

2
@WayToDoor Sabit! Ayrıca bununla ilgili bazı eğlenceli bilgiler eklendi.
anatolyg

1
Kaynak 142 bayttır, bu yüzden bu cevabın puanlanması gerektiği gibi.
Peter Taylor

3
@ AssemblyPaylor assembly dilinde 142 byte ; Makine kodunda çok daha az . Bunlar farklı dillerdir; Bence makine kodu daha eğlenceli (ancak, [sınırlı kaynak kodlu] bir mücadelede derleme dili daha iyi olurdu). Makine koduyla ilgili sorun ASCII olmadığı ve bunun büyük bir sorun olmadığını düşünüyorum. İlgili bir konu burada tartışılmaktadır ; Makine koduyla ilgili bir tartışma başlatmalı mıyım (veya siz)?
anatolyg

21

Bash, 29 25 24 23 19 bayt

w()(ping -t$1 1.2)

Doğruluk testi ( time) burada $1= 1 saniye:

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

Bayt'ı tıraş ettiğin için teşekkürler Dennis, 23'ten 19'a kadar sayıyor!

EDIT : IP pinggeridöngü aygıtı olan Linux 0.0.0.0'da ping yapmaktan kaçınmak için değiştirdim .


Bu nasıl çalışır

ping varsayılan olarak 1 saniyelik bir zaman aşımı süresi vardır, bu nedenle, mevcut olmayan bir IP adresiyle iletişim kurarken, ping, zaman aşımı süresi doluncaya kadar devam edemez veya IP'den yanıt alamaz.

-tBu sahte IP adresinde kaç kez pingdenemeyi söyler $1, ping'in tamamlanması birkaç saniye pingsürer $1.


Bu ödül için uygun! Döngü yok!


Golf: w()(ping -t$1 0.0)(Farklı pings olmalı ; benimkiler gerektirir -w$1ve localhost'tan cevap alır.)
Dennis

Doğru, o zaman sadece OS X üzerinde no/dev/lo
georgeunix ile

Linux üzerinde 1.2 0.0 değiştirin
georgeunix

OS X'de, için w 10, ben olsun 10.02 sec realkullanarak time.
georgeunix 27:15

w()(ping -w$1 1.2)ÇALIŞIYOR bir cazibe gibi.
Dennis,

18

Matlab, 33 bayt

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

Veya bunu Octave'da da kullanabilirsiniz: çevrimiçi deneyin

Matlab, 31 bayt

As @flawr önerdiği , bu isimsiz bir işlev (kullanmak amacıyla bir isim atanması gereken) ile yapılabilir:

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

Örnek:

>> 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
Atanmamış bir işlev tanıtıcısı da @(t)eval('tic;while toc<t,end')
tamamsa

@flawr Wow! çok güzel bir numara, evalanonim bir işleve çeşitli ifadeler koymak için kullanmak . Teşekkürler!
Luis Mendo

Evet, bu bazen yararlı bir numaradır, ancak yine de eval içindeki değişkenlere değer atayamazsınız. Özyinelemeli işlevler için işlev tanıtıcılarını kötüye kullanmanın bir yolu üzerinde çalışıyorum =) Not: İşlev tanıtıcısına bir ad vermeniz gerekmez; bazen tanıtıcıyı başka bir işleve, örneğin için doğrudan bir argüman olarak da geçirebilirsiniz bsxfun.
kusur

+1, ancak adsız işlev sürümü Octave'de çalışmıyor (v 3.8.1). tEval içindeki değişkeni tanımıyor .
pawel.boczarski

11

Java, 63 62 bayt

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

Şaşırtıcı bir şey yok - sadece 1/1/1970'den bu yana nanosaniye sayısını yakalar ve bir saniyenin geçip geçmediğini kontrol eder.

Ypnypn ve aditsu sayesinde 1 bayt kurtarıldı.


25
Yuppi! 100 baytın altındaki bir Java programı: D
Beta Decay

5
@BetaDecay Aslında bu bir program değil.
user253751

1
Biri bunun için kısaltabileceğinden bahsetmedi mi? for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);
aditsu

Neyin var t->?
Işıltılı

1
@Luminous Bu , Java 8'de sıkça kullanılan bir lambda ifadesidir .
TNT

8

Toplu İş, 27 Bayt

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

Popüler bir parti numarasıdır, çünkü parti bir uyku fonksiyonuna sahip değildi.

Döngü yok, bu yüzden uygun ödül


Golf: set/ac=%1+12 bayt kaydeder.
stevefestl

7

Commodore 64 BASIC, 19 16 bayt

1000 FORI=1TO930*N:NEXT:RETURN

Bir çağrı ile N=<number-of-secods>:GOSUB1000.

Ancak, yeterince doğruluk sağlayamıyorum. C64 1 MHz işlemci hızından vardı çünkü ben boş bir hale getirmek için yeterince iyi olduğunu hatırlıyorum FOR- NEXTbu olduğunu 1000 kat böylece döngü yaklaşık 1 saniye.

Aslında, makinenin iki ana sürümü vardı: PAL 0.985 MHz ve NTSC 1.023 MHz (tüm veriler C64 Wikipedia Sayfası'ndan ). NTSC sürümüne sahip olduğum için yaklaşık 930 kez döngü çalıştırmak gerekiyordu.

Aşağıdaki programla testler ( Nkullanıcı tarafından sağlanan saniye 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

nerede TI$olduğunu dizeyi (içeren bir sistem değişkeni hhmmss(aynı saat çünkü bu, oldukça alakalı değildir bu yüzden ancak aynı zamanda, CPU hızına bağlı olarak 1 saniye doğruluk) Son sıfırlamadan itibaren geçen zaman biçimi).

görüntü tanımını buraya girin

Ekran görüntüsü çevrimiçi C64 emülatörü ile yapılmıştır http://codeazur.com.br/stuff/fc64_final/ .

Bu program ( 1000sadece satır ) işgal eder , PRINT FRE(0)+65535hem kodu yazmadan önce (38908 bayt) hem de sonra ( 38893 38889 bayt) test edildiği gibi 16 19 bayt bellekte yer alır . PRINT FRE(0)BASIC programı için boş hafıza döndürür (negatif bir değerdir ve sabit 65535eklenmelidir, ancak farketmez).

Bu program bir döngüde geçen süreyi test etmediğinden, bir ödül almaya hak kazanır.


Ne kadar TI$değişkenin doğru olduğunu ve ca başına 1 saniye olduğunu test ettim . Referans saati ile 2 saat fark (C64 dışında), bu nedenle doğruluk yeterli. Ne emin oldum değerdir 950, ancak (eminim) başka bir değer <1000, bu bayt aynı miktarda hala olurdu
Voitcus

JDeğişkenin bir şekilde test programının bir parçası değil de gerçek kodun bir parçası olması gerektiğini düşünüyorum - bu yüzden sadece 1 saniye değil N saniye bekleyecekti. Yine de BASIC'in sözdizimine nasıl entegre edileceğini bilmiyorum.
anatolyg

@anatolyg Hm, haklısın, 1000 FOR I=1 TO N:FOR I=1 TO 950:NEXT I:NEXTJ:RETURNörneğin bir çağrı ile gibi bir şey olmalı . 200 N=5:GOSUB 1000. Ayrıca OP'nin bir fonksiyon gerektirdiğini fark ettim . Bunu düzeltmeye çalışacağım
Voitcus

@anatolyg Düzeltdim, kullandı GOSUB- RETURNdeyimi,
BASIC'de

@Voitcus DEF FNBBC BASIC'deki gibi değil mi?
Beta Çürüğü

7

JavaScript ES6, 50 45 40 bayt

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

Bu, kendi kendine çalışan işlevleri kullanır, neden +new Dateçalışmadığından emin değildir.


kullanım

Bunu Safari Nightly ile test ettim, ancak Firefox'ta da çalışacak. Şununla test edildi:

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

Her ikisini de parantezle çevreleyerek çalıştırabilirsiniz:

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

Veya adlandırarak:

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

açıklama

İşte programın arkasındaki ana mantık:

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

Kullandığım sürüm aynı mantığı kullanıyor:

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

Bu, bir değişkende çalıştırılabilen veya saklanabilen bir bloktur (dolayısıyla adlandırılmış bir fonksiyondur). Dennis ve Bay Consensus sadece blok saymanın kabul edilebilir olduğu konusunda hemfikirdir :)

Açıklama:

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

Çevrimiçi deneyin


1
Meta üzerindeki fikir birliği, işlevlerin isimlendirilmesi gerekmediğidir, bu yüzden yığında bırakılan bir bloğun bir lambda kadar kullanılabileceğini iddia ediyorum.
Dennis,

6

JavaScript, 68 54 51 42

Bence ekran görüntüsü gerekli değil. Ama bundan daha çok golf oynayabileceğinden şüpheleniyorum.

Yeni sürüm: Artık nihayet iki kere newkullanmaktan kaçınmayı ve kullanmayı başardım Date:

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

Eski versiyonlar:

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
Artık ekran görüntüsü gerekmiyor :) Sadece birileri bu programı
Beta Decay

5

PHP, 171 177 84 79 65 64 62 bayt

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


Kullanımı:
Fonksiyonu şu şekilde çağırınız:
php -d error_reporting=0 -r "require 'script.php'; a(5);echo 'Hello, World!';"
5 saniye, programın "Merhaba, Dünya!" Yankılanmasından önce beklemesi gereken 5 saniyedir.


Açıklama:
İşlev, geçerli zamanı milisaniye cinsinden alır. Daha sonra fonksiyon, geçerli Zaman daha küçük olana ve ilk defa + giriş olana kadar bir döngü yapar. Daha sonra "Merhaba Dünya!" yankılanır.

İşlem kaydı:
Voitcus sayesinde 113 bayt
kaydedildi Axiac sayesinde 2 bayt kaydedildi


1
Bu - kılavuza , $get_as_floatparametreye bakın. Ayrıca kaldırın $t, $s- onlara ihtiyacınız yok (
koduma

1
1e6 = 1000000 bir milyon. echo 1e6;Eserleri. Ama evet - şamandıra gibi elde etmek saniye sayısıdır, bu yüzden $e=microtime(1)+$i;yeterli olur
Voitcus

2
Bir çalışma keman sizin için
Voitcus

1
@Voitcus yardımlarınız için teşekkürler!
jrenk

1
2 bayt daha tasarruf edebilirsiniz (PHP 7'de 3 bayt): 3v4l.org/fU11Y
axiac

5

Julia, 33 20 bayt

t->watch_file(".",t)

İşlev imzasındaki değişiklikler nedeniyle yalnızca Julia v0.4'te çalışır watch_file. t(Ab) öğesinde zaman aşımı parametresini kullanan tek bir parametreli anonim bir işlev tanımlar .watch_file işlevinde .

Bu ödül için bir aday!

Julia REPL'i kullanarak gösteri:

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

Önceki cevap (33 bytes)

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

4

R, 48 bayt

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

gösteri:

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=Bayt sayısına eklemeniz gerektiğini düşünmüyorum , fonksiyon snippet'leri gayet iyi.
Solomon Ucko

4

PHP, 39 bayt

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

(Not tam programı argümanlar yararlanarak gerekirse Aslında bu kısa alabilirsiniz komut satırında geçti. Aşağı için 35 )

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

Test için kullanılan program:

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

Sonuçlar:

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

görüntü tanımını buraya girin


Ödül için kalifiye olmama rağmen, diğer bazı girişimlerle yarışmakta zorlanıyorum!


Evet, bayt sayınız gayet iyi
Beta Çürümesi

4

Windows CMD, 22 bayt

ping -w 1000 -n %1 1.1

Bu döngü kullanmaz (label ve goto) bu nedenle ödül kazanır

tPings'i 1.0.0.1'e (geçersiz) gönderir ve 1000 msn yanıt bekler


3

JavaScript ES6, 40 bayt

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

Aşağıdakilerle test edilmiştir:

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

Ne yaptığını açıklayabilir misin elapsed(STOP, t)? DURDUR ve geçen nedir?
Beta Çürüğü

elapsedilk argüman STOPolan sırayla sadece ilk kod parçacığının çalıştırıldığı ilk argümanın aldığı süreyi ölçer . Geçen ikinci argüman iletilen argümandır STOP.
Dendrobium

3

TI-BASIC (84 + SE), 21 bayt

Giriş yöntemi: T:prgmT. Bu, TI-BASIC’teki bir fonksiyonun en yakın karşılığıdır. Programı:

For(A,1,841Ans
End

Tüm doğruluk deneme yanılma yoluyla kazanılır; Bir kronometre ile zamanlama, verilen test durumlarının tamamının saniyenin yirmi saniyesinde gerçekleşir.

Cihaz bilgisi:

RAM FREE   23312
ARC FREE  889802


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

W00T bir ödül için uygun!


1
Biliyor muydunuz: hesap makinenizin For(döngü hızları kaç harf değişkeninin bulunduğuna bağlı mı? Daha fazla değişken KDV'yi tıkar ve zamanınızın% 20'sini alabilir. Sistem değişkenleri (örneğin n , Xmin) bağışıklık bulunmaktadır.
lirtosiast

@ThomasKwa Huh! İlginç. Dosyaları aktarmak için zamanım olduğunda temiz bir hesap makinesiyle yeniden kalibre edeceğim.
Conor O'Brien,

2

Python, 57 bayt

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

Çağrı fonksiyonu y()


2

PureBasic, 92 bayt

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

Aklıma gelen en kısa şey. Bunun en uzun süre olacağından şüpheliyim ...

Test etmek için:

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

2

PowerShell, 75 bayt

Uzun, açıklayıcı prosedür çağrıları. Bir dilde netlik için Yay. :)

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

Bir program içinde gibi bir şey denir

Get-Date
w(15)
Get-Date

Alternatif olarak, bunun yerine harici programların çağrılmasına izin verilirse , aşağıdakileri kullanarak 59 Bayta ulaşabiliriz:

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

Bu, bir program içinde şu şekilde çağrılır (yukarıdakilerin "wait-function.ps1" olarak kaydedildiğini ve aynı klasöre kaydedildiğini varsayarsak):

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

Fonksiyonu / programı yazarken kaydettiğimiz şey, gerçekte onu gerçekleştirmek için gereken fazlalık yüzünden engellenmekten daha fazlasıdır. Le sigh


2

Python, 66 bayt

Unutmayın, benim uygulama ne dahili bir zaman fonksiyonu çağırıyor ne de zamanlama özelliğini kullanıyor.

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

Ve evet, lütuf için uygun.


Hayır, bu geçersiz: Herhangi bir yerleşik bekleme işlevini veya herhangi bir yerleşik işlevi belirli bir süre sonra kod yürütmek için kullanmamalısınız
Beta Decay

@BetaDecay: Anladığım kadarıyla, Queue (). Get bir "belirli bir süre sonra kod yürütmek için yerleşik fonksiyonlar" değildir. Lütfen bunun neden bir neden olduğunu açıklayın.
Abhijit

Diğer birçok cevap, başka şeyler için zaman aşımını kullanan kodlara sahiptir, bu yüzden bu da iyi olmalı.
Solomon Ucko


2

Pyth, 19 bayt

Geç giriş ancak .d0dün gece doktora bulduktan sonra bırakmaya karar verdim.

DCNK.d0W<-.d0KNJ1))

Geçen süre Nsaniye olana kadar döngü yapan bir işlevi tanımlar .

Burada dene .


Güzel. Ben de aldım DCNJ+.dZN#Ig.dZJB)), ki bu da 19 bayttır.
hakr14

2

RProgN 2,13 bayt

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

Açıklaması

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

Ödül, özellikle "ne kadar zaman geçtiğini kontrol eden bir döngü kullanmadan" diyor. . Bu bir hedef zaman belirler ve o hedef zamanın geçip geçmediğini kontrol etmeye devam eder, böylece ödül için uygun olur.

Çevrimiçi deneyin!


1

Tcl , 53 bayt

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

Çevrimiçi deneyin!

Açıklaması

Komut kaçan 1. parantez ile her döngüde ve sadece bir kez yorumlanmadan clock millisecondsdüşürülebilir clock mil. Milisaniyeyi ölçtüğü için, 1 Byte tasarrufu sağlayan 1000 veya 1e3 ile çarpmamız gerekir.


1

C # (Visual C # Etkileşimli Derleyici) + /u:System.Threading, 36 bayt

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

Çevrimiçi deneyin!

Kapasitesi olmayan bir semafor oluşturur ve belirtilen saniye boyunca almaya çalışır.

Burada bir şeyi beklettiğimin farkındayım. Bana göre bu daha ziyade ping / zaman aşımı çözümüne benziyor Thread.Sleep. Kod, alamadığı bir kaynağı almaya çalışır ve bir sınırdan sonra denemeyi durdurur.

===

Aşağıda Tasksonsuz bir döngü ile başlayan , sonra zaman aşımı ile tamamlanmasını bekleyen bir varyasyon vardır . Gerekli tüm ad alanları varsayılan olarak dahil edilmiştir, ancak çözüm yukarıdakilerden birkaç bayt daha uzundur.

C # (Visual C # Etkileşimli Derleyici) , 40 bayt

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

Çevrimiçi deneyin!


0

05AB1E , 22 bayt

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

Çevrimiçi deneyin.

NOT: Mevcut saniyedeki kaç mikrosaniyenin geçtiğine bağlı olarak tolerans 0,1 saniyeden biraz daha büyük olabilir. Ancak cevapların neredeyse yarısı benzer sorunlara sahip olduğundan, buna izin verildiğini düşündüm.

Açıklama:

05AB1E şu an için herhangi bir yerleşik yapıya sahip değil. Bununla birlikte, mevcut yıl / ay / gün / saat / dakika / saniye / mikrosaniye için ayrı yerleşikler olarak bir yerleşik yapıya sahiptir. Yalnızca saniye kullanmak, potansiyel olarak 59'dan 0'a kadar sarılabilir, çünkü sorunlara neden olabilir, kodları kodlamayan dillerdeki maalesef çoğu cevaptan daha uzun yapmak için hem dakikalara hem de saniyelere ihtiyacım var.

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

INPUT T
DIALOG"",,,T

TSaniyeler sonra otomatik olarak kapanan bir iletişim kutusu açar . Bunun bir "yerleşik bekleme işlevi" olarak sayıldığından emin değilim, ancak bunun kullanmak kadar geçerli olduğunu düşünüyorumping .

Kesinlikle aldatma olmayan alternatif bir 37 baytlık program:

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

Ekran solma renginin Tsaniyeler içinde yavaş yavaş 0 (alfa = 0, kırmızı = 0, yeşil = 0, mavi = 0) (efekt yok) değişmesine neden olur ve ardından bu animasyonun bitmesini bekler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.