Поскольку сегодня отмечается 26-й прыжок в секунду , ваша задача будет выводить дату и время каждой прыжковой секунды в GMT или UTC, которая произошла до сих пор, а также дату, которая произошла сегодня.
вход
Там нет ввода.
Выход
1972-06-30 23:59:60
1972-12-31 23:59:60
1973-12-31 23:59:60
1974-12-31 23:59:60
1975-12-31 23:59:60
1976-12-31 23:59:60
1977-12-31 23:59:60
1978-12-31 23:59:60
1979-12-31 23:59:60
1981-06-30 23:59:60
1982-06-30 23:59:60
1983-06-30 23:59:60
1985-06-30 23:59:60
1987-12-31 23:59:60
1989-12-31 23:59:60
1990-12-31 23:59:60
1992-06-30 23:59:60
1993-06-30 23:59:60
1994-06-30 23:59:60
1995-12-31 23:59:60
1997-06-30 23:59:60
1998-12-31 23:59:60
2005-12-31 23:59:60
2008-12-31 23:59:60
2012-06-30 23:59:60
2015-06-30 23:59:60
правила
Поскольку я сомневаюсь, что есть много встроенных модулей, которые позволяют високосные секунды, я позволю им.
Стандартные лазейки запрещены.
Самый короткий код выигрывает.
Формат даты должен содержать месяц с нулем и год из 4 цифр, а также военное время и пробел, отделяющий время от даты. Ставить UTC
в конце необязательно. Ваш выбор тире или косой черты.
РЕДАКТИРОВАТЬ: Да, как и предполагалось, это стало проблемой кодирования. Если бы только кодирование могло решить проблему високосного второго, ... тогда весь наш код был бы намного более практичным. Может быть, нам нужны идеи для более забавных задач с практическим использованием?
источник
Ответы:
CJam,
72706964 байтаПопробуйте онлайн в интерпретаторе CJam .
идея
Мы начинаем с кодирования каждой високосной секунды как 2 * (Y - 1972) + D , где D равно 1, если это происходит в декабре, и 0 в противном случае.
Массив всех закодированных високосных секунд:
Давайте назовем этот массив L .
Поскольку массив находится в порядке возрастания, мы можем хранить последовательные различия вместо фактических чисел:
Обрабатывая этот массив как цифры от базового числа 15, мы получаем целое число
какие цифры в базе 240 (приведенные к символам)
Код
источник
R,
7875 байтовВы говорите, встроенные модули? Что ж...
R имеет автоматическую переменную,
.leap.seconds
которая содержит дату и время каждой вставки високосной секунды, указанной в местном времени системы. Начиная с версии R 3.2.0, это не относится к сегодняшнему дню, поэтому я добавил это вручную.Ungolfed + объяснение:
Вы можете попробовать это онлайн !
источник
HTML, 594 байта
¯ \ _ (ツ) _ / ¯
источник
working
HTML-кодcode golf
вызовах.C
160146141140 байтПервый раз, не уверен, что такое "стандартные лазейки". У меня есть предупреждения printf, конечно.
160 байтов:
Первоначальная идея заключается в кодировании високосных секунд, используя два бита в год: один для июня и один для декабря. Кодирование потребляется по одному биту за счет внутреннего цикла while. Без 128-битного целого числа необходим внешний цикл while. Остальное все бухгалтерия и математика. :-)
141 байт:
Применение предложенных советов уменьшает его до 146 байт. Затем я нашел способ упростить внешнее условие while (от Y <2000 до просто Z), уменьшив его до 141 байта. Так близко к твиту!
140 байт:
Я заметил, что черту в дате можно устранить, сделав день отрицательным. Не может сделать это и с месяцем из-за нуля в июне. Но, по крайней мере, это сейчас вписывается в твит!
Красивая версия:
Бонусная версия:
Я исключил внешний цикл, сдвигая одно 64-битное целое число в другое, но оно составляет 150 байтов из-за довольно длинного «unsigned long long»; если бы я мог использовать что-то вроде «uint64», это было бы 138 байтов.
источник
for
цикла сэкономит несколько байтов. Кстати,int main()
->main()
. Вы можете найти это очень полезным.X>>=1
то же самоеX/=2
,6*(2-Z)
то же самое12-6*Z
, и4362608640
на один байт короче, чем0x104082000
.int
В передней части неmain()
является необходимым, и если вы меняетеmain()
вmain(Z)
то вы можете удалить объявлениеZ=1
.if(X&1)printf(...);
с помощьюX&1?printf(...):1;
чего экономит 1 байтwhile(X){...}
использовать запятые, чтобы вы могли удалить скобки,while(X)X&1?printf("%d-%02d-%d 23:59:60\n",Y,6*(2-Z),31-Z):1,Y+=Z^=1,X>>=1;
сохраняя еще 2 байтаPython 3, 91
Использует кодировку и форматирование строки Sp3000 , но сохраняет значения в 3-байтовом объекте Python, а не в магическом числе.
Для кодирования требуется только 86 из 256 возможных значений байтов, поэтому для удобства просмотра используется диапазон печатаемых символов.
источник
Brainfuck, 806
Вы можете запустить его на этом онлайн-переводчике.
источник
Python 2,
111104 байтаБазовое кодирование и более базовое кодирование.
источник
GNU sed + дата: 112
Обычные дистрибутивы Linux также имеют встроенные дополнительные секунды. Использование GNU sed и date:
GNU sed + дата: 90
Сохранение нескольких символов путем обрезания пути:
GNU sed + дата настроена Тоби Спейт: 84
Глубокая игра в гольф предлагается в комментариях:
источник
date
(GNU 8.23) отображает их как первую секунду следующей минуты. Что вы используете, что понимает 60-секундную минуту?-r
флагом, подставивdate
в сs///e
модификатором, и замена%Y-%m-%d
с%F
вdate
: TZ = UTCsed -nr 's/^([0-9]+).*/date -d "1900-1-1 \1sec" "+%F %T"/ep' /u*/s*/z*/leap*
1899-12-31 \1sec
для даты, и жесткое кодирование23:59:60
как время:sed -nr 's/^([0-9]+).*/date -d "1899-12-31 \1sec" "+%F 23:59:60"/ep' /u*/s*/z*/leap*
JavaScript ( ES6 ) 125
Новая строка внутри `` значима и считается.
Чтобы проверить, запустите приведенный ниже фрагмент (это EcmaScript 6, только Firefox)
источник
PHP, 198 байт
К сожалению, я не знаю, смогу ли я вставить
\n
в функцию даты. Если так, то это на 3 байта меньше из-за.""
.источник
(int)
и удалить пробелы. Date выдает ошибку, если часовой пояс по умолчанию не установлен, отключите его с помощью@
. 187 байт:foreach([.5,1,2,3,4,5,6,7,8,9.5,10.5,11.5,13.5,16,18,19,20.5,21.5,22.5,24,25.5,27,34,37,40.5,43.5]as$d){$h=$d-ceil($d);echo@date("Y-m-d 23:59:60",mktime(0,0,0,-6*$h,31+$h,$d+1972))."\n";}
8086 машинный код + DOS, 92 байта
Hexdump кода:
Для запуска запишите 92 байта в
com
-файл и запустите его под 32-битной Windows или DOSBox.Код использует растровое изображение с 87 битами, по одному на полгода. Биты разбиты на группы по 16, начиная с MSB.
Расшифровка растрового изображения:
Из-за структуры кода некоторые биты теряются при декодировании, поэтому мне пришлось их повторять. Это повторение не раздувает растровое изображение, потому что я все равно должен был дополнить 87 бит до 96 бит.
После распечатки (или не распечатывания) високосной секунды код увеличивает дату на полгода, используя манипуляции с кодами ASCII выходного сообщения.
Исходный код (может быть собран с
tasm
):источник
Pyth -
8884 байтаОбращенные к полукоксу для сжатия данных и сохраняет в
06-30
сравнении с12-31
данными , как двоичное число.(там есть место в конце)
Попробуйте здесь онлайн .
источник
Python 2,
123121116114111Мне удалось сделать его довольно коротким, но я не уверен, насколько он может быть короче. Я пытался использовать
exec
, но форматирование становится слишком дорогим.Я использовал основную 16 кодировку таблицы со связанной страницы Википедии.
Изменить: Использование шестнадцатеричного кодирования короче, чем база 36 (см. Версию с меньшим количеством гольфа)
Попробуй здесь
Менее гольф:
источник
C
155149147 байтВот еще один подход в C, использующий строки и кодирование длин серий. Не так кратко, как мое другое решение C, но, возможно, его можно улучшить?
155 байт:
Использование строки для хранения месяца / дня.
149 байт:
Исключение строки месяца / дня.
147 байт:
Устранение инициализации года.
144 байта:
Если бы я перекодировал буфер, чтобы счетчик пропусков был применен до (а не после) выполнения, я мог бы переупорядочить операторы во внешнем цикле while, использовать оператор запятой и удалить скобки, сохранив 2 байта.
Я могу сохранить еще один байт, сделав день отрицательным (как в моем другом решении).
Милая:
Объяснение:
Прогоны кодируются в байтах. Каждый байт имеет один бит, чтобы сказать, будет ли это июнь или декабрь, 3 бита для счетчика длины, 3 бита для счетчика пропусков и 1 неиспользованный старший бит.
Число пропусков - это количество лет, которое нужно пропустить после пробега; он смещен на -1, чтобы учесть две високосные секунды в 1972 году. Длина - это сколько лет подряд; это, вероятно, может быть смещено на +1, но это не в настоящее время.
Таким образом, под байтом подразумевается: «ДЛИВАЙТЕ годы високосных лет в июне (или ДЕКАБРЕ), затем пропустите SKIP-1 года», прежде чем переходить к следующему байту.
Байты смещены на 33, чтобы сделать их читаемыми и избежать сложного кодирования.
Это означает, что хотя у нас достаточно пропущенных битов для покрытия 1998-2005 гг., Мы находимся за пределами диапазона ASCII, поэтому у нас есть дополнительный прогон нулевой длины. Кроме того, 1979 год появляется сам по себе, потому что длина 1972-1979 годов слишком велика.
В байтах достаточно битов, поэтому в конечном итоге эти проблемы могут быть исправлены.
источник
q / kdb +,
959493 байтаобъяснение
Для каждого года +1 кодируйте годы с 1905 года как символ ASCII, например:
6h$x
витки"D"
назад к68
. Посколькуq
дата начала эпохи2000.01.01
, мы вычитаем95
и выполняем преобразование целых чисел в дату"d"$"m"$-12*95-6h$x
.Причина, по которой мы + 1 выше, состоит в том, чтобы вычесть количество дней с начала следующего года, чтобы получить фактический год 31 декабря или 30 июня, а именно 1 или 185 дней. Таким образом,
"DEFGHIJKSUV[^eh"
представляет годы с високосной секундой в декабре, а"DMNOQXYZ]lo"
для лет - в июне. Спаривание-вычитание производится с помощью(a;b){x-y}'(c;d)
, гдеa
иb
в годы , которые будут вычитаютc
иd
количество дней соответственно." "0:([]...)
подготавливает результаты к правильному форматированию с небольшим предупреждением о том, что будет сгенерирован заголовок столбца.1_
отбрасывает этот заголовок и, наконец, применяется,asc
чтобы получить правильный порядок.редактировать : «заново» вычитать 95 лет вместо 100 (сохраняя 1 символ).
edit 2 : изменение порядка расположения операндов внутри функции преобразования целых чисел в дату.
источник
Питон,
204201Вы можете играть с ним на repl.it .
Изменить: тщательно избили! Ответы на сжатие поразительно короткие.
источник
PHP, 164 байта
Это всего лишь несколько модификаций идеи @ Voitcus
источник
Питон,
221217Некоторые идеи
По сути,
d(x)
распаковывает вектор из 3 целых чисел из одного двузначного целого числа.d(x)
построен как обратная функция (в течение 26 секунд високосных секунд)c(v)
, которая, в свою очередь, представляет собой функцию сжатия, которая превращает 3-х ряд, такой как (1998, 12, 31), в число, подобное 85. Для получения списка [20 , 21 ... 28,58] Я разработал другой алгоритм, чтобы убедиться, что функция сжатия является биективной по области. То есть я убедился, что следующая программа не производит дубликаты, и использовал ее вывод в качестве списка программы выше.Функция сжатия
c(v)
была разработана, чтобы быть биективной, используя очень простую схему. Давайте возьмем в качестве примера (1998,12,31).Я написал программу, чтобы убедиться, что это правда, а затем я определил
d(x)
как обратноеc(v)
. В нашем примере c ((1998,12,31)) равно 85, а d (85) печатается правильно1998-12-31 23:59:60
.источник
q=x%10
и заменитьq
сx%10
везде. Это короче. Я также дам полезное описание некоторых дополнительных игр в гольф на вашей программе здесь . Я рекомендую просмотреть страницу Советы по игре в гольф на Python .gzip, 114 байт
HexDump:
1f8b080853f9975502006c006dd04b0a80300c84e1bde01dbc40218fa6697aff8309e2a6fa6f3f86cc10adb426a3b95ce62b6a0d398f07d59aeb8e4ed80983701026e1242cc0a9307e1aa11306615211b59710527b3961270cba9994fc7fc944829092faeedc313e7803993cfafb20020000
Создайте файл с байтами, описанными выше.
Распакуйте с помощью gunzip или другой программы распаковки, чтобы получить новый файл с именем «l». Этот файл содержит желаемый результат.
источник