Palíndromo menor divisível pela entrada


23

Dado um número inteiro positivo N, imprima o menor número inteiro positivo de forma que esse número seja um palíndromo (isto é, é o seu próprio reverso) e divisível por N.

O palíndromo (ou seja, a saída) não deve precisar de um zero inicial para ser um palíndromo, por exemplo, 080não é a resposta válida 16.

A entrada nunca será um múltiplo de 10, devido ao motivo anterior.

Seu programa pode levar o tempo necessário, mesmo que, na prática, demore muito para gerar a resposta.

Entradas e saídas

  • Você pode inserir a entrada STDINcomo argumento de função ou algo semelhante.
  • Você pode imprimir a saída STDOUT, retorná-la de uma função ou algo semelhante.
  • As entradas e saídas devem estar na base decimal.

Casos de teste

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

Pontuação

Isso é , então a resposta mais curta em bytes vence.


A entrada será divisível por 10?
Freira vazada

@LeakyNun Não, porque então não há solução, pois o palíndromo não deve precisar de um zero inicial. Eu vou deixar isso explícito.
Fatalize 25/08/16

A entrada será positiva?
Wheat Wizard

1
@WheatWizard Sim: Dado um número inteiro positivoN
Fatalize

@Fatalize sorry. Não sei como senti falta disso.
Assistente de trigo

Respostas:


9

2sable / 05AB1E , 6/7 bytes

2sable

[DÂQ#+

Explicação

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

Experimente online

05AB1E

[DÂQ#¹+

A diferença para o código 2sable é que a entrada é implícita apenas uma vez em 05AB1E, portanto, aqui precisamos ¹obter a primeira entrada novamente.

Experimente online

Salvo 1 byte com 2sable, conforme sugerido por Adnan


@Fatalize Eu estava escrevendo-up :)
Emigna

Se você alternar para 2sable, você pode salvar um byte, fazendo isso: [DÂQ#+.
Adnan

@Adnan: Certo! A entrada implícita repetido salva um byte :)
Emigna

14

Haskell, 45 37 34 bytes

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

13

Pitão, 7 bytes

*f_I`*Q

Experimente online: Demonstração

Explicação

*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

Depois de ler tantas perguntas codegold Estou começando a pensar que Pyth será o próximo JS / Java / Ruby / Python ...
agilob

5
@agilob oh querido deus pls no.
Alexander - Restabelece Monica

7

Java, 164 159 126 108 94 bytes

Versão Golfed:

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

Versão não destruída:

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

Agradeça a Emigna e Kevin Cruijssen por contribuir com melhorias e cortar os bytes quase pela metade :)


1
Não é x % a == 0meio redundante quando você inicializa x como ae apenas aumenta em a? Além disso, a comparação com a reversão da string pode ser feita enquanto condicional?
Emigna

Você pode remover import org.apache.commons.lang.StringUtils;e usar org.apache.commons.lang.StringUtils.reversediretamente. for(;;)é mais curto que while(1>0). Não há necessidade de um programa completo, apenas int c(int a){...}serviria como uma resposta válida, pois a pergunta tem a seguinte regra: " Você pode usar a entrada como argumento de função. Você pode retornar a saída de uma função. " @Emigna está realmente certo que a verificação do módulo não é necessária.
Kevin Cruijssen

Ah, e bem vindo, é claro! Você pode gostar deste post: Dicas para jogar golfe em Java .
Kevin Cruijssen

@ Emigna: você está absolutamente certo, fez isso.
peech

@KevinCruijssen: já que eu apenas itero através de números que são divisíveis por um (por x += a). Não preciso verificar a divisibilidade :) e obrigado pelas dicas de golfe!
peech

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

2
Você pode salvar alguns bytes removendo i e incrementando via x + = p.
Stannius

1
substituir x.ToString()por 'x + "" `salvará um monte de caracteres.

6

Python 2, 46 bytes

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

Ideone it!

Solução recursiva com ccomo contador.

O caso 0é interessante, porque, embora c=0satisfaça a condição do palíndromo, ele não seria retornado, porque ccc and 0 or xxxsempre retorna xxx.


1
É um pouco mais curto de fazer c*(`c`[::-1]==`c`)or.
Xnor

5

PHP, 39 bytes

while(strrev($i+=$argv[1])!=$i);echo$i;
  • Pega o número N como argumento $ argv [1];
  • ; depois de um tempo para não fazer nada
  • strrev retornar string para trás

Mesmo comprimento com loop for

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


5

Javascript (ES6), 55 51 bytes

4 bytes graças 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>


De brincar enquanto cria seu snippet de código para você, o primeiro +parece desnecessário.
Neil

Iria (x,c=x)permitir-lhe evitar o &&c?
Neil

Eu acho que você pode fazer c^[...c+""].reverse().join``?f(x,x+c):cpara salvar mais um byte.
Arnauld

c-funcionaria para números um pouco mais altos do que c^, se necessário.
Neil


4

C, 217 189 bytes

Versão autônoma:

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

Chame para uma versão da função:

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

Chame para uma função não destruída:

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
}

Eu incluí a versão autônoma para historicidade.

Este é o meu primeiro codegolf, qualquer comentário é bem-vindo!


Eu recomendo criar uma função separada para o desafio e não contar, main()independentemente de suas preferências. Você não jogaria beisebol executando doze voltas antes de marcar "porque eu prefiro", você nunca alcançará com segurança. Esta é uma competição, e a regra principal é usar todos os meios necessários e legais para reduzir a contagem de bytes.

1
@Snowman fair enouth, editei minha resposta para incluir uma versão 'call to a function'. Isso me permite tirar um int como parâmetro e ouro mais alguns bytes.
Valentin Mariette

sua função é compilada sem "incluir <string.h>"? Se a resposta não é que eu posso usar #define F favor ou #define R retorno sem fazê-lo na contagem ...
RosLuP

@RosLuP sim, recebo alguns avisos, mas o gcc é capaz de compilá-lo.
Valentin Mariette

Oi !, Gostaria de deixar algumas dicas! 1) C tem int implícito para que você possa alterar o código dessa forma int f(int a)-> f(a) 2) se precisar declarar alguns ints, pode usar os parâmetros de função: int f(int a){int b;-> f(a,b){ 3) sprintfnunca retornará 0, então você pode usar no while: while(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 ) use o K&R C para definir uma função para que você possa combinar com a minha segunda dica: 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

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)))verifica se em cada posição do avalor de ae seu reverso são os mesmos (ou seja, se aé palíndrico).
Pode ser possível obter alguns bytes brincando com o types.


4

Na verdade , 15 14 bytes

Solicitado a resposta por Leaky Nun. Sugestões de golfe são bem-vindas. Experimente 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.


3

VBSCRIPT, 47 bytes

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

destroçado

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

Inclui +2 para -ap

Execute com a entrada em STDIN:

palidiv.pl <<< 16

palidiv.pl:

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



2

MATL , 10 bytes

0`G+tVtP<a

Experimente 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

2

PowerShell v2 +, 72 bytes

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

Muito tempo por causa de como a inversão é tratada no PowerShell - não muito bem. ;-)

Recebe entrada $args[0], armazena em $i(nossa variável de loop) e $n(nossa entrada). Loops infinitamente, incrementando $iem$n cada vez que (a divisibilidade garantia).

A cada iteração, verificamos se $ié um palíndromo. Há alguns truques acontecendo aqui, então deixe-me explicar. Primeiro $ipegamos e estritamente com "$i". Isso é indexado por matriz na ordem inversa ["$i".length..0]antes de ser -joineditado novamente em uma string. Isso é alimentado no lado direito do -eqoperador de qualidade, que implicitamente lança a string de volta em um [int], já que esse é o operando do lado esquerdo. Nota: essa conversão tira quaisquer zeros à esquerda do palíndromo, mas, como é garantido que a entrada não é divisível 10, tudo bem.

Então, ifé um palíndromo, simplesmente colocamos $ino oleoduto e exit. A saída está implícita no final da execução.

Casos de teste

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

O formato da chamada é o p(302)resultado é uma sequência.

Nada inteligente aqui. Faz uma pesquisa linear, usando as funções num2str()e fliplr().

Esse arranjo feio é um toque mais curto do que usar um while(1) ... if ... break endpadrão.

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 bytes

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

Inicia a pesquisa em c = Ne incrementa, cse não for um palíndromo, e não divisível por N. Quando as condições são atendidas, as saídas c.


2

Gelatina, 12 bytes

¹µ+³ßµDU⁼Dµ?

Experimente online!

Explicação:

Este link leva 1 argumento. Eles µo dividem em 4 partes. Começando pela última e movendo para a esquerda:

           ? 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

ié entrada e xé (eventualmente) saída

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

Depois de rolar por outras respostas, encontrei uma resposta mais curta do Python 2, mas esforcei-me por minha solução, de modo que ela poderia ser lançada aqui. ¯ \ _ (ツ) _ / ¯


Você pode remover o espaço [::-1] else.
mbomb007

você não pode remover a atribuição de y e apenas colocar a expressão no final do retorno? return x if x%i==0&&x ==x [::-1]else f(i,x+1), o que significa que você pode transformá-lo em lambda e obter mais bytes de golfe?
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)

Experimente online!

Eu sei que a pergunta foi publicada há mais de seis meses, mas foi mais curta do que qualquer outro envio do Python.


2

QBIC , 29 bytes

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

Explicação:

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

Explicação:

-> \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 não incluindo o my &f=)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.