¡Encuentra los súper palíndromos!

23

Considere el número 99999999. Ese número es obviamente un palíndromo. El factor primo más grande de 99999999 es 137. Si divide 99999999 entre 137, obtiene 729927. Este número también es un palíndromo.

El factor primo más grande de 729927 es 101. 729927/101 = 7227 que nuevamente es un palíndromo.

El factor primo más grande de 7227 es 73. 7227/73 = 99, que nuevamente es un palíndromo.

Al dividir aún más por el factor primo más grande, obtienes 9, 3 y finalmente 1, que, al ser números de un dígito, también son palíndromos. Como 1 no tiene factores primos, el procedimiento termina aquí.

Ahora, generalizando esta observación, defino un súper palíndromo como un palíndromo que es 1 o que da otro súper palíndromo si se divide por su factor primo más grande.

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

Dado un número N , determine si es un súper palíndromo o no, e imprima un valor verdadero o falso en consecuencia.

Su programa debe imprimir un valor verdadero para estas entradas:

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

Su programa debe imprimir un valor falsey para estas entradas:

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

Recuerde, este es el , por lo que gana el código con la menor cantidad de bytes.

Oliver Ni
fuente
3
¿La entrada Nsiempre será un palíndromo para empezar?
Sherlock9
@ Sherlock9 No ..
Oliver Ni
2
Entonces, ¿puede agregar no palíndromos a los casos de prueba de falsey? Aclararía la especificación.
Sherlock9

Respuestas:

8

Jalea , 13 12 9 8 bytes

Æf×\D⁼U$

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

Æ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.
Dennis
fuente
6

Mathematica, 64 bytes

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

Función sin nombre, regresando Trueo False. Forma una lista comenzando en la entrada, luego iterando la función "yo dividido por mi factor primo más grande" hasta que la salida no cambie. (Afortunadamente, Mathematica ahora piensa que el factor primo más grande de 1 es 1.) Luego prueba si las entradas de la lista son palíndromos (¡yay incorporados! ¡Longitud del nombre de la función boo!) Y Ands todos juntos.

Greg Martin
fuente
Truco ordenado (ab) usando FactorInteger[1]las rarezas deFixedPoint
LegionMammal978
sí, por una vez ayudó! :)
Greg Martin
6

Mathematica, 51 bytes

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

Función anónima recursiva. Toma un número como entrada y devuelve Trueo Falsecomo salida.

LegionMammal978
fuente
6

05AB1E , 9 8 bytes

Salvó un byte gracias a Adnan .

Ò.pPDíïQ

Pruébalo en línea!

Explicación

n = 7227 usado como ejemplo

Ò           # 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
Emigna
fuente
Creo que Ò.pPDíïQtambién debería funcionar.
Adnan
5

Pyth - 15 12 bytes

Beat Jelly: P : /

Desafortunadamente, todos esos mapas implícitos no se acortan cuando se combinan en uno explícito, ya que el último es un auto-splat.

.A_IM`M*M._P

Banco de pruebas .

Obtiene todos los prefijos de la factorización prima, cuyos productos serán los súper palíndromos intermedios, y comprueba si todos son palíndromos.

Maltysen
fuente
4

Mathematica, 71 63 bytes

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

Explicación

FactorInteger@#

Factoriza la entrada. (por ejemplo 8668 -> {{2, 2}, {11, 1}, {197, 1}}, para cada lista en la salida, el primer elemento es el factor primo y el segundo es la potencia.

Join@@Table@@ ...

Para cada par factor-potencia, duplica el primer elemento por el segundo elemento y aplana todo. ( {{2, 2}, {11, 1}, {197, 1}} -> {{2, 2}, {11}, {197}} -> {2, 2, 11, 197})

FoldList[1##&, ... ]

Iterar a través de la lista, multiplicando los elementos. ( {2, 2, 11, 197} -> {2, 2 * 2, 2 * 2 * 11, 2 * 2 * 11 * 197} -> {2, 4, 44, 8668})

And@@PalindromeQ/@ ...

Compruebe si todos los números resultantes son palíndromos y aplique el Andoperador. ( {2, 4, 44, 8668} -> {True, True, True, True}-> True)

JungHwan Min
fuente
oooo, bien hecho! Ahora tengo que ir a ver si puedo guardar 2 bytes en alguna parte ...
Greg Martin
3

Brachylog , 14 bytes

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

Pruébalo en línea!

Explicación

Esto implementa la fórmula explicada en la descripción del desafío.

Calcular todos los productos de sufijos de factorización prima y verificar que todos son palíndromos es 1 byte más largo ( 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
Fatalizar
fuente
2

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

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

Pruebas:

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

Salida:

#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
rnso
fuente
No estoy familiarizado con Racket, pero ¿es necesario que su función auxiliar palinsea ​​un nombre de cinco bytes?
Roman Gräf
Lo había corregido antes, pero no se pegó aquí correctamente. 238 bytes es solo con 'p' como nombre. Gracias por señalarlo.
rnso
2

J, 30 bytes

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

Error para falsey, 1 para verdad.

Intento inicial, no error para falsey, 40 bytes:

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

Explicación

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

Casos de prueba

   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
Conor O'Brien
fuente
2

아희 (Aheui) , 309 bytes (100 caracteres * 3 bytes + 9 líneas nuevas)

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

¡Estoy tan feliz de haberlo terminado!

Soy nuevo en este idioma, por lo que cualquier consejo para mejorar el conteo de bytes es bienvenido.

Pruébalo aquí! (copia y pega el código)

Versión más limpia

방빠반루ㅇ쀼머솔쌀이
아노숙차뿌썁썸뻐솝셜
본서번분번뮤따냐별쀼
슉누번나투쑫썬쌀본묘
뽀서본석처삭뽀로떠추
분초러사누이숟뗘분뻐
듀삭빠쏘ㅇ이썩손뵬ㅇ
쌰뭉쇼텨이변번처우텨
뽀희ㅇㅇㅇ볻ㅇ유어솝
ㅇㅇㅇㅇㅇㅇ숙쌉삼쏩
JungHwan Min
fuente
¿Cuál es la diferencia entre la versión normal y la más clara?
Oliver Ni
@Oliver La primera versión no tiene NOP (ㅇ) y tiene caracteres más complejos (son códigos idénticos; solo hice que la primera parezca más esotérica). La segunda versión es para aquellos que deseen leer el programa, sin todo el galimatías.
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))

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

Explicación:

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
corvus_192
fuente
0

JavaScript (ES6), 78 bytes

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

Recursivamente construye los prefijos de factorización primarios y los verifica por palindromicidad.

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

Sin 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 ) ) ;       
 }
Nudo numérico
fuente
0

Actualmente , 29 bytes

Probablemente hay varias secciones de este código que podrían jugarse golf, aunque todavía no estoy seguro de dónde. Sugerencias de golf bienvenidas. Pruébalo en línea!

╗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.
Sherlock9
fuente