Tempo necessário para imprimir números


21

Sumário

Escreva um programa ou função que não receba nenhuma entrada e envie todos os números inteiros, entre -1000 e 1000 em ordem crescente, para o stdout, um por linha, como este:

-1000
-999
-998
-997
...

E depois disso, você precisa imprimir o tempo necessário para imprimir esses números ou o tempo desde o início da execução do programa em milissegundos (se necessário, também pode conter outras coisas, por exemplo: tempo gasto: xxxms está ok). Pode ser um número flutuante ou um número inteiro (se você imprimir um número inteiro, precisará arredondar para o mais próximo).

Código de exemplo

using System;
using System.Diagnostics;
class P
{
    static void Main(string[] args)
    {
        Stopwatch st = Stopwatch.StartNew();
        for (int i = -1000; i <= 1000; i++)
        {
            Console.WriteLine(i);
        }
        Console.WriteLine(st.ElapsedMilliseconds);      
    }
}

Restrições

Não são permitidas brechas padrão

Outras informações

É código de golfe, então a finalização mais curta vence.


@GurupadMamadapur Não, desculpe
Horváth Dávid

Por quê? Eu acho que, essencialmente, para imprimir esses números, todas as declarações estão envolvidas desde o início do programa, certo?
Gurupad Mamadapur

11
@GurupadMamadapur Ok, você está certo, vou editar a pergunta de acordo.
Horváth Dávid

O programa pode esperar uma certa quantidade de tempo desde o início e imprimir essa quantidade?
Xnor

@ xnor Eu acho que isso mudaria o desafio e, como já existem muitas respostas para o desafio original, eu diria que não.
Horváth Dávid

Respostas:


9

MATL , 13 bytes

1e3t_y&:!DZ`*

Experimente online!

       % Implicitly start timer
1e3    % Push 1000
       % STACK: 1000
t_     % Duplicate, negate
       % STACK: 1000, -1000
y      % Duplicate second-top number
       % STACK: 1000, -1000, 1000
&:     % Two-input range
       % STACK: 1000, [-1000, 999, ..., 1000]
!      % Transpose into column vector
       % STACK: 1000, [-1000; 999; ...; 1000]
D      % Display
       % STACK: 1000
Z`     % Push timer value, say t
       % STACK: 1000, t
*      % Multiply
       % STACK: 1000*t
       % Implicitly display

2
Muito agradável! Inteligente para implementar: Implicitly start timer. Isso aconteceu desde o primeiro dia ou é o resultado de um desafio anterior?
Stewie Griffin

@StewieGriffin Não desde o primeiro dia. Eu adicionei- em 13 Jul 2016 , provavelmente depois ter que intiallize explicitamente em um par de desafios
Luis Mendo

9

Oitava, 46 43 36 30 23 bytes

tic;(-1e3:1e3)',toc*1e3

Isso imprimirá:

ans =

  -1000
   -999
   -998
   -997
   -996
   -995

Se você não gostar do ans =, precisamos adicionar 6 bytes adicionais para disp:

tic;disp((-1e3:1e3)'),toc*1e3

Economizou muitos bytes graças a alguns lembretes de rahnema1.

Explicação:

tic;                              % Starts timer
         (-1e3:1e3)'              % A vertical vector -1000 ... 1000
    disp((-1e3:1e3)'),            % Display this vector
                      toc*1e3     % Stop the timer and output the time in milliseconds

8

JavaScript, 60 bytes

(c=console).time();for(i=~1e3;i++<1e3;c.log(i));c.timeEnd();

Para obter todos os eventos registrados, você deve usar o script no console do desenvolvedor (caso contrário, os logs serão apagados após uma certa quantidade deles).


i=~1e3salvar um byte :-)
ETHproductions

7

CJam , 18 bytes

es2001{1e3-n}/es\-

Experimente online!

Como funciona

es                  Push the current time (milliseconds since epoch) on the stack.
  2001{     }/      For each integer X from 0 to 2000:
       1e3-           Subtract 1000 from X.
           n          Print with a newline.
              es    Push the current time on the stack.
                \-  Swap and subtract.

7

Python 3.5, 80 77 73 bytes

import time
*map(print,range(-1000,1001)),
print(time.process_time()*1e3)

As soluções anteriores envolviam o uso de timeite time.time()eram maiores.

Infelizmente, time.process_time()foi introduzido no python 3.3.

Agradecimentos a Dennis por salvar 4 bytes!


5

Bash (+ coreutils), 41, 49., 46., 44, 42 bytes

EDITAS:

  • Refatorado para usar o Bash-builtin (time), para tratar de questões de precisão do @Dennis;
  • Reduzido em 3 bytes, utilizando o Bash 4+ |&para redirecionamento stderr;
  • Economizou mais 2 bytes substituindo seq -1000 1000por seq -1e3 1e3(Thanks @Dennis!);
  • -2 bytes removendo a barra invertida desnecessária e usando a precisão padrão (Thx @Dennis!).

Golfe

TIMEFORMAT=%R*1000;(time seq -1e3 1e3)|&bc

Experimente Online!

Nota

O uso do utilitário coreutils "time", em vez do built-in Bash, resulta em uma 41, Solução de 35 bytes:

\time -f "%e*1000" seq -1e3 1e3|&bc

"\" está aqui para fazer com que o bash chame o comando real, em vez do incorporado.

Infelizmente, a precisão do tempo do coreutils é de apenas 1 / 100s, o que levantou preocupações sobre se é uma solução válida.


4

R, 42 bytes

system.time(cat(-1e3:1e3,sep="\n"))[3]*1e3

Isso imprimirá

.
.
.
998
999
1000
elapsed 
     60 

Para remover elapsed, são necessários dois bytes adicionais:

system.time(cat(-1e3:1e3,sep="\n"))[[3]]*1e3

4

Utilitários Bash + GNU, 43

  • Guardado 2 bytes graças a @Dennis
  • Guardado 5 bytes graças a @zeppelin
c=date\ +%s%3N
s=`$c`
seq -1e3 1e3
$c-$s|bc

O datecomando fornece o número de segundos desde a época concatenada com os nanossegundos atuais. Este comando é executado antes e depois. bcpega a diferença e imprime.

Experimente online .


Eu esperava fazer isso por 17 anos:

time seq -1e3 1e3

Mas a produção de tempo oferece mais do que precisamos:

real    0m0.004s
user    0m0.000s
sys 0m0.004s

11
Você pode salvar dois bytes substituindo 1000por 1e3.
Dennis

"Mas a produção do tempo dá ..." ... talvez você devesse se divertir.
H Walters

11
Provavelmente, você pode economizar alguns bytes, capturando a data com precisão ms diretamente, como este: date +%s%3N.
Zeppelin

4

JavaScript (ES6), 63 59 bytes

for(c=console.log,i=~1e3;i<1e3;c(++i));c(performance.now())


Agradável. Você pode salvar três bytes removendo o espaço new (d=Date)e começando em -1000:for(t=new(d=Date),c=console.log,i=~1e3;i<1e3;c(++i));c(new d-t)
ETHproductions

Obrigado @ETHproductions :) ~1e3é um ótimo toque.
George Reith 14/01

11
No fragmento, a saída é apenas 952para 1000por que é isso?
Gurupad Mamadapur

@GurupadMamadapur A saída do trecho é limitada a 50 linhas. (Ou mais precisamente: as 50 últimas linhas.)
Arnauld

11
@IsmaelMiguel Amazing não sabia performance.now()ou a Performanceinterface era
George Reith

3

R, 66 bytes

x=proc.time();for(i in -1e3:1e3)cat(i,"\n");(proc.time()-x)[3]*1e3

Provavelmente não é o mais curto, mas funciona.


Pode proc.timeser armazenado em uma variável? t=proc.time;x=t(); ...
Annan

3

Mathematica, 51 bytes

p[1*^3#]&@@AbsoluteTiming@Array[p=Print,2001,-1*^3]

Explicação

Array[p=Print,2001,-1*^3]

Armazenar a Printfunção p. Imprima os números de 2001, começando em -1000, aumentando em 1.

AbsoluteTiming@ ...

Encontre o tempo total decorrido em segundos.

p[1*^3#]&@@ ...

Multiplique isso por 1000 (segundos -> milissegundos) e p( Print).


Argh, você me venceu por 3 minutos! :) Tem certeza de que Timingtambém não satisfaz a descrição do problema (um pouco vaga) AbsoluteTiming?
Greg Martin

2
O @GregMartin Timinggera o tempo da CPU e não inclui o tempo gasto pelo front-end. Isso é. o tempo gasto para incrementar o contador Arrayé contado, mas o tempo gasto para exibir esses números na tela não é contado. Este efeito pode ser visto neste exemplo simples: Timing@Print@3dá 0 segundos, mas AbsoluteTiming@Print@3não.
JungHwan Min

3

PHP, 110 70 bytes

ainda um pouco longo; mas salvou 38 com a dica de AlexHowansky e mais dois com 1e3e ~1e3.

for($t=($m=microtime)($i=~1e3);$i++<1e3;)echo"$i
";echo($m(1)-$t)*1e3;

impressões flutuam. Corra com -r.


2
Você pode passar um valor verdadeiro para microtime () e ele retornará um float diretamente, não sendo necessário adicionar as strings.
Alex Howansky

-30% com essa dica. Eu gostaria de poder fazer dez votos positivos no seu comentário. : D
Tito

É triste como o PHP não tem algo que retorne o tempo em milissegundos. Como Javascript tem. Não posso sugerir melhorias. É o menor possível. Bem feito!
Ismael Miguel

@IsmaelMiguel Acho que o JavaScript não tem microssegundos. :)
Tito

@Titus O que eu quis dizer é que as datas do Javascript são todas tratadas em milissegundos, enquanto o PHP possui apenas segundos ou microssegundos.
Ismael Miguel

3

Powershell, 27 bytes

$1=date;-1e3..1e3;(date)-$1

Agradecemos a AdmBorkBork por apontar que a saída padrão detalhada é aceitável no desafio.

As saídas resultam como:

994
995
996
997
998
999
1000

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 5
Milliseconds      : 679
Ticks             : 56799255
TotalDays         : 6.57398784722222E-05
TotalHours        : 0.00157775708333333
TotalMinutes      : 0.094665425
TotalSeconds      : 5.6799255
TotalMilliseconds : 5679.9255

para obter resultados mais contidos em apenas milissegundos, use a resposta original:

$1=date;-1e3..1e3;((date)-$1).TotalMilliseconds

Economize tempo antes como US $ 1, imprima no stdout automaticamente e obtenha o tempo entre o início e o final da execução.


Você pode simplesmente canalizar o intervalo para oh( Out-Host), que ignorará o fato de que Measure-Commandcaptura o pipeline. Exemplo no TIO
AdmBorkBork 19/01

@AdmBorkBork o ponto era que eu não acho que ele salvará bytes, a menos que eu esteja perdendo alguma coisa.
colsw

Measure-Command{-1e3..1e3|oh}tem 29 bytes. Claro, ele imprime coisas extras graças ao Measure-Command, mas o desafio afirma explicitamente que não há problema.
precisa saber é o seguinte

Na verdade, perdeu o ponto em que você pode imprimir outros dados, o criador do desafio pode precisar dizer se a saída muito detalhada do Measure-Command é aceitável. Também $1=date;-1e3..1e3;(date)-$1é de 2 bytes menor do que a opção medida de comando lá,
colsw

Ah, certo, haha. Bom golfe.
AdmBorkBork

2

Perl 6 , 45 bytes

.put for -($_=1e3)..$_;put (now -INIT now)*$_

Tente

Expandido:

# print the values

.put             # print with trailing newline ( method call on 「$_」 )

for              # for each of the following
                 # ( temporarily sets 「$_」 to the value )

-(
  $_ = 1e3       # store 「Num(1000)」 in 「$_」
)
..               # inclusive Range object
$_;

# print the time elapsed

put              # print with trailing newline

(now - INIT now) # Duration object that numifies to elapsed seconds
* $_             # times 1000 to bring it to milliseconds

# The 「INIT」 phaser runs code (the second 「now」) immediately
# as the program starts.

# There is no otherwise unrelated set-up in this code so this is a
# reliable indicator of the amount of time it takes to print the values.

2

J , 22 bytes

1e3*timex'echo,.i:1e3'

Experimente online!

timexé um builtin que executa a string e retorna o tempo necessário para avaliá-la em segundos. A string forma o intervalo [-1000, 1000] usando i:, depois o columiniza usando ,.e imprime usando o built-in echo.


2

Pitão , 18 15 14 bytes

j}_J^T3J;*.d1J

Experimente aqui!

Explicação

Isso é semelhante à minha resposta em python.

    J ^ T3 Defina J como 1000
  } _ J Lista variando de -1000 a 1000
j Entre na lista com novas linhas e imprima-a implicitamente
         ; *. d1J Tempo de impressão desde a execução do programa em milissegundos

Edições :


Eu tentei isso, 14 bytes, não tenho certeza se funciona corretamente. Você precisa adicionar uma nova linha no início do programa. pyth.herokuapp.com/?code=%0AM%7D_J%5ET3J%2a.d1J&debug=0
busukxuan

2

Noodel , 17 13 bytes

13 bytes

Tentei uma abordagem um pouco diferente e economizou 4 bytes.

ƇQjȥḶGQɱ⁻Ñ€Ƈ⁻

Tente:)

Como funciona

Ƈ             # Pushes on the amount of milliseconds passed since 01/01/1970.

 Qjȥ          # Pushes 2001 onto the stack.
 Qj           # Pushes on the string "Qj"
   ȥ          # Converts the string into a number as base 98.

    ḶGQɱ⁻Ñ€   # Loops 2001 times printing -1000 to 1000.
    Ḷ         # Consumes the 2001 and loops the following code 2001 times.
     GQ       # Pushes on the string "GQ"
       ɱ      # Pushes on the current counter of the loop (i)
        ⁻     # Subtracts (i - "GQ") since i is a number, the "GQ" is converted to a number which will fail.
              # So, Noodel will treat the string as a base 98 number producing (i - 1000). 
         Ñ    # Consume what is on the top of the stack pushing it to the screen followed by a new line.
          €   # The end of the loop.

           Ƈ⁻ # Calculates the duration of execution.
           Ƈ  # Pushes on the amount of milliseconds passed since 01/01/1970.
            ⁻ # Pushes on (end - start)

17 bytes

ƇGQȥḋɲṡ×2Ḷñ⁺1€ÑƇ⁻

Tente:)

Como funciona

Ƈ                 # Pushes on the amount of milliseconds passed since 01/01/1970.

 GQȥḋɲṡ×2         # Used to create the range of numbers to be printed.
 GQ               # Pushes on the string "GQ".
   ȥ              # Converts the string into number as if it were a base 98 number. (which is 1000)
    ḋ             # Duplicates the number and pushes it onto the stack. 
     ɲ            # Since the item on top is already a number, makes the number negative (random thing I threw in at the very beginning when made the langauge and totally forgot it was there)
      ṡ           # Swaps the first two items on the stack placing 1000 on top.
       ×2         # Doubles 1000 producing... 2000

         Ḷñ⁺1€Ñ   # Prints all of the numbers from -1000 to 1000.
         Ḷ        # Consumes the 2000 to loop the following code that many times (now -1000 is on the top).
          ñ       # Prints the value on top of the stack followed by a new line.
           ⁺1     # Increment the value on top of the stack by 1.
             €    # End of the loop.
              Ñ   # Since 1000 is still not printed, this consumes 1000 and prints it followed by a new line.

               Ƈ⁻ # Calculates the number of milliseconds to execute program.
               Ƈ  # Pushes on the amount of milliseconds passed since 01/01/1970.
                ⁻ # Pushes on (end - start) in milliseconds.
                  # At the end, the top of the stack is pushed to the screen.

O snippet usa os valores de -4 a 4 para não demorar muito para ser concluído.

<div id="noodel" code="ƇFȥḶAɱ⁻Ñ€Ƈ⁻" input="" cols="10" rows="10"></div>

<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


Você criou esse idioma antes ou depois do desafio?
Rɪᴋᴇʀ

@EasterlyIrk, before :)
tkellehe

2

TI-Basic, 22 bytes

startTmr
For(A,-ᴇ3,ᴇ3
Disp A
End
startTmr-Ans
  • Muitos comandos são representados por tokens de 1 ou 2 bytes.

  • Testado em um TI-84 CSE emulado.


2

Matlab, 16 23 bytes

tic;(-1e3:1e3)'
toc*1e3

Edit: eu percebi que estava violando várias regras deste desafio. Isso vai me ensinar a ler o desafio tarde da noite. Agora também percebo que a resposta corrigida é quase idêntica à solução Octave, mas essa é a vida.

Imprime cada elemento na matriz de espaço linear criada -1000: 1000 (a falta de; imprime no console).

tic / toc registra a hora e toc imprime a hora no console com ou sem o; . 1e3 é necessário para imprimir em milissegundos.


Muito bem, uma solução correta foi editada.
Owen Morgan


2

8o , 61 47 bytes

Agradecimentos a 8th_dev pela melhoria agradável (economizado 14 bytes)

d:msec ( . cr ) -1000 1000 loop d:msec swap - .

Isso imprimirá todos os números inteiros entre -1000 e 1000 em ordem crescente e o tempo gasto (em milissegundos) para imprimir esses números

-1000
-999
-998
-997
...
997
998
999
1000
4

11
Note-se que sugerir edições para melhorar o código é qualificado como "destrutivo". Sugestões para jogar golfe devem ser fornecidas como um comentário. Eu faria ping no usuário que o fazia se pudesse, mas não posso. Meta.codegolf.stackexchange.com/q/1615/34718
mbomb007

11
Sei que você o aprovou, o que é bom, já que é sua própria postagem, mas outros revisores da fila de revisão devem rejeitá-lo e o usuário que sugeriu a edição em primeiro lugar não deveria.
mbomb007

@ mbomb007 - Obrigado por me informar isso. Nesse caso específico, verifiquei o código antes de aceitá-lo, mas na próxima vez ignorarei ou rejeitarei esse tipo de revisão.
Chaos Manor

2

Japonês, 23 bytes

Existem duas soluções equivalentes:

Oo(Ð -(A³òA³n @OpXÃ,йn
K=Ð;A³òA³n @OpXÃ;OoÐ -K

O primeiro basicamente faz o seguinte:

output(-(new Date() - (1000 .range(-1000).map(X => print(X)), new Date())));

Ou seja, os números são impressos no meio da subtração para evitar o armazenamento do tempo em uma variável. No entanto, não é mais curto que a rota variável, que é basicamente:

K = new Date(); 1000 .range(-1000).map(X => print(X)); output(new Date() - K);

Na versão mais recente do Japt (mais recente que esse desafio), Kestá configurada para retornar automaticamente new Date(). Isso reduz a primeira solução para 21 bytes:

Oo(K-(A³òA³n @OpXÃK)n

Teste online!


1

QBIC , 34 bytes

d=timer[-z^3,z^3|?a]?z^3*(timer-d)

Usa o QBasic TIMER função , que retorna segundos em notação decimal. Fazer com que pareça bonito adiciona alguns bytes.

Explicação

d=timer     Set 'd' to the current # seconds since midnight
[-z^3,z^3|  FOR -1000 to 1000  --  Note that 'z' = 10 in QBIC, and z^3 saves a byte over 1000
?a          Display the iterator
]           Close the FOR loop
    timer-d Take the current time minus the time at the start of the program -- 0.156201
?z^3*()     Multiply by a thousand and display it   156.201

1

C ++ - 261

Só para rir, pensei em publicar uma resposta em C ++.

#include <iostream>
#include <chrono>
using namespace std::chrono; using c=std::chrono::system_clock; void p(){c::time_point n=c::now();for(int i=-1001;++i<1001;)std::cout<<i<<"\n";std::cout<<(duration_cast<milliseconds>(system_clock::now()-n)).count()<<"\n";}

Vou deixar isso como um exercício para determinar o que está fazendo e como chamá-lo - não deve ser muito difícil.


1

Scala, 77 bytes

def t=System.nanoTime
val s=t
Range(-1000,1001)map println
println((t-s)/1e6)

1

ForceLang, 124

set t timer.new()
set i -1000
label 1
io.writeln set i i+1
if i=1000
 io.write math.floor 0.001.mult t.poll()
 exit()
goto 1

Nota: Você deve suprimir stderrao executar isso. Acredito que o consenso sobre a meta é que isso não incorra em uma penalidade de contagem de bytes.


1

SimpleTemplate , 92 bytes

O que realmente me matou foi a necessidade de registrar o tempo.

{@callmicrotime intoX 1}{@for_ from-1000to1000}{@echol_}{@/}{@phpecho microtime(1)-$DATA[X]}

Como ainda não há matemática, isso dificulta bastante as coisas, forçando-me a escrever PHP diretamente.

Ungolfed:

{@call microtime into start_time true}
{@for i from -1000 to 1000 step 1}
    {@echol i}{@// echoes a newline after}
{@/}
{@php echo microtime(true) - $DATA["start_time"];}

Aviso Legal:

Eu executei isso com o commit e118ae72c535b1fdbe1b80c847f52aa161854fda , de 13/01/2017.

A confirmação mais recente foi corrigir algo não relacionado ao código aqui.


1

C 134 133 bytes

Agradecemos a @Thomas Padron-McCarthy por economizar 1 byte.

f(){clock_t s,e;s=clock();for(int i=-1000;i<1001;i++)printf("%d\n",i);e=clock();printf("%lf",((double)((e-s))/(CLOCKS_PER_SEC))*1e3);}

Versão não destruída:

void f()
{   
  clock_t s,e;

  s=clock();

  for(int i=-1000;i<1001;i++)
    printf("%d\n",i);   

  e=clock();
  printf("%f",((double)((e-s))/(CLOCKS_PER_SEC))*1e3);

 }

Você pode salvar um caractere alterando "% lf" para "% f".
Thomas Padron-McCarthy

Por que não int t=time(null);... printf("%d",time(null)-t)? AFAIK mais curto
SIGSTACKFAULT

1

Gura , 75 bytes

t=datetime.now();println(-1000..1000);print((datetime.now()-t).usecs/1000);

1

Clojure, 94 bytes

(let[t #(System/currentTimeMillis)s(t)](doseq[n(range -1e3 1001)](println n))(println(-(t)s)))

Estou decepcionado com o tempo que isso durou, mas acho que ninguém nunca afirmou que Clojure era uma boa linguagem para jogar golfe.

Solução ingênua que apenas registra a hora de início, faz um loop e depois imprime a hora atual menos a hora de início. A menos que Clojure tenha um getter de tempo ms do que estou perdendo, não sei como isso pode ficar mais curto. Talvez algum tipo de loop implícito?

(defn time-print []
  (let [t #(System/currentTimeMillis) ; Alias the time-getter to "t"
        start (t)] ; Record starting time
    (doseq [n (range -1000 1001)] ; Loop over the range...
      (println n)) ; ... printing the numbers

    (println (- (t) start)))) ; Then print the current time minus the starting time.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.