Kleinstes Palindrom, das durch die Eingabe teilbar ist


23

Bei einer positiven Ganzzahl Ngeben Sie die kleinste positive Ganzzahl so aus, dass diese Zahl ein Palindrom ist (dh ihre eigene Umkehrung ist) und durch teilbar ist N.

Das Palindrom (dh die Ausgabe) muss keine führende Null haben, um ein Palindrom zu sein, dh es 080ist keine gültige Antwort für 16.

Die Eingabe wird aus dem vorherigen Grund niemals ein Vielfaches von 10 sein.

Ihr Programm kann so viel Zeit wie nötig in Anspruch nehmen, auch wenn es in der Praxis viel zu lang wäre, die Antwort auszugeben.

Eingänge und Ausgänge

  • Sie können die Eingabe STDINals Funktionsargument oder ähnliches durchgehen .
  • Sie können die Ausgabe an drucken STDOUT, von einer Funktion zurückgeben oder etwas Ähnliches.
  • Ein- und Ausgänge müssen dezimal sein.

Testfälle

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

Wertung

Das ist , also gewinnt die kürzeste Antwort in Bytes.


Ist die Eingabe durch 10 teilbar?
Undichte Nonne

@LeakyNun Nein, denn dann gibt es keine Lösung, da das Palindrom keine führende Null benötigen darf. Ich werde das explizit machen.
Fatalize

Wird der Eingang positiv sein?
Weizen-Zauberer

1
@ WheatWizard Ja: Bei einer positiven GanzzahlN
Fatalize

@Fatalize Entschuldigung. Ich weiß nicht, wie ich es verpasst habe.
Weizen-Zauberer

Antworten:


9

2sable / 05AB1E , 6/7 Bytes

2sable

[DÂQ#+

Erläuterung

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

Probieren Sie es online aus

05AB1E

[DÂQ#¹+

Der Unterschied zum 2sable-Code besteht darin, dass die Eingabe in 05AB1E nur einmal implizit erfolgt. Daher müssen wir hier ¹die erste Eingabe erneut abrufen .

Probieren Sie es online aus

1 Byte mit 2sable gespeichert, wie von Adnan vorgeschlagen


@ Fatalize Ich habe es gerade geschrieben :)
Emigna

Wenn Sie 2sable wechseln, können Sie ein Byte speichern , indem Sie diese: [DÂQ#+.
Adnan

@Adnan: Richtig! Die wiederholte implizite Eingabe speichert ein Byte :)
Emigna

14

Haskell, 45 37 34 Bytes

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

13

Pyth, 7 Bytes

*f_I`*Q

Probieren Sie es online aus: Demonstration

Erläuterung

*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

Nachdem ich so viele Codegold-Fragen gelesen habe, beginne ich zu glauben, dass Pyth das nächste Mal JS / Java / Ruby / Python sein wird ...
agilob

5
@ Agilob oh lieber Gott pls nein.
Alexander - Reinstate Monica

7

Java, 164 159 126 108 94 Bytes

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

Dank an Emigna und Kevin Cruijssen, die Verbesserungen beigetragen und die Bytes fast halbiert haben :)


1
Ist das nicht x % a == 0redundant, wenn Sie x als initialisieren und nur um a erhöhen? Kann der Vergleich mit der Umkehrung der Zeichenfolge auch unter der Bedingung while durchgeführt werden?
Emigna

Sie können direkt entfernen import org.apache.commons.lang.StringUtils;und verwenden org.apache.commons.lang.StringUtils.reverse. for(;;)ist kürzer als while(1>0). Es ist kein vollständiges Programm erforderlich, dies ist lediglich int c(int a){...}eine gültige Antwort, da die Frage die folgende Regel enthält: " Sie können die Eingabe als Funktionsargument verwenden. Sie können die Ausgabe einer Funktion zurückgeben. " @Emigna ist in der Tat richtig Der Modulo Check ist nicht notwendig.
Kevin Cruijssen

Oh, und natürlich willkommen! Dieser Beitrag könnte Ihnen gefallen: Tipps zum Golfen in Java .
Kevin Cruijssen

@Emigna: Du hast absolut Recht, hast das getan.
Peech

@KevinCruijssen: da ich nur durch Zahlen iteriere, die durch a (durch x += a) teilbar sind . Ich muss nicht auf Teilbarkeit prüfen :) und danke für die Golftipps!
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
Sie können einige Bytes sparen, indem Sie i entfernen und mit x + = p erhöhen.
Stannius

1
Durch Ersetzen x.ToString()mit "x +" "" werden eine Reihe von Zeichen gespeichert.

6

Python 2, 46 Bytes

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

Ideone es!

Rekursive Lösung mit cals Zähler.

Der Fall für 0ist interessant, weil, obwohl c=0er die Palindrombedingung erfüllt, er nicht zurückgegeben werden würde, weil er ccc and 0 or xxximmer zurückgibt xxx.


1
Es ist etwas kürzer zu machen c*(`c`[::-1]==`c`)or.
Xnor

5

PHP, 39 Bytes

while(strrev($i+=$argv[1])!=$i);echo$i;
  • Nimmt die Zahl N als Argument $ argv [1];
  • ; nach einer Weile nichts zu tun
  • strrev Zeichenkette rückwärts zurückgeben

Gleiche Länge mit for-Schleife

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


5

Javascript (ES6), 55 51 Bytes

4 Bytes dank 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>


Vom Herumspielen beim Erstellen Ihres Code-Snippets für Sie +scheint das erste unnötig.
Neil

Würden (x,c=x)Sie das vermeiden &&c?
Neil

Ich denke, Sie können noch c^[...c+""].reverse().join``?f(x,x+c):cein Byte sparen.
Arnauld

c-würde für etwas höhere Zahlen als arbeiten c^, wenn nötig.
Neil


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

Aufruf einer Funktionsversion:

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

Aufrufen einer Funktion ohne 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
}

Ich habe die eigenständige Version für Historizität hinzugefügt.

Dies ist mein erster Codegolf, jeder Kommentar ist willkommen!


Ich empfehle, eine separate Funktion für die Herausforderung zu erstellen und main()unabhängig von Ihren Vorlieben nicht zu zählen . Du würdest nicht Baseball spielen, indem du zuerst zwölf Loops laufen lässt, bevor du mit "Ich bevorzuge es" markierst. Du wirst niemals sicher ankommen. Dies ist ein Wettbewerb, und die Hauptregel lautet, alle erforderlichen und zulässigen Mittel einzusetzen, um die Anzahl der Bytes zu verringern.

1
@Snowman fair, ich habe meine Antwort so bearbeitet, dass sie die Version "Aufruf einer Funktion" enthält. Dadurch kann ich ein int als Parameter nehmen und ein paar Bytes mehr Gold wegnehmen.
Valentin Mariette

Kompilieren Sie Ihre Funktion ohne "include <string.h>"? Wenn die Antwort nicht ist, kann ich #define F für oder #define R zurückgeben, ohne es in der Zählung zu machen ...
RosLuP

@RosLuP Ja, ich bekomme ein paar Warnungen, aber gcc kann es kompilieren.
Valentin Mariette

Hi !, ich würde gerne ein paar Tipps abgeben! 1) C hat implizites int, so dass Sie den Code wie folgt ändern können int f(int a)-> f(a) 2) Wenn Sie einige ints deklarieren müssen, können Sie die Funktionsparameter verwenden: int f(int a){int b;-> f(a,b){ 3) sprintfwird niemals 0 zurückgeben, so dass Sie Folgendes verwenden können while: while(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 ) benutze das K & R C, um eine Funktion zu definieren, die du mit meinem zweiten Hinweis int s(char*a){int b=strlen(a);for(int i=0s(a,b,i)char*a;{b=strlen(a);for(i=0;
kombinieren kannst

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)))prüft, ob an jeder Position ader Wert von aund seine Umkehrung gleich sind (dh ob apalindromisch ist).
Es könnte möglich sein, einige Bytes durch Herumspielen mit dem Golf zu spielen types.


4

Eigentlich , 15 14 Bytes

Gefragt nach einer Antwort von Leaky Nun. Golfvorschläge sind willkommen. Probieren Sie es 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))

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 Bytes

Beinhaltet +2 für -ap

Führen Sie mit der Eingabe auf STDIN aus:

palidiv.pl <<< 16

palidiv.pl:

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



2

MATL , 10 Bytes

0`G+tVtP<a

Probieren Sie es 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}}

Lange, weil das Umkehren in PowerShell nicht sehr gut funktioniert. ;-)

Nimmt Eingaben auf $args[0], speichert sie in $i(unsere Schleifenvariable) und $n(unsere Eingabe). Loops unendlich, Erhöhen $ivon $njeder Zeit (auf Garantie Teilbarkeit).

Bei jeder Iteration prüfen wir, ob $ies sich um ein Palindrom handelt. Hier passiert ein Trick, also lassen Sie mich erklären. Wir nehmen $ies zuerst und fassen es zusammen "$i". Das Array wird dann in umgekehrter Reihenfolge indiziert, ["$i".length..0]bevor es -joinwieder in einen String umgewandelt wird. Das wird in die rechte Seite des -eqOperators uality eingespeist, der den String implizit in einen zurücksetzt [int], da dies der linke Operand ist. Hinweis: Bei diesem Casting werden keine führenden Nullen aus dem Palindrom entfernt, aber da wir garantiert sind, dass die Eingabe nicht durch teilbar 10ist, ist das in Ordnung.

Dann ist ifes ein Palindrom, wir platzieren es einfach $iauf der Pipeline und exit. Die Ausgabe erfolgt implizit am Ende der Ausführung.

Testfälle

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

Aufrufformat ist p(302)Ergebnis ist eine Zeichenfolge.

Hier ist nichts Schlaues. Es führt eine lineare Suche mit den Funktionen num2str()und durch fliplr().

Diese hässliche Anordnung ist ein Hauch kürzer als die Verwendung eines while(1) ... if ... break endMusters.

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)&

Startet die Suche bei c = Nund erhöht, cfalls kein Palindrom und nicht teilbar durch N. Wenn die Bedingungen erfüllt sind, wird ausgegeben c.


2

Gelee, 12 Bytes

¹µ+³ßµDU⁼Dµ?

Probieren Sie es online!

Erläuterung:

Dieser Link benötigt 1 Argument. Die µs teilen es in 4 Teile. Ausgehend von der letzten und nach links bewegen:

           ? 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

Elixier , 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

iwird eingegeben und xwird (irgendwann) ausgegeben

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

Nachdem ich andere Antworten durchgeblättert hatte, fand ich eine kürzere Python 2-Antwort, aber ich habe die Mühe in meine Lösung gesteckt, also kann ich sie auch hierher werfen. ¯ \ _ (ツ) _ / ¯


Sie können das Leerzeichen in entfernen [::-1] else.
mbomb007

Können Sie die Zuweisung von y nicht entfernen und den Ausdruck am Ende der Rückgabe einfügen? return x if x%i==0&&x ==x [::-1]else f(i,x+1), was bedeutet dann, dass Sie es zu einem Lambda machen und mehr Bytes Golf spielen können?
Destructible Lemon

2

REXX, 46 Bytes

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


2

QBIC , 29 Bytes

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

Erläuterung:

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

Erläuterung:

-> \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 ohne die my &f=)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.