Palindrom o najniższej podstawie

16

Podając liczbę n, napisz funkcję, która znajdzie najmniejszą podstawę, b ≥ 2taką njak palindrom w podstawie b. Na przykład wejście 28powinno zwracać podstawę, 3ponieważ trójskładnikowa reprezentacja 28 wynosi 1001. Chociaż 93jest palindromem zarówno w podstawie 2, jak i podstawie 5, wynik powinien wynosić 2od 2 <5.

Wejście

Dodatnia liczba całkowita n < 2^31.

Wynik

Zwróć najmniejszą bazę, b ≥ 2tak aby podstawową breprezentacją nbyła palindrom. Nie zakładaj żadnych zer wiodących.

Próbki (wejście => wyjście):

11 => 10

32 => 7

59 => 4

111 => 6

Zasady

Najkrótszy kod wygrywa.

ntomlin1996
źródło
1
Myślę, że podstawa powinna być ograniczona.
Przekąska
3
@Snack: Jaki jest problem z wyższymi zasadami? Niezależnie od wyboru symboli, podstawowa liczba 1000 będzie albo palindromem, albo nie.
Dennis
3
Interesująca anegdota: n w podstawie n-1 wynosi zawsze 11 dla n> = 2, a zatem palindrom jest zawsze możliwy.
Cruncher
1
@Cruncher: nmoże być 1, a 2 nie jest podstawowym palindromem 1. Jednak każdy pozytyw njest podstawowym n + 1palindromem.
Dennis
1
@Dennis W jaki sposób 2 nie jest palindromem podstawowym 1? Jest 11. lub II, lub 2 dowolnego symbolu, którego używasz. Właściwie wszystkie liczby podstawowe 1 są palindromami. Powiedziałem n> = 2, ponieważ nie wiem, co na Ziemi byłoby 0.
Cruncher

Odpowiedzi:

4

CJam , 19 bajtów / GolfScript, 23 bajty

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

lub

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

Wypróbuj online:

Przykłady

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

Jak to działa

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.

W przypadku GolfScript q~jest ~, _jest ., bjest base, Wjest -1i gjest do.

Dennis
źródło
6

GolfScript, 20 znaków

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

Inne podejście z GolfScript inne niż Dennis . Pozwala to uniknąć kosztownej jawnej pętli na rzecz operatora znajdowania . Wypróbuj 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
źródło
1
Sprytny! Nie działa to jednak, jeśli x = 1lub x = 2. Oba są jednocyfrowymi podstawowymi x + 1palindromami, więc x))należy to naprawić.
Dennis
4

Mathematica, 67 66 bajtów

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

Tak naprawdę nie może konkurować z GolfScript pod względem wielkości kodu, ale wynik dla 2 32 jest w zasadzie natychmiast zwracany.

Martin Ender
źródło
Ładny. Nie trzeba jednak nazywać tej funkcji, prawda? Czy możesz po prostu użyć funkcji bez nazwy?
numbermaniac
(Ponadto, czy można używać PalindromeQdo sprawdzania wstecznego?)
numbermaniac
4

Japt , 12 9 bajtów

O ile nie spóźniłem się na lewę (jest już późno!), To powinno działać dla wszystkich liczb, do co najmniej włącznie 2**53-1.

W moich (co prawda ograniczonych i całkowicie losowych) testach uzyskałem wyniki do podstawy 11601 310,515 tej pory (!). Nie zbyt nikczemny jeśli wziąć pod uwagę tylko natywnie obsługuje JavaScript podstaw 2do 36.

@ìX êê}a2

Spróbuj

  • Dzięki ETH za wskazanie mi czegoś nowego, co pozwoliło zaoszczędzić 3 bajty i znacznie zwiększyć wydajność.

Wyjaśnienie

Domniemane wprowadzenie liczby całkowitej U .

@     }a2

Począwszy od 2 , zwróć pierwszą liczbę, która zwraca true po przejściu przez następującą funkcję, przy Xczym jest to bieżąca liczba

ìX

Konwertować U na tablicę Xcyfr podstawowych .

êê

Sprawdź, czy ta tablica jest palindromem.

Kudłaty
źródło
1) Tak Obwiniaj piwo za te kule! : D 2) Nicea; nigdy nie wiedziałem, N.ì(n)że poradzi sobie z bazami większymi niż 36. Dziękuję za to.
Kudłaty
Tak, alfabet base-36 nie ma znaczenia, N.ì(n)ponieważ używamy surowych liczb całkowitych ;-)
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)

Nie jestem pewien, jaki format wejściowy / wyjściowy chciał pytanie. Napisałem funkcję. Kod wykorzystuje opcjonalne dane wejściowe bdo śledzenia bieżącej bazy, którą testuje. Thewhile pętle konwertuje liczbę na listę cyfr w bazie b.

Ostatnia linia zwraca bif, jeśli ljest palindromem, i rekurencyjnie próbuje następnej binaczej. Sztuczka indeksowania według logiki nie działa tutaj, ponieważ spowodowałaby ocenę obu opcji niezależnie od logicznej wartości logicznej, a rekurencja nigdy nie byłaby dno.

xnor
źródło
1
Więc to nie zadziała z arbitralnie wysokimi bazami, prawda? Jeśli najniższa podstawa, którą liczba ma palindrom, to 10000, dostaniesz przepełnienie stosu?
Cruncher
@Cruncher To zależy od implementacji Pythona. Przepełni się, gdy zostanie uruchomiony z CPython, ale nie z Pythonem bez stosu , który optymalizuje wywołania tail, a więc nie ma limitu rekurencji (chociaż tak naprawdę go nie testowałem).
xnor
2

JavaScript, 88 bajtów

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

Nie golfowany:

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
}
rdzeń 1024
źródło
1

JavaScript, 105 bajtów

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/

Pamiętaj, że ta implementacja działa również poprawnie dla dużych baz. Na przykład f(10014)zwraca 1668 (10014 to 66 w podstawie 1668).

GOTO 0
źródło
To jest miłe. Możesz nawet s/var b=2,c,d/b=d=2/zyskać 6 dodatkowych bajtów;)
core1024
1

Bash + coreutils, 100 bajtów

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

Używa dcformatowania podstawowego. Trudna rzecz jestdc , że format jest inny dla n> 16.

Przypadki testowe:

$ ./lowestbasepalindrome.sh 11
10
$ ./lowestbasepalindrome.sh 32
7
$ ./lowestbasepalindrome.sh 59
4
$ ./lowestbasepalindrome.sh 111
6
$ 
Cyfrowa trauma
źródło
1

J - 28 znaków

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

Wyjaśniono:

  • #.inv~ - Rozwiń lewy argument do podstawy w prawym argumencie.

  • (-.@-:|.@) - Zwraca 0, jeśli rozwinięcie jest palindromiczne, a 1 w przeciwnym razie.

  • (1+]^:) - Zwiększ poprawny argument o jeden, jeśli zwróciliśmy 1, w przeciwnym razie nie podejmuj żadnych działań.

  • ^:_ - Powtarzaj powyższe czynności, aż nie podejmie żadnych działań.

  • &2 - Przygotuj odpowiedni argument jako 2, dzięki czemu będzie to funkcja jednego argumentu.

Przykłady:

   #.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
algorytmshark
źródło
2+1 i.~[#.inv"*(-:|.@)~2+i.dla 27 bajtów. (Nie chcę publikować osobno. Zostawię to tutaj.)
randomra
@ randomra Policzyłbym to jako 29, ponieważ pociągi potrzebują parenów, aby można je było używać w linii; moja ratuje postać, łącząc się na najwyższym poziomie.
algorytmshark
Wydaje mi się, że większość na punktacji to liczenie bez paren z dowolną nienazwaną funkcją, chociaż zawsze jest o to argument. W każdym razie zostawię to tutaj i każdy może wybrać sposób, w jaki to oceni. :)
randomra 18.04.15
1

R, 122 95 bajtów

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]

Trzyletnie rozwiązanie o wielkości 122 bajtów:

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]

Z kilkoma wyjaśnieniami:

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
źródło
1

Łuska , 11 9 bajtów

ḟoS=↔`B⁰2

Dzięki @Zgarb za -2!

Wypróbuj online!

Wyjaśnienie

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

Uwaga: Pyth jest nowszy od tego pytania, więc nie można wygrać.

Pyth, 10 bajtów

fq_jQTjQT2

Wypróbuj tutaj.

isaacg
źródło
0

Scala, 83 bajty

def s(n:Int)=(for(b<-2 to n;x=Integer.toString(n,b);if(x==x.reverse))yield(b)).min
Dave Swartz
źródło
0

JavaScript 72 bajty

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
źródło
0

Mathematica 42 bajty

Odmiana wpisu Martina Endera. Wykorzystuje IntegerReverse(udostępniony w wersji 10.3), z którego rezygnuje IntegerDigits.

(i=2;While[#~IntegerReverse~i !=#,i++];i)&
DavidC
źródło
0

Java 8, 103 bajty

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

Wyjaśnienie:

Wypróbuj tutaj.

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
źródło