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


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?
Утренняя монахиня

@LeakyNun Нет, потому что тогда нет решения, так как палиндрому не нужен начальный ноль. Я сделаю это явным.
Fatalize

Будет ли вход положительным?
Пшеничный волшебник

1
@WheatWizard Да: учитывая положительное целое числоN
Fatalize

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

Ответы:


9

2sable / 05AB1E , 6/7 байтов

2sable

[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#¹+

Отличие от кода 2sable заключается в том, что ввод неявным образом вводится только в 05AB1E, поэтому здесь нам нужно ¹снова получить первый ввод.

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

Сохранено 1 байт с 2sable, как это было предложено Аднаном


@Fatalize Я только что написал это
Эмигна

При переключении на 2sable, вы можете сохранить байты, делая это: [DÂQ#+.
Аднан

@ Аднан: Точно! Повторный неявный ввод сохраняет байт :)
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

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

5
@agilob Боже мой, пожалуйста, нет.
Александр - Восстановить Монику

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? Кроме того, можно ли сделать сравнение с обращением строки в условном выражении while?
Эминья

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

Ох и добро пожаловать конечно! Вам может понравиться этот пост: Советы по игре в гольф на Java .
Кевин Круйссен

@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;}

Ungolfed

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

2
Вы можете сохранить несколько байтов, удалив i и увеличивая при помощи x + = p.
Станниус

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(;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++;}}

Ungolfed:

#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;
}

Вызов функции ungolfed:

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
}

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

Это мой первый Codegolf, любые комментарии приветствуются!


Я рекомендую сделать отдельную функцию для вызова, и не считать main()независимо от ваших предпочтений. Вы бы не играли в бейсбол, если бы сначала запустили двенадцать петель, прежде чем ставить метку «потому что я предпочитаю», вы никогда не достигнете безопасной цели. Это соревнование, и основным правилом является использование любых необходимых и законных средств для уменьшения количества байтов.

1
@ Снежный человек, честно говоря, я отредактировал свой ответ, добавив версию «вызова функции». Это позволяет мне взять int в качестве параметра и убрать еще несколько байтов.
Валентин Мариетт

ваша функция компилируется без "include <string.h>"? если ответ не то, я могу использовать #define F для или #define R вернуть, не
делая

@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 для определения функции, чтобы вы могли комбинировать с моим вторым намеком: int s(char*a){int b=strlen(a);for(int i=0->s(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

Ungolfed

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 байт

На вопрос ответила Лики Монахиня. Предложения по игре в гольф приветствуются. Попробуйте онлайн!

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

ungolfed

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рисунка.

Ungolfed

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

Mathematica, 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&&х ==х [::-1]else f(i,x+1), что означает, что вы можете сделать его лямбда, а гольф больше байтов?
Разрушаемый лимон


2

Python 2 , 44 байта

x=lambda n,m=0:m*(`m`==`m`[::-1])or x(n,m+n)

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

Я знаю, что вопрос был опубликован более шести месяцев назад, но это было короче, чем любое другое представление Python.


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.