Дата может быть представлена целым числом без знака как таковое: ГГГГММДД. Что вам нужно сделать, это написать самую короткую программу или функцию, которая вычисляет самую последнюю дату, число которой делилось на данное число n
(включая сегодняшнюю дату), а затем возвращает эту дату в формате, показанном выше. Если никогда не было даты (между 00000101 и сегодня включительно), делимой на данное целое число, вы должны вернуть -1.
Примеры
Current Date Input Output
30 July, 2014 4 20140728
30 July, 2014 7 20140729
28 July, 2014 4 20140728
28 July, 2014 7 20140722
28 July, 5 90000 -1
вход
Вы можете читать из STDIN или принимать аргумент функции или даже ожидать, что ввод будет сохранен в переменной. На входе будет целое число без знака.
Выход
Записать в STDOUT или вернуть (или сохранить в переменной) целое число, представляющее дату в формате ГГГГММДД.
ограничения
Вы можете использовать любую стандартную библиотеку, которую предлагает ваш язык. Применяются стандартные лазейки .
Условия выигрыша
Это код-гольф , поэтому выигрывает самая маленькая программа (в байтах). В случае ничьей победит ответ с наибольшим количеством голосов.
Ответы:
Mathematica,
9360 байтОжидает, что вход будет сохранен в
n
.Обратите внимание, что вертикальная линия
∣
- это символ Юникода для «деления», который я посчитал как 3 байта (UTF-8).Редактировать: нашел хитрый трюк, чтобы избежать раздутой
DateString
и спецификации формата :).Изменить: полностью забыл о
-1
требовании. Исправлено сейчас.Вот объяснение
Обратите внимание, что я использовал
|
вместо∣
объяснения, потому что Unicode портит моноширинку.источник
Python 2 - 150
Спасибо @ chill0r за предложение удалить days = и Jason S за подсказку, что блок try может быть уменьшен до одной строки.
источник
days=
вt-=d.timedelta(days=1)
. Это тоже отлично работает (по крайней мере, в python3)int(t.strftime("%Y%m%d"))
и отбрасыватьre
, (2) использовать одну строку,try
потому чтоt-=d.timedelta(1)
нужно только в нем.strftime
в более ранние даты работает в python3, проверил, и я получаю ошибку в python2C # 136
С пересмотренными спецификациями, функция, которая принимает unsigned int и возвращает int.
152 символа с переменным вводом / выводом
Используя слабые требования к вводу / выводу, ввод должен быть сохранен в переменной
n
(в настоящее время считаются все символы, кроме целочисленного литерала), а вывод предоставляется с переменнойs
.204 символа с STDIN / STDOUT:
источник
T-SQL (2012) - 148
Предполагается, что есть свободная переменная @n со значением n.
источник
Golflua
9086Безголосая версия Луа будет,
источник
МАТЛАБ: 61
Предполагается, что делитель хранится в
n
. Результат будет сохранен в переменной с именемans
.Комментируемая версия:
Сгенерирует ошибку, если результат не найден, но ответ по-прежнему доступен в переменной, несмотря на это.
Ошибки можно избежать за счет 2 дополнительных символов:
источник
PHP (92 = 85 + 7)
Ожидается, что вход будет сохранен в
$n
.Я просто вспомнил, почему я больше не люблю PHP =)
РЕДАКТИРОВАТЬ: Теперь -1 спецификации также реализованы.
источник
JavaScript (ES6) 115
Ожидается число в переменной n, результат сохраняется в переменной r. Каждый день проверяется, начиная с текущей даты и по убыванию - должен быть лучший способ.
Более того, при использовании стандартных функций дат в JavaScript, все даты являются григорианскими вплоть до 1-го года (соответственно високосные годы неверны до григорианской реформы).
источник
C # - 144 (или 124 в LINQPad) + 1 для каждой цифры в
n
Это предполагает, что вход будет в переменной
n
. К концу выполнения желаемое значение будет в переменнойr
. Это считается00010101
первой датой, потому что дата00000101
не существует. Предложения по улучшению всегда приветствуются.Версия LINQPad:
источник
Groovy -
301300 символовОчень простой (и медленный), без хитростей, чтобы скрыть тот факт, что он использует Joda Time.
Golfed:
Пример выполнения (30.07.2014):
Ungolfed:
источник
R
146139Удачи с датой, которая не работает.
microbenchmark
сообщает, что для возврата на 15 дней требуется около полсекунды. По состоянию на 31 июля 2014 г. на то, чтобы выплюнуться, потребуется около 20 миллионов секунд (~ 23 дня)-1
, по крайней мере, согласно оборотной стороне конверта.редактировать : некоторые ярлыки в комментариях
источник
!d
короче чемd==F
и!z%%n
чемz%%n==0
. Кроме того, превращениеas.numeric(gsub("-","",...)
в функцию должно также уменьшить количество символов. Тем не менее, хорошая работа!as.real
часто это хорошая, более короткая альтернативаas.numeric
.as.real
не существует R 3.0.0. Но у нас все еще есть,as.double
который на один символ короче.paste0
по моему.Rprofile
естественно :)Matlab 104
Ungolfed:
РЕДАКТИРОВАТЬ: мне удалось немного оптимизировать его, но @DennisJaheruddin имеет реальное решение здесь
источник
-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Python 3 -
151148 байт, генераторыСпасибо @ nyuszika7h за
import*
предложениеисточник
Ruby 103
вход
Ожидает, что значение делителя будет присутствовать в переменной
n
.Выход
Возвращаемое значение
f
функцииПример в сети: http://ideone.com/LoYxG4
источник
Ява: 373 символа
Это порт ответа Groovy, который использует Joda Time.
Golfed:
Примеры прогонов (с joda-time-2.4.jar на пути к классам:
Ungolfed:
источник
java.time.*
в последней версии Java.Bash + coreutils (8.21), 67 байт
seq
генерирует целые числа от 1 до 9 9 , по одному на строку, и форматирует его как-<x>day
date -f
которому интерпретируется каждая строка и выводится дата, отформатированная вdc
выражение, например[pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p
(пробелы добавлены для удобства чтения)[pq]
определить макрос для печати вершины стека, затем выйтиsp
сохранить макрос в регистре p[pq]
определите макрос для нажатия -1, напечатайте верхнюю часть стека, затем выйдитеsq
сохранить макрос в регистре q20140728
целое число встроенной датыd
дубликат вершины стекаA1
нажать 101 (00000101)=q
2 верхних значения стека: сравните дату и 101 и вызовите макрос,q
если он равен7
толкатель%
поп делитель и делитель, разделяй и толкай остаток0
нажать 0=p
2 верхних значения стека: сравните остаток и 0 и вызовите макрос,p
если он равенd
дубликат вершины стекаp
называется: печатает целое число даты иdc
полностью выходитdc
выражения передаютсяdc
для оценки. Как толькоdc
печатает правильное значение и выходит, остальная часть конвейера срываетсяВыход:
Поскольку эта программа генерирует целые числа от 1 до 9 9 , она будет действительна в течение чуть более 1 миллиона лет в будущем. Я надеюсь, что это ограничение приемлемо ;-)
Спасибо @ WumpusQ.Wumbley за сокращение возврата -1.
источник
|grep .||echo -1
в конец конвейера или используйте zsh, где вы можете вкладывать расширения, напримерecho ${$(cmd):-1}
(это будет стоить вам обратной косой черты в другом месте ...)sizeof time_t
проблемой, поскольку граница, на которой она прорывается, составляет 2 ** 31 секунду до 1 января 1970 года. Моя старая установка тоже патетически 32-битнаяПитон: 134 байта
Не удастся победить нынешнего лидера, и это не намного лучше, чем лучший ответ Python, но я решил опубликовать свое лучшее решение Python.
Ungolfed:
источник
from datetime import*
вместоimport datetime as d
,timedelta(1)
вместоd.timedelta(1)
иyield
вместоreturn
.JavaScript (ES5) - 94
Он ожидает ввод в переменной
x
и помещает вывод вo
.источник
к4
(84)(73)Это просто начальная версия с первым алгоритмом, который пришел в голову; Я уверен, что лучшее возможно как по производительности, так и по длине.
Эта версия жестко кодирует часть «сегодня» (это
.z.D
); измените его на date literal (yyyy.mm.dd
) или на целое число в системе q date (количество дней с 1 января 2000 года) для запуска тестовых случаев. (q не будет анализировать литералы даты раньше, чем в начале восемнадцатого века, поэтому для дат до этого вам нужно будет определить значение и напрямую использовать соответствующее целое число. 1 января "AD 0" из спецификации поворачивается out to be-730457
, который используется в коде функции. 28 июля AD 5 из последнего контрольного примера оказывается-728450
.)Данные тестовые случаи:
редактировать:
Это другой подход, который использует один из операторов сходимости для уменьшения даты до тех пор, пока она не найдет делимую или не пересечет границу 1/1/0000. Это также делает преобразование из даты в целое число немного по-другому.
Тестовые случаи, на этот раз все сразу:
источник
VBA 343 байта (модуль)
источник
Sub d(i):a=Now:b=a:Do Until b/i=Int(b/i):a=DateAdd("d",-1,a):b=Format(a,"yyyymmdd"):If b="01000101"Then:b=-1:Exit Sub:Loop:Debug.?b:End Sub
139 байтPowerShell - 76
Это зависит от числа, хранящегося в переменной
$n
.источник