Palíndromo da base mais baixa

16

Dado um número n, escreva uma função que encontre a menor base, b ≥ 2como num palíndromo na baseb . Por exemplo, uma entrada de 28deve retornar a base, 3pois a representação ternária de 28 é 1001. Embora 93seja um palíndromo na base 2 e na base 5, a saída deve ser 2desde 2 <5.

Entrada

Um número inteiro positivo n < 2^31.

Resultado

Retorne a menor base de b ≥ 2modo que a brepresentação básica den seja um palíndromo. Não assuma zeros à esquerda.

Amostras (entrada => saída):

11 => 10

32 => 7

59 => 4

111 => 6

Regras

O código mais curto vence.

ntomlin1996
fonte
11
Eu acho que a base deve ser limitada.
Snack
3
@ Snack: Qual é o problema com bases mais altas? Independentemente da escolha dos símbolos, um número base 1000 será um palíndromo ou não.
Dennis
3
Anedota interessante: n na base n-1 é sempre 11 para n> = 2 e, portanto, um palíndromo é sempre possível.
Cruncher
11
@ Cruncher: npode ser 1 e 2 não é um palíndromo de base 1. No entanto, todo positivo né um n + 1palíndromo básico .
Dennis
11
@Dennis Como 2 não é um palíndromo de base 1? É 11. Ou II, ou 2 de qualquer símbolo que você use. Na verdade, todos os números da base 1 são palíndromos. E eu disse que n> = 2, porque eu não sei o que na terra 0 seria.
Cruncher

Respostas:

4

CJam , 19 bytes / GolfScript, 23 bytes

q~:N;1{)_N\b_W%=!}g

ou

~:N;1{).N\base.-1%=!}do

Experimente online:

Exemplos

$ cjam base.cjam <<< 11; echo
10
$ cjam base.cjam <<< 111; echo
6
$ golfscript base.gs <<< 11
10
$ golfscript base.gs <<< 111
6

Como funciona

q~:N;   # Read the entire input, interpret it and save the result in “N”.
1       # Push 1 (“b”).
{       #
  )     # Increment “b”.
  _N\   # Duplicate “b”, push “N” and swap.
  b     # Push the array of digits of “N” in base “b”.
  _W%   # Duplicate the array and reverse it.
  =!    # Compare the arrays.
}g      # If they're not equal, repeat the loop.

Para o GolfScript, q~é ~, _é ., bé base, Wé -1e gé do.

Dennis
fonte
6

GolfScript, 20 caracteres

~:x,2>{x\base.-1%=}?

Uma abordagem diferente com o GolfScript que não o de Dennis . Evita o loop explícito caro em favor de um operador de localização . Experimente online .

~:x        # interpret and save input to variable x
,2>        # make a candidate list 2 ... x-1 (note x-1 is the maximum possible base)
{          # {}? find the item on which the code block yields true
  x\       # push x under the item under investigation
  base     # perform a base conversion
  .-1%     # make a copy and reverse it
  =        # compare reversed copy and original array
}?         
Howard
fonte
11
Esperto! No entanto, isso não funciona se x = 1ou x = 2. Ambos são x + 1palíndromos básicos de um dígito , portanto, x))devem corrigi-lo.
Dennis #
4

Mathematica, 67 66 bytes

g[n_]:=For[i=1,1>0,If[(d=n~IntegerDigits~++i)==Reverse@d,Break@i]]

Não é possível competir com o GolfScript aqui em termos de tamanho do código, mas o resultado para 2 32 é basicamente retornado instantaneamente.

Martin Ender
fonte
Agradável. A função não precisa ser nomeada, pois não? Você poderia apenas usar uma função sem nome?
numbermaniac
(Além disso, é possível utilizar PalindromeQpara a verificação reversa?)
numbermaniac
4

Japt , 12 9 bytes

A menos que eu tenha esquecido um truque (é tarde!), Isso deve funcionar para todos os números, inclusive pelo menos 2**53-1 .

Nos meus testes (reconhecidamente limitados e inteiramente aleatórios), obtive resultados até a base (!) Até agora. Não é tão ruim quando você considera que o JavaScript apenas suporta nativamente bases para .11601 310,515236

@ìX êê}a2

Tente

  • Agradeço à ETH por apontar algo novo para mim que economizou 3 bytes e aumentou consideravelmente a eficiência.

Explicação

Entrada implícita de número inteiro U.

@     }a2

Começando com 2, retorne o primeiro número que retorna true quando passado pela função a seguir, Xsendo o número atual

ìX

Converta Uem uma matriz de Xdígitos base .

êê

Teste se essa matriz é um palíndromo.

Shaggy
fonte
1) sim Culpe a cerveja por essas bolas! : D 2) Bom; nunca soube que N.ì(n)poderia lidar com bases maiores que 36. Obrigado por isso.
Shaggy
Sim, o alfabeto base-36 não importa para N.ì(n)já que estamos usando números inteiros matérias ;-)
ETHproductions
2

Python 2 (83)

def f(n,b=2):
 l=[];m=n
 while m:l+=[m%b];m//=b
 return l==l[::-1]and b or f(n,b+1)

Não sei ao certo qual formato de entrada / saída a pergunta queria. Eu escrevi uma função. O código usa uma entrada opcional bpara rastrear a base atual que está testando. Os whileloops convertem o número em uma lista de dígitos na base b.

A última linha retorna bse lé um palíndromo e tenta recursivamente a próxima bcaso contrário. O truque de índice por booleano não funciona aqui porque faria com que ambas as opções fossem avaliadas independentemente do booleano e a recursão nunca terminaria.

xnor
fonte
11
Então isso não funcionará com bases arbitrariamente altas, certo? Se a base mais baixa que um número possui um palíndromo é como 10000, haverá um estouro de pilha?
Cruncher
@Cruncher Depende da implementação do Python. Ele transbordará quando executado com o CPython, mas não com o Stackless Python , que otimiza a chamada de cauda e, portanto, não tem limite de recursão (embora eu ainda não o tenha testado).
Xnor 22/05
2

JavaScript, 88 bytes

f=function(n){for(a=b='+1';a^a.split('').reverse().join('');a=n.toString(++b));return+b}

Ungolfed:

f = function(n) {
    for(a = b = '+1'; // This is not palindrome, but equals 1 so we have at least one iteration
        a ^ a.split('').reverse().join(''); // test a is palindrome
        a = n.toString(++b));
    return+b
}
core1024
fonte
1

Javascript, 105 bytes

function f(n){for(var b=2,c,d;d=[];++b){for(c=n;c;c=c/b^0)d.push(c%b);if(d.join()==d.reverse())return b}}

JSFiddle: http://jsfiddle.net/wR4Wf/1/

Observe que essa implementação também funciona corretamente para grandes bases. Por exemplo, f(10014)retorna 1668 (10014 é 66 na base 1668).

GOTO 0
fonte
Isso é legal. Você pode até s/var b=2,c,d/b=d=2/ganhar mais 6 bytes;) #
core1024
1

Bash + coreutils, 100 bytes

for((b=1;b++<=$1;)){
p=`dc<<<${b}o$1p`
c=tac
((b<17))&&c=rev
[ "$p" = "`$c<<<$p`" ]&&echo $b&&exit
}

Usa dcpara fazer a formatação básica. O complicado é que dco formato é diferente para n> 16.

Casos de teste:

$ ./lowestbasepalindrome.sh 11
10
$ ./lowestbasepalindrome.sh 32
7
$ ./lowestbasepalindrome.sh 59
4
$ ./lowestbasepalindrome.sh 111
6
$ 
Trauma Digital
fonte
1

J - 28 car

#.inv~(-.@-:|.@)(1+]^:)^:_&2

Explicado:

  • #.inv~ - Expanda o argumento esquerdo para a base no argumento direito.

  • (-.@-:|.@) - Retorne 0 se a expansão for palindrômica e 1 caso contrário.

  • (1+]^:) - Incremente o argumento correto em um se retornarmos 1, caso contrário, não tome nenhuma ação.

  • ^:_ - Repita o incremento acima até que não tome nenhuma ação.

  • &2 - Prepare o argumento correto como 2, tornando isso uma função de um argumento.

Exemplos:

   #.inv~(-.@-:|.@)(1+]^:)^:_&2 (28)
3
   #.inv~(-.@-:|.@)(1+]^:)^:_&2 every 93 11 32 59 111  NB. perform on every item
2 10 7 4 6
   #.inv~(-.@-:|.@)(1+]^:)^:_&2 every 1234 2345 3456 4567 5678 6789
22 16 11 21 31 92
algoritmshark
fonte
2+1 i.~[#.inv"*(-:|.@)~2+i.por 27 bytes. (Não quero postá-lo separadamente Eu só vai deixá-lo aqui..)
randomra
@randomra Eu contaria isso como 29, porque os trens precisam de parênteses para serem usados ​​em linha; o meu salva um personagem por ter uma conjunção no nível superior.
algorithmshark
Eu acho que a posição da maioria na pontuação é a contagem sem par com qualquer função sem nome, embora sempre exista uma discussão sobre isso. De qualquer forma, vou deixar aqui e todos podem escolher como ele / ela consegue. :)
randomra
1

R, 122 bytes 95

function(n)(2:n)[sapply(2:n,function(x){r={};while(n){r=c(n%%x,r);n=n%/%x};all(r==rev(r))})][1]

Solução de três anos em 122 bytes:

f=function(n)(2:n)[sapply(sapply(2:n,function(x){r=NULL;while(n){r=c(n%%x,r);n=n%/%x};r}),function(x)all(x==rev(x)))][1]

Com algumas explicações:

f=function(n)(2:n)[sapply(
                    sapply(2:n,function(x){ #Return the decomposition of n in bases 2 to n
                                 r=NULL
                                 while(n){
                                     r=c(n%%x,r)
                                     n=n%/%x}
                                     r
                                     }
                           ),
                    function(x)all(x==rev(x))) #Check if palindrome
                   ][1] #Return the first (i. e. smallest) for which it is
plannapus
fonte
1

Casca , 11 9 bytes

ḟoS=↔`B⁰2

Obrigado @Zgarb por -2!

Experimente online!

Explicação

ḟ(      )2  -- find least number ≥ 2 that satisfies:
     `B⁰    --   convert input to base (` flips arguments)
  S=↔       --   is palindrome (x == ↔x)
ბიმო
fonte
0

Nota: Pyth é mais recente que esta pergunta, portanto, esta resposta não é elegível para ganhar.

Pitão, 10 bytes

fq_jQTjQT2

Experimente aqui.

isaacg
fonte
0

Scala, 83 bytes

def s(n:Int)=(for(b<-2 to n;x=Integer.toString(n,b);if(x==x.reverse))yield(b)).min
Dave Swartz
fonte
0

Perl 5 , 84 + 1 (-p) = 85 bytes

$\=1;{++$\;my@r;$n=$_;do{push@r,$n%$\}while$n=int$n/$\;@t=@r;map$_-pop@t&&redo,@r}}{

Experimente online!

Xcali
fonte
0

JavaScript 72 bytes

F=(n,b=2)=>eval(`for(t=n,a=c="";t;t=t/b|0)a=t%b+a,c+=t%b`)^a?F(n,b+1):b

console.log(F(11) == 10)

console.log(F(32) == 7)

console.log(F(59) == 4)

console.log(F(111) == 6)

DanielIndie
fonte
0

Mathematica 42 bytes

Uma variação da entrada de Martin Ender. Faz uso de IntegerReverse(disponibilizado na versão 10.3) que dispensa IntegerDigits.

(i=2;While[#~IntegerReverse~i !=#,i++];i)&
DavidC
fonte
0

Java 8, 103 bytes

n->{int b=1,l;for(String s;!(s=n.toString(n,++b)).equals(new StringBuffer(s).reverse()+""););return b;}

Explicação:

Experimente aqui.

n->{                          // Method with integer as both parameter and return-type
  int b=1,                    //  Base-integer, starting at 1
      l;                      //  Length temp integer
  for(String s;               //  Temp String
      !(s=n.toString(n,++b))  //   Set the String to `n` in base `b+1`
                              //   (by first increase `b` by 1 using `++b`)
       .equals(new StringBuffer(s).reverse()+"");
                              //   And continue looping as long as it's not a palindrome
  );                          //  End of loop
  return b;                   //  Return the resulting base integer
}                             // End of method
Kevin Cruijssen
fonte