Najmniejszy palindrom podzielny przez dane wejściowe


23

Biorąc pod uwagę dodatnią liczbę całkowitą N, wyprowadzaj najmniejszą dodatnią liczbę całkowitą taką, że liczba ta jest palindromem (tzn. Stanowi swoją własną odwrotność) i jest podzielna przez N.

Palindrom (tj. Wynik) nie może wymagać początkowego zera, aby być palindromem, np. 080Nie jest poprawną odpowiedzią 16.

Dane wejściowe nigdy nie będą wielokrotnością 10, z poprzedniego powodu.

Twój program może zająć tyle czasu, ile to konieczne, nawet jeśli w praktyce odpowiedź byłaby o wiele za długa.

Wejścia i wyjścia

  • Możesz wziąć dane wejściowe STDINjako argument funkcji lub coś podobnego.
  • Możesz wydrukować dane wyjściowe STDOUT, zwrócić je z funkcji lub coś podobnego.
  • Wejścia i wyjścia muszą być w systemie dziesiętnym.

Przypadki testowe

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

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.


Czy dane wejściowe będą podzielne przez 10?
Leaky Nun

@LeakyNun Nie, ponieważ wtedy nie ma rozwiązania, ponieważ palindrom nie musi potrzebować zera wiodącego. Wyjaśnię to jasno.
Fatalize

Czy dane wejściowe będą pozytywne?
Wheat Wizard

1
@WheatWizard Tak: Biorąc pod uwagę dodatnią liczbę całkowitąN
Fatalize

@ Fatalizuj przepraszam. Nie wiem jak mi tego brakowało.
Wheat Wizard

Odpowiedzi:


9

2sable / 05AB1E , 6/7 bajtów

2sable

[DÂQ#+

Wyjaśnienie

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

Wypróbuj online

05AB1E

[DÂQ#¹+

Różnica w stosunku do kodu 2sable polega na tym, że dane wejściowe są domyślnie tylko raz w 05AB1E, więc tutaj musimy ¹ponownie uzyskać pierwsze dane wejściowe.

Wypróbuj online

Zapisano 1 bajt z 2sable, jak sugeruje Adnan


@Fatalize Właśnie pisałem to :)
Emigna

Po przełączeniu na 2sable można zapisać bajt w ten sposób: [DÂQ#+.
Adnan

@Adnan: Racja! Powtarzające się niejawne dane wejściowe oszczędzają bajt :)
Emigna

14

Haskell, 45 37 34 bajtów

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

13

Pyth, 7 bajtów

*f_I`*Q

Wypróbuj online: demonstracja

Wyjaśnienie

*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

Po przeczytaniu tylu pytań o kodowane litery zaczynam myśleć, że Pyth będzie następnym JS / Java / Ruby / Python ...
agilob

5
@agilob o mój drogi, proszę nie.
Alexander - Przywróć Monikę

7

Java, 164 159 126 108 94 bajtów

Wersja golfowa:

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

Wersja bez golfa:

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

Wołanie do Emigny i Kevina Cruijssena za wkład w ulepszenia i zmniejszenie bajtów prawie o połowę :)


1
Czy to nie jest x % a == 0zbyteczne, gdy inicjujesz x jako a i zwiększasz go tylko o a? Ponadto, czy porównanie z odwróceniem łańcucha można wykonać w warunkowym while?
Emigna,

Możesz usunąć import org.apache.commons.lang.StringUtils;i używać org.apache.commons.lang.StringUtils.reversebezpośrednio. for(;;)jest krótszy niż while(1>0). Nie ma potrzeby korzystania z pełnego programu, po prostu int c(int a){...}zrobiłbym to jako prawidłową odpowiedź, ponieważ pytanie ma następującą zasadę: „ Możesz wziąć dane wejściowe jako argument funkcji. Możesz zwrócić dane wyjściowe z funkcji. ” @Emigna rzeczywiście ma rację, że kontrola modulo nie jest konieczna.
Kevin Cruijssen

Och, i oczywiście witamy! Może ci się spodobać ten post: Wskazówki dotyczące gry w golfa w Javie .
Kevin Cruijssen

@Emigna: masz absolutną rację, zrobiłeś to.
peech

@KevinCruijssen: ponieważ iteruję tylko przez liczby, które są podzielne przez (by x += a). Nie muszę sprawdzać podzielności :) i dziękuję za wskazówki dotyczące gry w golfa!
peech

7

C #, 103 80 bajtów

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

Bez golfa

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

2
Możesz zapisać niektóre bajty, usuwając i, i zwiększając za pomocą x + = p.
stannius

1
zamiana na x.ToString()„x +” „” pozwoli zaoszczędzić sporo znaków.

6

Python 2, 46 bajtów

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

Ideone to!

Rozwiązanie rekurencyjne z clicznikiem.

Sprawa 0jest interesująca, ponieważ chociaż c=0spełnia warunek palindromu, nie zostanie zwrócona, ponieważ ccc and 0 or xxxzawsze wraca xxx.


1
To trochę krótsze c*(`c`[::-1]==`c`)or.
xnor

5

PHP, 39 bajtów

while(strrev($i+=$argv[1])!=$i);echo$i;
  • Pobiera liczbę N jako argument $ argv [1];
  • ; po chwili nic nie robić
  • strrev zwraca ciąg do tyłu

Ta sama długość z pętlą for

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


5

JavaScript (ES6), 55 51 bajtów

4 bajty dzięki Neilowi.

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>


Od zabawy podczas tworzenia fragmentu kodu dla Ciebie, pierwszy +wydaje się niepotrzebny.
Neil,

Czy (x,c=x)pozwalają uniknąć &&c?
Neil,

Myślę, że możesz zrobić, c^[...c+""].reverse().join``?f(x,x+c):caby zaoszczędzić jeszcze jeden bajt.
Arnauld,

c-działałby dla nieco wyższych liczb niż c^w razie potrzeby.
Neil,


4

C, 217 189 bajtów

Wersja samodzielna:

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

Wywołanie do wersji funkcji:

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

Nie golfowany:

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

Wywołanie funkcji niepoznanej:

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
}

Dołączyłem samodzielną wersję dla historyczności.

To jest mój pierwszy codegolf, każdy komentarz jest mile widziany!


Polecam utworzenie osobnej funkcji dla wyzwania i nie liczenie main()niezależnie od twoich preferencji. Nie grasz w baseball, uruchamiając najpierw dwanaście pętli przed oznaczeniem „ponieważ wolę”, nigdy nie dotrzesz bezpiecznie. Jest to konkurencja, a podstawową zasadą jest użycie wszelkich niezbędnych i legalnych środków w celu zmniejszenia liczby bajtów.

1
@Snowman fair enouth, zredagowałem swoją odpowiedź, aby uwzględnić wersję „call to a function”. To pozwala mi wziąć int jako parametr i pozbyć się kilku dodatkowych bajtów.
Valentin Mariette

czy twoja funkcja kompiluje się bez „include <string.h>”? jeśli odpowiedź jest
przecząca,

@RosLuP tak, dostaję kilka ostrzeżeń, ale gcc jest w stanie je skompilować.
Valentin Mariette,

Cześć! Chciałbym podrzucić kilka wskazówek! 1) C ma niejawne int, więc możesz zmienić kod w ten sposób int f(int a)-> f(a) 2) jeśli musisz zadeklarować niektóre z nich int, możesz użyć parametrów funkcji: int f(int a){int b;-> f(a,b){ 3) sprintfnigdy nie zwróci 0, więc możesz użyć w while: while(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 ) użyj K&R C do zdefiniowania funkcji, aby tou mogła łączyć się z moją drugą wskazówką: 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 bajtów

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

Bez golfa

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)))sprawdza, czy w każdej pozycji awartość ai jej odwrotność są takie same (tj. czy ajest palindromiczne).
Może być możliwe wygranie niektórych bajtów przez zabawę z types.


4

Faktycznie , 15 14 bajtów

Zapytany o odpowiedź przez Dziurawą Zakonnicę. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj 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 bajtów

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

bez golfa

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 bajtów

Obejmuje +2 za -ap

Uruchom z wejściem na STDIN:

palidiv.pl <<< 16

palidiv.pl:

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



2

MATL , 10 bajtów

0`G+tVtP<a

Wypróbuj 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 bajty

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

Długi z powodu sposobu cofania w PowerShell - niezbyt dobrze. ;-)

Pobiera dane wejściowe $args[0], przechowuje w $i(nasza zmienna pętli) i $n(nasze dane wejściowe). Pętle nieskończenie rosną $iza $nkażdym razem (aby zapewnić podzielność).

Przy każdej iteracji sprawdzamy, czy $ijest to palindrom. Dzieje się tu trochę sztuczek, więc wyjaśnię. Najpierw bierzemy to $ii zaostrzamy "$i". Jest to następnie indeksowane tablicowo w odwrotnej kolejności, ["$i".length..0]zanim zostanie z -joinpowrotem edytowane do łańcucha. Jest to podawane po prawej stronie -eqoperatora uality, który domyślnie rzutuje ciąg z powrotem na [int], ponieważ jest to lewy operand. Uwaga: ten rzutowanie usuwa wszystkie wiodące zera z palindromu, ale ponieważ jesteśmy pewni, że dane wejściowe nie są podzielne przez 10, to w porządku.

Następnie ifjest to palindrom, po prostu umieszczamy $ina rurociągu i exit. Dane wyjściowe są niejawne na końcu wykonania.

Przypadki testowe

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 bajtów

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

Format połączenia to p(302)wynik, że jest to ciąg znaków.

Nic mądrego tutaj. Wykonuje wyszukiwanie liniowe za pomocą funkcji num2str()i fliplr().

To brzydkie ustawienie jest odrobinę krótsze niż użycie while(1) ... if ... break endwzoru.

Bez golfa

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 bajtów

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

Rozpoczyna wyszukiwanie od c = Ni zwiększa, cjeśli nie jest palindromem i nie można go podzielić N. Po spełnieniu warunków wyjścia c.


2

Galaretka, 12 bajtów

¹µ+³ßµDU⁼Dµ?

Wypróbuj online!

Wyjaśnienie:

Ten link wymaga 1 argumentu. Gdy µs podzielić ją na 4 części. Zaczynając od ostatniego i przesuwając się w lewo:

           ? 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

Eliksir , 75 bajtów

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 bajtów

ijest wejściem i xjest (ostatecznie) wyjściem

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

Po przewinięciu innych odpowiedzi znalazłem krótszą odpowiedź w Pythonie 2, ale włożyłem wysiłek w moje rozwiązanie, więc równie dobrze mogę tu rzucić. ¯ \ _ (ツ) _ / ¯


Możesz usunąć miejsce w [::-1] else.
mbomb007,

nie możesz usunąć przypisania y i po prostu umieścić wyrażenie na końcu zwrotu? return x if x%i==0&&x ==x [::-1]else f(i,x+1), co oznacza, że ​​możesz zrobić z niego lambda, a golf więcej bajtów?
Destructible Lemon


2

Python 2 , 44 bajty

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

Wypróbuj online!

Wiem, że pytanie zostało wysłane ponad sześć miesięcy temu, ale było ono krótsze niż jakiekolwiek inne przesłanie Pythona.


2

QBIC , 29 bajtów

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

Wyjaśnienie:

:      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 bajtów

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

Wyjaśnienie:

-> \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 bajtów

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

(33 z wyłączeniem my &f=)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.