Palindrom terkecil yang dapat dibagi oleh input

23

Diberikan bilangan bulat positif N, menghasilkan bilangan bulat positif terkecil sehingga angka ini adalah palindrom (yaitu kebalikannya sendiri) dan dapat dibagi dengan N.

Palindrome (yaitu keluaran) tidak perlu nol awalan untuk menjadi palindrom, mis. 080Bukan jawaban yang valid untuk 16.

Masukan tidak akan berupa kelipatan 10, karena alasan sebelumnya.

Program Anda mungkin memakan waktu sebanyak yang diperlukan, bahkan jika dalam praktiknya akan terlalu lama untuk menghasilkan jawabannya.

Masukan dan keluaran

  • Anda dapat mengambil input melalui STDIN, sebagai argumen fungsi, atau yang serupa.
  • Anda dapat mencetak hasilnya STDOUT, mengembalikannya dari fungsi, atau yang serupa.
  • Input dan output harus dalam basis desimal.

Uji kasus

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

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Fatalisasi
sumber
Apakah input akan habis dibagi 10?
Leaky Nun
@ LeakyNun Tidak, karena dengan demikian tidak ada solusi karena palindrome tidak memerlukan nol di depan. Saya akan menjelaskannya secara eksplisit.
Fatalkan
Apakah inputnya positif?
Wheat Wizard
1
@WheatWizard Ya: Diberikan bilangan bulat positifN
Fatalize
@Segalkan maaf. Saya tidak tahu bagaimana saya melewatkannya.
Wheat Wizard

Jawaban:

9

2sable / 05AB1E , 6/7 byte

2sable

[DÂQ#+

Penjelasan

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

Cobalah online

05AB1E

[DÂQ#¹+

Perbedaannya dengan kode 2sable adalah bahwa input hanya tersirat sekali di 05AB1E, jadi di sini kita perlu ¹mendapatkan input pertama lagi.

Cobalah online

Disimpan 1 byte dengan 2sable seperti yang disarankan oleh Adnan

Emigna
sumber
@Fatalize Saya baru saja menulisnya :)
Emigna
Jika Anda beralih ke 2sable, Anda dapat menyimpan byte dengan melakukan hal ini: [DÂQ#+.
Adnan
@ Adnan: Benar! Masukan implisit yang diulang menyimpan byte :)
Emigna
14

Haskell, 45 37 34 byte

(+)>>=until((reverse>>=(==)).show)
Damien
sumber
13

Pyth, 7 byte

*f_I`*Q

Cobalah online: Demonstrasi

Penjelasan

*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
Jakube
sumber
Setelah membaca begitu banyak pertanyaan codegold, saya mulai berpikir bahwa Pyth akan menjadi JS / Java / Ruby / Python berikutnya ...
agilob
5
@ agilob oh tuhan sayang jangan.
Alexander - Pasang kembali Monica
7

Java, 164 159 126 108 94 byte

Versi golf:

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

Versi tidak disatukan:

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

Shoutout to Emigna dan Kevin Cruijssen untuk berkontribusi perbaikan dan memotong byte hampir menjadi dua :)

Peech
sumber
1
Bukankah x % a == 0agak berlebihan ketika Anda menginisialisasi x sebagai a dan hanya meningkatkannya dengan a? Juga, dapatkah perbandingan dengan pembalikan string dilakukan dalam kondisi sementara?
Emigna
Anda dapat menghapus import org.apache.commons.lang.StringUtils;dan menggunakan org.apache.commons.lang.StringUtils.reversesecara langsung. for(;;)lebih pendek dari while(1>0). Tidak perlu untuk program lengkap, hanya int c(int a){...}akan dilakukan sebagai jawaban yang valid, karena pertanyaannya memiliki aturan berikut: " Anda dapat mengambil input sebagai argumen fungsi. Anda dapat mengembalikan output dari suatu fungsi. " @Emigna memang benar bahwa pemeriksaan modulo tidak diperlukan.
Kevin Cruijssen
Oh, dan tentu saja selamat datang! Anda mungkin menyukai posting ini: Kiat untuk bermain golf di Jawa .
Kevin Cruijssen
@ Emigna: Anda memang benar, lakukan itu.
peech
@KevinCruijssen: karena saya hanya beralih melalui angka yang dapat dibagi oleh (oleh x += a). Saya tidak perlu memeriksa keterpisahan :) dan terima kasih atas tip golfnya!
peech
7

C #, 103 80 Bytes

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

Tidak disatukan

int f(int p)
{
   int x = p;
   while (x + "" != string.Concat((x + "").Reverse()))
      x += p;
   return x;
}
Omer Kahoot
sumber
2
Anda mungkin menyimpan beberapa byte dengan menghapus i, dan menambahkan melalui x + = p.
stannius
1
mengganti x.ToString()dengan 'x + "" `akan menghemat banyak karakter.
6

Python 2, 46 byte

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

Ide itu!

Solusi rekursif dengan csebagai penghitung.

Kasus untuk 0ini menarik, karena walaupun c=0memenuhi kondisi palindrome, itu tidak akan dikembalikan, karena ccc and 0 or xxxselalu kembali xxx.

Biarawati Bocor
sumber
1
Agak pendek untuk dilakukan c*(`c`[::-1]==`c`)or.
xnor
5

PHP, 39 byte

while(strrev($i+=$argv[1])!=$i);echo$i;
  • Mengambil angka N sebagai argumen $ argv [1];
  • ; setelah beberapa saat tidak melakukan apa-apa
  • strrev mengembalikan string ke belakang

Panjang yang sama dengan for-loop

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

Brachylog , 8 byte

:L#>*.r=

Cobalah online! (sekitar 5 detik untuk 1234)

Verifikasi semua testcases. (sekitar 20 detik)

: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.
Biarawati Bocor
sumber
5

Javascript (ES6), 55 51 byte

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

Biarawati Bocor
sumber
Dari bermain-main sambil membuat cuplikan kode untuk Anda, yang pertama +tampaknya tidak perlu.
Neil
Apakah (x,c=x)Anda bisa menghindari &&c?
Neil
Saya pikir Anda dapat melakukan c^[...c+""].reverse().join``?f(x,x+c):cuntuk menghemat satu byte lagi.
Arnauld
c-akan bekerja untuk angka yang sedikit lebih tinggi daripada c^, jika perlu.
Neil
4

Pyke, 11 9 byte

.f*`D_q)*

Coba di sini!

Biru
sumber
4

C, 217 189 byte

Versi mandiri:

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

Panggil ke versi fungsi:

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

Tidak Terkumpul:

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

Panggilan ke suatu fungsi yang tidak ditandai:

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
}

Saya menyertakan versi mandiri untuk historisitas.

Ini codegolf pertama saya, ada komentar apa pun!

Valentin Mariette
sumber
Saya sarankan membuat fungsi terpisah untuk tantangan, dan tidak menghitung main()terlepas dari preferensi Anda. Anda tidak akan bermain bisbol dengan menjalankan dua belas putaran terlebih dahulu sebelum menandai "karena saya lebih suka," Anda tidak akan pernah mencapai dengan aman. Ini adalah kompetisi, dan aturan utamanya adalah menggunakan segala cara yang diperlukan dan legal untuk mengurangi jumlah byte.
1
@Snowman fair enouth, saya mengedit jawaban saya untuk menyertakan versi 'panggilan ke fungsi'. Ini memungkinkan saya untuk mengambil int sebagai parameter dan mengambil beberapa byte lagi.
Valentin Mariette
lakukan kompilasi fungsi Anda tanpa "include <string.h>"? jika jawabannya tidak daripada saya dapat menggunakan #define F untuk atau #define R kembali tanpa membuatnya masuk hitungan ...
RosLuP
@ RosLuP ya, saya mendapatkan beberapa peringatan tetapi gcc dapat mengkompilasinya.
Valentin Mariette
Hai !, Saya ingin memberikan beberapa Petunjuk! 1) C memiliki int implisit sehingga Anda dapat mengubah kode seperti ini int f(int a)-> f(a) 2) jika Anda harus mendeklarasikan beberapa ints Anda dapat menggunakan parameter fungsi: int f(int a){int b;-> f(a,b){ 3) sprintftidak akan pernah mengembalikan 0 sehingga Anda dapat menggunakan while: while(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 ) gunakan K&R C untuk mendefinisikan Function sehingga tou dapat mengkombinasikan dengan petunjuk kedua saya: 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 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

Tidak disatukan

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)))memeriksa apakah pada setiap posisi anilai adan kebalikannya sama (yaitu, jika apalindromik).
Dimungkinkan untuk bermain golf beberapa byte dengan bermain - main dengan types.

Frédéric
sumber
4

Sebenarnya , 15 14 byte

Diminta dijawab oleh Leaky Nun. Saran bermain golf diterima. Cobalah online!

╖2`╜*$;R=`╓N╜*

Tidak melakukanolf

          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.
Sherlock9
sumber
3

Haskell, 64 63 56 byte

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

Panggil dengan (1!)16atau hanya 1!16. Cobalah di Ideone.

Laikoni
sumber
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
Traceur
sumber
3

Perl, 25 byte

Termasuk +2 untuk -ap

Jalankan dengan input pada STDIN:

palidiv.pl <<< 16

palidiv.pl:

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

SILOS , 109 byte

readIO 
n = 0
lbla
n + i
a = n
r = 0
lblb
m = a
m % 10
r * 10
r + m
a / 10
if a b
r - n
r |
if r a
printInt n

Cobalah online!

Biarawati Bocor
sumber
3

Japt , 14 byte

V±U s w ¥V?V:ß

Cobalah online!

Terima kasih ETHproduk atas bantuannya! :)

Oliver
sumber
2

MATL , 10 byte

0`G+tVtP<a

Cobalah 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
Luis Mendo
sumber
2

PowerShell v2 +, 72 byte

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

Lama karena bagaimana pembalikan ditangani di PowerShell - tidak terlalu baik. ;-)

Mengambil input $args[0], menyimpan ke dalam $i(variabel loop kami) dan $n(input kami). Loop tak terhingga, incrementing $ioleh $nsetiap kali (untuk jaminan keterbagian).

Setiap iterasi, kami memeriksa apakah $ipalindrom. Ada beberapa tipu daya yang terjadi di sini, jadi izinkan saya menjelaskannya. Pertama-tama kita ambil $idan tegaskan "$i". Itu kemudian array-diindeks dalam urutan terbalik ["$i".length..0]sebelum -joindiedit kembali menjadi string. Itu dimasukkan ke sisi kanan -eqoperator uality, yang secara implisit melemparkan kembali string ke dalam [int], karena itulah operan kiri. Catatan: casting ini menghilangkan nol di depan dari palindrome, tetapi karena kami dijamin inputnya tidak dapat dibagi 10, tidak apa-apa.

Kemudian, ifitu adalah palindrome, kita cukup menempatkan $ike dalam pipa dan exit. Output tersirat pada akhir eksekusi.

Uji Kasus

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
AdmBorkBork
sumber
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

Format panggilan adalah p(302)hasil adalah string.

Tidak ada yang pintar di sini. Itu melakukan pencarian linier, menggunakan num2str()dan fliplr()fungsi.

Pengaturan jelek ini adalah sentuhan yang lebih pendek daripada menggunakan while(1) ... if ... break endpola.

Tidak disatukan

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
Richard
sumber
2

Mathematica, 49 byte

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

Mulai penelusuran di c = N, dan tambah cjika bukan palindrom dan tidak dapat dibagi oleh N. Ketika kondisi terpenuhi, output c.


sumber
2

Jelly, 12 byte

¹µ+³ßµDU⁼Dµ?

Cobalah online!

Penjelasan:

Tautan ini membutuhkan 1 argumen. The µs membaginya menjadi 4 bagian. Mulai dari yang terakhir dan bergerak ke kiri:

           ? 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.
ruds
sumber
1
11 byte
caird coinheringaahing
2

Elixir , 75 byte

def f(p,a\\0),do: if'#{a+p}'|>Enum.reverse=='#{a+p}',do: a+p,else: f(p,a+p)
Mengalir
sumber
2

Python 2, 66 65 byte

iadalah input dan xoutput (akhirnya)

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

Setelah menggulir melalui jawaban lain saya menemukan jawaban Python 2 yang lebih pendek tapi saya berusaha untuk solusi saya jadi mungkin juga melemparkannya ke sini. ¯ \ _ (ツ) _ / ¯

RageCage
sumber
Anda dapat menghapus ruang di [::-1] else.
mbomb007
tidak bisakah kamu menghapus tugas y, dan hanya meletakkan ekspresi di akhir pengembalian? return x if x%i==0&&x ==x [::-1]else f(i,x+1), yang berarti Anda dapat membuatnya lambda, dan golf lebih banyak byte?
Lemon Destructible
2

REXX, 46 byte

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

Python 2 , 44 byte

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

Cobalah online!

Saya tahu bahwa pertanyaan itu diposting lebih dari enam bulan yang lalu, tetapi ini lebih pendek daripada pengajuan Python lainnya.

nedla2004
sumber
2

QBIC , 29 byte

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

Penjelasan:

:      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
steenbergh
sumber
1

Perl 6 , 35 byte

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

Penjelasan:

-> \N {
  # from a list of all multiples of the input
  # ( deduced sequence )
  ( N, N * 2 ... * )

  # find the first
  .first:

  # that is a palindrome
  { $_ == .flip }
}
Brad Gilbert b2gills
sumber
1

Perl 6, 39 byte

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

(33 tidak termasuk my &f=)

bb94
sumber