输入可除的最小回文


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
致命

@Fatalize对不起。我不知道我怎么想念它。
小麦巫师

Answers:


9

2sable / 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#¹+

与2sable代码的区别在于,在05AB1E中,输入仅隐式一次,因此这里我们需要¹再次获取第一个输入。

在线尝试

按照Adnan的建议,保存了1个字节的2sable字节


@Fatalize我只是在写:)
Emigna '16

如果切换到2sable,则可以执行以下操作来保存一个字节:[DÂQ#+
阿德南

@Adnan:对!重复的隐式输入保存了一个字节:)
Emigna '16

14

Haskell,45 37 34字节

(+)>>=until((reverse>>=(==)).show)

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

向Emigna和Kevin Cruijssen表示感谢,感谢他们做出了改进,并将字节减少了一半:)


1
x % a == 0当将x初始化为a并仅将其增加a时,这不是多余的吗?另外,是否可以在有条件的情况下与字符串反转进行比较?
Emigna '16

您可以直接删除import org.apache.commons.lang.StringUtils;和使用org.apache.commons.lang.StringUtils.reversefor(;;)比短while(1>0)。不需要完整的程序,只是int c(int a){...}一个有效的答案,因为问题具有以下规则:“ 您可以将输入作为函数参数。您可以从函数返回输出。 ” @Emigna确实正确模检查是不必要的。
凯文·克鲁伊森

哦,当然欢迎您!您可能会喜欢这篇文章:Java高尔夫技巧
凯文·克鲁伊森

@Emigna:你是绝对正确的,做到了。
peech

@KevinCruijssen:因为我只遍历一个可被(by 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 '16

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

Brachylog,8个字节

:L#>*.r=

在线尝试!(约5秒1234

验证所有测试用例。(大约20秒)

:L#>*.r=
?:L#>*.r=.   Implicitly filling Input and Output:
             Input is prepended to every predicate,
             Output is appended to every predicate.

?:L  *.      Input*L is Output,
  L#>        L is positive,
      .r .   Output reversed is Output,
        =.   Assign a value to Output.

5

Javascript(ES6),55 51字节

感谢Neil提供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再节省一个字节。
Arnauld

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()不管您的喜好如何。在标记“因为我更喜欢”之前,您不会先绕12个循环打棒球,否则您将永远无法安全到达。这是一场比赛,主要规则是使用任何必要且合法的手段来减少字节数。

1
@Snowman fair enouth,我编辑了答案,以包含“调用函数”版本。这使我可以将int作为参数,并将更多的字节作为黄金。
Valentin Mariette

没有“ include <string.h>”的情况下编译函数吗?如果答案不是,那么我可以使用#define F或#define R return而不用计数……
RosLuP

@RosLuP是的,我收到一些警告,但gcc可以编译它。
Valentin Mariette

嗨!我想放些提示!1)C具有隐式int,因此您可以像这样更改代码int f(int a)-> f(a) 2)如果必须声明一些ints,则可以使用函数参数:int f(int a){int b;-> f(a,b){ 3)sprintf永远不会返回0,因此可以在whilewhile(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=0->s(a,b,i)char*a;{b=strlen(a);for(i=0;
Giacomo Garabello

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╜*

开球

          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编入字符串。它被送入-equality运算符的右侧,该运算符隐式地将字符串转换回一个[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

Mathematica,49个字节

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

开始搜索c = Nc如果不是回文且不能被整除,则递增N。满足条件时,输出c


2

果冻,12个字节

¹µ+³ßµDU⁼Dµ?

在线尝试!

说明:

该链接带有1个参数。所述µ的IT分成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

Elixir,75字节

def f(p,a\\0),do: if'#{a+p}'|>Enum.reverse=='#{a+p}',do: a+p,else: f(p,a+p)

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 '16

您不能删除y的赋值,而只是将表达式放在返回值的末尾吗?return x if x%i==0&&x ==x [::-1]else f(i,x+1),那么这意味着您可以使其成为lambda,并打高尔夫球更多字节?
破坏的柠檬


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=

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.