El palíndromo más pequeño divisible por la entrada


23

Dado un entero positivo N, genera el entero positivo más pequeño de manera que este número sea un palíndromo (es decir, es su propio reverso) y es divisible por N.

El palíndromo (es decir, la salida) no debe necesitar un cero inicial para ser un palíndromo, por ejemplo, 080no es la respuesta válida para 16.

La entrada nunca será un múltiplo de 10, debido a la razón anterior.

Su programa puede tomar tanto tiempo como sea necesario, incluso si en la práctica sería demasiado tiempo para dar la respuesta.

Entradas y salidas

  • Puede tomar la entrada STDIN, como un argumento de función, o algo similar.
  • Puede imprimir el resultado STDOUT, devolverlo desde una función o algo similar.
  • Las entradas y salidas deben estar en la base decimal.

Casos de prueba

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

Tanteo

Este es el , por lo que gana la respuesta más corta en bytes.


¿La entrada será divisible por 10?
Leaky Nun

@LeakyNun No, porque entonces no hay solución ya que el palíndromo no debe necesitar un cero a la izquierda. Lo haré explícito.
Fatalize

¿La entrada será positiva?
Wheat Wizard

1
@WheatWizard Sí: dado un número entero positivoN
Fatalize

@Fatalize lo siento. No sé cómo me lo perdí.
Wheat Wizard

Respuestas:


9

2sable / 05AB1E , 6/7 bytes

2sable

[DÂQ#+

Explicación

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

Pruébalo en línea

05AB1E

[DÂQ#¹+

La diferencia con el código 2sable es que la entrada solo está implícita una vez en 05AB1E, por lo que aquí necesitamos ¹obtener la primera entrada nuevamente.

Pruébalo en línea

Guardado 1 byte con 2sable como lo sugiere Adnan


@Fatalize Solo lo estaba escribiendo :)
Emigna

Si cambia a 2sable, puede guardar un byte al hacer esto: [DÂQ#+.
Adnan

@Adnan: ¡Correcto! La entrada implícita repetida guarda un byte :)
Emigna

14

Haskell, 45 37 34 bytes

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

13

Pyth, 7 bytes

*f_I`*Q

Pruébelo en línea: demostración

Explicación

*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

Después de leer tantas preguntas de codegold, estoy empezando a pensar que Pyth será el próximo JS / Java / Ruby / Python ...
agilob

55
@agilob oh querido dios por favor no.
Alexander - Restablece a Mónica el

7

Java, 164 159 126 108 94 bytes

Versión de golf:

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

Versión sin golf:

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

Gracias a Emigna y Kevin Cruijssen por contribuir con las mejoras y reducir los bytes casi a la mitad :)


1
¿No es x % a == 0algo redundante cuando inicializa x como a y solo lo aumenta en a? Además, ¿se puede hacer la comparación con la inversión de la cadena en el condicional while?
Emigna

Puede eliminar import org.apache.commons.lang.StringUtils;y usar org.apache.commons.lang.StringUtils.reversedirectamente. for(;;)es más corto que while(1>0). No es necesario un programa completo, solo int c(int a){...}lo haría como una respuesta válida, ya que la pregunta tiene la siguiente regla: " Puede tomar la entrada como un argumento de función. Puede devolver la salida de una función " . @Emigna tiene razón en que La comprobación del módulo no es necesaria.
Kevin Cruijssen

Ah, y bienvenido por supuesto! Puede que te guste esta publicación: Consejos para jugar al golf en Java .
Kevin Cruijssen

@Emigna: tienes toda la razón, hiciste eso.
peech

@KevinCruijssen: dado que solo itero a través de números que son divisibles por a (by x += a). No tengo que verificar la divisibilidad :) y gracias por los consejos de golf.
peech

7

C #, 103 80 bytes

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

Sin golf

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

2
Puede guardar algunos bytes eliminando i e incrementándolo mediante x + = p.
stannius

1
reemplazar x.ToString()con 'x + "" `ahorrará un montón de caracteres.

6

Python 2, 46 bytes

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

Ideone it!

Solución recursiva con ccomo contador.

El caso 0es interesante, porque aunque c=0satisface la condición de palíndromo, no se devolvería, porque ccc and 0 or xxxsiempre regresa xxx.


1
Es un poco más corto de hacer c*(`c`[::-1]==`c`)or.
xnor

5

PHP, 39 bytes

while(strrev($i+=$argv[1])!=$i);echo$i;
  • Toma el número N como argumento $ argv [1];
  • ; después de un rato para no hacer nada
  • strrev devolver la cadena hacia atrás

Misma longitud con for-loop

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


5

Javascript (ES6), 55 51 bytes

4 bytes gracias a 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>


Desde jugar mientras crea el fragmento de código para usted, lo primero +parece innecesario.
Neil

¿ (x,c=x)Te permitiría evitar el &&c?
Neil

Creo que puedes hacer c^[...c+""].reverse().join``?f(x,x+c):cpara guardar un byte más.
Arnauld

c-funcionaría para números ligeramente más altos que c^, si es necesario.
Neil


4

C, 217 189 bytes

Versión independiente:

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

Llamar a una versión de función:

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

Sin golf:

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

Llamado a una función sin golf:

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
}

Incluí la versión independiente para historicidad.

Este es mi primer codegolf, cualquier comentario es bienvenido!


Recomiendo hacer una función separada para el desafío, y no contar main()independientemente de sus preferencias. No jugarías béisbol corriendo doce vueltas antes de etiquetar "porque lo prefiero", nunca llegarás a salvo. Esta es una competencia, y la regla principal es usar cualquier medio necesario y legal para reducir el conteo de bytes.

1
@Snowman fair enouth, edité mi respuesta para incluir una versión de 'llamada a una función'. Esto me permite tomar un int como parámetro y eliminar algunos bytes más.
Valentin Mariette

Cómo compila su función sin "include <string.h>"? si la respuesta no es la que puedo usar #define F para o #define R return sin contarlo ...
RosLuP

@RosLuP sí, recibo algunas advertencias pero gcc puede compilarlo.
Valentin Mariette

¡Hola! ¡Me gustaría dejar algunas pistas! 1) C tiene int implícito para que pueda cambiar el código de esta manera int f(int a)-> f(a) 2) si tiene que declarar algunos ints, puede usar los parámetros de función: int f(int a){int b;-> f(a,b){ 3) sprintfnunca devolverá 0, por lo que puede usar en while: while(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 ) use K&R C para definir una Función para que pueda combinar con mi segunda pista: 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 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

Sin golf

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)))comprueba si en cada posición ael valor de ay su reverso son iguales (es decir, si aes palindrómico).
Puede ser posible jugar algunos bytes jugando con el types.


4

En realidad , 15 14 bytes

Pidió una respuesta de Leaky Nun. Sugerencias de golf bienvenidas. Pruébalo en línea!

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

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

sin golf

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 bytes

Incluye +2 para -ap

Ejecutar con la entrada en STDIN:

palidiv.pl <<< 16

palidiv.pl:

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



2

MATL , 10 bytes

0`G+tVtP<a

Pruébalo en línea!

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 bytes

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

Mucho tiempo debido a cómo se maneja la inversión en PowerShell, no muy bien. ;-)

Toma entrada $args[0], almacena en $i(nuestra variable de bucle) y $n(nuestra entrada). Bucles infinitamente, incrementando $ipor $ncada vez (a la divisibilidad de garantía).

Cada iteración, verificamos si $ies un palíndromo. Aquí hay algunos trucos, así que déjame explicarte. Primero lo tomamos $iy lo stringificamos con"$i" . Eso se indexa en orden inverso ["$i".length..0]antes de -joinvolver a ser editado en una cadena. Eso se alimenta al lado derecho del -eqoperador de calidad, que implícitamente convierte la cadena de nuevo en un [int], ya que ese es el operando de la izquierda. Nota: esta conversión elimina todos los ceros a la izquierda del palíndromo, pero como estamos garantizados que la entrada no es divisible 10, está bien.

Entonces, ifes un palíndromo, simplemente lo colocamos $ien la tubería y exit. La salida está implícita al final de la ejecución.

Casos de prueba

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 bytes

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

El formato de la llamada es p(302) resultado es una cadena.

Nada inteligente aquí. Realiza una búsqueda lineal, utilizando elnum2str()fliplr() funciones y .

Este arreglo feo es un poco más corto que usar un while(1) ... if ... break end patrón.

Sin golf

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 bytes

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

Inicia la búsqueda en c = Ne incrementa csi no es un palíndromo y no es divisible por N. Cuando se cumplen las condiciones, salidas c.


2

Jalea, 12 bytes

¹µ+³ßµDU⁼Dµ?

Pruébalo en línea!

Explicación:

Este enlace lleva 1 argumento. El µs lo dividió en 4 partes. Comenzando desde el último y moviéndose a la izquierda:

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

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 bytes

ies entrada y xes (eventualmente) salida

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

Después de desplazarme por otras respuestas, encontré una respuesta más corta de Python 2, pero puse el esfuerzo en mi solución, así que podría arrojarla aquí. ¯ \ _ (ツ) _ / ¯


Puedes quitar el espacio adentro [::-1] else.
mbomb007

¿no puedes eliminar la asignación de y, y simplemente poner la expresión al final del retorno? return x if x%i==0&&x ==x [::-1]else f(i,x+1), lo que significa que puedes convertirlo en lambda y jugar más bytes?
Destructible Lemon

2

REXX, 46 bytes

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

2

Python 2 , 44 bytes

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

Pruébalo en línea!

Sé que la pregunta se publicó hace más de seis meses, pero fue más corta que cualquier otra presentación de Python.


2

QBIC , 29 bytes

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

Explicación:

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

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

Explicación:

-> \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 bytes

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

(33 sin incluir my &f=)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.