Süper palindromları bulun!


23

99999999 sayısını göz önünde bulundurun. Bu sayı açıkça bir palindrom. 99999999’un en büyük ana faktörü 137’dir. 99999999’u 137’ye bölerseniz, 729927’ye ulaşırsınız. Bu sayı aynı zamanda bir palindromdur.

729927'nin en büyük ana faktörü 101'dir. 729927/101 = 7227, bu yine bir palindromdur.

7227'nin en büyük ana faktörü 73'tür. 7227/73 = 99, yine bir palindromdur.

En büyük asal çarpanı daha da bölerek 9, 3 ve son olarak 1 rakam elde edersiniz. 1'in ana faktör olmadığı için prosedür burada bitiyor.

Şimdi bu gözlemi genelleştirerek, süper palindromu, ya 1 olan ya da en büyük ana faktöre bölünmesi durumunda başka bir süper palindrom veren bir palindrom olarak tanımlarım.

Kredi: /math/200835/are-there-infinitely-many-super-palindromes

N sayısı göz önüne alındığında , süper bir palindrom olup olmadığına karar verin ve buna göre bir truthy veya falsey değeri yazdırın.

Programınız bu girişler için gerçek bir değer yazdırmalıdır:

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

Programınız bu girişler için falsey değeri yazdırmalıdır:

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

Unutmayın, bu , bu yüzden en az bayt içeren kod kazanır.


3
Girdi Nher zaman başlamak için bir palindrome mi olacak?
Sherlock9

@ Sherlock9 Hayır ..
Oliver Ni

2
Öyleyse lütfen falsey test durumlarına palindrom olmayanları da ekleyebilir misiniz? Şartnameyi açıklığa kavuştururdu.
Sherlock9

Yanıtlar:


8

Jelly , 13 12 9 8 bayt

Æf×\D⁼U$

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

Æ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 bayt

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

Adsız işlev, dönen Trueveya False. Girdiden başlayarak bir liste oluşturur, ardından çıktı değişmedene kadar "beni en büyük asal çarpanla böldüm" işlevini tekrarlar. (Neyse ki, Mathematica şimdi 1'in en büyük asal çarpanının 1 olduğunu düşünüyor.) Ardından liste girişlerinin palindrom olup olmadığını test eder (yay yerleşikler! Boo fonksiyon ismi uzunluğu!) Ve Andhepsini bir araya getirir.


Düzgün hile (ab) ile FactorInteger[1]'tuhaflıkları kullanarakFixedPoint
LegionMammal978

evet, bir kere olsun yardımcı oldu! :)
Greg Martin

6

Mathematica, 51 bayt

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

Özyinelemeli anonim işlev. Bir sayıyı girdi olarak alır ve geri döndürür Trueveya Falseçıktı olarak alır.


6

05AB1E , 9 8 bayt

Adnan sayesinde bir bayt kaydedildi .

Ò.pPDíïQ

Çevrimiçi deneyin!

açıklama

n = 7227 örnek olarak kullanılır

Ò           # 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

Ben Ò.pPDíïQde çalışması gerektiğini düşünüyorum .
Adnan

5

Pyth - 15 12 bayt

Jöle yendi: P : /

Ne yazık ki, tüm bu örtülü haritalar, sonuncusu bir otomatik uyarlama olduğundan, açık bir taneyle birleştirildiğinde kısalmaz.

.A_IM`M*M._P

Test Takımı .

Ürünleri ara süper palindromlar olacak ana çarpanlara ayırmanın öneklerini alır ve hepsinin palindrom olup olmadığını kontrol eder.


4

Mathematica, 71 63 bayt

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

açıklama

FactorInteger@#

Giriş faktörü. (örneğin 8668 -> {{2, 2}, {11, 1}, {197, 1}}; çıktıdaki her liste için, birinci öğe ana faktör, ikincisi ise güç.

Join@@Table@@ ...

Her faktör-güç çifti için, ilk elemanı ikinci elemanla çoğaltın ve her şeyi düzleştirin. ( {{2, 2}, {11, 1}, {197, 1}} -> {{2, 2}, {11}, {197}} -> {2, 2, 11, 197})

FoldList[1##&, ... ]

Öğeleri çarparak listeyi yineleyin. ( {2, 2, 11, 197} -> {2, 2 * 2, 2 * 2 * 11, 2 * 2 * 11 * 197} -> {2, 4, 44, 8668})

And@@PalindromeQ/@ ...

Tüm sonuçlanan sayıların palindrom olup olmadığını kontrol edin ve Andoperatörü uygulayın. ( {2, 4, 44, 8668} -> {True, True, True, True}-> True)


Oooo, güzel bitti! Şimdi gidip bir yere 2 bayt kaydedebilir miyim ....
Greg Martin

3

Brachylog , 14 bayt

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

Çevrimiçi deneyin!

açıklama

Bu, meydan okuma tarifinde açıklanan formülü uygular.

Ana çarpanlara ayırma eklerinin tüm ürünlerinin hesaplanması ve hepsinin palindrom olup olmadığının kontrol edilmesi 1 bayt daha uzundur ( 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

Raket 238 bayt

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

Test yapmak:

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

Çıktı:

#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t

Racket'e aşina değilim, ancak yardımcı işlevinizin palinbeş bayt uzunluğunda bir ad olması gerekli mi?
Roman Gräf

Daha önce düzeltmiştim ama buraya düzgün yapıştırmadım. 238 bayt adı olarak sadece 'p' ile. Gösterdiğin için teşekkürler.
rnso

2

J, 30 bayt

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

Falsey için hata, 1 gerçeği için hata.

İlk deneme, 40 bayt falsey için hata yapmaz:

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

açıklama

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

Test durumları

   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 bayt (100 karakter * 3 bayt + 9 yeni satır)

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

O kadar mutluyum ki aslında bitirdim!

Bu dilde yeniyim, bu nedenle bayt sayısını artırma konusunda herhangi bir ipucu bekliyoruz.

Burada dene! (kodu kopyalayıp yapıştırın)

Temiz sürüm

방빠반루ㅇ쀼머솔쌀이
아노숙차뿌썁썸뻐솝셜
본서번분번뮤따냐별쀼
슉누번나투쑫썬쌀본묘
뽀서본석처삭뽀로떠추
분초러사누이숟뗘분뻐
듀삭빠쏘ㅇ이썩손뵬ㅇ
쌰뭉쇼텨이변번처우텨
뽀희ㅇㅇㅇ볻ㅇ유어솝
ㅇㅇㅇㅇㅇㅇ숙쌉삼쏩

Normal sürüm ile net sürüm arasındaki fark nedir?
Oliver Ni,

@Oliver İlk sürümde NOP yoktur (ㅇ) ve daha karmaşık karakterlere sahiptir (Aynı kodlardır; yalnızca ilkini daha ezoterik gösterdim). İkinci versiyon ise, tüm saçmalıklar olmadan programı okumak isteyenler içindir.
JungHwan Min

0

Scala, 138 bayt

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

Açıklama:

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 bayt

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

Asal çarpanlara ayırma öneklerini yinelemeli olarak oluşturur ve bunları palindromicity için denetler.


0

Java 7, 133 bayt

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

0

Aslında , 29 bayt

Nerede olduğundan emin olmasam da, muhtemelen bu kodun golf oynayabileceği birkaç bölüm var. Golf önerileri kabul edilir. Çevrimiçi deneyin!

╗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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.