Визначте, чи ціле число є паліндром у заданому радіусі (база)


11

Напишіть програму, яка зчитує з stdin два цілі числа, кожен новий рядок закінчується, надалі називається "число" і "radix", і:

  1. Друк будь-якого фіксованого повідомлення , яке ви хочете , якщо число паліндром в цій системі числення (наприклад true, t, 1)
  2. Друк будь-якого іншого фіксованого повідомлення , яке ви хочете , якщо число не паліндром в цій системі числення (наприклад false, f, 0і т.д.)
  3. Ці повідомлення повинні бути однаковими на кожному пробігу, але немає правил щодо того, якими вони повинні бути (що найкраще для гри в гольф).
  4. Ви можете припустити, що введення дійсне, два натуральних числа. "число" не перевищить 2147483647, "радікс" не перевищить 32767.
  5. Ви не можете використовувати зовнішні ресурси, але ви можете використовувати будь-яку математичну функцію, включену за замовчуванням у вашу мову.

Примітка: радіус - це лише основа числа.

Проби:

16
10
false

16
3
true

16
20
true

121
10
true

5
5
false

12346
12345
true

16781313
64
true

16781313
16
true

Примітка: радіус - це лише основа числа.

Зараз добре виглядає. Можливо, ви хочете заборонити зовнішні ресурси.

@ user2509848 hmmm, наприклад?
durron597

Якщо людина зможе знайти в Інтернеті калькулятор, який перетворює числа між базами, він майже напевно буде використаний. Останнім часом у нас виникає нестримність відповідей.

Чи може одне з фіксованих повідомлень бути порожнім рядком (якщо припустити, що інше є не порожнім рядком)?
Toby Speight

Відповіді:


5

J (23 char) та K (19) подвійна функція

Дві мови дуже схожі, як в цілому, так і в цьому специфічному гольфі. Ось J:

(-:|.)#.^:_1~/".1!:1,~1
  • ,~1- Додайте число 1 до себе, складаючи масив 1 1.
  • 1!:1- Прочитайте у двох рядках з клавіатури ( 1!:1є для читання, і 1це ручка / номер файлу для введення на клавіатуру).
  • ". - Перетворити кожен рядок у число.
  • #.^:_1~/- F~/ x,yзначить знайти y F x. Наша Fє #.^:_1, яка виконує розширення бази.
  • (-:|.)- Чи відповідає аргумент ( -:) його зворотній ( |.)? 1за так, 0за ні.

І ось K:

a~|a:_vs/|.:'0::'``
  • 0::'``- Прочитайте в ( 0::) рядок для кожного ( ') рядка з консолі ( `це обробка файлу для цього).
  • .:'- Перетворити ( .:) кожен 'рядок ( ) у число.
  • _vs/|- Переверніть пару чисел так, щоб радіус був перед числом, а потім вставити між ними ( /) базову функцію розширення _vs("вектор від скаляра").
  • a~|a:- Призначте це отримане розширення aта перевірте, чи aвідповідає ( ~) його зворотному ( |). Знову ж 1так, 0за ні.

@ ak82 Я вважаю, що це цікавіше цим способом
Джон Дворак

8

GolfScript, 10 символів

~base.-1%=

Це легко для GolfScript, якщо ми це робимо прямо. Вихід є 0/ 1для хибного / правдивого.

~       # Take input and evaluate it (stack: num rdx)
base    # Fortunately the stack is in the correct order for
        # a base transformation (stack: b[])
.       # Duplicate top of stack (stack: b[] b[])
-1%     # Reverse array (stack: b[] brev[])
=       # Compare the elements

3

APL (20)

⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕

Виходи 0або 1, наприклад:

      ⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕
⎕:
      5
⎕:
      5
0
      ⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕
⎕:
      16781313
⎕:
      64
1

Пояснення:

  • ⎕{... }⎕: прочитайте два числа, передайте їх функції. є першим числом і є другим числом.
  • ⌊1+⍺⍟⍵: floor(1+⍺ log ⍵), кількість цифр, необхідних для представлення в базі .
  • ⍺/⍨: база для кожної цифри, так що реплікується на число, яке ми тільки що обчислили.
  • ⍵⊤⍨: представляють у заданій базі (використовуючи числа, тому вона працює для всіх значень ).
  • ≡∘⌽⍨: подивіться, чи результат дорівнює його зворотному.

3

Perl, 82 77 73 69 байт

$==<>;$.=<>;push(@a,$=%$.),$=/=$.while$=;@b=reverse@a;print@a~~@b?1:0

Вхідні числа очікуються як рядки введення STDIN, а результат записується як 1або 0, колишнє значення першого числа є паліндром у поданні даної бази.

Редагувати 1: Використання $=зберігає деякі байти через внутрішнє перетворення в int.

Редагувати 2: Оператор smartmatch ~~порівнює елементи масиву безпосередньо, тому перетворення в рядок не потрібно.

Редагування 3: Оптимізація шляхом видалення непотрібної змінної.

65 байт : Якщо пустий рядок дозволено як вихід false, останні чотири байти можна видалити.

Безгольова версія

$= = <>;
$. = <>;
while ($=) {
    push(@a, $= % $.);
    $= /= $.; # implicit int conversion by $=
}
@b = reverse @a;
print (@a ~~ @b) ? 1 : 0

Алгоритм зберігає цифри перетвореного числа в масиві @a. Потім рядкове представлення цього масиву порівнюється з масивом у зворотному порядку. Пробіли розділяють цифри.


Вибачте, моя відповідь насправді такий же підхід, але, використовуючи, $=дозволяйте вам простукати intкрок ... І питання стоїть anything you wantтак, щоб нічого не могло бути тим, що ви хочете ;-)
Ф. Хаурі,

@ F.Hauri: Дякую, я оновлю. $=також дається підказка у цій відповіді на питання "Поради щодо гольфу в Перлі" . Повернення 0коштує 6 зайвих байт, але в мене склалося враження, що фіксоване повідомлення не має бути порожнім.
Хайко Обердьєк,

Хем ,, Повернення 0 коштувало 4 зайвих байта, а не 6. Але я стверджую: це все! silence
Ф. Хаурі

@ F.Hauri: Так, 4 правильно, додаткові два байти були дужками версії, що не має волі.
Хайко Обердьєк

2

Javascript 87

function f(n,b){for(a=[];n;n=(n-r)/b)a.push(r=n%b);return a.join()==a.reverse().join()}

nаргумент - число, bаргумент - радіус.


2

Шавлія, 45

Працює в інтерактивному рядку

A=Integer(input()).digits(input())
A==A[::-1]

Друкує, Trueколи це паліндром, друкує Falseінакше


2

Перл 54 56 62

$==<>;$-=<>;while($=){$_.=$/.chr$=%$-+50;$=/=$-}say$_==reverse

Для тестування:

for a in $'16\n3' $'16\n10' $'12346\n12345' $'12346\n12346' $'21\n11' $'170\n16';do
    perl -E <<<"$a" ' 
        $==<>;$-=<>;while($=){$_.=$/.chr$=%$-+50;$=/=$-}say$_==reverse
    '
  done

дам:

1

1


1

Тому цей вихід 1для trueколи не буде знайдений і паліндром нічого , якщо ще.

Ungolfing:

$==<>;                            # Stdin to `$=`  (value)
$-=<>;                            # Stdin to `$-`  (radix)
while ( $= ) {
    $_.= $/. chr ( $= % $- +50 ); # Add *separator*+ chr from next modulo to radix to `$_`
    $=/= $-                       # Divide value by radix
}
say $_ == reverse                 # Return test result

Нота :

  • $_ є поточним буфером рядків і порожнім на початку.
  • $=це зарезервована змінна, оригінально використовується для друку ліній, це лічильник ліній. Таким чином, ця змінна є цілим числом , будь-яке обчислення на цьому призведе до урізаного цілого числа, як якщо б воно int()було використано.
  • $- використовували для розваги, просто щоб не використовувати традиційні букви ... (ще кілька примхливості) ...

щоб уточнити, це нічого не говорить, коли це не паліндром, а 1, коли це?
durron597

1
Приємні трюки. Однак помилковий позитивний: 21 з базовою 11. Для порівняння рядків потрібен роздільник.
Хайко Обердьєк,

Ааарг +3! @HeikoOberdiek Ви маєте рацію ...
Ф. Хаурі

@ F.Hauri: Також цифри повертаються назад. Таким чином, 170 з основою 16 є 0xAA, паліндром, але результат хибний.
Хайко Обердік

Ааарг +6! перетворення на символи ...
Ф. Хаурі

1

Математика 77 43

IntegerDigits[n,b]представляє n як перелік цифр у базі b. Кожна база-b цифра виражається десятково.

Наприклад, 16781313 не є паліндром в основі 17:

IntegerDigits[16781313, 17]

{11, 13, 15, 11, 14, 1}

Тим НЕ менше, це паліндром в базі 16:

IntegerDigits[16781313, 16]

{1, 0, 0, 1, 0, 0, 1}


Якщо упорядковані пари у наведених вище прикладах були введені,

(x=Input[]~IntegerDigits~Input[])==Reverse@x

повернеться

Неправдиво (* (тому що {11, 13, 15, 11, 14, 1}! = {1, 14, 11, 15, 13, 11}) *)

Істинно (* (тому що {1, 0, 0, 1, 0, 0, 1} дорівнює {1, 0, 0, 1, 0, 0, 1}) *)


Дивно, не потрібно для відповіді, але мені цікаво, як це їх робить?
durron597

Я ненавиджу це, коли втрачаю через дурний набір ...
user12205

Будь ласка, поясніть "набір тексту".
DavidC

Моє рішення мудреця на два символи довше, ніж у вас, тому що я маю подати дані для введенняInteger
user12205

Тепер я розумію, що ви маєте на увазі. Дякую.
DavidC

1

Хаскелл (80 годин)

tb 0 _=[]
tb x b=(tb(div x b)b)++[mod x b]
pali n r=(\x->(x==reverse x))(tb n r)

Телефонуйте за допомогою pali $number $radix. Щоправда, коли число - паліндром, помилково, якщо ні.



1

Perl 6 , 27 байт (22 без stdin / out)

say (+get).base(get)~~.flip

Спробуйте в Інтернеті!

  get()                     # pulls a line of stdin
 +                          # numerificate
(      ).base(get())        # pull the radix and call base to 
                            #  convert to string with that base
                    ~~      # alias LHS to $_ and smartmatch to
                      .flip # reverse of the string in $_

Perl6, король читабельних гольфів (golves?) (А також деякі не такі читальні).

Функція Perl 6 (не stdin / stdout), 22 байти

{$^a.base($^b)~~.flip}

Спробуйте в Інтернеті!


Причиною, яку я не використовував baseу своїй відповіді, є те, що baseпідтримує лише базу 36, а питання вимагає підтримувати радіуси до32767
Джо Кінг,

О, не знав цього. Хм.
Філ Х

0

дг - 97 байт

Випробування дг :

n,r=map int$input!.split!
a=list!
while n=>
 a.append$chr(n%r)
 n//=r
print$a==(list$reversed a)

Пояснили:

n, r=map int $ input!.split!      # convert to int the string from input
a = list!                         # ! calls a function without args
while n =>
 a.append $ chr (n % r)           # append the modulus
 n //= r                          # integer division
print $ a == (list $ reversed a)  # check for palindrome list

0

С, 140 132

int x,r,d[32],i=0,j=0,m=1;main(){scanf("%d %d",&x,&r);for(;x;i++)d[i]=x%r,x/=r;i--;for(j=i;j;j--)if(d[j]-d[i-j])m=0;printf("%d",m);}
  • radix 1 не підтримується :)

1
Просто puts(m)працювало б правильно?
durron597

printf("%d",m);буде на 8 символів коротше.
VX

0

Хаскелл - 59

Небагато змін у відповіді Макса Ріда.

0%_=[]
x%b=x`mod`b:((x`div`b)%b)
p=((reverse>>=(==)).).(%)


0

постійного струму, 39 байт

Довжина - паліндром, звичайно ( 33₁₂).

[[t]pq]sgod[O~laO*+sad0<r]dsrx+la=g[f]p

Число та радіація повинні знаходитись у верхній частині стека (у поточній базі чисел); число повинно бути не менше 0, а радіус повинен бути не менше 2. Вихід, tякщо це паліндром, а fякщо ні. Оскільки це не вказано в виклику, я припускав, що числа ніколи не мають провідних нулів (тому будь-яке число, що закінчується, 0не може бути паліндром).

Пояснення

Як повноцінна програма:

#!/usr/bin/dc

# read input
??

# success message
[[t]pq]sg

# set output radix
o

# keep a copy unmodified
d

# reverse the digits into register a
[O~ laO*+sa d0<r]dsrx

# eat the zero left on stack, and compare stored copy to a
+ la=g

# failure message
[f]p

0

LaTeX, 165 байт

Приклад на desmos.com

k, radix, є регульованим входом

b=\floor \left(\log _k\left(\floor \left(x\right)\right)\right)
f\left(x\right)=k^bx-x-\left(k^2-1\right)\sum _{n=1}^bk^{\left(b-n\right)}\floor \left(xk^{-n}\right)

Якщо f(x)=0, xє паліндром в основі k.


0

Perl 6 , 34 байти

-4 байти завдяки PhilH

{@(polymod $^a: $^b xx*)~~[R,] $_}

Спробуйте в Інтернеті!


Ви можете використовувати $ _ замість @r, щоб зберегти 2
Phil H

@PhilH Ні . (призначає послідовність, а не список)
Джо Кінг

Ах, вибачте, що не побачив помилку
Phil H

@PhilH Ваша друга порада все-таки допомогла зберегти байти!
Джо Кінг

1
Завжди дратує, що не існує коротшого способу виклику скорочення мета на $ _ або @_.
Філ Х

0

05AB1E ,  4  3 байти

вÂQ

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

в      # The first (implicit) input converted to base second (implicit) input
       #  i.e. 12345 and 12346 → [1,1]
       #  i.e. 10 and 16 → [1,6]
 Â     # Bifurcate the value (short for duplicate & reverse)
       #  i.e. [1,1] → [1,1] and [1,1]
       #  i.e. [1,6] → [1,6] and [6,1]
  Q    # Check if they are still the same, and thus a palindrome
       #  i.e. [1,1] and [1,1] → 1
       #  i.e. [1,6] and [6,1] → 0

0

C (gcc) , 79 байт

n,r,m;main(o){for(scanf("%d %d",&n,&r),o=n;n;n/=r)m=m*r+n%r;printf("%d",m==o);}

Спробуйте в Інтернеті!

Спуститися

n,r,m;main(o){
for(scanf("%d %d",&n,&r),       Read the number and the radix.
o=n;                            ...and save the number in o
n;                              Loop while n is non-zero
n/=r)                           Divide by radix to remove right-most digit.
m=m*r+n%r;                      Multiply m by radix to make room for a digit
                                and add the digit.
printf("%d",m==o);}             Print whether we have a palindrome or not.

Виходячи з того, що для паліндрому зворотний бік числа повинен дорівнювати самому числу.

Припустимо, у вас є трицифрове число ABC в якійсь базі. Помноження його на базу завжди призведе до ABC0, а ділення на базу в AB з C як залишок. Отже, щоб повернути число, ми вибираємо найбільшу цифру від початкового числа і вставляємо її праворуч на перевернене число. Щоб звільнити місце для цієї цифри, попередньо множимо реверс на базу.

В основному:

n       rev
ABC     0
AB      C
AB      C0
A       CB
A       CB0
0       CBA

Це круто, ви можете пояснити математику за цим?
durron597

@ durron597 Звичайно! Додано пояснення до публікації.
гастропнер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.