Smallest palindrome divisible by the input

23

3

Given a positive integer N, output the smallest positive integer such that this number is a palindrome (i.e. is its own reverse) and is divisible by N.

The palindrome (i.e. the output) must not need a leading zero to be a palindrome, e.g. 080 is not the valid answer for 16.

The input will never be a multiple of 10, because of the previous reason.

Your program may take as much time as necessary, even if in practice it would be way too long to output the answer.

Inputs and outputs

  • You may take the input through STDIN, as a function argument, or anything similar.
  • You may print the output to STDOUT, return it from a function, or anything similar.
  • Inputs and outputs must be in the decimal base.

Test cases

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

Scoring

This is , so the shortest answer in bytes wins.

Fatalize

Posted 2016-08-25T06:41:47.473

Reputation: 32 976

Will the input be divisible by 10? – Leaky Nun – 2016-08-25T07:01:09.733

@LeakyNun No, because then there is no solution since the palindrome must not need a leading zero. I will make that explicit. – Fatalize – 2016-08-25T07:04:24.733

Will the input be positive? – Post Rock Garf Hunter – 2016-08-25T14:01:51.900

1@WheatWizard Yes: Given a positive integer N – Fatalize – 2016-08-25T14:29:12.803

@Fatalize sorry. I don't know how I missed it. – Post Rock Garf Hunter – 2016-08-25T14:38:38.570

Base 10 is mandatory? – corsiKa – 2016-08-25T21:45:54.630

@corsiKa Yes, unless your language does not support base 10 (which I highly doubt) – Fatalize – 2016-08-26T06:34:50.233

Answers

9

2sable / 05AB1E, 6 / 7 bytes

2sable

[DÂQ#+

Explanation

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

Try it online

05AB1E

[DÂQ#¹+

The difference to the 2sable code is that input is only implicit once in 05AB1E, so here we need ¹ to get the first input again.

Try it online

Saved 1 byte with 2sable as suggested by Adnan

Emigna

Posted 2016-08-25T06:41:47.473

Reputation: 50 798

@Fatalize I was just writing it up :) – Emigna – 2016-08-25T06:57:53.307

If you switch to 2sable, you can save a byte by doing this: [DÂQ#+. – Adnan – 2016-08-25T08:42:22.347

@Adnan: Right! The repeated implicit input saves a byte :) – Emigna – 2016-08-25T08:46:20.913

14

Haskell, 45 37 34 bytes

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

Damien

Posted 2016-08-25T06:41:47.473

Reputation: 2 407

13

Pyth, 7 bytes

*f_I`*Q

Try it online: Demonstration

Explanation

*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

Jakube

Posted 2016-08-25T06:41:47.473

Reputation: 21 462

After reading so many codegold questions I'm starting to think that Pyth will be next JS/Java/Ruby/Python... – agilob – 2016-08-25T12:00:08.723

5@agilob oh dear god pls no. – Alexander - Reinstate Monica – 2016-08-26T20:14:41.887

7

Java, 164 159 126 108 94 bytes

Golfed version:

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

Ungolfed version:

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

Shoutout to Emigna and Kevin Cruijssen for contributing improvements and cutting the bytes almost in half :)

peech

Posted 2016-08-25T06:41:47.473

Reputation: 309

1Isn't x % a == 0 kind of redundant when you initialize x as a and only increase it by a? Also, can the comparison with the reversal of the string be done in the while conditional? – Emigna – 2016-08-25T09:12:12.177

You can remove import org.apache.commons.lang.StringUtils; and use org.apache.commons.lang.StringUtils.reverse directly. for(;;) is shorter than while(1>0). No need for a full program, just int c(int a){...} would do as a valid answer, since the question has the following rule: "You may take the input as a function argument. You may return the output from a function." @Emigna is indeed right that the modulo check isn't necessary. – Kevin Cruijssen – 2016-08-25T09:18:28.017

Oh, and welcome of course! You might like this post: Tips for golfing in Java.

– Kevin Cruijssen – 2016-08-25T09:19:21.597

@Emigna: you're absolutely right, did that. – peech – 2016-08-25T09:23:45.280

@KevinCruijssen: since I only iterate through numbers which are divisible by a (by x += a). I don't have to check for divisibility :) and thanks for the golfing tips! – peech – 2016-08-25T09:25:14.277

Also, why did you use StringUtils.reverse? Because of the required org.apache.commons.lang. it's actually longer than new StringBuffer(x+"").reverse()+"".. – Kevin Cruijssen – 2016-08-25T09:25:15.510

@peech Yeah, I noticed the smart x+=a after I made that last comment. I removed that part before the 5 minutes had past and I wouldn't have been able to edit my comment. (I also deleted my own Java answer, since it was pretty bad..) – Kevin Cruijssen – 2016-08-25T09:27:14.893

You can remove {} from the while-loop as there's only 1 statement inside, can't you? – Emigna – 2016-08-25T09:31:35.347

Oh, also, since you're new: It's nice to add a link with your test-code so others can verify it works. I personally use ideone.com for this, but there are other online compilers available. Here is your code with a test-ideone. Feel free to fork it and make changes if you need/want to.

– Kevin Cruijssen – 2016-08-25T13:21:08.330

Interesting: converting to an empty for loop produces a function of the exact same size. Usually for is slightly smaller in terms of code byte size. – None – 2016-08-25T17:53:11.793

Yes I tried that but kept the while loop for easier reading. – peech – 2016-08-26T08:57:01.413

7

C#, 103 80 Bytes

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

Omer Kahoot

Posted 2016-08-25T06:41:47.473

Reputation: 101

2You might save some bytes by removing i, and incrementing via x+=p. – stannius – 2016-08-25T15:59:47.990

1replacing x.ToString() with 'x+""` will save a bunch of chars. – None – 2016-08-25T22:07:21.713

6

Python 2, 46 bytes

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

Ideone it!

Recursive solution with c as counter.

The case for 0 is interesting, because although c=0 satisfies the palindrome condition, it would not be returned, because ccc and 0 or xxx always returns xxx.

Leaky Nun

Posted 2016-08-25T06:41:47.473

Reputation: 45 011

1It's a bit shorter to do c*(`c`[::-1]==`c`)or. – xnor – 2016-08-25T18:34:04.787

5

Brachylog, 8 bytes

:L#>*.r=

Try it online! (around 5 seconds for 1234)

Verify all testcases. (around 20 seconds)

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

Leaky Nun

Posted 2016-08-25T06:41:47.473

Reputation: 45 011

5

Javascript (ES6), 55 51 bytes

4 bytes thanks to Neil.

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>

Leaky Nun

Posted 2016-08-25T06:41:47.473

Reputation: 45 011

From playing around while creating your code snippet for you, the first + seems unnecessary. – Neil – 2016-08-25T09:51:09.023

Would (x,c=x) allow you to avoid the &&c? – Neil – 2016-08-25T09:51:59.437

I think you can do c^[...c+""].reverse().join``?f(x,x+c):c to save one more byte. – Arnauld – 2016-08-25T17:54:07.797

c- would work for slightly higher numbers than c^, if necessary. – Neil – 2016-08-25T19:11:41.203

5

PHP, 39 bytes

while(strrev($i+=$argv[1])!=$i);echo$i;
  • Takes number N as argument $argv[1];
  • ; after while to do nothing
  • strrev return string backward

Same length with for-loop

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

Crypto

Posted 2016-08-25T06:41:47.473

Reputation: 862

4

Pyke, 11 9 bytes

.f*`D_q)*

Try it here!

Blue

Posted 2016-08-25T06:41:47.473

Reputation: 26 661

4

R, 117 113 109 101 bytes

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))) checks if at each position of a the value of a and its reverse are the same (i.e., if a is palindromic).
It might be possible to golf out some bytes by messing around with the types.

Frédéric

Posted 2016-08-25T06:41:47.473

Reputation: 2 059

4

Actually, 15 14 bytes

Asked to answer by Leaky Nun. Golfing suggestions welcome. Try it online!

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

Sherlock9

Posted 2016-08-25T06:41:47.473

Reputation: 11 664

4

C, 217 189 bytes

Standalone version :

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

Call to a function version :

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

Call to a function 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
}

I included the standalone version for historicity.

This is my first codegolf, any comment is welcome !

Valentin Mariette

Posted 2016-08-25T06:41:47.473

Reputation: 51

I recommend making a separate function for the challenge, and not counting main() regardless of your preferences. You wouldn't play baseball by running twelve loops around first before tagging "because I prefer it," you will never reach safely. This is a competition, and the primary rule is to use any means necessary and legal to reduce byte count. – None – 2016-08-25T17:46:40.380

1@Snowman fair enouth, I edited my answer to include a 'call to a function' version. This allows me to take an int as parameter and gold away a few more bytes. – Valentin Mariette – 2016-08-26T09:11:38.250

do your function compile without "include <string.h>"? if the answer is not than i can use #define F for or #define R return without make it in count... – RosLuP – 2016-08-28T08:53:27.363

@RosLuP yeah, I get a few warnings but gcc is able to compile it. – Valentin Mariette – 2016-08-30T09:56:47.930

Hi!, I would like drop some Hints!

  1. C has implicit int so you can change the code like this int f(int a) -> f(a)
  2. if you have to declare some ints you can use the function parameters: int f(int a){int b; -> f(a,b){
  3. sprintf will never return 0 so you ca use in the while: while(1){sprintf(c,"%d",b); -> while(sprintf(c,"%d",b)){
  4. use the K&R C for define a Function so tou can combo with my 2nd hint: int s(char*a){int b=strlen(a);for(int i=0 -> s(a,b,i)char*a;{b=strlen(a);for(i=0;
  5. < – Giacomo Garabello – 2017-01-04T17:41:40.813

@GiacomoGarabello Thanks for the tips, I didn't know about the default type, that's a pretty neat trick ! – Valentin Mariette – 2017-01-05T13:47:13.977

3

Japt, 14 bytes

V±U s w ¥V?V:ß

Try it online!

Thank you ETHproductions for the help! :)

Oliver

Posted 2016-08-25T06:41:47.473

Reputation: 7 160

3

Haskell, 64 63 56 bytes

x!n|mod x n==0,s<-show x,reverse s==s=x|y<-x+1=y!n
(1!)

Call with (1!)16 or simply 1!16. Try it on Ideone.

Laikoni

Posted 2016-08-25T06:41:47.473

Reputation: 23 676

3

VBSCRIPT, 47 bytes

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

Traceur

Posted 2016-08-25T06:41:47.473

Reputation: 131

3

Perl, 25 bytes

Includes +2 for -ap

Run with the input on STDIN:

palidiv.pl <<< 16

palidiv.pl:

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

Ton Hospel

Posted 2016-08-25T06:41:47.473

Reputation: 14 114

3

S.I.L.O.S, 109 bytes

readIO 
n = 0
lbla
n + i
a = n
r = 0
lblb
m = a
m % 10
r * 10
r + m
a / 10
if a b
r - n
r |
if r a
printInt n

Try it online!

Leaky Nun

Posted 2016-08-25T06:41:47.473

Reputation: 45 011

2

REXX, 46 bytes

arg a
do n=a by a until reverse(n)=n
end
say n

idrougge

Posted 2016-08-25T06:41:47.473

Reputation: 641

2

QBIC, 29 bytes

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

Explanation:

:      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

steenbergh

Posted 2016-08-25T06:41:47.473

Reputation: 7 772

2

Python 2, 44 bytes

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

Try it online!

I know that the question was posted over six months ago, but this was shorter than any other Python submission.

nedla2004

Posted 2016-08-25T06:41:47.473

Reputation: 521

2

MATL, 10 bytes

0`G+tVtP<a

Try it online!

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

Luis Mendo

Posted 2016-08-25T06:41:47.473

Reputation: 87 464

2

MATLAB, 76 bytes

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

Call format is p(302) result is a string.

Nothing clever here. It does a linear search, using the num2str() and fliplr() functions.

This ugly arrangement is a touch shorter than using a while(1) ... if ... break end pattern.

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

Richard

Posted 2016-08-25T06:41:47.473

Reputation: 21

2

PowerShell v2+, 72 bytes

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

Long because of how reversing is handled in PowerShell -- not very well. ;-)

Takes input $args[0], stores into $i (our loop variable) and $n (our input). Loops infinitely, incrementing $i by $n each time (to guarantee divisibility).

Each iteration, we check whether $i is a palindrome. There's some trickery happening here, so let me explain. We first take $i and stringify it with "$i". That's then array-indexed in reverse order ["$i".length..0] before being -joined back into a string. That's fed into the right-hand side of the -equality operator, which implicitly casts the string back into an [int], since that's the left-hand operand. Note: this casting does strip any leading zeros from the palindrome, but since we're guaranteed the input isn't divisible by 10, that's OK.

Then, if it is a palindrome, we simply place $i onto the pipeline and exit. Output is implicit at the end of execution.

Test Cases

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

AdmBorkBork

Posted 2016-08-25T06:41:47.473

Reputation: 41 581

2

Mathematica, 49 bytes

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

Starts the search at c = N, and increments c if not a palindrome and not divisible by N. When conditions are met, outputs c.

user48818

Posted 2016-08-25T06:41:47.473

Reputation:

2

Jelly, 12 bytes

¹µ+³ßµDU⁼Dµ?

Try it online!

Explanation:

This link takes 1 argument. The µs split it into 4 parts. Starting from the last and moving left:

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

ruds

Posted 2016-08-25T06:41:47.473

Reputation: 201

111 bytes – caird coinheringaahing – 2018-04-11T13:10:10.330

2

Python 2, 66 65 bytes

i is input and x is (eventually) output

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

After scrolling through other answers I found a shorter Python 2 answer but I put the effort into my solution so might as well throw it here. ¯\_(ツ)_/¯

RageCage

Posted 2016-08-25T06:41:47.473

Reputation: 245

You can remove the space in [::-1] else. – mbomb007 – 2016-08-26T19:41:55.060

can't you remove the assignment of y, and just put the expression on the end of the return? return x if x%i==0&&x==x[::-1]else f(i,x+1), which then means you can make it a lambda, and golf more bytes? – Destructible Lemon – 2016-09-24T03:01:41.577

2

Elixir, 75 bytes

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

Flow

Posted 2016-08-25T06:41:47.473

Reputation: 39

1

Clojure, 71 bytes

#(first(for[i(rest(range))i[(str(* % i))]:when(=(seq i)(reverse i))]i))

Just one long for with a two-step generation of i.

NikoNyrh

Posted 2016-08-25T06:41:47.473

Reputation: 2 361

1

Mathematica, 28 bytes

#//.x_/;!PalindromeQ@x:>x+#&

Explanation

#//....

Repeatedly apply the following substitution to the input.

x_/;!PalindromeQ@x

Match a value which is not a palindrome.

...:>x+#

And replace that value with itself plus the input. This repeated substitution therefore searches through consecutive multiples of the input until it finds a palindrome.

Martin Ender

Posted 2016-08-25T06:41:47.473

Reputation: 184 808

1

Japt, 12 bytes

_s ꬩZvU}a1

Try it


Alternative

_¥sw «ZuU}aÄ

Try it

Shaggy

Posted 2016-08-25T06:41:47.473

Reputation: 24 623

1

Perl 6, 35 bytes

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

Explanation:

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

  # find the first
  .first:

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

Brad Gilbert b2gills

Posted 2016-08-25T06:41:47.473

Reputation: 12 713

1

Perl 6, 39 bytes

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

(33 not including the my &f=)

bb94

Posted 2016-08-25T06:41:47.473

Reputation: 1 831

1

Mathematica, 34 28 bytes

#//.x_/;!PalindromeQ@x:>x+#&

Unnamed function taking a positive integer input and returning a positive integer. To be read as: "Starting with the function argument #, repeatedly replace any x we see that is not a palindrome with x+#." Yes, Virginia, there is a PalindromeQ! It only works in base 10 though.

Original submission:

(i=1;While@!PalindromeQ[++i#];i#)&

Greg Martin

Posted 2016-08-25T06:41:47.473

Reputation: 13 940

I count 34, but here's 33: (i=0;While@!PalindromeQ[i+=#];i)& or (For[i=0,!PalindromeQ[i+=#],];i)& or (For[i=#,!PalindromeQ@i,i+=#];i)&. – Martin Ender – 2017-01-10T15:07:20.923

Revisiting this answer, I see that I've learned some tricks since August! Down to 28 :) – Greg Martin – 2017-01-10T18:25:58.667

Good thing that duplicate answers have been allowed since August. ;)

– Martin Ender – 2017-01-10T18:27:04.723

#$%^&%#$&^%!@... ;) – Greg Martin – 2017-01-10T18:29:12.920

1

C, not 83, 80 bytes

f(n,b,k,z){for(b=1;;){for(z=0,k=b*n;z+=k%10,k/=10;z*=10);if(b++*n==z)return z;}}

For say the true i had seen in one other puzzle one programmer use the same algo number=swapped(number) => number is palindrome. How is possible to edit barred text?

#include <stdio.h>
main()
{unsigned  a[]={0,1,2,3,16,17,42,111,302,1234}, i;
 for(i=0;i<10;++i)
   printf("f(a[%u])=f(%u)=%u\n", i, a[i], f(a[i], 0, 0, 0)); 
 return 0;
}

/*
 f(a[0])=f(0)=0
 f(a[1])=f(1)=1
 f(a[2])=f(2)=2
 f(a[3])=f(3)=3
 f(a[4])=f(16)=272
 f(a[5])=f(17)=272
 f(a[6])=f(42)=252
 f(a[7])=f(111)=111
 f(a[8])=f(302)=87278
 f(a[9])=f(1234)=28382
 */

RosLuP

Posted 2016-08-25T06:41:47.473

Reputation: 3 036

1

dc, 85 78 76 bytes

[pq]sq?ddsI[dddZ0sR[1-dsD10r^rdsN10%*lR+sRlN10/lDd0<@]ds@xlR++=q+lIrlLx]dsLx

Run:

dc -f program.dc <<< "16"

Output:

272

Previously submitted code and explanation:

    # loads register 'q' with an exit function
[pq]sq
    # register '@' contains an iterative function to reverse a number (312 to 213),
#by calculating one coefficient at a time of the new base 10 polynomial
[1-dsD10r^rdsN10%*lR+sRlN10/lDd0<@]s@
    # register 'L' implements the logic. It iteratively compares the current value
#with the generated reversed one, exiting if equal, otherwise increments the value
#by N and repeats.
[dddZ0sRl@xlR++=q+lIrlLx]sL
    # the "main". It reads the input, then calls the solver function from 'L'.
?ddsIlLx

seshoumara

Posted 2016-08-25T06:41:47.473

Reputation: 2 878

1

Racket 174 bytes

(let((p?(λ(m)(equal? m(string->number(list->string(reverse(string->list(number->string m)))))))))
(let loop((N n))(cond[(and(p? N)(= 0(modulo N n)))N][else(loop(add1 N))])))

Ungolfed:

(define (f1 n)
  (let ((p? (λ (m)(equal? m
                          (string->number
                           (list->string
                            (reverse
                             (string->list
                              (number->string m)))))))))
    (let loop ((N n))
      (cond
        [(and (p? N) (= 0 (modulo N n))) N]
        [else (loop (add1 N))]
        ))))

Testing:

(f 1)
(f 2)
(f 16)
(f 17)
(f 42)
(f 111)
(f 302)
(f 1234)

Output:

1
2
272
272
252
111
87278
28382

rnso

Posted 2016-08-25T06:41:47.473

Reputation: 1 635

1

Ruby, 50 bytes

->n{a=n;while(s=a.to_s;s!=s.reverse)do a+=n;end;a}

It's horrible, I know.

Lee W

Posted 2016-08-25T06:41:47.473

Reputation: 521

1

RProgN, 31 Bytes Non-Competing

►x=01¿1+]x*]''.S.\''.≡!}x*

Explained

►x=01¿1+]x*]''.S.\''.≡!}x*  # ► Defines spaceless segment.
 x=                         # Define the input as x
   01                       # Push 0, 1 to the stack. 1 is used as a truthy for the while, 0 is our incrementing product.
     ¿                 }    # While the value on top of the stack (popped) is truthy. 
      1+                    # Increment the product by one.
        ]x*                 # Duplicate the producter, multiply by the input.
           ]''.S.\''.≡!     # Check to see if the result is a palindrome.
           ]''.             # Push a duplicate of the multiplied number, convert to a string.
               S.           # Convert it to a stack and re-concatinate it. This reverses the string.
                 \''.≡!     # Flip the top two values, exposing the original product. Conver it to a string and test inverse equality.
                        x*  # Once the loop ends, the last number times the input will be a palindrome. Thus, do that.

Non-competing as the equality sugar was only added after the discovery of this challenge, as was the bugfix that allowed strings to be used in spaceless segments.

Try it Online!

ATaco

Posted 2016-08-25T06:41:47.473

Reputation: 7 898