Найменший паліндром, що ділиться на вході


23

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

Паліндром (тобто вихід) не повинен мати нульовий нуль, щоб бути паліндром, наприклад, 080це неправдива відповідь 16.

Вхід ніколи не буде кратним 10 через попередню причину.

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

Входи та виходи

  • Ви можете взяти дані STDINяк аргумент функції чи щось подібне.
  • Ви можете надрукувати вихід STDOUT, повернути його з функції чи чогось подібного.
  • Входи та виходи повинні бути в десятковій базі.

Тестові справи

N        Output
1        1
2        2
16       272
17       272
42       252
111      111
302      87278
1234     28382

Оцінка балів

Це , тому найкоротша відповідь у байтах виграє.


Чи буде вхід ділитися на 10?
Leaky Nun

@LeakyNun Ні, оскільки тоді рішення не існує, оскільки паліндром не повинен мати нульового нуля. Я зроблю це явно.
Фаталізувати

Чи буде вклад позитивним?
Пшеничний майстер

1
@WheatWizard Так: Дано додатне ціле числоN
Підписатись

@ Фаталізуйте вибачте. Я не знаю, як я це пропустив.
Пшеничний майстер

Відповіді:


9

2able / 05AB1E , 6/7 байт

2 користування

[DÂQ#+

Пояснення

[         # infinite loop
 D        # duplicate current number
  Â       # bifurcate
   Q#     # if the number is equal to its reverse, break loop
     +    # add input
          # implicitly print

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

05AB1E

[DÂQ#¹+

Різниця від 2-кодового коду полягає в тому, що вхід неявний лише один раз у 05AB1E, тому тут нам потрібно ¹отримати перший вхід ще раз.

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

Збережено 1 байт з двома можливостями, як запропонував Аднан


@Fatalize Я щойно писав це :)
Emigna

При перемиканні на 2sable, ви можете зберегти байти, роблячи це: [DÂQ#+.
Аднан

@Adnan: Правильно! Повторне неявне введення економить байт :)
Emigna


13

Pyth, 7 байт

*f_I`*Q

Спробуйте в Інтернеті: Демонстрація

Пояснення

*f_I`*QT)Q   implicit endings, Q=input number
 f      )    find the first number T >= 1, which satisfies:
     *QT        product of Q and T
    `           as string
  _I            is invariant under inversion (=palindrom)
*        Q   multiply this number with Q and print

Прочитавши стільки запитань щодо кодового коду, я починаю думати, що Pyth буде наступним JS / Java / Ruby / Python ...
agilob

5
@agilob о дорогий боже, pls ні.
Олександр - Відновіть Моніку

7

Java, 164 159 126 108 94 байт

Версія для гольфу:

int c(int a){int x=a;while(!(x+"").equals(new StringBuffer(x+"").reverse()+""))x+=a;return x;}

Негольована версія:

int c(int a)
{
    int x = a;
    while (!(x + "").equals(new StringBuffer(x + "").reverse() + ""))
        x += a;
    return x;
}

Вигукніть Еміньї та Кевіну Крейссену за те, що ви внесли вдосконалення та скоротили байти майже навпіл :)


1
Чи не x % a == 0є надмірним, коли ви ініціалізуєте x як a і збільшуєте його лише на a? Також, чи можна порівняння з обертанням рядка робити в той час як умовне?
Емінья

Ви можете видалити import org.apache.commons.lang.StringUtils;та використовувати org.apache.commons.lang.StringUtils.reverseбезпосередньо. for(;;)коротше, ніж while(1>0). Немає потреби у повноцінній програмі, це int c(int a){...}було б справедливою відповіддю, оскільки питання має таке правило: " Ви можете сприймати дані як аргумент функції. Ви можете повернути вихід з функції ". @Emigna справді має рацію, що перевірка модуля не потрібна.
Kevin Cruijssen

О, і ласкаво просимо! Можливо, вам сподобається ця публікація: Поради щодо гольфу на Java .
Kevin Cruijssen

@Emigna: ти абсолютно прав, зробив це.
peech

@KevinCruijssen: оскільки я повторюю лише числа, які поділяються на (на x += a). Мені не потрібно перевіряти подільність :) і дякую за поради з гольфу!
peech

7

C #, 103 80 байт

int f(int p){int x=p;while(x+""!=string.Concat((x+"").Reverse()))x+=p;return x;}

Безумовно

int f(int p)
{
   int x = p;
   while (x + "" != string.Concat((x + "").Reverse()))
      x += p;
   return x;
}

2
Ви можете зберегти деякі байти, видаливши i, і збільшивши через x + = p.
stannius

1
заміна x.ToString()на "x +" "` дозволить зберегти купу символів.

6

Python 2, 46 байт

f=lambda x,c=0:`c`[::-1]==`c`and c or f(x,c+x)

Ідей це!

Рекурсивне рішення з cлічильником.

Справа 0є цікавою, адже хоча вона c=0відповідає умові паліндром, вона не повертається, бо ccc and 0 or xxxзавжди повертається xxx.


1
Це зробити трохи коротше c*(`c`[::-1]==`c`)or.
xnor

5

PHP, 39 байт

while(strrev($i+=$argv[1])!=$i);echo$i;
  • Бере число N як аргумент $ argv [1];
  • ; через час нічого не робити
  • strrev повернути рядок назад

Однакова довжина з for-петлею

for(;strrev($i+=$argv[1])!=$i;);echo$i;


5

Javascript (ES6), 55 51 байт

4 байти завдяки Нілу.

f=(x,c=x)=>c==[...c+""].reverse().join``?c:f(x,x+c)
<input type=number min=1 oninput=o.textContent=this.value%10&&f(+this.value)><pre id=o>


Коли ви граєте, створюючи фрагмент коду для вас, перший +здається непотрібним.
Ніл

Чи (x,c=x)дозволить вам уникнути &&c?
Ніл

Я думаю, ви можете зробити, c^[...c+""].reverse().join``?f(x,x+c):cщоб зберегти ще один байт.
Арнольд

c-працював би на дещо більшу кількість, ніж c^, якщо це необхідно.
Ніл


4

C, 217 189 байт

Автономна версія:

int a(char*b){int c=strlen(b);for(int i=0;i<c/2;i++)if(b[i]!=b[c-i-1])return 0;}int main(int e,char **f){int b,c;char d[9];b=atoi(f[1]);c=b;while(1){sprintf(d,"%d",c);if(a(d)&&(c/b)*b==c)return printf("%d",c);c++;}}

Виклик до версії функції:

int s(char*a){int b=strlen(a);for(int i=0;i<b/2;i++)if(a[i]!=a[b-i-1])return 0;}int f(int a){int b;char c[9];b=a;while(1){sprintf(c,"%d",b);if(s(c)&&(b/a)*a==b)return printf("%d",b);b++;}}

Безголовки:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int check_palindrome(char *str) {
  int length = strlen(str);

  for (int i = 0; i < length / 2; i++) {
    if (str[i] != str[length - i - 1])
      return 0;
  }
  return 1;
}

int main(int argc, char **argv) {
  int number;
  int pal;
  char string[15];

  number = atoi(argv[1]);
  pal = number;
  while (1) {
    sprintf(string, "%d", pal);
    if (check_palindrome(string) && (pal / number) * number == pal)
      {
        printf("%d\n", pal);
        return 1;
      }
    pal++;
  }
  return 0;
}

Виклик функції, що не перебуває в голові:

int s(char *a) {
  int b = strlen(a);

  for (int i = 0; i < b / 2; i++) {
    if (a[i] != a[b - i - 1])
      return 0;
  }
  return 1; //We can remove it, it leads to a undefined behaviour but it works
}

int f(int a) {
  int b;
  char c[9];

  b = a;
  while (1) {
    sprintf(c, "%d", b);
    if (s(c) && (b / a) * a == b)
      {
        printf("%d\n", b); //no need for the \n
        return 1; //just return whatever printf returns, who cares anyway ?
      }
    b++;
  }
  return 0; //no need for that
}

Я включив окрему версію для історичності.

Це мій перший кодогольф, будь-який коментар вітається!


Я рекомендую зробити окрему функцію для виклику, і не рахувати, main()незалежно від ваших уподобань. Ви б не грали в бейсбол, виконуючи дванадцять циклів, перш ніж позначити "тому, що я вважаю за краще", ви ніколи не досягнете благополуччя. Це конкуренція, і головне правило - використовувати будь-які необхідні та законні засоби для зменшення кількості байтів.

1
@ Шведман справедливий, я змінив свою відповідь, щоб включити версію "виклик функції". Це дозволяє мені взяти int як параметр і золото ще кілька байтів.
Валентин Марієтт

чи компілюється ваша функція без "включати <string.h>"? якщо відповідь не
менша,

@RosLuP Так, я отримую декілька попереджень, але gcc вміє його компілювати.
Валентин Марієтт

Привіт! Я хотів би скинути деякі підказки! 1) C має неявний int, так що ви можете змінити такий код, як цей int f(int a)-> f(a) 2) якщо вам доведеться оголосити деякий ints, ви можете використовувати параметри функції: int f(int a){int b;-> f(a,b){ 3) sprintfніколи не поверне 0, тож ви можете використовувати в while: while(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 ) використовуйте K&R C для визначення функції, щоб tou міг поєднати з моїм другим int s(char*a){int b=strlen(a);for(int i=0s(a,b,i)char*a;{b=strlen(a);for(i=0;
підказом

4

R, 117 113 109 101 байт

D=charToRaw;P=paste;S=strtoi;a=P(i<-scan()+1);while(!all(D(a)==rev(D(a))&&S(a)%%i==0)){a=P(S(a)+1)};a

Безумовно

i<-scan()        #Takes the input

D=charToRaw      #Some aliases
P=paste
S=strtoi
a=P(i+1)         #Initializes the output

while(!(all(D(a)==rev(D(a)))&&(S(a)%%i==0))) #While the output isn't a palindrom and isn't
                                             #divisible by the output...
    a=P(S(a)+1)

a

all(charToRaw(a)==rev(charToRaw(a)))перевіряє, чи в кожному положенні aзначення aта його зворотне значення однакові (тобто, якщо aпаліндромні).
Можливо, можна покататися на байтах, повозившись із types.


4

Власне , 15 14 байт

На прохання відповісти Leaky Nun. Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

╖2`╜*$;R=`╓N╜*

Ungolfing

          Implicit input n.
╖         Save n in register 0.
2`...`╓   Push first 2 values where f(x) is truthy, starting with f(0).
  ╜*$       Push register 0, multiply by x, and str().
  ;R        Duplicate str(n*x) and reverse.
  =         Check if str(n*x) == reverse(str(n*x)).
          The map will always result in [0, the x we want].
N         Grab the last (second) value of the resulting list.
╜*        Push n and multiply x by n again.
          Implicit return.


3

VBSCRIPT, 47 байт

do:i=i+1:a=n*i:loop until a=eval(strreverse(a))

неозорий

do                     #starts the loop
i=i+1                  #increments i, we do it first to start at 1 instead of 0
a=                     #a is the output
n*i                    #multiply our input n by i
loop until 
a=eval(strreverse(a))  #end the loop when our output is equal to its reverse

3

Perl, 25 байт

Включає +2 для -ap

Запустити з введенням STDIN:

palidiv.pl <<< 16

palidiv.pl:

#!/usr/bin/perl -ap
$_+="@F"while$_-reverse



2

MATL , 10 байт

0`G+tVtP<a

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

0      % Push 0
`      % Do...while
  G+   %   Add the input. This generates the next multiple of the input
  tV   %   Duplicate, convert to string
  tP   %   Duplicate, reverse
  <a   %   Is any digit lower than the one in the reverse string? This is the
       %   loop condition: if true, the loop proceeds with the next iteration
       % End do...while
       % Implicitly display

2

PowerShell v2 +, 72 байти

for($i=$n=$args[0];;$i+=$n){if($i-eq-join"$i"["$i".Length..0]){$i;exit}}

Довго через те, як обертається робота в PowerShell - не дуже добре. ;-)

Здійснює введення $args[0], зберігає в $i(нашу змінну циклу) і $n(наш вхід). Петлі нескінченно, збільшуються $iз $nкожним часом (щоб гарантувати подільність).

Кожну ітерацію ми перевіряємо, чи $iє паліндром. Тут відбувається якась хитрість, тому дозвольте мені пояснити. Спочатку ми беремо $iта узагальнюємо його "$i". Тоді індексований масив у зворотному порядку ["$i".length..0]перед тим, як -joinредагувати його назад у рядок. Це подається в праву частину -eqоператора uality, який неявно перекидає рядок назад у [int], оскільки це лівий операнд. Примітка: цей кастинг знімає будь-які провідні нулі з паліндром, але оскільки ми гарантуємо, що введення не ділиться на 10, це нормально.

Потім, ifце паліндром, ми просто розміщуємо $iна трубопровід і exit. Вихідні дані неявні в кінці виконання.

Випробування

PS C:\Tools\Scripts\golfing> 1,2,16,17,42,111,302,1234|%{"$_ -> "+(.\smallest-palindrome-divisible-by-input.ps1 $_)}
1 -> 1
2 -> 2
16 -> 272
17 -> 272
42 -> 252
111 -> 111
302 -> 87278
1234 -> 28382

2

MATLAB, 76 байт

function s=p(n)
f=1;s='01';while(any(s~=fliplr(s))) s=num2str(n*f);f=f+1;end

Формат дзвінка - p(302)результат - рядок.

Тут нічого розумного. Він виконує лінійний пошук, використовуючи функції num2str()і fliplr().

Ця потворна домовленість на дотик коротша, ніж використання while(1) ... if ... break endвізерунка.

Безумовно

function s = findFirstPalindromeFactor(n)
  f = 1;                        % factor
  s = '01';                     % non-palindromic string for first try
  while( all(s ~= fliplr(s)) )  % test s not palindrome
    s = num2str( n * f );       % factor of input as string
    f = f + 1;                  % next factor
  end

2

Математика, 49 байт

(c=#;Not[PalindromeQ@c&&c~Mod~#==0]~While~c++;c)&

Починає пошук з c = Nкроком, cякщо не паліндром і не ділиться на N. Коли умови виконані, результати c.


2

Желе, 12 байт

¹µ+³ßµDU⁼Dµ?

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

Пояснення:

Це посилання має 1 аргумент. В µи розділити його на 4 частини. Починаючи з останнього і рухаючись ліворуч:

           ? The three parts in front of this are the if, else, and
             condition of a ternary expression.
      DU⁼D  This condition takes a number n as an argument. It converts
            n to an array of decimal digits, reverses that array, and
            then compares the reversed array to the decimalization of
            n (ie is n palindromic in decimal?)
  +³ß  This is the else. It adds the original input argument to n
       and then repeats the link with the new value of n.
¹  This is the if. It returns the value passed to it.



2

Python 2, 66 65 байт

iє вхідним і xє (зрештою) виходом

def f(i,x):
    y=x if x%i==0&&`x`==`x`[::-1]else f(i,x+1)
    return y

Після прокручування інших відповідей я знайшов коротшу відповідь Python 2, але я доклав зусиль до свого рішення, щоб, можливо, кинути його сюди. ¯ \ _ (ツ) _ / ¯


Ви можете видалити місце в [::-1] else.
mbomb007

ви не можете видалити призначення y, а просто поставити вираз у кінці повернення? return x if x%i==0&&x ==x [::-1]else f(i,x+1), а значить, ви можете зробити це лямбда, а гольф більше байтів?
Руйнуючий лимон



2

QBIC , 29 байт

:{c=a*q~!c$=_f!c$||_Xc\q=q+1

Пояснення:

:      Get cmd line param as number 'a'
{      DO
c=a*q  multiply 'a' by 'q' (which is 1 at the start of a QBIC program) and assign to 'c'
~      IF
!c$    'c' cast to string
=      equals
_f!c$| 'c' cast to string, the reversed
|      THEN
_Xc    Quit, printing 'c'
\q=q+1 ELSE increment q and rerun
       DO Loop is auto-closed by QBIC, as is the IF

1

Perl 6 , 35 байт

->\N{first {$_%%N&&$_==.flip},N..*}
->\N{first {$_==.flip},(N,N*2...*)}
->\N{(N,N*2...*).first:{$_==.flip}}

Пояснення:

-> \N {
  # from a list of all multiples of the input
  # ( deduced sequence )
  ( N, N * 2 ... * )

  # find the first
  .first:

  # that is a palindrome
  { $_ == .flip }
}

1

Perl 6, 39 байт

my &f={first {.flip==$_},($_,2*$_...*)}

(33 без урахування my &f=)

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