Palindrome della base più bassa


16

Dato un numero n, scrivi una funzione che trova la base più piccola in b ≥ 2modo che nsia un palindromo nella base b. Ad esempio, un input di 28dovrebbe restituire la base 3poiché la rappresentazione ternaria di 28 è 1001. Sebbene 93sia un palindromo sia nella base 2 che nella base 5, l'output dovrebbe essere 2da 2 <5.

Ingresso

Un numero intero positivo n < 2^31.

Produzione

Restituisce la base più piccola in modo b ≥ 2tale che la brappresentazione di base di nsia un palindromo. Non assumere zero iniziali.

Campioni (input => output):

11 => 10

32 => 7

59 => 4

111 => 6

Regole

Vince il codice più corto.


1
Penso che la base dovrebbe essere limitata.
Spuntino

3
@Snack: qual è il problema con le basi più alte? Indipendentemente dalla scelta dei simboli, un numero di base 1000 sarà o un palindromo o no.
Dennis,

3
Aneddoto interessante: n nella base n-1 è sempre 11 per n> = 2 e quindi è sempre possibile un palindromo.
Cruncher,

1
@Cruncher: npuò essere 1 e 2 non è un palindromo di base 1. Tuttavia, ogni positivo nè un n + 1palindromo di base .
Dennis,

1
@Dennis In che modo 2 non è un palindromo di base 1? Sono 11. O II, o 2 di qualunque simbolo tu usi. In realtà tutti i numeri di base 1 sono palindromi. E ho detto n> = 2, perché non so cosa sarebbe 0 sulla Terra.
Cruncher,

Risposte:


4

CJam , 19 byte / GolfScript, 23 byte

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

o

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

Provalo online:

Esempi

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

Come funziona

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.

Per GolfScript, q~è ~, _è ., bè base, Wè -1ed gè do.


6

GolfScript, 20 caratteri

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

Un approccio diverso con GolfScript diverso da Dennis '. Evita il costoso ciclo esplicito a favore di un operatore di ricerca . Prova 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
}?         

1
Intelligente! Tuttavia, questo non funziona se x = 1o x = 2. Entrambi sono x + 1palindromi a cifra singola e base , quindi x))dovrebbero risolverli.
Dennis,

4

Mathematica, 67 66 byte

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

Non posso davvero competere con GolfScript qui in termini di dimensioni del codice, ma il risultato per 2 32 viene sostanzialmente restituito all'istante.


Bello. La funzione non deve essere nominata però, vero? Potresti semplicemente usare una funzione senza nome?
numbermaniac,

(Inoltre, è possibile utilizzare PalindromeQper il controllo inverso?)
numbermaniac

4

Japt , 12 9 byte

A meno che non abbia perso un trucco (è tardi!), Questo dovrebbe funzionare per tutti i numeri fino almeno compreso 2**53-1 .

Nei miei test (certamente limitati e del tutto casuali), ho ottenuto risultati fino alla base (!) Finora. Non troppo malandato se si considera JavaScript supporta solo in modo nativo le basi per .11601 310,515236

@ìX êê}a2

Provalo

  • Grazie a ETH per avermi segnalato qualcosa di nuovo che ha consentito di risparmiare 3 byte e di aumentare notevolmente l'efficienza.

Spiegazione

Input implicito di numero intero U.

@     }a2

A partire da 2, restituisce il primo numero che restituisce true quando viene passato attraverso la seguente funzione, con Xil numero corrente

ìX

Converti Uin una matrice di Xcifre di base .

êê

Verifica se quell'array è un palindromo.


1) Sì Dai la colpa alla birra per quelle palle! : D 2) Nizza; mai saputo in N.ì(n)grado di gestire basi maggiori di 36. Grazie per quello
Shaggy,

Sì, l'alfabeto base 36 non ha importanza N.ì(n) poiché stiamo usando numeri interi grezzi ;-)
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)

Non sono sicuro del formato di input / output desiderato dalla domanda. Ho scritto una funzione. Il codice utilizza un input facoltativo bper tenere traccia della base corrente che sta testando. I whileloop converte il numero in un elenco di cifre in baseb .

L'ultima riga restituisce bif se lè un palindromo e, in caso bcontrario, tenta il successivo in modo ricorsivo . Il trucco dell'indice per booleano non funziona qui perché causerebbe la valutazione di entrambe le opzioni indipendentemente dal booleano e la ricorsione non avrebbe mai toccato il fondo.


1
Quindi questo non funzionerà con basi arbitrariamente alte, giusto? Se la base più bassa in cui un numero ha un palindromo è come 10000, otterrai un overflow dello stack?
Cruncher,

@Cruncher Dipende dall'implementazione di Python. Traboccerà quando viene eseguito con CPython, ma non con Stackless Python , che ottimizza le chiamate di coda e quindi non ha limiti di ricorsione (anche se non l'ho ancora testato).
xnor

2

JavaScript, 88 byte

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
}

1

Javascript, 105 byte

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/

Si noti che questa implementazione funziona correttamente anche per basi di grandi dimensioni. Ad esempio, f(10014)restituisce 1668 (10014 è 66 nella base 1668).


Questo è carino. Puoi persino s/var b=2,c,d/b=d=2/guadagnare altri 6 byte;)
core1024

1

Bash + coreutils, 100 byte

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

Utilizza dcper eseguire la formattazione di base. La cosa difficile è che dcil formato è diverso per n> 16.

Casi test:

$ ./lowestbasepalindrome.sh 11
10
$ ./lowestbasepalindrome.sh 32
7
$ ./lowestbasepalindrome.sh 59
4
$ ./lowestbasepalindrome.sh 111
6
$ 

1

J - 28 caratteri

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

Ha spiegato:

  • #.inv~ - Espandi l'argomento sinistro alla base nell'argomento destro.

  • (-.@-:|.@) - Restituisce 0 se l'espansione è palindromica e 1 altrimenti.

  • (1+]^:) - Aumenta l'argomento giusto di uno se siamo tornati 1, altrimenti non prendere alcuna azione.

  • ^:_ - Ripetere l'incremento sopra finché non interviene.

  • &2 - Prepara l'argomento giusto come 2, rendendolo una funzione di un argomento.

Esempi:

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

2+1 i.~[#.inv"*(-:|.@)~2+i.per 27 byte. (Non voglio pubblicarlo separatamente. Lo lascerò qui.)
randomra,

@randomra lo considererei 29 perché i treni hanno bisogno di genitori per essere usati in linea; il mio salva un personaggio avendo una congiunzione al livello più alto.
algoritmo

Penso che la posizione della maggioranza sul punteggio sia il conteggio senza pari con qualsiasi funzione senza nome sebbene ci sia sempre una discussione su questo. Ad ogni modo, lo lascerò qui e tutti potranno scegliere come segnarlo. :)
randomra,

1

R, 122 95 byte

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]

Soluzione di tre anni a 122 byte:

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]

Con alcune spiegazioni:

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

1

Buccia , 11 9 byte

ḟoS=↔`B⁰2

Grazie @Zgarb per -2!

Provalo online!

Spiegazione

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

0

Nota: Pyth è più recente di questa domanda, quindi questa risposta non è idonea a vincere.

Pyth, 10 byte

fq_jQTjQT2

Provalo qui.


0

Scala, 83 byte

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



0

JavaScript 72 byte

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)


0

Mathematica 42 byte

Una variazione dell'entrata di Martin Ender. Utilizza IntegerReverse(reso disponibile nella versione 10.3) di cui si discute IntegerDigits.

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

0

Java 8, 103 byte

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

Spiegazione:

Provalo qui.

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