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.


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.


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
}?         

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.


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


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.


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
}

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


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
$ 

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

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

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)


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



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)


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.