Паліндром нижнього рівня


16

Задавши число n, напишіть функцію, яка знаходить найменшу основу b ≥ 2таку, яка nє паліндром в основі b. Наприклад, вхід 28має повернути базу, 3оскільки потрійне представлення 28 дорівнює 1001. Хоча 93паліндром і в базі 2, і в базі 5, вихід повинен бути 2з 2 <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, і тому паліндром завжди можливий.
Крончер

1
@Cruncher: nможе бути 1 і 2 не є базовим 1 паліндром. Однак кожен позитив n- базовий n + 1паліндром.
Денніс

1
@Dennis Як 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, крім Dennis '. Це дозволяє уникнути дорогого явного циклу на користь оператора пошуку . Спробуйте в Інтернеті .

~: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

Математика, 67 66 байт

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

Тут реально не можна конкурувати з GolfScript за розміром коду, але результат для 2 32 в основному повертається миттєво.


Приємно. Однак функцію не потрібно називати, чи не так? Чи можете ви просто використовувати неназвану функцію?
numbermaniac

(Також, чи можна використовувати PalindromeQдля зворотної перевірки?)
numbermaniac

4

Japt , 12 9 байт

Якщо я не пропустив трюк (пізно!), Це повинно працювати для всіх чисел, щонайменше, включаючи щонайменше 2**53-1 .

У моєму (правда, обмеженому і цілком випадковому) тестуванні я отримав результати до цих пір (!). Чи не занадто пошарпаний , якщо врахувати , JavaScript тільки спочатку підтримує бази в .11601 310,515236

@ìX êê}a2

Спробуй це

  • Завдяки ETH за вказівку на щось нове для мене, що заощадило 3 байти та значно збільшило ефективність.

Пояснення

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

@     }a2

Починаючи з того 2, поверніть перше число, яке повертається істинним при переході через наступну функцію, з Xпоточним номером

ìX

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

êê

Перевірте, чи є цей масив паліндром.


1) Так. Звинувачуйте пиво за те, що кульки! : D 2) Ніцца; ніколи не знав, чи N.ì(n)може обробити бази більше 36. Дякую за це.
Shaggy

Так, алфавіт базової 36 не має значення, N.ì(n)оскільки ми використовуємо цілі числа ;-)
ETHproductions

2

Пітон 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 .

Останній рядок повертається, bякщо 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}

Безголівки:

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.

Тести:

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

1

J - 28 char

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