Girdiyle bölünebilen en küçük palindrom


23

Pozitif bir tamsayı verildiğinde N, bu sayının bir palindrom olduğu (yani kendi tersi olduğu) ve bölüştüğü şekilde en küçük pozitif tamsayıyı verin N.

Palindrom (yani çıktı), bir palindrom olmak için ön sıfıra ihtiyaç duymamalıdır, örneğin 080geçerli cevap değildir 16.

Bir önceki nedenden dolayı girdi asla 10'un katı olamaz.

Programınız gerektiği kadar zaman alabilir, pratikte yanıtı vermek çok uzun olsa bile.

Girdiler ve çıktılar

  • Girdiyi STDINişlev argümanı veya benzer bir şey olarak alabilirsiniz.
  • Çıktıyı STDOUTbir işlevden veya benzeri bir şey için geri yazdırabilirsiniz .
  • Girişler ve çıkışlar ondalık tabanda olmalıdır.

Test durumları

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

puanlama

Bu , yani bayt cinsinden en kısa cevap kazanır.


Giriş 10 ile bölünebilir mi?
Sızdıran Rahibe,

@LeakyNun Hayır, çünkü o zaman hiçbir çözüm yoktur çünkü palindromun baştaki sıfıra ihtiyacı olmamalıdır. Bunu açıklığa kavuşturacağım.
16'da

Girdi pozitif olacak mı?
Buğday Sihirbazı 14

1
@WheatWizard Evet: Olumlu bir tamsayı verilirN
29'da Fatalize

@ Üzgünüm üzgünüm. Nasıl özlediğimi bilmiyorum.
Buğday Sihirbazı 14

Yanıtlar:


9

2sable / 05AB1E , 6/7 bayt

2sable

[DÂQ#+

açıklama

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

Çevrimiçi deneyin

05AB1E

[DÂQ#¹+

2sable kodundaki fark, girişin 05AB1E'de yalnızca bir kez örtülü olmasıdır, bu yüzden burada ¹ilk girişi tekrar almamız gerekir .

Çevrimiçi deneyin

Tarafından önerildiği gibi 2sable ile 1 byte Kaydedilen Adnan


@Fatalize Sadece yazıyordum :)
Emigna

Eğer 2sable geçerseniz, bunu yaparak bir byte kaydedebilirsiniz: [DÂQ#+.
Adnan

@Adnan: Doğru! Tekrarlanan örtük girdi bir bayt kazandırır :)
Emigna

14

Haskell, 45 37 34 bayt

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

13

Pyth, 7 bayt

*f_I`*Q

Çevrimiçi deneyin: Gösteri

açıklama

*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

Pek çok kodlayıcı soru okuduktan sonra Pyth'un bir sonraki JS / Java / Ruby / Python ...
agilob

5
@ agilob oh sevgili tanrım pls hayır.
Alexander - Monica

7

Java, 164 159 126 108 94 bayt

Golf versiyonu:

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

Ungolfed versiyonu:

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

Gelişmelere katkıda bulunmak ve baytları neredeyse yarıya indirmek için Emigna ve Kevin Cruijssen'e not verin :)


1
x % a == 0X'i a olarak başlattığınızda ve onu yalnızca a ile artırdığınızda, fazlalık olmaz mı ? Ayrıca, dizenin ters çevrilmesi ile karşılaştırılması şartlı süre içinde yapılabilir mi?
Emigna

Doğrudan kaldırabilir import org.apache.commons.lang.StringUtils;ve kullanabilirsiniz org.apache.commons.lang.StringUtils.reverse. for(;;)daha kısa while(1>0). Tam bir programa gerek yok, sadece int c(int a){...}geçerli bir cevap olarak yapmalısınız, çünkü soru şu kuralı içeriyor: “Girdiyi bir işlev argümanı olarak alabilirsiniz. Çıktıyı bir işlevden döndürebilirsiniz . ” @Emigna gerçekten de doğru modulo kontrolü gerekli değildir.
Kevin Cruijssen,

Oh, ve elbette hoşgeldin! Bu yazı hoşunuza gidebilir: Java'da golf oynamak için ipuçları .
Kevin Cruijssen,

@Emigna: Kesinlikle haklısın, bunu yaptın.
saat

@KevinCruijssen: Çünkü sadece (by x += a) ile bölünebilen sayıları yineliyorum . Bölünebilirliği kontrol etmem gerekmiyor :) ve golf önerileri için teşekkürler!
saat

7

C #, 103 80 Bayt

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
İ'yi kaldırarak ve x + = p ile artırarak bazı baytları kaydedebilirsiniz.
stannius,

1
x.ToString()'x + "" `ile değiştirmek bir grup karakteri kurtarır.

6

Python 2,46 bayt

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

Ideone!

cSayaç olarak özyinelemeli çözüm .

Bu durum 0ilginçtir, çünkü c=0palindrom koşulunu yerine getirmesine rağmen geri döndürülmez, çünkü ccc and 0 or xxxdaima geri döner xxx.


1
Yapması biraz daha kısa c*(`c`[::-1]==`c`)or.
xnor

5

PHP, 39 bayt

while(strrev($i+=$argv[1])!=$i);echo$i;
  • N sayısını $ argv [1] argümanı olarak alır;
  • ; bir şey yapmadan sonra
  • strrev dizgeyi geriye döndür

For-loop ile aynı uzunluk

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


5

Javascript (ES6), 55 51 bayt

Neil sayesinde 4 bayt.

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>


Sizin için kod pasajını oluştururken oyun oynamaktan ilk önce +gereksiz görünüyor.
Neil

Kaçınmanıza (x,c=x)izin verir mi &&c?
Neil

Bir c^[...c+""].reverse().join``?f(x,x+c):cbayt daha kazanmak için yapabileceğini düşünüyorum .
Arnauld

c-c^Gerekirse, biraz daha yüksek sayılar için çalışacak .
Neil


4

C, 217 189 bayt

Bağımsız sürüm:

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

İşlev versiyonuna çağrı:

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

Ungolfed bir işleve çağrı:

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
}

Tarihselliğin bağımsız versiyonunu ekledim.

Bu benim ilk codegolf, herhangi bir yorum açığız!


Meydan okuma için ayrı bir işlev yapmanızı ve main()tercihlerinizden bağımsız olarak saymamanızı öneririm . "Ben tercih ederim" i işaretlemeden önce ilk olarak on iki halka çalıştırarak beyzbol oynamazsınız, asla güvenli bir şekilde ulaşamazsınız. Bu bir yarışmadır ve birincil kural bayt sayısını azaltmak için gerekli ve yasal her türlü aracı kullanmaktır.

1
@Snowman fair enouth, 'İşleve çağrı' versiyonunu eklemek için cevabımı düzenledim. Bu bir int parametresi ve altın bir kaç bayt daha altın almak için izin verir.
Valentin Mariette

işleviniz "include <string.h>" olmadan derlenir mi? Cevap bende #define F kullanabilir ya da #define R 'i geri
saymadan

@RosLuP evet, birkaç uyarı alıyorum ancak gcc onu derleyebiliyor.
Valentin Mariette

Merhaba!, Bazı ipuçları bırakmak istiyorum! 1) C int intit'e sahiptir, bu yüzden böyle bir kodu değiştirebilirsiniz int f(int a)-> f(a) 2) bazı ints işlevlerini kullanmanız gerekiyorsa, fonksiyon parametrelerini kullanabilirsiniz: int f(int a){int b;-> f(a,b){ 3) sprintfasla 0 döndürmez, böylece while: while(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 ) Fonksiyonu tanımlamak için K&R C'yi kullanın, böylece tou 2. int s(char*a){int b=strlen(a);for(int i=0s(a,b,i)char*a;{b=strlen(a);for(i=0;
ipucumla birleşebilir

4

R, 117 113 109 101 bayt

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)))adeğerinin her konumunda ave tersinin aynı olup olmadığını kontrol eder (yani apalindromik ise).
Bazı baytlarla uğraşarak golf oynamak mümkün olabilir types.


4

Aslında , 15 14 bayt

Leaky Nun tarafından cevaplanması istendi. Golf önerileri kabul edilir. Çevrimiçi deneyin!

╖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

Haskell, 64 63 56 bayt

x!n|mod x n==0,s<-show x,reverse s==s=x|y<-x+1=y!n
(1!)

(1!)16Ya da basitçe arayın 1!16. Ideone'da dene.


3

VBSCRIPT, 47 bayt

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 bayt

İçin +2 içerir -ap

STDIN'deki giriş ile çalıştırın:

palidiv.pl <<< 16

palidiv.pl:

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



2

MATL , 10 bayt

0`G+tVtP<a

Çevrimiçi deneyin!

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 bayt

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

Uzun zamandır tersine çevirmenin PowerShell'de ele alınması nedeniyle - çok iyi değil. ;-)

Girdiyi alır $args[0], depolar $i(döngü değişkenimiz) ve $n(girdilerimiz). Döngüler sonsuz, artırılmıyor $itarafından$n (garanti bölünebilme kadar) her zaman.

Her yineleme, $ibir palindrom olup olmadığını kontrol ederiz . Burada bazı hileler oluyor, o yüzden açıklamama izin verin. İlk önce $ionu alıp dizilelim "$i". Bu daha sonra bir dizgeye geri döndürülmeden ["$i".length..0]önce ters sırayla -joindizge ile dizine alınır . Bu, -equality işlecinin sağ tarafına beslenir , bu da dizgiyi tekrar geri çeker [int], çünkü sol işlenen budur. Not: bu döküm palindromdan baştaki sıfırları sıyırır, ancak girişin bölünmeyeceğinden emin olduğumuzdan, sorun değil 10.

O ifzaman, bir palindrom, sadece $iboru hattına yerleştiriyoruz ve exit. Yürütme sonunda çıktı çok açık.

Test Kılıfları

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 bayt

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

Çağrı biçimi p(302)sonucu bir dizedir.

Burada akıllıca bir şey yok. num2str()Ve fliplr()fonksiyonlarını kullanarak doğrusal bir arama yapar .

Bu çirkin düzenleme bir while(1) ... if ... break endkalıp kullanmaktan daha kısa bir dokunuş .

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 bayt

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

Aramayı başlatır ve bir palindrom değilse ve tarafından bölünemezse c = Nartar . Koşullar sağlandığında, çıktılar .cNc


2

Jöle, 12 bayt

¹µ+³ßµDU⁼Dµ?

Çevrimiçi deneyin!

Açıklama:

Bu bağlantı 1 argüman alır. µS, 4 parçaya bölünmüş. Sondan başlayarak ve sola hareket ederek:

           ? 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

İksir , 75 bayt

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 bayt

igiriş ve xçıkış (sonunda)

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

Diğer cevapları okuduktan sonra, daha kısa bir Python 2 cevabı buldum, ancak çabamı çözümüme harcadım, o yüzden de buraya fırlat. ¯ \ _ (ツ) _ / ¯


İçindeki boşluğu kaldırabilirsiniz [::-1] else.
mbomb007

y ödevini kaldıramazsınız ve sadece ifadeyi dönüşün sonuna koyabilir misiniz? return x if x%i==0&&x ==x [::-1]else f(i,x+1), hangi bir lambda yapabilir ve daha fazla bayt golf yapabilir?
Yıkılabilir Limon

2

REXX, 46 bayt

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


2

QBIC , 29 bayt

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

Açıklama:

:      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, 39 bayt

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

(33 dahil değil my &f=)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.