Encontre os super palíndromos!


23

Considere o número 99999999. Esse número é obviamente um palíndromo. O maior fator primo de 99999999 é 137. Se você dividir 99999999 por 137, obtém 729927. Esse número também é um palíndromo.

O maior fator primordial de 729927 é 101. 729927/101 = 7227, que novamente é um palíndromo.

O maior fator primo de 7227 é 73. 7227/73 = 99, que novamente é um palíndromo.

Ao dividir ainda mais pelo maior fator primo, você obtém 9, 3 e finalmente 1, que, sendo números de um dígito, também são palíndromos. Como 1 não possui fatores primos, o procedimento termina aqui.

Agora generalizando essa observação, defino um super-palíndromo como um palíndromo que é 1 ou que dá outro super-palíndromo se dividido pelo seu maior fator primo.

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

Dado um número N , determine se é um super palíndromo ou não e imprima um valor de verdade ou falsey de acordo.

Seu programa deve imprimir um valor verdadeiro para estas entradas:

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

Seu programa deve imprimir um 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

Lembre-se, isso é , portanto o código com a menor quantidade de bytes vence.


3
A entrada Nsempre será um palíndromo para começar?
Sherlock9

@ Sherlock9 No ..
Oliver Ni

2
Então, você pode adicionar não-palíndromos aos casos de teste de falsey? Esclareceria a especificação.
Sherlock9

Respostas:


8

Gelatina , 13 12 9 8 bytes

Æf×\D⁼U$

Experimente online! ou verifique todos os casos de teste .

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

6

Mathematica, 64 bytes

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

Função sem nome, retornando Trueou False. Forma uma lista iniciando na entrada e repetindo a função "me dividido pelo meu maior fator principal" até que a saída não seja alterada. (Felizmente, Mathematica agora acha que o maior fator primordial de 1: 1) Em seguida, testa se as entradas da lista são palíndromos (yay built-ins! Boo comprimento nome da função!) E Andé-los todos juntos.


Truque puro (ab) usando FactorInteger[1]esquisitices comFixedPoint
LegionMammal978 23/10

sim, pela primeira vez ajudou! :)
Greg Martin

6

Mathematica, 51 bytes

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

Função anônima recursiva. Pega um número como entrada e retorna Trueou Falsecomo saída.


6

05AB1E , 9 8 bytes

Guardou um byte graças a Adnan .

Ò.pPDíïQ

Experimente online!

Explicação

n = 7227 usado como exemplo

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

Eu acho que Ò.pPDíïQtambém deve funcionar.
Adnan

5

Pitão - 15 12 bytes

Beat Jelly: P : /

Infelizmente, todos esses mapas implícitos não ficam mais curtos quando combinados em um explícito, pois o último é um splat automático.

.A_IM`M*M._P

Conjunto de Teste .

Obtém todos os prefixos da fatoração primária, cujos produtos serão os super palíndromos intermediários e verifica se todos eles são palíndromos.


4

Mathematica, 71 63 bytes

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

Explicação

FactorInteger@#

Fatore a entrada. (por exemplo 8668 -> {{2, 2}, {11, 1}, {197, 1}}, para cada lista na saída, o primeiro elemento é o fator principal e o segundo é a potência.

Join@@Table@@ ...

Para cada par fator-potência, duplique o primeiro elemento pelo segundo e aplane tudo. ( {{2, 2}, {11, 1}, {197, 1}} -> {{2, 2}, {11}, {197}} -> {2, 2, 11, 197})

FoldList[1##&, ... ]

Repita a lista, multiplicando os elementos. ( {2, 2, 11, 197} -> {2, 2 * 2, 2 * 2 * 11, 2 * 2 * 11 * 197} -> {2, 4, 44, 8668})

And@@PalindromeQ/@ ...

Verifique se todos os números resultantes são palíndromos e aplique o Andoperador. ( {2, 4, 44, 8668} -> {True, True, True, True}-> True)


oooo, muito bem feito! Agora eu tenho que ir ver se eu posso salvar 2 bytes em algum lugar ....
Greg Martin

3

Braquilog , 14 bytes

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

Experimente online!

Explicação

Isso implementa a fórmula explicada na descrição do desafio.

A computação de todos os produtos dos sufixos da fatoração primária e a verificação de que todos são palíndromos têm 1 byte a mais ( 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

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

Teste:

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

Saída:

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

Não conheço o Racket, mas é necessário que sua função auxiliar palinseja um nome de cinco bytes?
Roman Gräf 23/10

Eu o corrigi anteriormente, mas ele não foi colado aqui corretamente. 238 bytes estão com apenas 'p' como o nome. Obrigado por apontar.
rnso

2

J, 30 bytes

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

Erro para falsey, 1 para verdade.

Tentativa inicial, não erro para falsey, 40 bytes:

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

Explicação

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 teste

   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

A (Aheui) , 309 bytes (100 caracteres * 3 bytes + 9 novas linhas)

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

Estou tão feliz que terminei!

Como sou novo nesse idioma, qualquer dica sobre como melhorar a contagem de bytes é bem-vinda.

Experimente aqui! (copie e cole o código)

Versão mais limpa

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

Qual é a diferença entre a versão normal e a mais clara?
Oliver Ni

@ Oliver A primeira versão não possui NOPs (ㅇ) e possui caracteres mais complexos (são códigos idênticos; eu apenas fiz a primeira parecer mais esotérica). A segunda versão é para quem realmente deseja ler o programa, sem toda a tagarelice.
JungHwan Min 25/10/16

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

Explicação:

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

Cria recursivamente os prefixos de fatoração primários e verifica a palindromicidade deles.


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

Na verdade , 29 bytes

Provavelmente existem várias seções desse código que podem ser jogadas no golfe, embora ainda não tenha certeza de onde. Sugestões de golfe são bem-vindas. Experimente 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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.