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


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

правила

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


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противном случае. Трюк с индексированием по логическим значениям здесь не работает, потому что он приведет к тому, что обе опции будут оценены независимо от логического значения, а рекурсия никогда не достигнет дна.


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
}

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


Это приятно. Вы можете даже 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

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







0

Mathematica 42 байта

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

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

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.