Tìm siêu palindromes!


23

Hãy xem xét số 99999999. Con số đó rõ ràng là một bảng màu. Hệ số nguyên tố lớn nhất của 99999999 là 137. Nếu bạn chia 99999999 cho 137, bạn nhận được 729927. Con số này cũng là một bảng màu.

Hệ số nguyên tố lớn nhất của 729927 là 101. 729927/101 = 7227, một lần nữa là một bảng màu.

Hệ số nguyên tố lớn nhất của 7227 là 73. 7227/73 = 99, một lần nữa là một bảng màu.

Bằng cách chia thêm cho thừa số nguyên tố lớn nhất, bạn nhận được 9, 3 và cuối cùng là 1, là các số có một chữ số, cũng là các palindromes. Vì 1 không có thừa số nguyên tố, nên thủ tục kết thúc tại đây.

Bây giờ khái quát hóa quan sát này, tôi định nghĩa một siêu palindrom là một palindrom là 1 hoặc cung cấp cho một siêu palindrom khác nếu chia cho thừa số nguyên tố lớn nhất của nó.

Tín dụng: /math/200835/are-there-infinite-many-super-palindromes

Cho một số N , xác định xem nó có phải là một siêu bảng màu hay không, và in một giá trị trung thực hoặc falsey tương ứng.

Chương trình của bạn sẽ in một giá trị trung thực cho các đầu vào này:

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

Chương trình của bạn sẽ in một giá trị falsey cho các đầu vào này:

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

Hãy nhớ rằng, đây là , vì vậy mã có số byte ngắn nhất sẽ thắng.


3
Đầu vào sẽ Nluôn luôn là một palindrom để bắt đầu?
Sherlock9

@ Sherlock9 số ..
Oliver Ni

2
Sau đó, bạn có thể vui lòng thêm non-palindromes vào các trường hợp thử nghiệm falsey không? Nó sẽ làm rõ các đặc điểm kỹ thuật.
Sherlock9

Câu trả lời:


8

Thạch , 13 12 9 8 byte

Æf×\D⁼U$

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

Æ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

Toán học, 64 byte

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

Hàm không tên, trả về Truehoặc False. Hình thành một danh sách bằng cách bắt đầu ở đầu vào, sau đó lặp lại hàm "tôi chia cho thừa số nguyên tố lớn nhất của tôi" cho đến khi đầu ra không thay đổi. (May mắn thay, Mathicala bây giờ nghĩ rằng hệ số nguyên tố lớn nhất của 1 là 1.) Sau đó kiểm tra xem các mục nhập danh sách có phải là palindromes hay không ( Andtất cả các hàm của hàm boo!) Và tất cả chúng cùng nhau.


Thủ thuật gọn gàng (ab) bằng cách sử dụng FactorInteger[1]các số FixedPoint
lẻ

yeah, cho một lần nó đã giúp! :)
Greg Martin

6

Toán học, 51 byte

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

Hàm đệ quy ẩn danh. Lấy một số làm đầu vào và trả về Truehoặc Falselà đầu ra.


6

05AB1E , 9 8 byte

Đã lưu một byte nhờ Adnan .

Ò.pPDíïQ

Hãy thử trực tuyến!

Giải trình

n = 7227 dùng làm ví dụ

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

Tôi nghĩ Ò.pPDíïQcũng nên làm việc.
Ad Nam

5

Pyth - 15 12 byte

Đánh bại Jelly: P : /

Thật không may, tất cả các bản đồ ngầm đó sẽ không ngắn hơn khi được kết hợp thành một bản đồ rõ ràng vì bản đồ cuối cùng là tự động chia tách.

.A_IM`M*M._P

Phòng thử nghiệm .

Nhận tất cả các tiền tố của thừa số nguyên tố, các sản phẩm trong đó sẽ là các siêu palindromes trung gian và kiểm tra xem tất cả chúng có phải là palindromes không.


4

Toán học, 71 63 byte

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

Giải trình

FactorInteger@#

Yếu tố đầu vào. (ví dụ: 8668 -> {{2, 2}, {11, 1}, {197, 1}}đối với mỗi danh sách trong đầu ra, phần tử đầu tiên là thừa số nguyên tố và phần tử thứ hai là công suất.

Join@@Table@@ ...

Đối với mỗi cặp nhân tố - sức mạnh, nhân đôi phần tử thứ nhất bằng phần tử thứ hai và làm phẳng toàn bộ vật. ( {{2, 2}, {11, 1}, {197, 1}} -> {{2, 2}, {11}, {197}} -> {2, 2, 11, 197})

FoldList[1##&, ... ]

Lặp lại qua danh sách, nhân các yếu tố. ( {2, 2, 11, 197} -> {2, 2 * 2, 2 * 2 * 11, 2 * 2 * 11 * 197} -> {2, 4, 44, 8668})

And@@PalindromeQ/@ ...

Kiểm tra xem tất cả các số kết quả là palindromes và áp dụng Andtoán tử. ( {2, 4, 44, 8668} -> {True, True, True, True}-> True)


oooo, được thực hiện độc đáo! Bây giờ tôi phải đi xem liệu tôi có thể lưu 2 byte ở đâu không ....
Greg Martin

3

Brachylog , 14 byte

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

Hãy thử trực tuyến!

Giải trình

Điều này thực hiện các công thức được giải thích trong mô tả thách thức.

Tính toán tất cả các sản phẩm của hậu tố của thừa số nguyên tố và kiểm tra xem chúng có phải là tất cả các palindromes dài hơn 1 byte không ( 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

Vợt 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])))))))

Ung dung:

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

Kiểm tra:

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

Đầu ra:

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

Tôi không quen thuộc với Vợt, nhưng có cần thiết không khi chức năng trợ giúp của bạn palinlà một tên dài năm byte?
Roman Gräf

Tôi đã sửa nó trước đó nhưng nó không dán ở đây đúng. 238 byte chỉ với 'p' là tên. Cảm ơn đã chỉ ra.
vào

2

J, 30 byte

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

Lỗi cho falsey, 1 cho sự thật.

Nỗ lực ban đầu, không có lỗi với falsey, 40 byte:

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

Giải trình

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

Các trường hợp thử nghiệm

   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 ký tự * 3 byte + 9 dòng mới)

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

Tôi rất vui vì tôi đã thực sự hoàn thành nó!

Tôi chưa quen với ngôn ngữ này, vì vậy mọi mẹo để cải thiện số byte đều được hoan nghênh.

Hãy thử nó ở đây! (sao chép và dán mã)

Phiên bản sạch hơn

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

Sự khác biệt giữa phiên bản bình thường và phiên bản clearner là gì?
Oliver Ni

@Oliver Phiên bản đầu tiên không có NOP (ㅇ) và có các ký tự phức tạp hơn (Chúng là mã giống hệt nhau; Tôi chỉ làm cho phiên bản đầu tiên trông bí truyền hơn). Phiên bản thứ hai dành cho những người muốn thực sự đọc chương trình, không có sự vô nghĩa.
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))

Ung dung:

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

Giải trình:

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)

Đệ quy xây dựng các tiền tố nhân tố chính và kiểm tra xem chúng có độc tính không.


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

Bị đánh cắp

    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

Trên thực tế , 29 byte

Có lẽ có một số phần của mã này có thể được đánh gôn, mặc dù tôi không chắc là ở đâu. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

╗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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.