Найди супер палиндромы!

23

Рассмотрим число 99999999. Это число явно палиндром. Наибольший коэффициент 99999999 равен 137. Если вы разделите 99999999 на 137, вы получите 729927. Это число также является палиндромом.

Наибольший простой коэффициент 729927 равен 101. 729927/101 = 7227, который снова является палиндромом.

Наибольшее простое число 7227 составляет 73. 7227/73 = 99, который снова является палиндромом.

При дальнейшем делении на наибольший простой множитель вы получите 9, 3 и, наконец, 1, которые, будучи однозначными числами, также являются палиндромами. Поскольку 1 не имеет простых факторов, процедура заканчивается здесь.

Теперь, обобщая это наблюдение, я определяю суперпалиндром как палиндром, который либо равен 1, либо дает другой суперпалиндром, если его разделить на его наибольший простой множитель.

Кредиты: /math/200835/are-there-infinite-many-super-palindromes

Учитывая число N , определите, является ли он суперпалиндромом или нет, и выведите соответственно значение truey или false.

Ваша программа должна напечатать истинное значение для этих входных данных:

1
101
121
282
313
353
373
393
474
737
919
959
1331
1441
2882
6446
7887
8668
9559
9779

Ваша программа должна напечатать значение Falsey для этих входных данных:

323
432
555
583
585
646
642
696
777
969
989
2112
3553
4554
5242
5225
5445
8080
8118
9988

Помните, что это , поэтому выигрывает код с наименьшим количеством байтов.

Оливер Ни
источник
3
Будет ли ввод Nвсегда палиндромом для начала?
Шерлок9
@ Sherlock9 Нет ..
Оливер Ни
2
Тогда, пожалуйста, не могли бы вы добавить непалиндромы к тестам Фалси? Было бы уточнить спецификации.
Sherlock9

Ответы:

8

Желе , 13 12 9 8 байт

Æf×\D⁼U$

Попробуйте онлайн! или проверьте все контрольные примеры .

Как это работает

Æf×\D⁼U$  Main link. Argument: n

Æf        Yield all prime factors of n, with multiplicities and in ascending order.
  ×\      Take the cumulative product.
    D     Decimal; convert each product into the array of its base 10 digits.
       $  Combine the two links to the left into a monadic chain.
      U     Upend; reverse all arrays of decimal digits.
     ⁼      Test for equality.
Деннис
источник
6

Mathematica, 64 байта

And@@PalindromeQ/@FixedPointList[#/FactorInteger[#][[-1,1]]&,#]&

Безымянная функция, возвращающая Trueили False. Формирует список, начиная с ввода, затем итерируя функцию «я делю на мое наибольшее простое множитель», пока результат не изменится. (К счастью, Mathematica теперь считает, что наибольшее простое число 1 равно 1.) Затем проверяет, являются ли записи списка палиндромами (да, встроенные модули! Длина имени функции boo!) И Andсопоставляет их все вместе.

Грег Мартин
источник
Опрятный трюк (ab), используя FactorInteger[1]странности сFixedPoint
LegionMammal978
да, на этот раз это помогло! :)
Грег Мартин
6

Mathematica, 51 байт

#<2||PalindromeQ@#&&#0[#/FactorInteger[#][[-1,1]]]&

Рекурсивная анонимная функция. Принимает число как ввод и возвращает Trueили Falseкак вывод.

LegionMammal978
источник
6

05AB1E , 9 8 байт

Сохранил байт благодаря Аднану .

Ò.pPDíïQ

Попробуйте онлайн!

объяснение

n = 7227 используется в качестве примера

Ò           # prime factors with duplicates
            # STACK: [3, 3, 11, 73]
 .p         # prefixes
            # STACK: [[3], [3, 3], [3, 3, 11], [3, 3, 11, 73]]
   P        # product
            # STACK: [3, 9, 99, 7227]
    D       # duplicate
            # STACK: [3, 9, 99, 7227], [3, 9, 99, 7227]
     í      # reverse each
            # STACK: [3, 9, 99, 7227], ['3', '9', '99', '7227']
      ï     # convert to  int
            # STACK: [3, 9, 99, 7227], [3, 9, 99, 7227]
       Q    # check for equality
            # STACK: 1
            # implicit output
Emigna
источник
Я думаю, что Ò.pPDíïQтакже должно работать.
Аднан
5

Pyth - 15 12 байт

Удар желе: P : /

К сожалению, все эти неявные карты не становятся короче, когда объединяются в явную, поскольку последняя является автоматическим разделением.

.A_IM`M*M._P

Тестовый пакет .

Получает все префиксы первичной факторизации, продуктами которой будут промежуточные суперпалиндромы, и проверяет, все ли они являются палиндромами.

Maltysen
источник
4

Mathematica, 71 63 байта

And@@PalindromeQ/@FoldList[1##&,Join@@Table@@@FactorInteger@#]&

объяснение

FactorInteger@#

Фактор ввода. (например 8668 -> {{2, 2}, {11, 1}, {197, 1}}, для каждого списка в выходных данных первый элемент является основным фактором, а второй - степенью.

Join@@Table@@ ...

Для каждой пары фактор-мощность дублируйте первый элемент вторым элементом и сгладьте все это. ( {{2, 2}, {11, 1}, {197, 1}} -> {{2, 2}, {11}, {197}} -> {2, 2, 11, 197})

FoldList[1##&, ... ]

Итерируйте по списку, умножая элементы. ( {2, 2, 11, 197} -> {2, 2 * 2, 2 * 2 * 11, 2 * 2 * 11 * 197} -> {2, 4, 44, 8668})

And@@PalindromeQ/@ ...

Проверьте, все ли полученные числа являются палиндромами, и примените Andоператор. ( {2, 4, 44, 8668} -> {True, True, True, True}-> True)

Юнг Хван Мин
источник
оооо, красиво сделано! Теперь я должен пойти посмотреть, смогу ли я где-нибудь сохранить 2 байта ....
Грег Мартин,
3

Брахилог , 14 байт

1|r?$ph:?r/:0&

Попробуйте онлайн!

объяснение

Это реализует формулу, объясненную в описании вызова.

Вычисление всех произведений суффиксов простой факторизации и проверка того, что все они являются палиндромами, на 1 байт длиннее ( 1|$p:@]f:{*.r}a).

1                  Input = 1
 |                 OR
  r?               Reversing the Input results in the Input
    $p             Get the prime factors of the Input
      h            Take the first one (the biggest)
       :?r/        Divide the Input by that prime factor
           :0&     Call this predicate recursively with that new number as input
Fatalize
источник
2

Ракетка 238 байт

(define(p n)(=(string->number(list->string(reverse(string->list(number->string n)))))n))
(if(= n 1)#t(begin(let o((n n))(define pd(prime-divisors n))(if(null? pd)#f(begin(let((m(/ n(last pd))))
(cond[(= m 1)#t][(p m)(o m)][else #f])))))))

Ungolfed:

(define (f n)
  (define (palin? n)                      ; define palindrome of number
    (=(string->number
       (list->string
        (reverse
         (string->list
          (number->string n)))))
      n))
  (if(= n 1)#t
     (begin
       (let loop ((n n))
         (define pd (prime-divisors n))   ; find prime divisors
         (if (null? pd) #f                ; end if none- not superpalindrome
             (begin
               (let ((m (/ n (last pd)))) ; divide by largest prime divisor
                 (cond                    ; test quotient
                   [(= m 1) #t]           ; end if 1: super-palindrome found
                   [(palin? m) (loop m)]  ; loop with quotient if palindrome
                   [else #f]              ; end if not palindrome
                   ))))))))

Тестирование:

(f 1)
(f 101)
(f 121)
(f 282)
(f 313)
(f 353)
(f 373)
(f 393)
(f 474)
(f 737)
(f 919)
(f 959)
(f 1331)
(f 1441)
(f 2882)
(f 6446)
(f 7887)
(f 8668)
(f 9559)
(f 9779)
(f 99999999)

Выход:

#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
rnso
источник
Я не знаком с Racket, но обязательно ли, чтобы ваша вспомогательная функция palinимела имя длиной пять байт?
Роман Греф,
Я исправил это ранее, но это не вставило здесь должным образом. 238 байт только с 'p' в качестве имени. Спасибо за указание.
rnso
2

J, 30 байт

0:`(%1>.{:@q:)@.((-:|.)@":)^:_

Ошибка для фальси, 1 для правды.

Начальная попытка, не ошибка для фальси, 40 байт:

0:`(([:$:]%{:@q:)`[@.(1&=))@.((-:|.)@":)

объяснение

0:`(%1>.{:@q:)@.((-:|.)@":)^:_
                           ^:_  repeat until convergent
              @.((-:|.)@":)     if the number is palindromic:
   (         )                   do the stuff inside, which is a 4-train
        {:@q:                    largest prime factor
     1>.                         (or 1, if smaller than 1)
    %                            divide the original number by this value
0:`                             otherwise, return 0
                                (because of ^:_, this will be passed into q:, which will
                                error because 0 cannot be factored.)

Контрольные примеры

   NB. collect errors; 0 if errored, otherwise the result of the function
   NB. left arg: values; right arg: boxed name of function
   errors =: 4 : 0
    f =. y`:6
    l =: ''
    for_e. x do.
        try.
            l =. l , f e
        catch.
            l =. l , 0
        end.
    end.
    l
)
   s =: 0:`(%1>.{:@q:)@.((-:|.)@":)^:_
   t =: 1 101 121 282 313 353 373 393 474 737 919 959 1331 1441 2882 6446 7887 8668 9559 9779
   f =: 323 432 555 583 585 646 642 696 777 969 989 2112 3553 4554 5242 5225 5445 8080 8118 9988
   t ,. f
   1  323
 101  432
 121  555
 282  583
 313  585
 353  646
 373  642
 393  696
 474  777
 737  969
 919  989
 959 2112
1331 3553
1441 4554
2882 5242
6446 5225
7887 5445
8668 8080
9559 8118
9779 9988
   (t ,. f) errors"1 0 <'s'
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
Конор О'Брайен
источник
2

아희 (Aheui) , 309 байтов (100 символов * 3 байта + 9 новых строк)

방빩반룸있쁏멐솔쌀잌
앟놂숙참뿔썁썸뻙솝셜
본서번분번뮴딸냥별쀼
슉눇번낢퉅쑫썬쌀본묳
뽇서본석첫삭뽑롷떵춤
분촐럶사눙읽숟뗘분뻨
듐삭빶쏘윙잉썩손뵬괆
쌰뭉쇼텰궮변번첳웅텩
뽇흶아희쾯볻훼윺엄솝
코드골프욉쁍숙쌉삼쏩

Я так счастлив, что я действительно закончил это!

Я новичок в этом языке, поэтому любые советы по улучшению количества байтов приветствуются.

Попробуй это здесь! (скопируйте и вставьте код)

Более чистая версия

방빠반루ㅇ쀼머솔쌀이
아노숙차뿌썁썸뻐솝셜
본서번분번뮤따냐별쀼
슉누번나투쑫썬쌀본묘
뽀서본석처삭뽀로떠추
분초러사누이숟뗘분뻐
듀삭빠쏘ㅇ이썩손뵬ㅇ
쌰뭉쇼텨이변번처우텨
뽀희ㅇㅇㅇ볻ㅇ유어솝
ㅇㅇㅇㅇㅇㅇ숙쌉삼쏩
Юнг Хван Мин
источник
В чем разница между обычной версией и более ясной?
Оливер Ни
@Oliver Первая версия не имеет NOP (ㅇ) и содержит более сложные символы (они представляют собой идентичный код; я только первый из них выглядел более эзотерическим). Вторая версия для тех, кто хотел бы на самом деле прочитать программу, без всякой ерунды.
JungHwan Мин
0

Scala, 138 байт

def?(n:Int):Int={val p=Stream.from(2).filter(n%_==0)(0)
if(p==n)n else?(n/p)}
def s(i:Int):Boolean=i<2||(i+"")==(i+"").reverse&&s(i/ ?(i))

Ungolfed:

def largestFactor(n:Int):Int={
  val p=Stream.from(2).filter(n%_==0).head
  if(p==n)n else largestFactor(n/p)}
def superPalindrome(i:Int):Boolean=i<2||(i+"")==(i+"").reverse&&superPalindrome(i/ largestFactor(i))

Объяснение:

def?(n:Int):Int={                       //define a method for the largest prime factor
  val p=Stream.from(2).filter(n%_==0)(0)  //find the first factor of n
  if(p==n)n else?(n/p)                    //if it's n, return n else the next factor
}
def s(i:Int):Boolean=                     //method for the superprime
  i<2                                     //if s<2 return true
  ||                                      //else return:
    (i+"")==(i+"").reverse                  //is i a palindrome
    &&                                      //and
    s(i/ ?(i))                              //is i divided by it's largestPrimeFactor a superpalindrome
corvus_192
источник
0

JavaScript (ES6), 78 байт

(n,d=2,p=1)=>n%d?n<2||f(n,d+1,p):[...p=p*d+''].reverse().join``==p&&f(n/d,d,p)

Рекурсивно создает основные префиксы факторизации и проверяет их на палиндромность.

Нил
источник
0

Java 7, 133 байта

int c(int a){int x=a,y=0,z=a,i=2;for(;x>0;y=y*10+x%10,x/=10);for(;z>1;i++)for(;z%i<1;z/=i);if(a<2)return 1;return y!=a?0:c(a/(i-1));}

Ungolfed

    static int c( int a ){
    int x = a , y = 0 , z = a , i = 2 ;

    for ( ; x > 0 ; y = y * 10 + x % 10 , x /= 10 ) ;

    for ( ; z > 1 ; i++ )
    for ( ; z % i < 1 ; z /= i ) ; 

    if ( a < 2 )
      return 1 ;

    return y != a ? 0 : c( a / ( i - 1 ) ) ;       
 }
Numberknot
источник
0

На самом деле , 29 байт

Вероятно, есть несколько разделов этого кода, которые можно было бы сыграть в гольф, хотя я еще не уверен, где именно. Предложения по игре в гольф приветствуются. Попробуйте онлайн!

╗1`X╜$;R=;╝╜yN╜\;╗1<&`╬X╜DY╛&

Ungolfing

          Implicit input n.
╗         Save n to register 0.
1`...`╬   Run the following function on the stack while TOS is truthy.
  X         Discard the previous truthy.
  ╜         Push n from register 0.
  $         Push str(n).
  ;R=       Check if str(n) == str(n)[::-1], i.e. if n is a palindrome.
  ;╝        Save a copy of (is n a palindrome?) to register 1.
  ╜yN       Get the largest prime factor of n.
  ╜\        Divide n by its largest prime factor.
  ;╗        Save a copy of n // l_p_f to register 0.
  1<        Check if 1 < n // l_p_f. This returns 0 only if n // l_p_f is 1.
  &         Logical AND (is n a palindrome?) and (is n // l_p_f > 1?).
            This quits if we have reached a non-palindrome or we have reached 1.
X         Discard the falsey that ended the previous function.
╜         Get the last value saved to register 0 (could be 1 or a non-palindrome // l_p_f)
DY        This returns 1 if register 0 was a 1, else 0.
╛&        Logical AND with register 1 (was the last n a palindrome?) to get our result.
          Implicit return.
Sherlock9
источник