Вы знаете, что такое палиндром , прайм и свидание .
Ваша задача - перечислить все даты за 100 тысяч лет, которые соответствуют всем трем характеристикам.
Nevermind ничего , кроме номера, используйте следующие форматы: ГГГГММДД и YYYYYMMDD .
Даты между 0000-01-01 и 9999-12-31 должны быть напечатаны как 8-значные палиндромы (если есть?), А даты между 10000-01-01 и 99999-12-31 должны быть напечатаны как 9-значные палиндромы.
Не обязательно перечислять даты в хронологическом порядке.
Пример части правильного вывода.
Первые три 9-значные простые палиндромные даты:
...
100111001
100131001
100161001
...
правила
Применяются стандартные лазейки .
02-29
существует только для лет, которые делятся на 400 или (делятся на 4 и не делятся на 100).Ответы:
Ruby ,
144141 байт (134 + 7 для-rprime
флага)Сохранено 3 байта благодаря benj2240 !
Попробуйте онлайн!
Алгоритм:
Time
экземпляра с учетомy
,m
,d
значения. Если полученный объект времени имеет#day
значение, равноеd
, то это была действительная дата. В противном случае это сместит дату (например,Time.new 2018,2,30
возврат2018-03-02
).Внутренний цикл изначально был функцией, которая вызывалась для каждого элемента в
(?0..?9)
диапазоне, а также для пустой строки.Так как пустая строка не дала никаких результатов (нет действительных 8-значных простых палиндромов), я решил удалить ее и выполнить рефакторинг для этой версии.
источник
t
переменную: TIOPython 2 ,
116107128122119 байтВторая половина 4 - й строки вдохновлена mxdsp «s ответа здесь на другой вопрос гольфа .
объяснение
Функция
g()
принимает аргумент только для инициализацииn
переменной, используя ее значение по умолчанию. Начальное значение - это нечетное число, которое как можно короче и максимально возможно, но все же меньше первого действительного ответа 100111001.Цикл, пока не
n
достигнет конца диапазона дат 10 9 . Инкрементn
на 2.m
является месяцем датыn
.Если
n
действительная дата, палиндром и штрих, выведите ее:0 < m < 13
проверяет, чтоm
является действительным месяцем.n % 100 < 31 + (m+m/8)%2
проверяет, чтоn
день месяца действителен.(m+m/8)%2
добавляет1
за все месяцы с 31 дня. Кредит на это идет к ответу ArmanX . На 29-30 февраля нет простых чисел.`n`[::-1] == `n`
. Обратные черты преобразуютсяn
.[::-1]
переворачивает строку2**n % n == 2
это тест на примитивность Ферма . Этот тест только вероятностный. Есть также не простые числа, которые соответствуют. Но не в диапазоне чисел, на которые мы смотрим.источник
APL (Dyalog Unicode) , 155 байт
Попробуйте онлайн!
Это Tradfn ( трады itional х unctio п ) , который принимает один аргумент
arg = yyyymmdd
илиarg = yyyyymmdd
. Использование естьf arg
.Это не будет ничего выводить, когда аргумент начинается с,
10000101
потому что он не находит простую дату палиндрома за 60 секунд.Вот менее удачный подход, который будет выводить пример вывода OP
( Попробуйте онлайн! )
Обратите внимание, что оба кода одинаковы до тех пор, пока не будут рекурсивно вызваны функции для следующей даты. В то время как версия для игры в гольф просто называет это так
f arg+1
, код с меньшим количеством игроков скачет изо дня31
в день01
и из месяца12
в месяц01
, что значительно ускоряет его.Как это работает:
источник
Python 3, 163 байта
Решение довольно длинное (и, вероятно, может быть улучшено), но не использует никаких встроенных функций для проверки простого числа / даты / палиндрома. Несколько неутешительная версия для ясности:
Действительные даты генерируются путем выбора месяца и дня. Как отмечалось ранее, необходимо учитывать только размер 9. Также обратите внимание, что високосные годы не учитываются. Это не требуется из-за счастливого совпадения, что простые числа палиндрома длины 9, заканчивающиеся на 0229, просто не существуют (другие аномалии даты, такие как 30 февраля 1712 года, могут быть отклонены по той же причине).
Затем выбирается средняя цифра, и выполняется первичный тест. Из-за того, что основной тест должен был быть как можно короче, он очень наивен и, следовательно, крайне медленен. Использование внешней библиотеки может решить эту проблему (и сэкономить несколько байтов), но, как уже упоминалось, я не хотел использовать какую-либо.
источник
WolframLanguage (Mathematica) 187 байт
Там может быть некоторое уменьшение в размерах, которые будут найдены. Объяснение, чтобы следовать ...
Контрольные примеры
(* {"100111001", "100131001", "100161001"} *)
Объяснение кода
DayRange[d@#,d@#2]
возвращает все даты между{10011, 10, 1}
и{10017, 1, 1}
. В этом случае возвращается приблизительно 5 лет, 4 месяца дат (точно 1920 дат). Високосные годы учитываются.Даты возвращаются в стандартном формате Wolfram. Например, первая дата будет выглядеть как
DateObject[List[1,1,1],"Day","Gregorian",-5.
] `#[[1]] & /@
удалит часть даты, в каждой дате, которая касается нас. В этом примереDateObject[List[1,3,7],"Day","Gregorian",-5.]
возвращает сокращенную дату{1,3,7}
.t/@p[#3,2]}
илиToString/@Padleft[#3,2]
дополняет третий элемент, а именно 7, стоящий «на 7-й день месяца» как"07"
. Аналогичное дополнение предоставляется для однозначного символа месяца марта, а именно,3
возвращается как"03"
.p[#, If[Length@# < 5, 4, 5]]
дополняет год нулями до длины строки из 4 или 5 цифр. В этом случае январь, а именно1
, возвращается как «00001»."" <>...
присоединяется к струнам. В этом случае он возвращается"000010307"
.Cases[...x_ /; PalindromeQ@x && PrimeQ@ToExpression@x]
возвращает те случаи, среди дат 1920 года, которые являются палиндромами и простыми числами.источник
Javascript ,
187177Допущения: не совпадают 4-значные годы; нет подходящих дней в феврале между 29-30
Это работает так:
История:
Заметки:
В ходе тестирования я обнаружил, что нет действительных совпадений, которые имеют 4-значные годы или выпадают на 29 или 30 февраля. К сожалению, ради кода, ровно пять (недействительных) результатов выпадают на 31-е число различных месяцев. это только 31 день.
источник
Java 10,
329327320318312308307264 байта-1 байт благодаря @assylias .
Объяснение:
Попробуйте сделать это онлайн (обратите внимание: часть первичной проверки была заменена на более эффективный метод разделения, хотя даже после этого он истекает через 60 секунд, выводя только первые ~ 115 палиндромных простых чисел).
Pastebin из всех 197 выходов из местного запуска.
источник
if(t.equals(new StringBuffer(t).reverse()+"")
->if(t.contains(new StringBuffer(t).reverse())
сохранить 1 символ (работает, потому что мы знаем, что обе строки имеют одинаковую длину). Это не так много :-(VBA, 347
источник
DateString
это произвольное имя переменной, так что вы должны быть в состоянии сократить его до одного символа, верно?Чисто ,
262... 213 байтПопробуйте онлайн!
источник
Javascript ,
234229 байтНемного громоздко, но выкладываю его, чтобы завалить шар JS. Любые предложения приветствуются!
Ungolfed:
Как это работает:
Магия переключения цифр основана в основном на экспериментах.
Я начал с выяснения, из какого числа вычесть, чтобы получить перевернутую версию. Я заботился только о последних двух цифрах.
Так что, если мы возьмем
n
, найдитеk
такn+k=flip(n)
. Для10<n<20
k
начала с 101 и с увеличением с шагом 9. Однако, дляn<10
, это было 100. Я предполагал, чтоk
увеличивается для каждого прыжка 10, и после небольшой тряски я понял, что это было правильно.Итак,
k=100+9*n+n//10
где // означает целочисленное деление.Таким образом, мы получаем
n+k = n+(100+9*n+n//10) = 100+10*n+n//10 = flipped(n)
.Я не могу ни доказать, ни утверждать, что это работает для любого числа, но оно дало правильные результаты для чисел, используемых здесь.
За тест на первичность, ответьте на ответ Кевина Круйссена . У меня была немного более короткая версия, но я не мог понять это правильно:
Я пропустил тест на палиндром, выполнив циклы по месяцам, дням и средней цифре, чтобы я мог строить строки
dDmMxMmDd
, гдеD
первая цифраd
дня, вторая и т. Д.история
Сохранено 5 байт за счет избавления от условной части q
источник
f
результат только в качестве параметра дляq
, поэтому вырежьте посредника и напишитеf=n=>''+n%10+(n/10|0)
, а результат q всегда используется как строка, так что вы можете писатьq=n=>n<10?'0'+n:n
.APL NARS 626 байт, 313 символов
это вывести за 50 секунд, чем остановить самому (потому что иначе я не могу остановить программу для копирования и вставки теста, потому что я не знаю, как остановить программу, не закрывая окна интерпретатора):
источник
Юлия 0.6 , 109 байт
Ссылка идет на более длинную версию с двумя отличиями:
Попробуйте онлайн!
источник