Час, необхідний для друку номерів


21

Підсумок

Напишіть програму або функцію, яка не приймає жодного вводу, і виводить усі цілі числа, від -1000 до 1000 у порядку зростання, до stdout, по одному на рядок:

-1000
-999
-998
-997
...

А після цього потрібно роздрукувати час, необхідний для друку цих чисел, або час від початку виконання програми в мілісекундах (при необхідності він може містити і деякі інші речі, наприклад: час, взятий: xxxms - це нормально). Це може бути флоат або ціле число (якщо ви надрукуєте ціле число, вам потрібно округлити до найближчого).

Приклад коду

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

Обмеження

Стандартні лазівки заборонені

Інші інформації

Це код гольфу, тому виграє найкоротше подання.


@GurupadMamadapur Ні, вибачте
Horváth Dávid

Чому? Я думаю, що для того, щоб надрукувати ці цифри, кожне твердження бере участь із початку програми, правда?
Гурупад Мамадапур

1
@GurupadMamadapur Добре, ти маєш рацію, я відповідним чином відредагую це питання.
Хорват Давід

Чи може програма чекати деяку кількість часу від початку та надрукувати цю суму?
xnor

@xnor Я думаю, що це змінить проблему, і тому що вже існує багато відповідей на початковий виклик, я б сказав «ні».
Хорват Давід

Відповіді:


9

MATL , 13 байт

1e3t_y&:!DZ`*

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

       % 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
Дуже хороша! Смарт для реалізації: Implicitly start timer. Це було з першого дня, чи це результат попереднього виклику?
Стюі Гріффін

@StewieGriffin Не з першого дня. Я додав це 13 липня 2016 року , ймовірно, після того, як явно мав намір поступити на це в декількох викликах
Луїс Мендо

9

Октава, 46 43 36 30 23 байт

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

Це надрукує:

ans =

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

Якщо це вам не подобається ans =, нам доведеться додати ще 6 байт для disp:

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

Збережено багато байтів завдяки кільком нагадуванням від rahnema1.

Пояснення:

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 байт

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

Для того, щоб записати всі події, слід скористатися скриптом із консолі розробника (інакше журнали стираються після певного їх кількості).


i=~1e3щоб зберегти байт :-)
ETHproductions


7

Python 3,5, 80 77 73 байт

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

Попередні рішення включали використання, timeitі time.time()вони були більшими.

На жаль, time.process_time()було введено в python 3.3.

Дякуємо Деннісу за збереження 4 байтів!


5

Bash (+ coreutils), 41, 49, 46, 44, 42 байти

ЗМІНИ:

  • Відновлюється використовувати Bash-вбудований (час), щоб вирішити питання щодо точності @Dennis;
  • Зменшено на 3 байти, використовуючи Bash 4+ |&для більш жорсткого перенаправлення;
  • Збережено ще 2 байти, замінивши seq -1000 1000на seq -1e3 1e3(Дякую @Dennis!);
  • -2 байти, видаливши непотрібний зворотний проріз і використовуючи точність за замовчуванням (Thx @Dennis!).

Гольф

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

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

Sidenote

Використання утиліти "time" для coreutils замість вбудованого Bash призводить до: 41, 35-байтний розчин:

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

"\" тут, щоб змусити bash викликати реальну команду замість вбудованої.

На жаль, точність часу в Coreutils становить лише 1/100, що викликає занепокоєння щодо того, чи є правильним рішенням.


4

R, 42 байти

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

Це надрукується

.
.
.
998
999
1000
elapsed 
     60 

Для видалення elapsedпотрібні два додаткові байти:

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

4

Bash + GNU утиліти, 43

  • Збережено 2 байти завдяки @Dennis
  • Збережено 5 байт завдяки @zeppelin
c=date\ +%s%3N
s=`$c`
seq -1e3 1e3
$c-$s|bc

dateКоманда дає кількість секунд з початку епохи зчепленого з поточними наносекунд. Ця команда виконується до і після. bcприймає різницю і відбитки.

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


Я сподівався зробити це протягом 17:

time seq -1e3 1e3

Але вихід часу дає більше, ніж нам потрібно:

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

1
Ви можете зберегти два байти, замінивши 1000на 1e3.
Денніс

"Але вихід часу дає ...." ... можливо, ви повинні похизуватися.
H Walters

1
Ви , ймовірно , може заощадити кілька байт, захопивши дату з точністю мс безпосередньо, як це: date +%s%3N.
зеппелін

4

JavaScript (ES6), 63 59 байт

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


Приємно. Ви можете зберегти три байти, видаливши пробіл у new (d=Date)та починаючи з -1000:for(t=new(d=Date),c=console.log,i=~1e3;i<1e3;c(++i));c(new d-t)
ETHproductions

@ETHproductions дякую :) ~1e3це чудовий штрих.
Джордж Рейт

1
У висновку сниппета від тільки 952до 1000чому?
Гурупад Мамадапур

@GurupadMamadapur Вихід фрагмента обмежений на 50 рядків. (А точніше: 50 останніх рядків.)
Арнольд

1
@IsmaelMiguel Дивовижна не було відомо performance.now()чи Performanceінтерфейс на всіх
Джордж Рейт

3

R, 66 байт

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

Напевно, не найкоротший, але це працює.


Чи proc.timeможна зберігати в змінній? t=proc.time;x=t(); ...
Аннан

3

Математика, 51 байт

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

Пояснення

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

Збережіть Printфункцію в p. Роздрукуйте номери 2001 року, починаючи з -1000, збільшуючи на 1.

AbsoluteTiming@ ...

Знайдіть загальний час, що минув у секундах.

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

Помножте це на 1000 (секунди -> мілісекунди) і p( Print) це.


Аргу, ти мене побив 3 хвилини! :) Ви впевнені, що Timingтакож не задовольняє (трохи розпливчастий) опис проблеми AbsoluteTiming?
Грег Мартін

2
@GregMartin Timingвиводить час процесора і не включає час, який зайняв передній кінець. Це є. час, витрачений на збільшення приросту лічильника Array, підраховується, але час, необхідний для відображення цих цифр на екрані, не враховується. Цей ефект можна побачити на цьому простому прикладі: Timing@Print@3дає 0 секунд, але AbsoluteTiming@Print@3не робить.
JungHwan Min

3

PHP, 110 70 байт

ще трохи довгий; але збережено 38 за допомогою підказки @ AlexHowansky, і ще два з 1e3і ~1e3.

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

відбитки плавають. Бігайте з -r.


2
Ви можете передати microtime () значення truthy, і воно поверне поплавок безпосередньо, вам не доведеться додавати рядки.
Олексій Хованський

-30% з цим натяком. Я б хотів, щоб я міг зробити десять оновлень на ваш коментар. : D
Тит

Сумно, як у PHP немає чогось, що повертає час у мілісекундах. Як і у Javascript. Я не можу запропонувати поліпшень. Це настільки ж мало, скільки може отримати. Молодці!
Ісмаїл Мігель

@IsmaelMiguel Я думаю, що у JavaScript немає мікросекунд. :)
Тит

@Titus Що я мав на увазі, що дати Javascript обробляються в мілісекундах, тоді як PHP мав лише секунди або мікросекунди.
Ісмаїл Мігель

3

Powershell, 27 байт

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

Дякуємо AdmBorkBork за те, що він вказав, що багатослівний вихід за замовчуванням прийнятний у виклику.

Результати:

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

для більш вміщеного результату в декілька мілісекунд використовуйте оригінальну відповідь:

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

Економте час до $ 1, роздрукуйте на stdout автоматично, а потім отримайте час між початком і кінцем виконання.


Ви можете просто передати діапазон до oh( Out-Host), який обійде факт, який Measure-Commandзахоплює трубопровід. Приклад у TIO
AdmBorkBork

@AdmBorkBork справа в тому, що я не думаю, що це збереже байти, якщо я щось не пропущу.
colsw

Measure-Command{-1e3..1e3|oh}становить 29 байт. Звичайно, він друкує додаткові речі завдяки Measure-Command, але виклик прямо говорить про те, що це добре.
AdmBorkBork

Насправді пропущений момент, коли ви можете надрукувати інші дані, творцю виклику, можливо, доведеться сказати, чи дуже багатослівний вихід Measure-Command прийнятний. також $1=date;-1e3..1e3;(date)-$1на 2 байти коротше, ніж там міра-команда,
colsw

О так, ха-ха. Хороший гольф.
AdmBorkBork

2

Perl 6 , 45 байт

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

Спробуй це

Розширено:

# 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 байти

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

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

timexце вбудований, який виконує рядок і повертає час, необхідний для його оцінки, в секундах. Рядок формує діапазон [-1000, 1000] за допомогою i:, потім колумінізує його ,., використовуючи вбудований echo.


2

Pyth , 18 15 14 байт

j}_J^T3J;*.d1J

Спробуйте тут!

Пояснення

Це схоже на мою відповідь пітона.

    J ^ T3 Встановіть J на ​​1000
  } _ J Перелік від -1000 до 1000
j Приєднайтесь до списку новими рядками та негайно роздрукуйте його
         ; *. d1J Час друку з моменту виконання програми в мілісекундах

Зміни :

  • Завдяки fryamtheeggman за збереження 3 байтів!
  • Завдяки busukxuan за збереження байта.

Я спробував це, 14 байт, не впевнений, чи працює він правильно. Вам потрібно додати новий рядок на початку програми. pyth.herokuapp.com/?code=%0AM%7D_J%5ET3J%2a.d1J&debug=0
busukxuan

2

Нуд , 17 13 байт

13 байт

Спробував трохи інший підхід і врятував 4 байти.

ƇQjȥḶGQɱ⁻Ñ€Ƈ⁻

Спробуй це:)

Як це працює

Ƈ             # 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 байт

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

Спробуй це:)

Як це працює

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

У фрагменті використовуються значення -4 до 4, щоб не зайняти стільки часу.

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


Ви створили цю мову після або перед викликом?
Rɪᴋᴇʀ

@EasterlyIrk, раніше :)
tkellehe

2

TI-Basic, 22 байти

startTmr
For(A,-ᴇ3,ᴇ3
Disp A
End
startTmr-Ans
  • Багато команд представлені 1 або 2-байтовими лексемами.

  • Тестували на емульованому ТС-84 CSE.


2

Матлаб, 16 23 байт

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

Редагувати: Я зрозумів, що порушую кілька правил цього завдання. Це навчить мене скупо читати виклик пізно вночі. Тепер я також усвідомлюю, що виправлена ​​відповідь майже ідентична рішенню Октави, але таке життя.

Друкує кожен елемент у створеному лінійному просторовому масиві -1000: 1000 (відсутність; друкує до консолі).

tic / toc записує час, а toc друкує час на консолі з або без; . 1e3 потрібен для друку в мілісекундах.


Цілком правильно, правильне рішення було відредаговано.
Оуен Морган


2

8-е , 61 47 байт

Завдяки 8th_dev за приємне поліпшення (збережено 14 байт)

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

Це надрукує всі цілі числа від -1000 до 1000 у порядку зростання та час, необхідний (у мілісекундах) для друку цих чисел

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

1
Слід зазначити, що пропонування змін для поліпшення коду кваліфікується як "руйнівне". Пропозиції щодо гольфу слід надати замість цього. Я б пінг користувачеві, який це зробив, якщо міг, але не можу. meta.codegolf.stackexchange.com/q/1615/34718
mbomb007

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

@ mbomb007 - Дякую, що повідомили мені це. У цьому конкретному випадку я перевірив код, перш ніж його прийняти, але наступного разу я пропущу або відхилюю такий вид огляду.
Садиба Хаос

2

Japt, 23 байти

Є два еквівалентні рішення:

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

Перший в основному робить наступне:

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

Тобто числа друкуються посередині віднімання, щоб уникнути необхідності зберігання часу у змінній. Однак він не коротший за змінний маршрут, який в основному:

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

В останній версії Japt (новішої, ніж ця проблема) Kналаштовано на автоматичне повернення new Date(). Це скорочує перший розчин до 21 байта:

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

Перевірте це в Інтернеті


1

QBIC , 34 байти

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

Використовує функцію QBasic TIMER, яка повертає секунди в десятковій нотації. Якщо це виглядає красиво, додає кілька байт.

Пояснення

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

Тільки для сміху я подумав, що опублікую відповідь С ++.

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

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


1

Scala, 77 байт

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

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


1

SimpleTemplate , 92 байти

Те, що нас справді вбило, - це потреба записувати час.

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

Оскільки математики поки що немає, це робить речі досить важкими, змушуючи мене писати PHP безпосередньо.

Безголівки:

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

Відмова:

Я керував цим з комітетом e118ae72c535b1fdbe1b80c847f52aa161854fda з 2017-01-13.

Останнім зобов’язанням було виправити щось, що не пов’язане з кодом.


1

C 134 133 байт

Завдяки @Thomas Padron-McCarthy за збереження 1 байта.

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

Негольована версія:

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

 }

Ви можете зберегти один символ, змінивши "% lf" на "% f".
Томас Падрон-Маккарті

Чому б не int t=time(null);... printf("%d",time(null)-t)? Коротший AFAIK
SIGSTACKFAULT


1

Clojure, 94 байти

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

Я розчарований тим, як довго це дісталося, але я думаю, ніхто ніколи не стверджував, що Clojure - це гарна мова для гри в гольф.

Наївне рішення, яке просто записує час початку, циклічно, а потім друкує поточний час мінус час початку. Якщо у Clojure не знайдеться часу, ніж я відсутній, я не знаю, як це може бути коротшим. Може, якась неявна петля?

(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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.