Finde die super Palindrome!


23

Betrachten Sie die Zahl 99999999. Diese Zahl ist offensichtlich ein Palindrom. Der größte Primfaktor von 99999999 ist 137. Wenn Sie 99999999 durch 137 teilen, erhalten Sie 729927. Diese Zahl ist auch ein Palindrom.

Der größte Primfaktor von 729927 ist 101. 729927/101 = 7227, was wiederum ein Palindrom ist.

Der größte Primfaktor von 7227 ist 73. 7227/73 = 99, was wiederum ein Palindrom ist.

Durch weitere Division durch den größten Primfaktor erhalten Sie 9, 3 und schließlich 1, die als einstellige Zahlen auch Palindrome sind. Da 1 keine Primfaktoren hat, endet die Prozedur hier.

Als Verallgemeinerung dieser Beobachtung definiere ich ein Superpalindrom als ein Palindrom, das entweder 1 ist oder das ein anderes Superpalindrom ergibt, wenn es durch seinen größten Primfaktor dividiert wird.

Credits: /math/200835/sind- unendlich-viele- Superpalindrome

Bestimmen Sie anhand einer Zahl N , ob es sich um ein Super-Palindrom handelt, und geben Sie entsprechend einen Wahrheits- oder Falsch-Wert aus.

Ihr Programm sollte einen Wahrheitswert für diese Eingaben ausgeben:

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

Ihr Programm sollte einen Falsey-Wert für diese Eingaben ausgeben:

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

Denken Sie daran, das ist , also gewinnt der Code mit der kürzesten Anzahl von Bytes.


3
Wird die Eingabe Nzu Beginn immer ein Palindrom sein?
Sherlock9

@ Sherlock9 No ..
Oliver Ni

2
Können Sie dann bitte Nicht-Palindrome zu den Falsey-Testfällen hinzufügen? Es würde die Spezifikation verdeutlichen.
Sherlock9

Antworten:


8

Jelly , 13 12 9 8 Bytes

Æf×\D⁼U$

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

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

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

Unbenannte Funktion, Rückkehr Trueoder False. Bilden Sie eine Liste, indem Sie am Eingang beginnen und dann die Funktion "Ich geteilt durch meinen größten Primfaktor" iterieren, bis sich die Ausgabe nicht mehr ändert. (Zum Glück geht Mathematica jetzt davon aus, dass der größte Primfaktor von 1 1 ist.) Dann wird geprüft, ob die Listeneinträge Palindrome sind (yay built-ins! Boo function name length!) Und Andsie alle zusammen.


Ordentlicher Trick (ab) FactorInteger[1]mitFixedPoint
LegionMammal978

ja, ausnahmsweise hat es geholfen! :)
Greg Martin

6

Mathematica, 51 Bytes

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

Rekursive anonyme Funktion. Nimmt eine Zahl als Eingabe und gibt sie zurück Trueoder Falseals Ausgabe.


6

05AB1E , 9 8 Bytes

Ein Byte gespeichert dank Adnan .

Ò.pPDíïQ

Probieren Sie es online!

Erläuterung

n = 7227 als Beispiel verwendet

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

Ich denke Ò.pPDíïQauch sollte funktionieren.
Adnan

5

Pyth - 15 12 Bytes

Beat Jelly: P : /

Leider werden all diese impliziten Maps nicht kürzer, wenn sie zu einer expliziten kombiniert werden, da die letzte ein Auto-Splat ist.

.A_IM`M*M._P

Test Suite .

Ruft alle Präfixe der Primfaktorisierung ab, deren Produkte die intermediären Superpalindrome sind, und überprüft, ob alle Palindrome sind.


4

Mathematica, 71 63 Bytes

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

Erläuterung

FactorInteger@#

Faktor der Eingabe. (zB 8668 -> {{2, 2}, {11, 1}, {197, 1}}für jede Liste in der Ausgabe ist das erste Element der Primfaktor und das zweite die Potenz.

Join@@Table@@ ...

Duplizieren Sie für jedes Faktor-Potenz-Paar das erste Element mit dem zweiten Element und reduzieren Sie das gesamte Element. ( {{2, 2}, {11, 1}, {197, 1}} -> {{2, 2}, {11}, {197}} -> {2, 2, 11, 197})

FoldList[1##&, ... ]

Durchlaufen Sie die Liste und multiplizieren Sie die Elemente. ( {2, 2, 11, 197} -> {2, 2 * 2, 2 * 2 * 11, 2 * 2 * 11 * 197} -> {2, 4, 44, 8668})

And@@PalindromeQ/@ ...

Überprüfen Sie, ob alle resultierenden Zahlen Palindrome sind, und wenden Sie den AndOperator an. ( {2, 4, 44, 8668} -> {True, True, True, True}-> True)


oooo, schön gemacht! Jetzt muss ich mal schauen, ob ich irgendwo 2 Bytes retten kann ...
Greg Martin

3

Brachylog , 14 Bytes

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

Probieren Sie es online!

Erläuterung

Dies implementiert die in der Challenge-Beschreibung erläuterte Formel.

Die Berechnung aller Produkte von Suffixen der Primfaktorisierung und die Überprüfung, ob es sich um Palindrome handelt, dauert 1 Byte länger ( 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

Schläger 238 Bytes

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

Testen:

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

Ausgabe:

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

Ich kenne mich mit Racket nicht aus, aber ist es notwendig, dass Ihre Hilfsfunktion palinein fünf Byte langer Name ist?
Roman Gräf

Ich hatte es früher korrigiert, aber es fügte hier nicht richtig ein. 238 Bytes haben nur den Namen 'p'. Vielen Dank für den Hinweis.
RNSO

2

J, 30 Bytes

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

Fehler für Falsey, 1 für Truthy.

Anfänglicher Versuch, kein Fehler für Falsey, 40 Bytes:

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

Erläuterung

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

Testfälle

   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 Bytes (100 Zeichen * 3 Bytes + 9 Zeilenvorschübe)

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

Ich bin so froh, dass ich es tatsächlich geschafft habe!

Ich bin neu in dieser Sprache, daher ist jeder Tipp zur Verbesserung der Byteanzahl willkommen.

Probieren Sie es hier aus! (Kopieren Sie den Code und fügen Sie ihn ein)

Sauberere Version

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

Was ist der Unterschied zwischen der normalen und der klareren Version?
Oliver Ni

@Oliver Die erste Version hat keine NOPs (ㅇ) und komplexere Zeichen (sie sind identischer Code; ich habe nur die erste esoterischer aussehen lassen). Die zweite Version ist für diejenigen, die das Programm tatsächlich lesen möchten, ohne den ganzen Kauderwelsch.
JungHwan Min

0

Scala, 138 Bytes

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

Erläuterung:

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)

Erstellt rekursiv die Präfixe für die Primfaktorisierung und überprüft sie auf Palindromizität.


0

Java 7, 133 Bytes

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

Eigentlich 29 Bytes

Es gibt wahrscheinlich mehrere Abschnitte dieses Codes, die man spielen könnte, obwohl ich mir noch nicht sicher bin, wo. Golfvorschläge sind willkommen. Probieren Sie es online!

╗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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.