Самая низкая база палиндрома

16

Учитывая число n, напишите функцию, которая находит наименьшую базу, b ≥ 2такую nкак палиндром в базе b. Например, вход 28должен возвращать основание, 3поскольку троичное представление 28 равно 1001. Хотя 93это палиндром как в основании 2, так и в основании 5, результат должен быть равен 22 <5.

вход

Целое положительное число n < 2^31.

Выход

Верните наименьшую базу b ≥ 2, так чтобы базовое bпредставление nбыло палиндромом. Не предполагайте никаких ведущих нулей.

Образцы (вход = выход):

11 => 10

32 => 7

59 => 4

111 => 6

правила

Самый короткий код выигрывает.

ntomlin1996
источник
1
Я думаю, что база должна быть ограничена.
Закуска
3
@Snack: В чем проблема с более высокими базами? Независимо от выбора символов число 1000 будет либо палиндромом, либо нет.
Деннис
3
Интересный анекдот: n в базе n-1 всегда равно 11 при n> = 2 и, таким образом, палиндром всегда возможен.
Cruncher
1
@Cruncher: nможет быть 1 и 2 не является палиндромом базы 1. Однако каждый позитив nявляется базовым n + 1палиндромом.
Денис
1
@ Денис Как 2 не палиндром базы 1? Это 11. Или II, или 2 любого символа, который вы используете. На самом деле все числа базы 1 являются палиндромами. И я сказал n> = 2, потому что я не знаю, что на земле будет 0.
Cruncher

Ответы:

4

CJam , 19 байтов / GolfScript, 23 байта

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

или

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

Попробуйте онлайн:

Примеры

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

Как это устроено

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.

Для GolfScript q~есть ~, _есть ., bесть base, Wесть -1и gесть do.

Деннис
источник
6

GolfScript, 20 символов

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

Другой подход с GolfScript, кроме Денниса . Это позволяет избежать дорогостоящего явного цикла в пользу оператора поиска . Попробуйте онлайн .

~: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
Умная! Тем не менее, это не работает, если x = 1или x = 2. Оба являются однозначными, базовыми x + 1палиндромами, поэтому x))следует это исправить.
Денис
4

Mathematica, 67 66 байт

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

Не может реально конкурировать с GolfScript здесь с точки зрения размера кода, но результат для 2 32 в основном возвращается мгновенно.

Мартин Эндер
источник
Ницца. Функция не должна быть названа, правда? Не могли бы вы просто использовать неназванную функцию?
Числовой маньяк
(Также возможно ли использовать PalindromeQдля обратной проверки?)
Numbermaniac
4

Джапт , 12 9 байт

Если я не пропустил трюк (уже поздно!), Это должно работать для всех номеров, включая, по крайней мере, 2**53-1 .

В моем (по общему признанию ограниченном и совершенно случайном) тестировании я до сих пор доводил результаты до базового (!). Не так уж и плохо, если учесть, что JavaScript поддерживает только базовые возможности .11601 310,515236

@ìX êê}a2

Попытайся

  • Спасибо ETH за указание на что-то новое для меня, которое сэкономило 3 байта и значительно повысило эффективность.

объяснение

Неявный ввод целого числа U.

@     }a2

Начиная с 2, верните первое число, которое возвращает true, когда передано через следующую функцию, с Xтекущим числом

ìX

Преобразовать Uв массив базовых Xцифр.

êê

Проверьте, является ли этот массив палиндромом.

мохнатый
источник
1) да. Вини пиво за эти яйца! : D 2) Ницца; никогда не знал, N.ì(n)может обрабатывать базы больше, чем 36. Спасибо за это.
Лохматый
Да, алфавит base-36 не имеет значения, N.ì(n)так как мы используем сырые целые числа ;-)
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)

Я не уверен, какой формат ввода / вывода хотел вопрос. Я написал функцию. Код использует дополнительный вход bдля отслеживания текущей базы, которую он тестирует. whileПетли преобразует число в список цифр в базеb .

Последняя строка возвращает bif, если lэто палиндром, и рекурсивно пытается выполнить следующее в bпротивном случае. Трюк с индексированием по логическим значениям здесь не работает, потому что он приведет к тому, что обе опции будут оценены независимо от логического значения, а рекурсия никогда не достигнет дна.

XNOR
источник
1
Так что это не будет работать с произвольно высокими основаниями, верно? Если нижняя база числа с палиндромом равна 10000, то вы получите переполнение стека?
Cruncher
@Cruncher Это зависит от реализации Python. Он будет переполнен при запуске с CPython, но не с Stackless Python , который выполняет оптимизацию хвостовых вызовов и поэтому не имеет предела рекурсии (хотя я на самом деле его не тестировал).
xnor
2

JavaScript, 88 байт

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
источник
1

Javascript, 105 байт

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/

Обратите внимание, что эта реализация также работает правильно для больших баз. Например, f(10014)возвращает 1668 (10014 равно 66 в базе 1668).

GOTO 0
источник
Это приятно. Вы можете даже s/var b=2,c,d/b=d=2/получить еще 6 байтов;)
core1024
1

Bash + coreutils, 100 байт

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

Использует dcсделать базовое форматирование. Хитрость в том, что dcформат отличается при n> 16.

Testcases:

$ ./lowestbasepalindrome.sh 11
10
$ ./lowestbasepalindrome.sh 32
7
$ ./lowestbasepalindrome.sh 59
4
$ ./lowestbasepalindrome.sh 111
6
$ 
Цифровая травма
источник
1

J - 28 символов

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

Разъяснение:

  • #.inv~ - Разверните левый аргумент до основания в правом аргументе.

  • (-.@-:|.@) - Вернуть 0, если расширение палиндромно, и 1 в противном случае.

  • (1+]^:) - Увеличить правильный аргумент на единицу, если мы вернули 1, иначе не предпринимать никаких действий.

  • ^:_ - Повторяйте вышеуказанное приращение, пока оно не предпримет никаких действий.

  • &2 - Подготовьте правильный аргумент как 2, сделав это функцией одного аргумента.

Примеры:

   #.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
algorithmshark
источник
2+1 i.~[#.inv"*(-:|.@)~2+i.для 27 байтов. (Не хочу публиковать это отдельно. Я просто оставлю это здесь.)
randomra
@randomra Я бы посчитал, что это 29, потому что поездам нужны парены, чтобы их можно было использовать на линии; Мой спасает персонажа, имея соединение на верхнем уровне.
алгоритмическая
Я думаю, что позиция большинства в подсчете очков - это беспристрастный подсчет с любой неназванной функцией, хотя всегда есть спор об этом. В любом случае, я оставлю это здесь, и каждый может выбрать, как он / она забьет это. :)
randomra
1

R, 122 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]

Трехлетнее решение на 122 байта:

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]

С некоторыми объяснениями:

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
источник
0

Скала, 83 байта

def s(n:Int)=(for(b<-2 to n;x=Integer.toString(n,b);if(x==x.reverse))yield(b)).min
Дейв Шварц
источник
0

JavaScript 72 байта

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
источник
0

Mathematica 42 байта

Вариант записи Мартина Эндера. Использует IntegerReverse(доступно в версии 10.3), без которого IntegerDigits.

(i=2;While[#~IntegerReverse~i !=#,i++];i)&
DavidC
источник
0

Java 8, 103 байта

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

Объяснение:

Попробуй это здесь.

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
Кевин Круйссен
источник