Некоторые числа, такие как , являются палиндромами в базе 10: если вы напишите цифры в обратном порядке, вы получите тот же номер.
Некоторые числа являются суммой 2 палиндромов; например, или .
Для других чисел 2 палиндромов недостаточно; например, 21 нельзя записать как сумму 2 палиндромов, и лучшее, что вы можете сделать, это 3: .
Напишите функцию или программу, которая принимает целочисленный ввод n
и выводит n
число, которое не может быть разложено как сумма 2 палиндромов. Это соответствует OEIS A035137 .
Однозначные числа (включая 0) являются палиндромами.
Стандартные правила для последовательностей применяются:
- Ввод / вывод является гибким
- Вы можете использовать 0- или 1- индексацию
- Вы можете вывести
n
th-й термин, или первыеn
термины, или бесконечную последовательность
(В качестве обозначения: все целые числа можно разложить как сумму не более 3 палиндромов.)
Контрольные примеры (1-индексированные):
1 -> 21
2 -> 32
10 -> 1031
16 -> 1061
40 -> 1103
Это код-гольф, поэтому выигрывает самый короткий ответ.
n
, выведите n-й член последовательности OEIS An? Звучит многообещающе ...Ответы:
JavaScript (ES6),
93 83 8079 байтовСохранено 1 байт благодаря @tsh
Возвращает й член, 1-индексированный.n
Попробуйте онлайн!
Как?
Учитывая , мы проверяем, существует ли такой, что и являются палиндромами. Если мы найдем такое , то будет суммой двух палиндромов.n 1≤k≤n k n−k k n
Хитрость в том, чтобы обрабатывать и одновременно, проверяя одну строку, состоящую из конкатенации , и .k n−k k n−k k
Пример:
Для :n=2380
комментарии
NB: это версия без
eval()
читабельности.источник
i=>eval("for(n=k=1;k=(s=[...k+[n-k]+k])+''!=s.reverse()?k-1||i--&&++n:++n;);n")
79 байтовi=>eval("...")
ES6 позволяет использоватьi=>eval`...`
, сохраняя 2 байта;n
в конце.eval()
потому что он не приводит свой аргумент к строке. Удаление;n
приведет к синтаксической ошибке, а удалениеn
приведет к возврату функцииundefined
.Желе ,
16 109 байт-1 байт благодаря Эрику Аутгольферу . Выводит первыеn членов.
Попробуйте онлайн!
Я пытался придумать другую идею по сравнению с моим первоначальным подходом. Давайте рассмотрим процесс мышления:
Первоначально тест работал следующим образом: он генерировал целочисленные разделы этого числа, затем отфильтровывал те, которые также содержали непалиндромы, а затем подсчитывал, сколько существует списков, подходящих для длины 2. Это было явно не слишком эффективно с точки зрения длины кода.
Генерация целочисленных разделовN и последующая фильтрация имели 2 основных недостатка: длительность и эффективность по времени. Чтобы решить эту проблему, я подумал, что сначала придумаю метод, который генерирует только пары целых чисел (x,y) которые суммируют с N (не все списки произвольной длины), с условием, что оба числа должны быть палиндромами.
Но, тем не менее, я не был удовлетворен «классическим подходом» к этому. Я поменял подходы: вместо генерации пар , давайте сосредоточим программу на отдельных палиндромах . Таким образом, можно просто вычислить все палиндромыx ниже N , и если N−x также палиндром, то мы закончили.
Код Объяснение
* Любая другая ненулевая цифра работает, в этом отношении.
источник
Желе , 11 байт
Попробуйте онлайн!
Полная программа примерно работает так:
Вы можете подозревать, что шаг 5 на самом деле не выполняет работу, которую должен. Мы действительно не должны уменьшать z, если все пары, которые суммируют с x, являются палиндромными. Однако мы можем доказать, что этого никогда не произойдет:
Мы заключаем, что, если мы начнем с установки значения x, равного или превышающего 10 , у нас никогда не будет всех пар неотрицательных целых чисел, сумма которых равна x, является парами палиндромов.
источник
ŻŒḂ€aṚ$Ṁ¬µ#
Сетчатка ,
135102 байтаПопробуйте онлайн! Слишком медленно для
n
10 или более. Объяснение:Начните с попытки 0.
Повторите
n
раз.Преобразуйте текущее пробное значение в унарное и увеличьте его.
Создайте все пары неотрицательных целых чисел, которые суммируются с новым пробным значением.
Повторите, пока существует хотя бы одна пара, содержащая два палиндромных целых числа.
Увеличьте и снова увеличьте пробную стоимость.
Извлеките окончательное значение.
источник
Haskell,
686763 байтаВозвращает бесконечную последовательность.
Собирать все ,
n
где либоa
илиn-a
не палиндром для всехa <- [0..n]
.Попробуйте онлайн!
источник
Perl 5
-MList::Util=any -p
,5955 байт-3 байта благодаря @NahuelFouilleul
Попробуйте онлайн!
Примечание:
any
можно заменитьgrep
и избежать-M
переключения командной строки, но в соответствии с текущими правилами оценки, это будет стоить еще один байт.источник
+
послеwhile
.R ,
115111 байтов-4 благодаря Джузеппе
Попробуйте онлайн!
Большая часть работы упакована в аргументы функции, чтобы убрать
{}
вызов функции для нескольких операторов и уменьшить скобки, необходимые для определения объектаr
Основная стратегия состоит в том, чтобы найти все палиндромы до заданной границы (включая 0), найти все попарные суммы, а затем взять n-е число, не входящее в этот вывод.
Граница
n*1000
была выбрана исключительно из обоснованного предположения, поэтому я призываю всех, кто доказывает / опровергает ее, как правильный выбор.r=0:(n*1e3)
вероятно, может быть улучшено с помощью более эффективной границы.Map(paste,Map(rev,strsplit(a,"")),collapse="")
оторван от ответа Марка здесь , и это просто невероятно умно для меня.r[!r%in%outer(p,p,'+')][n]
читает немного неэффективно для меня.источник
C # (интерактивный компилятор Visual C #) , 124 байта
Попробуйте онлайн!
источник
J , 57/60 байт
Попробуйте онлайн!
Связанная версия добавляет 3 байта в общей сложности 60 для сохранения в качестве функции, которую может вызвать нижний колонтитул.
В REPL этого можно избежать, вызвав напрямую:
объяснение
Общая структура является то , что этой техникой от ответа по Miles :
Это сэкономило несколько байтов по сравнению с моей первоначальной техникой зацикливания, но поскольку основная функция - моя первая попытка написать J, вероятно, многое еще можно улучшить.
источник
1&(_:1&((e.((*&(-:|.)&":"0>:)&i.-))+])+)*
05AB1E ,
1512 байт-3 байта благодаря @Grimy .
0 индексированные.
Очень медленно, поэтому время ожидания для большинства тестовых случаев.
Попробуйте онлайн или проверьте первые несколько случаев, удалив
Iè
.Намного быстрее предыдущей 15-ти битной версии:
1-индексироваться.
Объяснение:
источник
°LDʒÂQ}ãOKIè
(вероятно, есть верхняя граница скорости, чем 10 ^ x). Я думаю∞DʒÂQ}ãOK
, технически это 9, но время ожидания до первого выхода.Iè
)[1,21,32,43,54,65,76,87,98,111,131,141,151,...]
выглядит так: но должна идти как[*,21,32,43,54,65,76,87,98,201,1031,1041,1051,1052,...]
(первая1
/*
может быть проигнорирована, так как мы используем ввод с 1 индексом).L
0 ... :)Красный , 142 байта
Попробуйте онлайн!
Возвращает n-й член, 1-индексированный
источник
Python 3 , 107 байт
Попробуйте онлайн!
Инвертирование проверки палиндрома сэкономило 2 байта :)
Для справки: прямая положительная проверка (109 байт):
источник
APL (NARS), 486 байтов
Какое слово для разрыва цикла? Кажется, это "уйти", верно?
{k≡⌽k←⍕⍵}
в п - тест на палиндром. Эта функция выше в цикле хранит весь палиндром, найденный в множестве P, если для некоторого элемента w из P такой, что iw также находится в P, это означает, что i не верно, и мы имеем приращение i. Полученные результаты:источник