Trouvez les super palindromes!


23

Considérez le nombre 99999999. Ce nombre est évidemment un palindrome. Le plus grand facteur premier de 99999999 est 137. Si vous divisez 99999999 par 137, vous obtenez 729927. Ce nombre est également un palindrome.

Le plus grand facteur premier de 729927 est 101. 729927/101 = 7227 qui est à nouveau un palindrome.

Le plus grand facteur premier de 7227 est 73. 7227/73 = 99 qui est encore un palindrome.

En divisant davantage par le plus grand facteur premier, vous obtenez 9, 3 et enfin 1, qui, étant des nombres à un chiffre, sont également des palindromes. Puisque 1 n'a pas de facteurs premiers, la procédure se termine ici.

En généralisant maintenant cette observation, je définis un super-palindrome comme un palindrome qui est soit 1, soit qui donne un autre super-palindrome s'il est divisé par son plus grand facteur premier.

Crédits: /math/200835/are-there-infinitely-many-super-palindromes

Étant donné un nombre N , déterminez s'il s'agit d'un super palindrome ou non et imprimez une valeur véridique ou falsey en conséquence.

Votre programme doit imprimer une valeur véridique pour ces entrées:

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

Votre programme doit imprimer une valeur de falsey pour ces entrées:

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

N'oubliez pas qu'il s'agit de , donc le code avec le plus petit nombre d'octets l'emporte.


3
L'entrée Nsera- t-elle toujours un palindrome au départ?
Sherlock9

@ Sherlock9 No ..
Oliver Ni

2
Pouvez-vous alors ajouter des non-palindromes aux cas de test de falsey? Cela clarifierait la spécification.
Sherlock9

Réponses:


8

Gelée , 13 12 9 8 octets

Æf×\D⁼U$

Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça marche

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

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

Fonction sans nom, retour Trueou False. Forme une liste en commençant à l'entrée, puis en itérant la fonction "moi divisé par mon plus grand facteur premier" jusqu'à ce que la sortie ne change pas. (Heureusement, Mathematica pense maintenant que le plus grand facteur premier de 1 est 1.) Puis teste si les entrées de la liste sont des palindromes (yay built-ins! Boo function name name!) Et les Ands tous ensemble.


Neat trick (ab) utilisant FactorInteger[1]les bizarreries de 'avecFixedPoint
LegionMammal978

ouais, pour une fois ça a aidé! :)
Greg Martin

6

Mathematica, 51 octets

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

Fonction anonyme récursive. Prend un nombre en entrée et retourne Trueou Falseen sortie.


6

05AB1E , 9 8 octets

Enregistré un octet grâce à Adnan .

Ò.pPDíïQ

Essayez-le en ligne!

Explication

n = 7227 utilisé comme exemple

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

Je pense que Ò.pPDíïQdevrait également fonctionner.
Adnan

5

Pyth - 15 12 octets

Beat Jelly: P : /

Malheureusement, toutes ces cartes implicites ne raccourcissent pas lorsqu'elles sont combinées en une carte explicite car la dernière est une auto-splat.

.A_IM`M*M._P

Suite de tests .

Obtient tous les préfixes de la factorisation principale, dont les produits seront les super-palindromes intermédiaires, et vérifie si tous sont des palindromes.


4

Mathematica, 71 63 octets

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

Explication

FactorInteger@#

Factorisez l'entrée. (par exemple 8668 -> {{2, 2}, {11, 1}, {197, 1}}; pour chaque liste dans la sortie, le premier élément est le facteur premier, et le second est la puissance.

Join@@Table@@ ...

Pour chaque paire facteur-puissance, dupliquez le premier élément par le deuxième élément et aplatissez le tout. ( {{2, 2}, {11, 1}, {197, 1}} -> {{2, 2}, {11}, {197}} -> {2, 2, 11, 197})

FoldList[1##&, ... ]

Parcourez la liste en multipliant les éléments. ( {2, 2, 11, 197} -> {2, 2 * 2, 2 * 2 * 11, 2 * 2 * 11 * 197} -> {2, 4, 44, 8668})

And@@PalindromeQ/@ ...

Vérifiez si tous les nombres résultants sont des palindromes et appliquez l' Andopérateur. ( {2, 4, 44, 8668} -> {True, True, True, True}-> True)


oooo, bien fait! Maintenant, je dois aller voir si je peux enregistrer 2 octets quelque part ....
Greg Martin

3

Brachylog , 14 octets

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

Essayez-le en ligne!

Explication

Cela implémente la formule expliquée dans la description du défi.

Calculer tous les produits des suffixes de la factorisation principale et vérifier qu'ils sont tous des palindromes est de 1 octet de plus ( 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

Raquette 238 octets

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

Non golfé:

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

Essai:

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

Sortie:

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

Je ne suis pas familier avec Racket, mais est-il nécessaire que votre fonction d'assistance palinsoit un nom long de cinq octets?
Roman Gräf

Je l'avais corrigé plus tôt mais il ne collait pas correctement ici. 238 octets est avec juste «p» comme nom. Merci d'avoir souligné.
rnso

2

J, 30 octets

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

Erreur pour falsey, 1 pour véridique.

Tentative initiale, sans erreur pour falsey, 40 octets:

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

Explication

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

Cas de test

   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 octets (100 caractères * 3 octets + 9 sauts de ligne)

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

Je suis tellement contente d'avoir fini!

Je suis nouveau dans cette langue, donc toute astuce pour améliorer le nombre d'octets est la bienvenue.

Essayez-le ici! (copiez et collez le code)

Version plus propre

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

Quelle est la différence entre la version normale et la version plus claire?
Oliver Ni

@Oliver La première version n'a pas de NOP (ㅇ) et a des caractères plus complexes (Ce sont des codes identiques; j'ai seulement donné à la première une apparence plus ésotérique). La deuxième version est pour ceux qui voudraient réellement lire le programme, sans tout le charabia.
JungHwan Min

0

Scala, 138 octets

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

Non golfé:

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

Explication:

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 octets

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

Construit récursivement les préfixes de factorisation principaux et vérifie leur palindromicité.


0

Java 7, 133 octets

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

Non golfé

    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

Réellement , 29 octets

Il y a probablement plusieurs sections de ce code qui pourraient être jouées, mais je ne sais pas encore où. Suggestions de golf bienvenues. Essayez-le en ligne!

╗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.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.