Я хотел бы, чтобы вы построили мне часы, которые отображают время в следующем формате:
18 ----------
19 --------------------------------------------------
Это отображает «18: 10». Текущий час и следующий час показываются в начале строки, за которым следуют пробел и количество тире: в первой строке указано количество минут, прошедших за этот час, а во второй строке показано, сколько еще минут. идти в этот час.
Уточнить
- Часы должны отображать системное время. Если удобнее получать время из другого источника, это тоже хорошо. Он не может быть предоставлен в качестве входных данных.
- В
18:00
верхней строке просто18
(конечные пробелы разрешены, но не обязательны) - В
18:59
нижней строке19 -
- Часы <10 предварительно заполнены
0
(01 -----
) или выровнены по правому краю (1 -----
). Выравнивание по левому краю не допускается, даже если тире начинаются в нужном месте (1 -----
недопустимо). - Часы должны отображать часы в 24-часовом формате.
- Хотя он называется 24-часовым форматом, на самом деле
24
его нет. В течение 23-го часа вторая строка начинается с00
или0
. - Дисплей необходимо обновлять как минимум раз в минуту, но это не должно происходить ровно за
00
секунды. Вы можете обновлять чаще / непрерывнее, если это более удобно, но результат, конечно, должен быть четким - ни одного пятна по всему экрану.
вход
Никто.
Выход
- Как описано выше. Конечные пробелы для заполнения часов до 60-ти позиций разрешены на обеих линиях, также допускается завершающий перевод строки.
- Экран должен быть очищен при отображении следующей минуты: либо с помощью команды очистки экрана, либо путем добавления не менее 30 новых строк.
Дополнительные правила
- Стандартные лазейки запрещены
- Code-Golf , кратчайший ответ в байтах выигрывает.
Ответы:
MATL , 41 байт
Спасибо @Kundor за обнаружение ошибки, теперь исправлена
Попробуйте это в MATL онлайн! Но обратите внимание, что программа завершается через 30 секунд, поэтому сложно отследить какие-либо изменения в выводе.
Как это работает
источник
TI-Basic, 94 байта
Относительно просто. Это строка с одним пробелом в начале. Часы выровнены по правому краю. Это работает только на калькуляторах TI-84 +, так как TI-83 не имеет внутренних часов.
Редактировать: Спасибо @kundor за то, что заметил, что я не закрыл последний цикл. Исправлено сейчас (+2 байта).
Правка № 2: Первый час должен быть ноль, а не двадцать четыре. Исправлено по стоимости +14 байт.
источник
Str1
,getTime
иsub(
есть два байта каждый. Вы можете узнать больше на tibasicdev.wikidot.com/tokensПакет, 197 байтов
Примечание: 10-я строка имеет завершающий пробел. Для меня
%time%
форматирует часы с лидирующим пробелом, но минуты с лидирующим нулем. Я решил, что начальный ноль является более простым выходным форматом, так как для этого все, что мне нужно сделать, это добавить 100 часов и удалить первую цифру. Минуты сложнее , как08
и09
вызовет восьмиричные ошибки синтаксического анализа, так что префикс1
эффективно добавление 100 минут, с поправкой на это, компенсируя петлю надлежащим образом , который является байт меньше , чем 100 вычитания.источник
Python 3.6,
110114112 байтПри этом используется новое форматирование f-строки для сохранения одного байта (
f'\n{h+1:2} '
против'\n%2d '%(h+1)
). Вы можете изменить[sleep(9)]
его1
на сохранение 8 байтов, но тогда это просто спам на экране.Благодаря TuukkaX сохраненный один байт изменяется
while 1:...;sleep 60
наwhile[sleep(60)]:...
.Мне пришлось использовать еще 5 байтов, чтобы следующий час после 23 показывал 0, а не 24, как только что прокомментировал OP. :-(
Восстановил один байт, только спя 9 секунд вместо 60.
Сохраненные два байта, используя битовую мелочь для сокращения
(h+1)%24
, заимствованы из Ruby-ответа Value Ink .источник
sleep
возвращаетNone
, что ложно.sleep
также есть вtime
модуле, поэтому лучше импортировать *.Рубин,
989591 байтОбновляется каждые 5 секунд. Работает только в терминалах в стиле Unix.
Версия командной строки Windows,
9592 байта:источник
`cls`
vssystem'cls'
h=t.hour
а затем использоватьh
вместо второгоt.hour
, который экономит 3 байта.cls
. Спасибо за ваше другое предложение, хотя!puts`clear`
это путь, если вы используете терминалы Unix. Он просто не работает с командной строкой Windowscls
.puts"\e[H\e[2J"
очистить консоль, которая, я думаю, бреет четыре байта. Ваша первая строка будет прочитанаloop{t=Time.now;puts"\e[H\e[2J%02d %s
Perl 6 , 113 байт
Попробуйте один раз с тайм-аутом в одну секунду.
Или попробуйте измененную версию которая выводит результат работы в течение нескольких часов.
Expanded:
источник
[\+]
это добавляет и в[\-]
это, кажется, вычитать. Это работает с умножением и тому подобное?[+] LIST
что и сокращение, за исключением того, что оно дает вам промежуточные значения. См. Страницу документации для продукцииQBasic,
120127121 байтНе запускайте его очень долго, иначе ваш ноутбук загорится.Теперь 99.several9s% более эффективно CPU.Неуправляемый и объяснение
Мы начинаем с очистки экрана, затем получаем текущие часы и минуты
TIMER
, которые возвращают количество секунд с полуночи.Это первый раз, когда я пытался
PRINT USING
, поэтому я был рад обнаружить, что он не страдает от обычной причуды QBasic, что положительные числа печатаются с начальным пробелом.##
поскольку спецификатор формата гарантирует, что однозначные числа выровнены по правому краю и дополнены пробелом, как требуется. К сожалению, мы должны использовать цикл для дефисов, поскольку в QBasic нет функции повторения строк. (Если я ошибаюсь, пожалуйста, дайте мне знать!)Все
PRINT
утверждения заканчиваются;
на подавление новой строки; но после дефиса нам нужен перевод строки; Таким образом, одиночный?
после внутреннегоFOR
цикла.SLEEP 1
Теперь необходимо. Без него экран очищается так быстро после печати, что это просто мерцающий беспорядок. (Я использовалLOCATE 1
вместо этогоCLS
сначала, по этой причине, пока не понял, чтоCLS
сSLEEP
в любом случае короче.)RUN
Перезапускает программу сверху - самый короткий способ получить бесконечный цикл.источник
Java 8,
313300299 байтЭто обновляет только каждые 30 итераций цикла while. Остальные 29 итераций просто печатают новые строки.
обновленный
Благодаря помощи Кевина Круйссена сэкономлено
1314 байт! Благодарность!источник
void f(){...}
и добавить требуемый импорт (в вашем случаеimport java.time.*;
). При этом ваш код можно использовать в нескольких местах, чтобы уменьшить его до 311 байтов (даже при добавленном методе). -декларация и импорт). (Поскольку этот комментарий слишком длинный, я разместил его в следующем комментарии .. xD)import java.time.*;void f(){for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>99){c=0;String l="",u,d;for(i=0;i++<61;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}}
( 303 байта ) Я рекомендую прочитать Советы по игре в гольф на Java и Советы по игре в гольф на <все языки> . Приятного пребывания.for(i=0;i++<60
вместо 61 и(h<10?
вместо 9. Спасибо за информирование меня об объявлении метода и некоторых советах по игре в гольф!for(i=0;++i<61
вместоfor(i=0;i++<61
(во втором случае это действительно должно быть 60, и даже если это то же самое количество байтов, это, вероятно, более очевидно / читаемо).h<9
В моем коде является правильным, хотя. У вас былоh+1<10
раньше, и я просто изменил этоh<9
, удалив 1 с обеих сторон. :)h<9
, Я отредактирую его, чтобы сохранить еще 1 байт. Еще раз спасибо!C
176162161160156 байтовЭто грубое злоупотребление указателями, но компилируется и запускается, как указано. Обязательно компилируйте без оптимизации, иначе вы, скорее всего, столкнетесь с segfault.
Ungolfed:
источник
JavaScript (ES6), 162 байта
Обновления один раз в секунду
источник
console.clear()
внутриconsole.log
аргумента) и присваивая как можно больше в неиспользуемых скобках. Версия для 15:setInterval(c=>c.log(H(h,c.clear(d=new Date))+` ${'-'.repeat(m)} ${H(h+1)} `+'-'.repeat(60-m)),1e3,console,m=d.getMinutes(h=d.getHours(H=$=>$<9?'0'+$:$)))
.m=>`0${h++} \.slice(-3)+'-'.repeat(m)
.Python 2,
131129127 байтспас байт благодаря @TuukkaX
источник
while 1:
19 - \n 20 -----------------------------------------------------------
. Часы не обновляются ...C
251267251 байтНеуправляемая версия
Получает проделанную работу! Определенно может быть сокращен каким-либо образом. Предполагать
unistd.h
файл включен.@Neil Спасибо за информацию.
@Seth Спасибо, за сохранение 8 байтов.
источник
time_t
иstruct tm
) в ваш счетчик байтов.printf("\n");
тебя можно использоватьputs("");
Первый раз в гольф ...
Powershell, 116 байт (было 122)
Редактировать: из рекомендации @ AdmBorkBork изменил Get-Date на date и Clear до cls для экономии 6 байт.
источник
cls
вместоclear
и (если вы находитесь на Windows)date
вместоget-date
. Я также уверен, что есть более простой способ вывода форматирования - я играю с ним и сообщу, если что-нибудь придумаю.while($d=date){cls;"{0,2} {2}``n{1,2} {3}"-f($h=$d.Hour),(++$h%24),('-'*($m=$d.Minute)),('-'*(60-$m));Sleep 9}
. Вместо этого используйте разрыв строки LF в вашем редакторе `` n`PHP,
104105 байтвитрина для
printf
изготовленных на заказ заполняющих символов:"%'-Ns"
= левая строка подушечки с-
доN
символов.напечатает 99 новых строк (каждые 6 секунд) вместо очистки экрана.
Первый символ новой строки должен быть одним символом. Итак, в Windows его необходимо заменить на
\n
.источник
Язык GameMaker, 134 байта
В настройках вы должны игнорировать нефатальные ошибки, чтобы это работало. Кроме того, в GML
#
это эквивалентно\n
большинству языков.источник
Perl 6 , 104 байта
Необходимо запустить на ANSI-совместимом терминале, чтобы управляющая последовательность для сброса терминала работала .
Довольно простой (потому что более запутанные подходы, которые я пробовал, оказались длиннее):
DateTime.now.&{" "}.say xx*
: Преобразуйте текущее время в строку (см. Ниже) и произнесите это, и повторяйте все это бесконечное количество раз. Строка построена так:\ec
: Управляющий код ANSI<ESC>c
для сброса терминала, который очищает экран.{.hour.fmt: '%2s'}
: час, выровнено по правому краю на 2 столбца: Космос
{'-'x.minute}
: dash повторяется раз в минуту\n
: новая линия{(.hour+1).fmt: '%2s'}
: следующий час, выровнено по правому краю на 2 столбца: Космос
{'-'x 60-.minute}
: тире повторяется раз 60 минус минутаисточник
AWK, 190 байт
Поскольку
AWK
у меня нет встроеннойsleep
функции, я просто постоянно проверяю часы, чтобы увидеть, изменилась ли еще минута. Главное, что это работает ... верно? :)источник
Python 3.5,
127120117байтисточник
print('\n'*50)
вместо того , чтобыos.system('cls')
так оно работает как на * Nix и Windows? Сохранит пару байтов, поскольку вы можете потерятьos
импорт, а OP говорит, что это разрешено.Python,
115113 байтовсэкономил пару байтов благодаря @kundor и @Phlarx
источник
:02
форматы на just:2
.:02
формат на правой клавише с одной цифрой часов с нулями.:2
левые прокладки с пробелами, которые, как говорит задача, в порядке.Интерактивный C # (138 байт)
источник
d
вместо даты переменную датыdt
? и 2) использоватьsleep(1e3)
или999
вместо1000
?PHP,
112120 байтПоскольку нет способа очистить экран (что я могу найти), мне пришлось идти с кучей новых строк. Кроме того, вопрос, который обновляется до "хотя бы раз в минуту", сохраняет байт
9
вместо60
.edit: @Titus заметил ошибку в заполнении второго часа. Исправление это стоило 8 байт.
источник
Notice: Use of undefined constant str_pad - assumed 'str_pad' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant H - assumed 'H' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant i - assumed 'i' in C:\wamp64\www\my-site\a.php on line 2
. Что-нибудь на Мете об этом?-n
илиerror_reporting(22519);
H
установка даты идет с 00-23, но я забыл об этом на второй час.Баш (3 и 4): 90 байт
Из-за использования
$0
, этот скрипт должен быть помещен в файл, а не вставлен в интерактивную оболочку bash.Первая команда устанавливает
$d
до 60 дефисов; он основан на том факте, что длина первой строки этого скрипта составляет 60 символов. Это на три символа короче, чем следующая лучшая вещь, которую я мог придумать:Если вы не хотите, чтобы это в конечном итоге запускало ваш ящик из PID или памяти, вы можете добавить
eval
в начало последней строки, что составит 95 байтов.источник
let: h=09: value too great for base (error token is "09")
. Проблема заключается в том, что ведущие нули интерпретируются как восьмеричные константы, поэтому значение 09 недопустимо.BASH,
165141155 байтовисточник
sleep 9
к состоянию цикла while; удалите-
перед M в строке формата в строке 4. Вам также не нужно использовать $ перед именами переменных в арифметических выражениях, так что$((60-$m))
может быть$((60-m))
h=23; echo $((10#$h+1))
печатает 24 для меня.Гура , 138 байт
Довольно коротко и просто :)
источник
Gura.exe
и вставке в этот код выдается синтаксическая ошибкаsymbol k is not defined
.Ладно, давно не занимался гольфом, так что вот моя грустная попытка :)
Unix Korn Shell:
177171170 байтисточник
Mathematica, 235 байтов
источник
Обработка
204200198197 байтов5 байтов сохранено благодаря @L. Serné, используя умные троицы
Это выводит 30+ новых строк для каждого обновления (что происходит, когда кадр обновляется)
Ungolfed
источник
((i=hour())<10?" ":"")+i
на((i=hour())>9?i:" "+i)
сэкономил бы 2B дважды ... Удачи в дальнейшем игре в гольф!((i=hour()+1)>24?i=0:i)>9
становится(i=hour()+1)>9
, так какhour
выводит число в диапазоне 0-23, и даже с добавленным к нему 1, оно никогда не будет больше 24. Кроме того, вы должны переместить приращениеi
внутрь условия вfor
цикле как вы сделали в самом последнем цикле. Всего должно сэкономить 13В.i
внутрь условия цикла for,i
начнется как1
вместо,0
и мне нужно добавить еще один байт,i++<=minute()
и число байтов останется прежним. Но, тем не менее, спасибо, что помогли мнеC 239 байт
Вдохновленный записями Сета и Авеля, он будет выводить 0 вместо 24 в течение следующего часа, как требуется, и будет использовать 30 строк для очистки экрана.
источник
SmileBASIC, 55 байтов
Объяснение:
Примечание: SmileBASIC содержит только 50 столбцов текста, поэтому он не будет хорошо выглядеть ...
источник
C #
181176Этот код предполагает, что
using System.Threading;
строка включена.Полный класс:
источник
Console.ReadKey
оператор является избыточным. Единственный выход - закрыть окно консоли илиCtrl+Break
...using System.Threading;
необходимо включить его в число байтов, если вы его используете. То же самое сUsing System;
.