Temukan palindrom super!


23

Pertimbangkan nomor 99999999. Angka itu jelas merupakan palindrom. Faktor prima terbesar dari 99999999 adalah 137. Jika Anda membagi 99999999 dengan 137, Anda mendapatkan 729927. Angka ini juga merupakan palindrom.

Faktor prima terbesar dari 729927 adalah 101. 729927/101 = 7227 yang lagi merupakan palindrome.

Faktor prima terbesar dari 7227 adalah 73. 7227/73 = 99 yang lagi merupakan palindrome.

Dengan membagi lebih lanjut dengan faktor prima terbesar, Anda mendapatkan 9, 3 dan akhirnya 1, yang, sebagai angka satu digit, juga merupakan palindrom. Karena 1 tidak memiliki faktor prima, prosedur berakhir di sini.

Sekarang menggeneralisasi pengamatan ini, saya mendefinisikan super-palindrome sebagai palindrome yang merupakan 1, atau yang memberikan super-palindrom jika dibagi oleh faktor prima terbesarnya.

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

Diberi nomor N , tentukan apakah itu palindrom super atau tidak, dan cetaklah nilai yang benar atau salah.

Program Anda harus mencetak nilai kebenaran untuk input ini:

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

Program Anda harus mencetak nilai falsey untuk input ini:

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

Ingat, ini adalah , jadi kode dengan jumlah byte terpendek akan menang.


3
Akankah input Nselalu menjadi palindrome untuk memulai?
Sherlock9

@ Sherlock9 No. ..
Oliver Ni

2
Lalu bisakah Anda menambahkan non-palindrom ke kasus uji falsey? Itu akan memperjelas spesifikasi.
Sherlock9

Jawaban:


8

Jelly , 13 12 9 8 byte

Æf×\D⁼U$

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

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

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

Fungsi yang tidak disebutkan namanya, kembali Trueatau False. Membentuk daftar dengan mulai dari input, lalu mengulangi fungsi "saya dibagi dengan faktor prima terbesar saya" sampai output tidak berubah. (Untungnya, Mathematica sekarang menganggap faktor prima terbesar 1 adalah 1.) Kemudian menguji apakah entri daftar adalah palindrom (yay built-in! Panjang nama fungsi boo!) Dan Ands semuanya bersama-sama.


Trik rapi (ab) menggunakan FactorInteger[1]keanehan denganFixedPoint
LegionMammal978

ya, untuk sekali ini membantu! :)
Greg Martin

6

Mathematica, 51 byte

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

Fungsi anonim rekursif. Mengambil angka sebagai input dan mengembalikan Trueatau Falsesebagai output.


6

05AB1E , 9 8 byte

Menyimpan satu byte, terima kasih kepada Adnan .

Ò.pPDíïQ

Cobalah online!

Penjelasan

n = 7227 digunakan sebagai contoh

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

Saya pikir Ò.pPDíïQjuga harus bekerja.
Adnan

5

Pyth - 15 12 byte

Kocok Jelly: P : /

Sayangnya, semua peta implisit tersebut tidak menjadi lebih pendek ketika digabungkan menjadi yang eksplisit karena yang terakhir adalah percikan otomatis.

.A_IM`M*M._P

Test Suite .

Mendapat semua awalan dari faktorisasi utama, produk yang akan menjadi palindrom super menengah, dan memeriksa apakah semuanya merupakan palindrom.


4

Mathematica, 71 63 byte

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

Penjelasan

FactorInteger@#

Faktor input. (misalnya 8668 -> {{2, 2}, {11, 1}, {197, 1}}; untuk setiap daftar dalam output, elemen pertama adalah faktor utama, dan yang kedua adalah kekuatan.

Join@@Table@@ ...

Untuk setiap pasangan faktor daya, duplikat elemen pertama dengan elemen kedua, dan ratakan semuanya. ( {{2, 2}, {11, 1}, {197, 1}} -> {{2, 2}, {11}, {197}} -> {2, 2, 11, 197})

FoldList[1##&, ... ]

Iterate melalui daftar, mengalikan elemen. ( {2, 2, 11, 197} -> {2, 2 * 2, 2 * 2 * 11, 2 * 2 * 11 * 197} -> {2, 4, 44, 8668})

And@@PalindromeQ/@ ...

Periksa apakah semua angka yang dihasilkan adalah palindrom, dan terapkan Andoperator. ( {2, 4, 44, 8668} -> {True, True, True, True}-> True)


oooo, bagus sekali! Sekarang saya harus melihat apakah saya dapat menyimpan 2 byte di suatu tempat ....
Greg Martin

3

Brachylog , 14 byte

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

Cobalah online!

Penjelasan

Ini mengimplementasikan formula yang dijelaskan dalam deskripsi tantangan.

Komputasi semua produk sufiks faktorisasi prima dan memeriksa apakah semuanya palindrom lebih panjang 1 byte ( 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

Racket 238 byte

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

Tidak Disatukan:

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

Pengujian:

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

Keluaran:

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

Saya tidak terbiasa dengan Racket, tetapi apakah perlu bahwa fungsi pembantu Anda palinadalah nama panjang lima byte?
Roman Gräf

Saya telah memperbaikinya sebelumnya tetapi tidak menempel di sini dengan benar. 238 byte hanya dengan 'p' sebagai namanya. Terima kasih telah menunjukkan.
rnso

2

J, 30 byte

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

Kesalahan untuk falsey, 1 untuk kebenaran.

Upaya awal, tidak kesalahan untuk falsey, 40 byte:

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

Penjelasan

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

Uji kasus

   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 byte (100 karakter * 3 byte + 9 baris baru)

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

Saya sangat senang bahwa saya benar-benar menyelesaikannya!

Saya baru dalam bahasa ini, jadi tip untuk meningkatkan jumlah byte diterima.

Coba di sini! (salin dan tempel kode)

Versi lebih bersih

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

Apa perbedaan antara versi normal dan yang lebih jelas?
Oliver Ni

@Oliver Versi pertama tidak memiliki NOP (ㅇ) dan memiliki karakter yang lebih kompleks (Mereka adalah kode yang identik; Saya hanya membuat yang pertama terlihat lebih esoteris). Versi kedua adalah bagi mereka yang ingin benar-benar membaca program, tanpa semua omong kosong.
JungHwan Min

0

Scala, 138 byte

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

Tidak Disatukan:

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

Penjelasan:

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 byte

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

Secara rekursif membangun awalan factorisation prima dan memeriksanya untuk palindromisitas.


0

Java 7, 133 byte

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

Tidak disatukan

    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

Sebenarnya , 29 byte

Mungkin ada beberapa bagian dari kode ini yang bisa golf, meskipun saya belum yakin di mana. Saran bermain golf diterima. Cobalah online!

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

Tidak melakukanolf

          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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.