Tempo impiegato per stampare i numeri


21

Sommario

Scrivi un programma o una funzione, che non accetta alcun input, e genera tutti i numeri interi, tra -1000 e 1000 in ordine crescente, sullo stdout, uno per riga, in questo modo:

-1000
-999
-998
-997
...

E dopo ciò è necessario stampare il tempo impiegato per stampare questi numeri, o il tempo dall'inizio dell'esecuzione del programma in millisecondi (se necessario, può contenere anche altre cose, ad esempio: tempo impiegato: xxxms è ok). Può essere un float o un numero intero (se si stampa un numero intero, è necessario arrotondare per difetto al più vicino).

Codice di esempio

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

restrizioni

Non sono ammesse scappatoie standard

Altre informazioni

È il golf di codice, quindi vince il contributo più breve.


@GurupadMamadapur No, sorry
Horváth Dávid

Perché? Penso essenzialmente di stampare quei numeri ogni dichiarazione è coinvolta dall'inizio del programma giusto?
Gurupad Mamadapur,

1
@GurupadMamadapur Ok, hai ragione, modificherò la domanda di conseguenza.
Horváth Dávid

Il programma può attendere un po 'di tempo dall'inizio e stampare tale importo?
xnor

@xnor penso che ciò cambierebbe la sfida, e poiché ci sono già molte risposte alla sfida originale, direi di no.
Horváth Dávid,

Risposte:


9

MATL , 13 byte

1e3t_y&:!DZ`*

Provalo 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
Molto bella! Intelligente per implementare: Implicitly start timer. È stato lì dal primo giorno o è il risultato di una sfida precedente?
Stewie Griffin,

@StewieGriffin Non dal primo giorno. L'ho aggiunto il 13 luglio 2016 , probabilmente dopo averlo dovuto chiarire esplicitamente in un paio di sfide
Luis Mendo,

9

Ottava, 46 43 36 30 23 byte

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

Questo stamperà:

ans =

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

Se non ti piace il ans =, allora dobbiamo aggiungere altri 6 byte per disp:

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

Risparmio di molti byte grazie ad alcuni promemoria di rahnema1.

Spiegazione:

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 byte

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

Al fine di ottenere tutti gli eventi registrati, è necessario utilizzare lo script dalla console dello sviluppatore (altrimenti i registri vengono cancellati dopo una certa quantità di essi).


i=~1e3per salvare un byte :-)
ETHproductions

7

CJam , 18 byte

es2001{1e3-n}/es\-

Provalo online!

Come funziona

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 byte

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

Le soluzioni precedenti prevedevano l'utilizzo timeit e time.time(), erano più grandi.

Purtroppo, time.process_time() stato introdotto in Python 3.3.

Grazie a Dennis per aver salvato 4 byte!


5

Bash (+ coreutils), 41, 49, 46, 44, 42 byte

Modifiche:

  • Rifattorizzato per usare Bash-builtin (tempo), per rispondere alle preoccupazioni di precisione di @Dennis;
  • Ridotto di 3 byte, utilizzando Bash 4+ |&per il reindirizzamento standard;
  • Salvati altri 2 byte sostituendoli seq -1000 1000con seq -1e3 1e3(Grazie @Dennis!);
  • -2 byte rimuovendo la barra rovesciata non necessaria e usando la precisione predefinita (Thx @Dennis!).

golfed

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

Provalo online!

Nota a margine

L'uso di un'utilità "time" di coreutils, anziché di Bash-builtin, si traduce in a 41, Soluzione a 35 byte:

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

"\" è qui per fare in modo che bash invochi il comando reale, anziché il comando incorporato.

Sfortunatamente la precisione temporale di coreutils è solo di 1/100 , il che ha sollevato dubbi sul fatto che si tratti di una soluzione valida.


4

R, 42 byte

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

Questo stamperà

.
.
.
998
999
1000
elapsed 
     60 

Per rimuovere elapsed, sono necessari due byte aggiuntivi:

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

4

Utilità Bash + GNU, 43

  • Salvato 2 byte grazie a @Dennis
  • 5 byte salvati grazie a @zeppelin
c=date\ +%s%3N
s=`$c`
seq -1e3 1e3
$c-$s|bc

Il datecomando fornisce il numero di secondi trascorsi dall'epoca concatenata con i nanosecondi attuali. Questo comando viene eseguito prima e dopo. bcprende la differenza e stampa.

Provalo online .


Speravo di farlo per 17:

time seq -1e3 1e3

Ma l'output del tempo dà più del necessario:

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

1
È possibile salvare due byte sostituendoli 1000con 1e3.
Dennis,

"Ma l'output del tempo dà ...." ... forse dovresti equipaggiare bash.
H Walters,

1
Probabilmente si può salvare un paio di byte, catturando la data con precisione ms direttamente, in questo modo: date +%s%3N.
zeppelin,

4

JavaScript (ES6), 63 59 byte

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


Bello. È possibile salvare tre byte rimuovendo lo spazio new (d=Date)e iniziando da -1000:for(t=new(d=Date),c=console.log,i=~1e3;i<1e3;c(++i));c(new d-t)
ETHproductions

@ETHproductions grazie :) ~1e3è un bel tocco.
George Reith,

1
Nello snippet l'output è solo 952per 1000questo?
Gurupad Mamadapur,

@GurupadMamadapur L'output dello snippet è limitato a 50 righe. (O più precisamente: le ultime 50 righe.)
Arnauld

1
@IsmaelMiguel stupefacente non era a conoscenza performance.now()o l' Performanceinterfaccia a tutti
George Reith

3

R, 66 byte

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

Probabilmente non il più breve ma funziona.


Può proc.timeessere memorizzato in una variabile? t=proc.time;x=t(); ...
Annan,

3

Mathematica, 51 byte

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

Spiegazione

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

Memorizza la Printfunzione in p. Stampa numeri 2001, a partire da -1000, con incrementi di 1.

AbsoluteTiming@ ...

Trova il tempo totale trascorso in secondi.

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

Moltiplicalo per 1000 (secondi -> millisecondi) e p( Print).


Argh, mi hai battuto di 3 minuti! :) Sei sicuro Timingche non soddisfi anche la descrizione (leggermente vaga) del problema AbsoluteTiming?
Greg Martin

2
@GregMartin Timingemette il tempo della CPU e non include il tempo impiegato dal front-end. Questo è. Arrayviene conteggiato il tempo impiegato per incrementare il contatore , ma non viene conteggiato il tempo impiegato per visualizzare quei numeri sullo schermo. Questo effetto può essere visto in questo semplice esempio: Timing@Print@3dà 0 secondi, ma AbsoluteTiming@Print@3non lo è.
JungHwan Min

3

PHP, 110 70 byte

ancora un po 'lungo; ma ne ho salvati 38 con il suggerimento di @ AlexHowansky e altri due con1e3 e ~1e3.

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

stampe galleggianti. Corri con -r.


2
Puoi passare a microtime () un valore sincero e restituirà direttamente un float, non devi aggiungere le stringhe.
Alex Howansky,

-30% con quel suggerimento. Vorrei poter fare dieci voti sul tuo commento. : D
Tito

È triste come PHP non abbia qualcosa che restituisca il tempo in millisecondi. Come Javascript ha. Non posso suggerire miglioramenti. È il più piccolo possibile. Molto bene!
Ismael Miguel,

@IsmaelMiguel Penso che JavaScript non abbia microsecondi. :)
Tito

@Titus Quello che volevo dire è che le date di Javascript sono tutte gestite in millisecondi, mentre PHP aveva solo secondi o microsecondi.
Ismael Miguel,

3

Powershell, 27 byte

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

Grazie ad AdmBorkBork per aver sottolineato che l'output dettagliato dettagliato è accettabile nella sfida.

Le uscite risultano come:

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

per un risultato più contenuto di appena millisecondi, usa la risposta originale:

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

Risparmia tempo prima di $ 1, stampa automaticamente su stdout, quindi ottieni il tempo tra l'inizio e la fine dell'esecuzione.


È possibile semplicemente reindirizzare l'intervallo a oh( Out-Host) che ignorerà il fatto che Measure-Commandacquisisce la pipeline. Esempio a TIO
AdmBorkBork,

@AdmBorkBork il punto era che non penso che salverà byte, a meno che non mi manchi qualcosa.
Colsw,

Measure-Command{-1e3..1e3|oh}è di 29 byte. Certo, stampa cose extra grazie a Measure-Command, ma la sfida afferma esplicitamente che va bene.
AdmBorkBork,

In realtà è mancato il punto in cui è possibile stampare altri dati, il creatore della sfida potrebbe aver bisogno di dire se l'output molto dettagliato di Measure-Command è accettabile. inoltre $1=date;-1e3..1e3;(date)-$1è più breve di 2 byte rispetto all'opzione misura-comando,
colsw

Oh giusto, ahah. Bel golf.
AdmBorkBork,

2

Perl 6 , 45 byte

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

Provalo

Allargato:

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

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

Provalo online!

timexè un builtin che esegue la stringa e restituisce il tempo impiegato per valutarla in secondi. La stringa forma l'intervallo [-1000, 1000] usando i:, quindi lo columinizza usando ,.e lo stampa usando l'integrato echo.


2

Pyth , 18 15 14 byte

j}_J^T3J;*.d1J

Provalo qui!

Spiegazione

Questo è simile alla mia risposta Python.

    J ^ T3 Impostare J su 1000
  } _ J Elenco compreso tra -1000 e 1000
j Unisciti all'elenco con nuove righe e stampalo implicitamente
         ; *. d1J Tempo di stampa dall'esecuzione del programma in millisecondi

Modifiche :


Ho provato questo, 14 byte, non sono sicuro che funzioni correttamente. Devi aggiungere una nuova riga all'inizio del programma. pyth.herokuapp.com/?code=%0AM%7D_J%5ET3J%2a.d1J&debug=0
busukxuan

2

Noodel , 17 13 byte

13 byte

Ho provato un approccio leggermente diverso e salvato 4 byte.

ƇQjȥḶGQɱ⁻Ñ€Ƈ⁻

Provalo:)

Come funziona

Ƈ             # 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 byte

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

Provalo:)

Come funziona

Ƈ                 # 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.

Lo snippet utilizza i valori da -4 a 4 per non richiedere troppo tempo per il completamento.

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


Hai creato questa lingua dopo o prima della sfida?
Rɪᴋᴇʀ

@EasterlyIrk, prima :)
tkellehe,

2

TI-Basic, 22 byte

startTmr
For(A,-ᴇ3,ᴇ3
Disp A
End
startTmr-Ans
  • Molti comandi sono rappresentati da token a 1 o 2 byte.

  • Testato su un TI-84 CSE emulato.


2

Matlab, 16 23 byte

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

Modifica: mi sono reso conto che stavo violando molte delle regole di questa sfida. Questo mi insegnerà a leggere la sfida a tarda notte. Ora capisco anche che la risposta corretta è quasi identica alla soluzione Octave, ma tale è la vita.

Stampa ogni elemento nella matrice di spazio lineare creata -1000: 1000 (la mancanza di; stampa su console).

tic / toc registra l'ora e toc stampa l'ora sulla console con o senza il; . 1e3 è necessario per stampare in millisecondi.


Esatto, è stata modificata una soluzione corretta.
Owen Morgan,

2

Groovy, 75 73 byte

t=System.&nanoTime
s=t()
(-1000..1e3).each{println it}
print((t()-s)/1e6)

Grazie a jaxad0127 per aver salvato 2 byte!

Provalo qui!


1
nanoTimecon una divisione per 1e6 è inferiore a currentTimeMillis. Dà anche tempo frazionario.
jaxad0127,

2

8 ° , 61 47 byte

Grazie a 8th_dev per un bel miglioramento (risparmiato 14 byte)

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

Ciò stamperà tutti i numeri interi compresi tra -1000 e 1000 in ordine crescente e il tempo impiegato (in millisecondi) per stampare questi numeri

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

1
Va notato che suggerire modifiche per migliorare il codice si qualifica come "distruttivo". Invece, i suggerimenti per il golf dovrebbero essere forniti come commento. Farei un ping all'utente che lo ha fatto se potessi, ma non posso. meta.codegolf.stackexchange.com/q/1615/34718
mbomb007

1
So che l'hai approvato, il che va bene dato che è il tuo post, ma altri revisori nella coda di revisione dovrebbero rifiutarlo, e l'utente che ha suggerito la modifica in primo luogo non dovrebbe averlo.
mbomb007,

@ mbomb007 - Grazie per avermelo fatto notare. In questo caso specifico ho verificato il codice prima di accettarlo, ma per la prossima volta salterò o respingerò questo tipo di revisione.
Chaos Manor

2

Japt, 23 byte

Esistono due soluzioni equivalenti:

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

Il primo sostanzialmente fa quanto segue:

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

Cioè, i numeri sono stampati nel mezzo della sottrazione per evitare di dover memorizzare l'ora in una variabile. Tuttavia, non è più breve del percorso variabile, che è fondamentalmente:

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

Nell'ultima versione di Japt (più recente di questa sfida), Kè impostato per tornare automaticamente new Date(). Ciò riduce la prima soluzione a 21 byte:

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

Provalo online!


1

QBIC , 34 byte

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

Utilizza QBasic TIMER funzione , che restituisce i secondi in notazione decimale. Farlo sembrare carino aggiunge alcuni byte.

Spiegazione

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

Solo per una risata, ho pensato di pubblicare una risposta 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";}

Lo lascerò come un esercizio per determinare cosa sta facendo e come chiamarlo - non dovrebbe essere troppo difficile.


1

Scala, 77 byte

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: è necessario sopprimere stderrquando si esegue questo. Credo che il consenso su meta sia che ciò non comporta una penalità per il conteggio dei byte.


1

SimpleTemplate , 92 byte

Ciò che mi ha davvero ucciso è stata la necessità di registrare l'ora.

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

Dal momento che non c'è matematica (ancora), questo rende le cose piuttosto difficili, costringendomi a scrivere PHP direttamente.

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

Disclaimer:

Ho eseguito questo con il commit e118ae72c535b1fdbe1b80c847f52aa161854fda , dal 13-01-2017.

L'ultimo commit è stato quello di riparare qualcosa che non è correlato al codice qui.


1

C 134 133 byte

Grazie a @Thomas Padron-McCarthy per aver salvato 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);}

Versione non golfata:

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

 }

È possibile salvare un carattere modificando "% lf" in "% f".
Thomas Padron-McCarthy,

Perché no int t=time(null);... printf("%d",time(null)-t)? Più corto AFAIK
SIGSTACKFAULT il

1

Gura , 75 byte

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

1

Clojure, 94 byte

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

Sono deluso da quanto tempo è arrivato, ma suppongo che nessuno abbia mai sostenuto che Clojure fosse una buona lingua per giocare a golf.

Soluzione ingenua che registra solo l'ora di inizio, esegue il loop, quindi stampa l'ora corrente meno l'ora di inizio. A meno che Clojure non abbia un tempo migliore di quello che mi manca, non so come questo potrebbe essere più breve. Forse una specie di circuito implicito?

(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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.