Знайдіть супер паліндром!


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-infinlimited-many-super-palindromes

Давши число N , визначте, чи це супер паліндром чи ні, і надрукуйте відповідно значення "truthy" або "falsey".

Ваша програма повинна надрукувати значення "truthy" для цих входів:

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

Ваша програма повинна надрукувати значення фальси для цих входів:

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
Тоді чи можете ви додавати неаліндром до тестових справ фальси? Це уточнило б специфікацію.
Шерлок9

Відповіді:


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

Математика, 64 байти

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

Безіменна функція, повернення Trueабо False. Формує список, починаючи з входу, потім повторюючи функцію "я розділений на мій найбільший основний коефіцієнт", поки вихід не зміниться. (На щастя, Mathematica вважає, що найбільший основний коефіцієнт 1 - 1). Потім перевіряється, чи є списки паліндромами (yay вбудовані! Boo назва функції довжини!), І Ands їх усі разом.


Акуратний трюк (ab) з використанням FactorInteger[1]диваків 'sFixedPoint
LegionMammal978

так, колись це допомогло! :)
Грег Мартін

6

Математика, 51 байт

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

Рекурсивна анонімна функція. Приймає число як вхід і повернення Trueабо Falseяк вихід.


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

Я думаю, що Ò.pPDíïQтакож має працювати.
Аднан

5

Pyth - 15 12 байт

Beat Jelly: P : /

На жаль, всі ці неявні карти не стають коротшими, якщо їх об'єднати в явну, оскільки остання - це автоматична бризка.

.A_IM`M*M._P

Тестовий сюїт .

Отримує всі префікси основної факторизації, продуктами яких стануть проміжні супер паліндроми, і перевіряє, чи всі вони є паліндрами.


4

Математика, 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)


oooo, прекрасно зроблено! Тепер я повинен піти, чи зможу я десь зберегти 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

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])))))))

Безголівки:

(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

Я не знайомий з Ракеткою, але чи потрібно, щоб ваша допоможна функція 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 Min

0

Скала, 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))

Безголівки:

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

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));}

Безумовно

    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 ) ) ;       
 }

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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.