Trova i super palindromi!


23

Considera il numero 99999999. Quel numero è ovviamente un palindromo. Il fattore primo più grande di 99999999 è 137. Se dividi 99999999 per 137, ottieni 729927. Questo numero è anche un palindromo.

Il fattore primo più grande di 729927 è 101. 729927/101 = 7227 che è di nuovo un palindromo.

Il fattore primo più grande di 7227 è 73. 7227/73 = 99 che è di nuovo un palindromo.

Dividendo ulteriormente per il fattore primo più grande, si ottengono 9, 3 e infine 1, che, essendo numeri a una cifra, sono anche palindromi. Poiché 1 non ha fattori primi, la procedura termina qui.

Ora generalizzando questa osservazione, definisco un super-palindromo come un palindromo che è 1, o che dà un altro super-palindromo se diviso per il suo più grande fattore primo.

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

Dato un numero N , determinare se si tratta di un super palindromo o meno e stampare di conseguenza un valore di verità o falsità.

Il tuo programma dovrebbe stampare un valore veritiero per questi input:

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

Il tuo programma dovrebbe stampare un valore false per questi input:

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

Ricorda, questo è , quindi vince il codice con il minor numero di byte.


3
L'ingresso Nsarà sempre un palindromo con cui cominciare?
Sherlock9,

@ Sherlock9 No ..
Oliver Ni,

2
Quindi, per favore, puoi aggiungere non-palindromi ai casi di falsi test? Chiarirebbe le specifiche.
Sherlock9,

Risposte:


8

Gelatina , 13 12 9 8 byte

Æf×\D⁼U$

Provalo online! o verifica tutti i casi di test .

Come funziona

Æ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]]&,#]&

Funzione senza nome, ritorno Trueo False. Crea un elenco iniziando dall'input, quindi ripetendo la funzione "me diviso per il mio fattore primo più grande" fino a quando l'output non cambia. (Fortunatamente, Mathematica ora pensa che il fattore primo più grande di 1 sia 1.) Quindi verifica se le voci dell'elenco sono palindromi (yay built-in! Boo length name!) E Andle uniscono tutte insieme.


Trucco FactorInteger[1]FixedPoint
pulito

sì, per una volta ha aiutato! :)
Greg Martin,

6

Mathematica, 51 byte

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

Funzione anonima ricorsiva. Prende un numero come input e restituisce Trueo Falsecome output.


6

05AB1E , 9 8 byte

Salvato un byte grazie ad Adnan .

Ò.pPDíïQ

Provalo online!

Spiegazione

n = 7227 usato come esempio

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

Penso che Ò.pPDíïQdovrebbe funzionare anche.
Adnan,

5

Pyth - 15 12 byte

Beat Jelly: P : /

Sfortunatamente, tutte quelle mappe implicite non si accorciano se combinate in una esplicita poiché l'ultima è un auto-splat.

.A_IM`M*M._P

Test Suite .

Ottiene tutti i prefissi della scomposizione in fattori primi, i cui prodotti saranno i super palindromi intermedi e controlla se tutti sono palindromi.


4

Mathematica, 71 63 byte

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

Spiegazione

FactorInteger@#

Fattorizza l'input. (ad es 8668 -> {{2, 2}, {11, 1}, {197, 1}}. per ogni elenco nell'output, il primo elemento è il fattore primo e il secondo è la potenza.

Join@@Table@@ ...

Per ogni coppia fattore-potenza, duplica il primo elemento per il secondo elemento e appiattisci l'intera cosa. ( {{2, 2}, {11, 1}, {197, 1}} -> {{2, 2}, {11}, {197}} -> {2, 2, 11, 197})

FoldList[1##&, ... ]

Scorrere l'elenco, moltiplicando gli elementi. ( {2, 2, 11, 197} -> {2, 2 * 2, 2 * 2 * 11, 2 * 2 * 11 * 197} -> {2, 4, 44, 8668})

And@@PalindromeQ/@ ...

Controllare se tutti i numeri risultanti sono palindromi e applicare l' Andoperatore. ( {2, 4, 44, 8668} -> {True, True, True, True}-> True)


oooo, ben fatto! Ora devo andare a vedere se riesco a salvare 2 byte da qualche parte ....
Greg Martin,

3

Brachylog , 14 byte

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

Provalo online!

Spiegazione

Questo implementa la formula spiegata nella descrizione della sfida.

Il calcolo di tutti i prodotti dei suffissi della scomposizione in fattori primi e la verifica che siano tutti palindromi è più lungo di 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

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

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:

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

Produzione:

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

Non ho familiarità con Racket, ma è necessario che la tua funzione di supporto palinabbia un nome lungo cinque byte?
Roman Gräf,

L'avevo corretto in precedenza ma non è stato incollato qui correttamente. 238 byte è solo con 'p' come nome. Grazie per averlo segnalato.
anche il

2

J, 30 byte

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

Errore per falso, 1 per verità.

Tentativo iniziale, non errore per falso, 40 byte:

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

Spiegazione

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

Casi 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 byte (100 caratteri * 3 byte + 9 newline)

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

Sono così felice di averlo davvero finito!

Sono nuovo in questa lingua, quindi qualsiasi suggerimento su come migliorare il conteggio dei byte è il benvenuto.

Provalo qui! (copia e incolla il codice)

Versione più pulita

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

Qual è la differenza tra la versione normale e quella più chiara?
Oliver Ni,

@Oliver La prima versione non ha NOP (ㅇ) e ha caratteri più complessi (sono codici identici; ho solo fatto sembrare il primo più esoterico). La seconda versione è per coloro che vorrebbero davvero leggere il programma, senza il minimo senso di incomprensione.
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))

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

Spiegazione:

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)

Costruisce ricorsivamente i prefissi di fattorizzazione primaria e li controlla per palindromicità.


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

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

In realtà , 29 byte

Probabilmente ci sono diverse sezioni di questo codice che potrebbero essere giocate a golf, anche se non sono ancora sicuro di dove. Suggerimenti di golf benvenuti. Provalo 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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.