Никому не говорите, но я назвал машину для путешествий во времени моего дяди! Мой дядя, тем не менее, одержим простыми числами, и это видно из машины - он запрограммировал ее так, чтобы она могла переходить только к датам, которые суммируют до простого числа.
Так что это не может пойти, 1947-08-15
потому что 1947 + 8 + 15 = 1970, что не является простым числом. Это может пойти 1947-07-25
, потому что 1947 + 7 + 25 = 1979, который является основным. Поэтому, если я хочу вернуться, чтобы посмотреть празднования независимости Индии, похоже, мне придется пойти на несколько недель раньше и подождать эти 20 дней.
У меня есть несколько других дат, на которые я хочу пойти, и мне также придется перейти на дату до (или, если повезет, равно) моей целевой даты, которая суммируется с простым числом. Я, однако, нетерпелив и не хочу ждать слишком много - поэтому я хочу найти дату, которую я могу использовать, которая ближе всего подходит к моей целевой дате.
Можете ли вы написать мне программу, которая берет мою целевую дату и дает мне дату, которую я должен ввести в машину времени - ближайшую дату до или равную данной дате, чьи части складываются в простое число?
(Для этой задачи мы используем пролаптический григорианский календарь - это просто означает, что мы используем текущий григорианский календарь даже для периодов, когда люди тогда использовали более старый юлианский календарь.)
вход
- Свидание
- в идеале, любая дата в текущую эру (AD); практически, любое подмножество того, что ваш язык может естественно обрабатывать
- в любом удобном для восприятия формате
Выход
- Дата, ближайшая к входной дате, которая меньше или равна входной и чья дата + месяц + год суммирует простое число.
- в любом удобном для восприятия формате
⁺: «читаемый человеком», как день, месяц и год, все отдельно указаны в любом порядке
Контрольные примеры
1947-08-15
=> 1947-07-25
1957-10-04
=> 1957-09-27
1776-07-04
=> 1776-07-04
999-12-12
=> 0999-12-10
2018-06-20
=> 2018-06-15
1999-01-02
=> 1998-12-29
1319-12-29
=> 1319-07-01
(Спасибо @Shaggy, @PeterTaylor и @Arnauld за помощь в вопросе.)
Fri Jul 25 02:46:39 CEST 1947
)Ответы:
Красный , 87 байт
Попробуйте онлайн!
Более читабельно:
источник
JavaScript (Node.js) , 94 байта
Вводит как 3 целых числа в синтаксисе карри
(year)(month)(day)
. Возвращает разделенную дефисом строку с первым дефисом.Попробуйте онлайн!
Как?
Сначала мы конвертируем дату в формат JSON
yyyy-mm-ddT00:00:00.000Z
( ISO 8601 ), разделяем ее на'T'
, оставляем только левую часть и добавляем начальный дефис, который дает-yyyy-mm-dd
.Это выражение s теперь можно использовать
eval()
для получения противоположного n от суммы год + месяц + день .Мы используем вспомогательную функцию P () для проверки, является ли -n простым (в этом случае она возвращает 0 ). Если это так, мы возвращаем s . В противном случае мы попробуем еще раз с предыдущим днем.
источник
Python 2 ,
130127 байтовВход есть
year, month, day
.-3 байта благодаря Кевину Круйссену .
Попробуйте онлайн!
источник
Java 8,
144128 байтПопробуйте онлайн.
java.time.LocalDate
класс был улучшением по сравнению со старымjava.util.Date
, но почему они должны были сделать эти имена длиннее (getMonthValue
аgetDayOfMonth
неgetMonth
и?getDay
) ..>.>Объяснение:
источник
Рубин , 94 байта
Попробуйте онлайн!
Принимает один ввод даты и возвращает строку в формате ISO 8601 (
YYYY-MM-DD
).Он использует основной модуль Руби. Если это не разрешено или осуждается, то еще на два байта я представляю эту мерзость:
Рубин , 97 байт
Попробуйте онлайн!
Он использует проверку числа, являющегося простым из этого ответа stackoverflow . Я понятия не имею, как это работает, это похоже на колдовство. Тот же вход, что и выше, и тот же вывод.
источник
d
и пробела после негоif
, так что вы можете сбрить 3 байта из вашего первого ответа, удалив их. Ссылка?x*n !~ /^x?$|^(xx+?)\1+$/
= проверить, является ли n простым, сделать строку из n 'x, проверить, что это не 0 или 1 x (которые не являются простыми), и что он не совпадает ни с одним 2 или более х повторяются (совпадение^(xxxxx)\1+$
будет означать, что n делится на 5). Он злоупотребляет возвратом движка регулярных выражений, чтобы сделать нашу петлю для нас - это замечательно, это чудовищно, и жертва животных, вероятно, была вовлечена в его открытие.Рубин ,
5753 байтаПопробуйте онлайн!
Не моя идея - украденная у "мерзости" ИМП1
Оригинальная идея:
Рубин , 59 байт
Попробуйте онлайн!
источник
8e4
вместо этого работать?R , 117 байт
Попробуйте онлайн!
источник
F #,
134133 байта-1 байт благодаря sundar .
Попробуйте онлайн!
Суммируйте день, месяц и год и посмотрите, будет ли оно простым. Если это так, верните эту дату. Если нет, уменьшите дату на 1 день и попробуйте снова.
источник
-1.0
как-1.
в вызове AddDays.PowerShell ,
10590 байтПопробуйте онлайн!
Спасибо sundar за -13 байтов.
Принимает входные данные как
DateTime
2018-06-20
и сохраняет их в$a
. Тогда мы вfor
цикле. Каждую итерацию мы принимаем$a
-f
как ormattedyyyy+MM+dd
(то есть текущая дата, на которой мы+
знаками), добавляемая вместе|iex
(аналогичноeval
), умножая строку на1
s, чтобы сформировать унарное число, и используя регулярное выражение регулярной проверки определить, является ли текущая дата простой или нет. Если это не главное, мы.AddDays(-1)
должны вернуться назад на один день и продолжить цикл. Если это простое число, мы вырываемся из цикла и$a
помещаем в конвейер с неявным выводом.Полученный результат зависит от культуры. На TIO, который использует
en-us
, вывод имеет формат длинной даты, который выглядит следующим образомSaturday, July 1, 1319 12:00:00 AM
.источник
0001-01-01
сумме 3). Я взял трещину на эти изменения здесь .Баш ,
114108 байтПопробуйте онлайн!
Мой первый в истории гольф Честно говоря, моя первая настоящая bash-программа ... тест на первичность, взятый отсюда .
Иногда может произойти сбой при изменении часового пояса, но TIO использует UTC, поэтому он должен работать.
источник
@$
, дает рабочий код на 110 байтов .C (gcc) , 167 байтов
Попробуйте онлайн!
Спуститься
Функция антипрайм-проверки. Поскольку самый ранний действительный год, с которым нам нужно иметь дело, это 0001-01-01, наименьшее число, о котором нам нужно беспокоиться, это 3, так что проверки в специальном случае для n == 2 или n <2 удаляются. r установлен в истинное значение, если n не простое число. r сохраняется глобальным, так как не возвращая его, он сохраняет два байта (
i=n;
чтобы вернуть v,r
для проверки глобального). Я установил в 1 вызывающую функцию, чтобы сохранить еще 2 байта.Мы берем дату как три отдельных целых числа и запускаем основной цикл, который продолжается до тех пор, пока y + m + d не будет простым числом. Тогда мы подходим к основной функции:
Может показаться сомнительным использование m и y как в проверке високосного года, так и в качестве индекса строки, когда порядок оценки не указан. К счастью, мы проверяем только високосный год, если m == 2, что не может произойти одновременно с изменением m и y, поскольку это происходит только с января по декабрь, поэтому проверка високосного года никогда не беспокоит порядок оценки.
Наконец, результат выводится на STDOUT:
источник
C # -
281239232 символовungolfed:
Сделал код менее эффективным, но меньше. Цикл Prime теперь будет идти к целому числу, а не к квадратному корню. Это также обработает все четные числа.
источник
public
. Кроме того, поскольку не представляется возможным получить ввод даты в качестве вызывающего параметра, вы можете получитьMain(string[]a)
и затемDateTime.Parse(a[0])
MATL , 14 байтов
Попробуйте онлайн!
С другой стороны:
15 байт
Попробуйте онлайн!
источник