Il più piccolo palindromo divisibile per l'input


23

Dato un numero intero positivo N, genera il numero intero positivo più piccolo in modo tale che questo numero sia un palindromo (cioè sia il suo contrario) e sia divisibile per N.

Il palindromo (ovvero l'output) non deve necessitare di uno zero iniziale per essere un palindromo, ad esempio 080non è la risposta valida per 16.

L'input non sarà mai un multiplo di 10, a causa del motivo precedente.

Il tuo programma potrebbe richiedere tutto il tempo necessario, anche se in pratica sarebbe troppo lungo per produrre la risposta.

Ingressi e uscite

  • È possibile prendere l'input tramite STDIN, come argomento di funzione o qualcosa di simile.
  • È possibile stampare l'output STDOUT, restituirlo da una funzione o qualcosa di simile.
  • Gli ingressi e le uscite devono essere nella base decimale.

Casi test

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

punteggio

Questo è , quindi vince la risposta più breve in byte.


L'input sarà divisibile per 10?
Leaky Nun,

@LeakyNun No, perché allora non esiste soluzione poiché il palindromo non deve aver bisogno di uno zero iniziale. Lo renderò esplicito.
Fatalizza il

L'input sarà positivo?
Mago del grano

1
@WheatWizard Sì: dato un numero intero positivoN
Fatalizza il

@Fatalize scusa. Non so come mi sia perso.
Mago del grano

Risposte:


9

2able / 05AB1E , 6/7 byte

2sable

[DÂQ#+

Spiegazione

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

Provalo online

05AB1E

[DÂQ#¹+

La differenza con il codice 2sable è che l'input è implicito solo una volta in 05AB1E, quindi qui dobbiamo ¹ottenere nuovamente il primo input.

Provalo online

Salvato 1 byte con 2sable come suggerito da Adnan


@Fatalize Stavo solo scrivendo :)
Emigna il

Se si passa a 2sable, è possibile salvare un byte facendo questo: [DÂQ#+.
Adnan,

@Adnan: giusto! L'ingresso implicito ripetuto salva un byte :)
Emigna,

14

Haskell, 45 37 34 byte

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

13

Pyth, 7 byte

*f_I`*Q

Provalo online: dimostrazione

Spiegazione

*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

Dopo aver letto tante domande in codice, comincio a pensare che Pyth sarà il prossimo JS / Java / Ruby / Python ...
agilob,

5
@agilob oh caro dio per favore no.
Alexander - Ripristina Monica il

7

Java, 164 159 126 108 94 byte

Versione golfizzata:

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

Versione non golfata:

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

Shoutout a Emigna e Kevin Cruijssen per aver contribuito a migliorare e tagliare i byte quasi a metà :)


1
Non è x % a == 0ridondante quando si inizializza x come a e lo si aumenta solo di a? Inoltre, il confronto con l'inversione della stringa può essere eseguito nel mentre condizionale?
Emigna,

È possibile rimuovere import org.apache.commons.lang.StringUtils;e utilizzare org.apache.commons.lang.StringUtils.reversedirettamente. for(;;)è più corto di while(1>0). Non c'è bisogno di un programma completo, int c(int a){...}farebbe solo una risposta valida, poiché la domanda ha la seguente regola: " Puoi prendere l'input come argomento di funzione. Puoi restituire l'output da una funzione. " @Emigna ha davvero ragione che il controllo del modulo non è necessario.
Kevin Cruijssen,

Oh, e benvenuta ovviamente! Potrebbe piacerti questo post: Suggerimenti per giocare a golf in Java .
Kevin Cruijssen,

@Emigna: hai perfettamente ragione, l'hai fatto.
peech

@KevinCruijssen: poiché eseguo solo iterazioni tra numeri che sono divisibili per un (per x += a). Non devo verificare la divisibilità :) e grazie per i suggerimenti sul golf!
peech

7

C #, 103 80 byte

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
È possibile salvare alcuni byte rimuovendo i e incrementando tramite x + = p.
stannius

1
la sostituzione x.ToString()con 'x + "" `salverà un sacco di caratteri.

6

Python 2, 46 byte

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

Ideone esso!

Soluzione ricorsiva con ccome contatore.

Il caso 0è interessante, perché sebbene c=0soddisfi le condizioni del palindromo, non verrebbe restituito, perché ccc and 0 or xxxritorna sempre xxx.


1
È un po 'più breve da fare c*(`c`[::-1]==`c`)or.
xnor

5

PHP, 39 byte

while(strrev($i+=$argv[1])!=$i);echo$i;
  • Prende il numero N come argomento $ argv [1];
  • ; dopo un po 'per non fare nulla
  • strrev ritorna la stringa indietro

Stessa lunghezza con for-loop

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

5

Brachylog , 8 byte

:L#>*.r=

Provalo online! (circa 5 secondi per 1234)

Verifica tutti i test. (circa 20 secondi)

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

4 byte grazie 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>


Dal giocare mentre crei lo snippet di codice per te, il primo +sembra inutile.
Neil,

Ti (x,c=x)permetterebbe di evitare il &&c?
Neil,

Penso che tu possa fare c^[...c+""].reverse().join``?f(x,x+c):cper salvare un altro byte.
Arnauld,

c-funzionerebbe per numeri leggermente più alti di c^, se necessario.
Neil,


4

C, 217 189 byte

Versione standalone:

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

Chiama per una versione della funzione:

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

Chiamata a una funzione non golfata:

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
}

Ho incluso la versione standalone per la storicità.

Questo è il mio primo codegolf, ogni commento è il benvenuto!


Consiglio di creare una funzione separata per la sfida e di non contare main()indipendentemente dalle tue preferenze. Non giocherai a baseball eseguendo dodici anelli prima di taggare "perché lo preferisco", non raggiungerai mai in modo sicuro. Questa è una competizione e la regola principale è quella di utilizzare tutti i mezzi necessari e legali per ridurre il conteggio dei byte.

1
@Snowman fiera, ho modificato la mia risposta per includere una versione di "call to a function". Questo mi permette di prendere un int come parametro e gold di qualche byte in più.
Valentin Mariette,

la tua funzione si compila senza "include <string.h>"? se la risposta non è che posso usare #define F per o #define R ritorno senza renderlo in conto ...
RosLuP

@RosLuP sì, ricevo alcuni avvertimenti ma gcc è in grado di compilarlo.
Valentin Mariette,

Ciao! Vorrei rilasciare alcuni suggerimenti! 1) C ha int implicito quindi puoi cambiare il codice in questo modo int f(int a)-> f(a) 2) se devi dichiarare alcuni ints puoi usare i parametri della funzione: int f(int a){int b;-> f(a,b){ 3) sprintfnon restituirai mai 0 quindi puoi usare in while: while(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 ) usa K&R C per definire una funzione in modo da poter combinare con il mio secondo suggerimento: 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 101 byte

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)))controlla se in ciascuna posizione ail valore di ae il suo rovescio sono uguali (cioè se aè palindromico).
Potrebbe essere possibile giocare a golf di alcuni byte scherzando con il types.


4

In realtà , 15 14 byte

Alla domanda di risposta di Leaky Nun. Suggerimenti di golf benvenuti. Provalo 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 byte

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 byte

Include +2 per -ap

Esegui con l'input su STDIN:

palidiv.pl <<< 16

palidiv.pl:

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



2

MATL , 10 byte

0`G+tVtP<a

Provalo 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 byte

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

Lungamente a causa della gestione dell'inversione in PowerShell - non molto bene. ;-)

Accetta input $args[0], memorizza in $i(la nostra variabile loop) e $n(il nostro input). Cicli infiniti, incrementando $idi $nvolta in volta (per garantire la divisibilità).

Ogni iterazione, controlliamo se $iè un palindromo. Ci sono degli scherzi qui, quindi lasciami spiegare. Per prima cosa lo prendiamo $ie lo stringiamo con "$i". Questo viene quindi indicizzato nell'array in ordine inverso ["$i".length..0]prima di essere -joinriportato in una stringa. -eqViene immesso nella parte destra dell'operatore uality, che ricollega implicitamente la stringa in un [int], poiché quello è l'operando di sinistra. Nota: questo casting elimina tutti gli zeri iniziali dal palindromo, ma poiché siamo sicuri che l'input non è divisibile per 10, va bene.

Quindi, ifè un palindromo, semplicemente posizioniamo $isulla tubazione e exit. L'output è implicito al termine dell'esecuzione.

Casi test

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 byte

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

Il formato della chiamata è p(302)risultato è una stringa.

Niente di intelligente qui. Fa una ricerca lineare, usando le funzioni num2str()e fliplr().

Questa brutta disposizione è un tocco più breve rispetto all'uso di un while(1) ... if ... break endmotivo.

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 byte

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

Avvia la ricerca c = Ne incrementa cse non un palindromo e non è divisibile per N. Quando le condizioni sono soddisfatte, le uscite c.


2

Gelatina, 12 byte

¹µ+³ßµDU⁼Dµ?

Provalo online!

Spiegazione:

Questo collegamento accetta 1 argomento. L'hanno µdiviso in 4 parti. A partire dall'ultima e spostandosi a sinistra:

           ? 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

Elisir , 75 byte

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 byte

iè input ed xè (eventualmente) output

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

Dopo aver fatto scorrere altre risposte, ho trovato una risposta Python 2 più breve, ma ho messo lo sforzo nella mia soluzione, quindi potrei anche lanciarla qui. ¯ \ _ (ツ) _ / ¯


È possibile rimuovere lo spazio in [::-1] else.
mbomb007,

non riesci a rimuovere l'assegnazione di y e metti l'espressione alla fine del ritorno? return x if x%i==0&&x ==x [::-1]else f(i,x+1), il che significa che puoi renderlo un lambda e golf più byte?
Limone distruttibile

2

REXX, 46 byte

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

2

Python 2 , 44 byte

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

Provalo online!

So che la domanda è stata pubblicata oltre sei mesi fa, ma era più breve di qualsiasi altra presentazione di Python.


2

QBIC , 29 byte

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

Spiegazione:

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

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

Spiegazione:

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

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

(33 escluso il my &f=)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.