Время, необходимое для печати чисел

21

Резюме

Напишите программу или функцию, которая не принимает никаких входных данных и выводит все целые числа в диапазоне от -1000 до 1000 в порядке возрастания в стандартный вывод, по одному на строку, например:

-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 Нет, извините
Хорват Давид
Зачем? Я думаю, что по сути, чтобы напечатать эти цифры, каждое утверждение задействовано с самого начала программы, верно?
Гурупад Мамадапур
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();

Для регистрации всех событий вы должны использовать скрипт из консоли разработчика (в противном случае журналы удаляются после определенного количества).

nicael
источник
i=~1e3сохранить байт :-)
ETHproductions
7

CJam , 18 байт

es2001{1e3-n}/es\-

Попробуйте онлайн!

Как это устроено

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

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

правок:

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

Golfed

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

Попробуйте онлайн!

Примечание

Использование утилиты coreutils «time» вместо встроенной Bash приводит к 4135-байтовое решение:

\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 Уолтерс
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

Вероятно, не самый короткий, но это работает.

Billywob
источник
Может proc.timeхраниться в переменной? t=proc.time;x=t(); ...
Аннан
3

Mathematica, 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 Мин.
3

PHP, 110 70 байт

еще немного долго; но спас 38 с подсказкой @ AlexHowansky, и еще два с 1e3и ~1e3.

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

принты плавают. Беги с -r.

Titus
источник
2
Вы можете передать microtime () истинное значение, и оно будет возвращать значение с плавающей точкой, вам не нужно добавлять строки.
Алекс Ховански
-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, распечатайте на стандартный вывод автоматически, затем получите время между началом и концом выполнения.

colsw
источник
Вы можете просто передать диапазон в oh( Out-Host), что обойдет тот факт, что Measure-Commandзахватывает конвейер. Пример на
TIO
@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)*$_

Попытайся

Expanded:

# 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.
Брэд Гилберт b2gills
источник
2

J , 22 байта

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

Попробуйте онлайн!

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

миль
источник
2

Pyth , 18 15 14 байтов

j}_J^T3J;*.d1J

Попробуй это здесь!

объяснение

Это похоже на мой ответ Python.

    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

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

tkellehe
источник
Вы создали этот язык после или до испытания?
R
@EasterlyIrk, раньше :)
tkellehe
2

TI-Basic, 22 байта

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

  • Испытано на эмулированной TI-84 CSE.

Джулиан Лахниет
источник
2

Matlab, 16 23 байта

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

Изменить: я понял, что нарушил несколько правил этого испытания. Это научит меня читать задание поздно ночью. Теперь я также понимаю, что исправленный ответ почти идентичен решению Octave, но такова жизнь.

Печатает каждый элемент в созданном массиве линейных пространств -1000: 1000 (отсутствие; вывод на консоль).

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

Оуэн Морган
источник
Совершенно верно, правильное решение было отредактировано.
Оуэн Морган
2

Groovy, 75 73 байта

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

Спасибо jaxad0127 за сохранение 2 байта!

Попробуй это здесь!

Гурупад Мамадапур
источник
1
nanoTimeс делением на 1e6 меньше чем currentTimeMillis. Это также дает дробное время.
jaxad0127
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
Chaos Manor
источник
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())));

То есть числа печатаются в середине вычитания, чтобы избежать необходимости сохранять время в переменной. Тем не менее, он не короче, чем переменная route, которая в основном:

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

Проверьте это онлайн!

ETHproductions
источник
1

QBIC , 34 байта

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

Использует TIMERфункцию QBasic , которая возвращает секунды в десятичной записи. Делая это выглядит красиво добавляет несколько байтов.

объяснение

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
steenbergh
источник
1

С ++ - 261

Просто для смеха я думал, что выложу ответ 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";}

Я оставлю это как упражнение, чтобы определить, что он делает и как его назвать - не должно быть слишком сложно.

original.legin
источник
1

Scala, 77 байт

def t=System.nanoTime
val s=t
Range(-1000,1001)map println
println((t-s)/1e6)
jaxad0127
источник
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при запуске этого. Я считаю, что консенсус в отношении мета заключается в том, что это не повлечет за собой штраф за счет байтов.

SuperJedi224
источник
1

SimpleTemplate , 92 байта

Что действительно убило меня, так это необходимость записать время.

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

Поскольку математики нет (пока), это усложняет ситуацию, заставляя меня писать PHP напрямую.

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

Отказ от ответственности:

Я запускал это с коммитом 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
1

Гура , 75 байт

t=datetime.now();println(-1000..1000);print((datetime.now()-t).usecs/1000);
Sygmei
источник
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.
Carcigenicate
источник