Desafio
Escreva uma função que aceite um parâmetro: um número inteiro t
. Sua função precisa interromper o programa por t
segundos antes de continuar, semelhante ao time.sleep(t)
Python e WAIT t
ao BBC BASIC.
Você não deve usar nenhuma função incorporada em espera ou executada para executar código após um certo tempo, e seu programa deve continuar após t
segundos.
Para testar sua função, há tolerância de 0,1 segundos a mais ou a menos do que a fornecida t
em sua própria máquina: as variações entre os computadores são boas.
Se a sua resposta é desafiado por qualquer pessoa, você deve fornecer prova fotográfica (screenshotted) que a sua função funciona corretamente para t=1
, t=5
e t=25
. Você também pode fornecer os detalhes do seu computador para que as pessoas possam tentar replicá-lo em sua própria máquina.
Seu programa deve e será executado em um computador cuja velocidade de clock seja de 1,6 GHz ou superior.
Ganhando
O programa mais curto vence.
Recompensa
Uma recompensa vai para o programa mais curto que interrompe o programa sem usar um loop para verificar quanto tempo se passou. Se você está concorrendo a essa recompensa, adicione uma nota de rodapé dizendo que sua resposta é para a recompensa.
Entre os melhores
/* 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
exemplo são uma referência ao programa de TV Sherlock ou estou lendo muito sobre isso?Respostas:
código de máquina x86_64, 10 bytes
Hexdump do código:
Código fonte (pode ser montado pelo
ml64
Visual Studio):Executa um loop vazio, iniciando do valor especificado até 0. Escolhi o multiplicador 945421514 empiricamente por tentativa e erro, até que meu programa de teste produza resultados satisfatórios.
Programa de teste (aguarda 10 vezes por cada uma das durações 1, 5 e 25 segundos):
O resultado:
Eu executei este programa em um computador Windows que não tem mais nada para fazer. Se ele executa alguns aplicativos, os tempos de espera são mais irregulares.
A velocidade da CPU é de 3,9 GHz. Parece que esse código é mal bom o suficiente para a tecnologia atual do PC - se a frequência do relógio for de 8,8 GHz, o multiplicador não se ajustará a um int assinado de 32 bits.
PS Como essa resposta não verifica quanto tempo se passou, ela é candidata à recompensa.
fonte
Bash,
2925242319 bytesTeste de precisão (
time
) em que$1
= 1 segundo:Obrigado Dennis por reduzir a contagem de bytes para 19 a partir de 23!
EDIT : Eu mudei o IP para evitar
ping
ping no Linux 0.0.0.0, que é o dispositivo de loopback.Como isso funciona
ping
tem um tempo limite padrão de 1 segundo; portanto, ao entrar em contato com um endereço IP que não existe, o ping não pode continuar até que o tempo limite se esgote ou que tenha recebido uma resposta do IP.-t
dizping
que tentar$1
várias vezes sobre este endereço IP falso, forçandoping
a tomar$1
segundos para completar o ping.É elegível para a recompensa! No loop!
fonte
w()(ping -t$1 0.0)
(Devemos ter diferentesping
s; mina requer-w$1
e obtém uma resposta do localhost.)/dev/lo
w 10
, eu10.02 sec real
usotime
.w()(ping -w$1 1.2)
Funciona como um encanto.Matlab, 33 bytes
Ou você também pode usar isso no Octave: experimente on-line
Matlab, 31 bytes
Como sugerido por @flawr , isso pode ser feito com uma função anônima (deve ser atribuído um nome para usá-lo):
Exemplo:
fonte
@(t)eval('tic;while toc<t,end')
eval
para empacotar várias instruções em uma função anônima. Obrigado!bsxfun
.t
variável dentro de avaliação.Java,
6362 bytesNada de surpreendente - basta pegar o número de nanossegundos desde 1/1/1970 várias vezes e verificar se um segundo se passou.
Economizou 1 byte graças a Ypnypn e aditsu.
fonte
for(long a=System.nanoTime();System.nanoTime()-a<t*1E9;);
t->
?Lote, 27 bytes
Um truque popular de lote, pois o lote não tinha uma função de suspensão.
Nenhum loop, portanto, a recompensa é elegível
fonte
set/ac=%1+1
economiza 2 bytes.Commodore 64 BASIC, 19
16bytesCom uma chamada
N=<number-of-secods>:GOSUB1000
.No entanto, não posso fornecer precisão suficiente. Como o C64 tinha cerca de 1 MHz de velocidade da CPU, lembro que era bom o suficiente para fazer um vazio
FOR
-NEXT
ciclo 1000 vezes de modo que era sobre 1 segundo.De fato, havia duas versões principais da máquina: PAL 0,985 MHz e NTSC 1,023 MHz (todos os dados da página C64 da Wikipedia) ). Como eu tinha a versão NTSC, era necessário executar o loop cerca de 930 vezes.
Testes com o seguinte programa (
N
segundos, fornecidos pelo usuário emINPUT
):onde
TI$
é uma variável do sistema contendo string (hhmmss
formato) com o tempo decorrido desde a última redefinição (precisão de 1 segundo, mas também dependendo da velocidade da CPU, portanto, isso não é muito relevante, porque é o mesmo relógio).Captura de tela feita com o emulador C64 on-line http://codeazur.com.br/stuff/fc64_final/ .
Este programa (
1000
somente linha ) ocupa1619 bytes na memória, conforme testadoPRINT FRE(0)+65535
antes de digitar o código (38908 bytes) e depois (3889338889 bytes).PRINT FRE(0)
retorna memória livre para o programa BASIC (é um valor negativo e uma constante65535
deve ser adicionada, mas na verdade não importa).Como este programa não testa o tempo decorrido em um loop, ele se qualifica para receber uma recompensa.
fonte
TI$
precisão da variável e foi de cerca de 1 segundo por ca. 2 horas de diferença com o relógio de referência (fora de C64), portanto a precisão é suficiente. O que eu tenho certeza é o valor950
, no entanto, seria qualquer outro valor <1000 (que estou certo), ainda é a mesma quantidade de bytesJ
variável deve, de alguma forma, fazer parte do código real, não parte do programa de teste - portanto, esperaria N segundos, não apenas 1 segundo. Mas não sei como integrá-lo à sintaxe do BASIC.1000 FOR I=1 TO N:FOR I=1 TO 950:NEXT I:NEXTJ:RETURN
com uma chamada, por exemplo.200 N=5:GOSUB 1000
. Também notei que o OP exigia uma função . Vou tentar consertarGOSUB
-RETURN
statement, pois não há funções no BASICDEF FN
na BBC BASIC?JavaScript ES6,
504540 bytesisso usa funções de execução automática, não sei por que
+new Date
não está funcionando.Uso
Eu testei isso com o Safari Nightly, mas também funcionará no Firefox. Testado com:
Você pode executá-lo colocando-o entre parênteses:
Ou nomeando-o:
Explicação
Aqui está a principal lógica por trás do programa:
A versão que estou usando usa a mesma lógica:
fonte
CJam, 15
Este é um bloco que pode ser executado ou armazenado em uma variável (tornando-se uma função nomeada). Dennis e Mr Consensus concordam que contar apenas o bloco é aceitável :)
Explicação:
Experimente online
fonte
JavaScript,
68 54 5142Eu acho que nenhuma captura de tela é necessária. Mas suspeito que você possa jogar golfe ainda mais ...
Nova versão: agora finalmente consegui evitar
new
e usarDate
duas vezes:Versões mais antigas:
fonte
PHP,
1711778479656462 bytesUso:
Chame a função da seguinte maneira:
php -d error_reporting=0 -r "require 'script.php'; a(5);echo 'Hello, World!';"
Onde 5 é o tempo em segundos que o programa deve esperar antes de ecoar "Olá, Mundo!".
Explicação:
Inicialmente, a função obtém o tempo atual em milissegundos. Então a função faz um loop até que o tempo atual seja menor que a primeira vez + a entrada. Depois "Olá Mundo!" recebe eco.
Log:
Economizado 113 bytes graças ao Voitcus
Economizado 2 bytes graças ao axiac
fonte
$get_as_float
parâmetro. Também remover$t
,$s
- você não precisa deles (ver o meu código)echo 1e6;
trabalho. Mas sim - ficando como float é o número de segundos, por isso$e=microtime(1)+$i;
seria o suficienteJulia,
3320 bytesSó funciona na Julia v0.4 devido a alterações na assinatura da função de
watch_file
. Define uma função anônima com um único parâmetrot
que (ab) usa o parâmetro timeout nowatch_file
função.Este é um candidato à recompensa!
Demonstração usando o Julia REPL:
Resposta anterior (33 bytes), também trabalhando em Julia stable
fonte
R, 48 bytes
Demonstração:
fonte
f=
na contagem de bytes, os trechos de função estão corretos.PHP, 39 bytes
(Observe que, na verdade, posso diminuir isso se um programa completo for necessário, aproveitando os argumentos passados na linha de comando. Abaixo de 35 )
Programa usado para teste:
Resultados:
Apesar de me qualificar para a recompensa, dificilmente concordo com algumas das outras entradas!
fonte
Windows CMD, 22 bytes
Isso não usa loop (label e goto), portanto, qualifica-se para a recompensa
Ele envia
t
pings para 1.0.0.1 (inválido) e aguarda uma resposta por 1000 msfonte
JavaScript ES6, 40 bytes
Testado com o seguinte:
fonte
elapsed(STOP, t)
faz? O que são STOP e decorridos?elapsed
mede o tempo que levou o primeiro argumento a ser executado, neste casoSTOP
, que, por sua vez, é apenas o primeiro trecho de código. O segundo argumento decorrido é o argumento passado paraSTOP
.TI-BASIC (84 + SE), 21 bytes
Método de entrada:
T:prgmT
. Este é o equivalente mais próximo de uma função no TI-BASIC. Programa:Toda a precisão é obtida através de tentativa e erro; cronometrando-o com um cronômetro funciona para todos os casos de teste fornecidos dentro de um vigésimo de segundo.
Informação de dispositivo:
W00T elegível para uma recompensa!
fonte
For(
loops da sua calculadora depende de quantas variáveis de letras existem? Mais variáveis obstruem o IVA e podem levar até 20% do seu tempo. Variáveis do sistema (por exemplo , nXmin
) são imunes.Python, 57 bytes
Função de chamada
y()
fonte
PureBasic, 92 bytes
É o mais curto que consigo pensar. Eu suspeito que este será o mais longo aqui também ...
Testar:
fonte
PowerShell, 75 bytes
Chamadas de procedimento longas e descritivas. Yay para maior clareza em um idioma. :)
Chamado dentro de um programa com algo como
Como alternativa, se for permitido chamar programas externos, podemos reduzir para 59 bytes com o seguinte:
Isso seria chamado dentro de um programa da seguinte maneira (presumindo que o acima foi salvo como "wait-function.ps1" e salvo na mesma pasta):
O que economizamos ao escrever a função / programa é mais do que prejudicado pelo excesso necessário para realmente executá-la. Le suspiro.
fonte
Python, 66 bytes
Observe que minha implementação nem chama uma função de tempo embutida nem usa o recurso de agendamento.
E sim, é elegível para recompensa.
fonte
Hassium, 55 Bytes
Run and see expanded: http://HassiumLang.com/Hassium/index.php?code=9f4e2bdb292b14b150fba63677a11a79
fonte
Pyth, 19 bytes
Late entry but after finding
.d0
in the docs last night I decided to give it a go.Defines a function which loops until the time elapsed is
N
seconds.Try it here.
fonte
DCNJ+.dZN#Ig.dZJB))
, which is also 19 bytes.RProgN 2, 13 bytes
Explained
The bounty specifically says "without using a loop checking how much time has elapsed", which this does not do. This sets a target time, and keeps checking if it's passed that target time, thus it's eligible for the bounty.
Try it online!
fonte
Tcl, 53 bytes
Try it online!
Explained
Command
clock milliseconds
can be reduced toclock mil
, with escaped 1st bracket, it'll be interpreted at each loop, and w/o just once. As it measures milliseconds, we need to multpily by 1000 or 1e3 which saves 1 Byte.fonte
C# (Visual C# Interactive Compiler) + /u:System.Threading, 36 bytes
Try it online!
Creates a semaphore with no capacity and tries to get it for the specified number of seconds.
I realize I am "wait"ing on something here. To me this seems more like the ping/timeout solution as opposed to
Thread.Sleep
. The code tries to get a resource that it cannot get and stops trying after a limit.===
Below is a variation that starts a
Task
with an infinite loop, then waits for it to complete with a timeout. All required namespaces are included by default, but the solution is a few bytes longer than the one above.C# (Visual C# Interactive Compiler), 40 bytes
Try it online!
fonte
05AB1E, 22 bytes
Try it online.
NOTE: Depending on how many microseconds in the current second have already passed, the tolerance might be slightly larger than 0.1 sec. But since almost halve the answers have similar issues, I figured it's allowed.
Explanation:
05AB1E doesn't have any builtins for the current time. It does however have a builtin for the current year/month/day/hours/minutes/seconds/microseconds as separated builtins. Since only using seconds can potentially wrap around from 59 to 0 causing issues, I need both the minutes and seconds, making the code even longer than most answers in non-codegolfing languages unfortunately.
fonte
SmileBASIC, 20 bytes
Opens a dialog box that closes automatically after
T
seconds. I'm not sure if this counts as a "built in waiting function", but I think this is just as valid as usingping
.An alternative 37-byte program which definitely isn't cheating:
Causes the screen fade color to change to 0 (alpha=0,red=0,green=0,blue=0) (no effect) gradually over
T
seconds, then waits for that animation to finish.fonte