Bảng màu nhỏ nhất chia hết cho đầu vào


23

Cho một số nguyên dương N, xuất ra số nguyên dương nhỏ nhất sao cho số này là một palindrom (nghĩa là đảo ngược của chính nó) và chia hết cho N.

Bảng màu (tức là đầu ra) không cần số 0 đứng đầu là bảng màu, ví dụ: 080không phải là câu trả lời hợp lệ cho 16.

Đầu vào sẽ không bao giờ là bội số của 10, vì lý do trước đó.

Chương trình của bạn có thể mất nhiều thời gian khi cần thiết, ngay cả khi trong thực tế, nó sẽ quá dài để đưa ra câu trả lời.

Đầu vào và đầu ra

  • Bạn có thể lấy đầu vào thông qua STDIN, làm đối số hàm hoặc bất cứ thứ gì tương tự.
  • Bạn có thể in đầu ra STDOUT, trả lại từ một chức năng hoặc bất cứ thứ gì tương tự.
  • Đầu vào và đầu ra phải ở trong cơ sở thập phân.

Các trường hợp thử nghiệm

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

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


Đầu vào sẽ chia hết cho 10?
Nữ tu bị rò rỉ

@LeakyNun Không, bởi vì sau đó không có giải pháp nào vì palindrom không cần số 0 đứng đầu. Tôi sẽ làm cho rõ ràng.
Gây tử vong vào

Đầu vào sẽ tích cực?
Thuật sĩ lúa mì

1
@WheatWizard Có: Cho một số nguyên dươngN
Làm chết người vào

@Fanh hóa xin lỗi. Tôi không biết làm thế nào tôi bỏ lỡ nó.
Thuật sĩ lúa mì

Câu trả lời:


9

2sable / 05AB1E , 6/7 byte

2sable

[DÂQ#+

Giải trình

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

Dùng thử trực tuyến

05AB1E

[DÂQ#¹+

Sự khác biệt của mã 2sable là đầu vào chỉ được ẩn một lần trong 05AB1E, vì vậy ở đây chúng ta cần ¹lấy lại đầu vào đầu tiên.

Dùng thử trực tuyến

Đã lưu 1 byte với 2sable theo đề xuất của Adnan


@Firthize Tôi vừa mới viết nó lên :)
Emigna

Nếu bạn chuyển sang 2sable, bạn có thể lưu một byte bằng cách này : [DÂQ#+.
Ad Nam

@Ad Nam: Đúng vậy! Đầu vào ẩn lặp đi lặp lại tiết kiệm một byte :)
Emigna

14

Haskell, 45 37 34 byte

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

13

Bình thường, 7 byte

*f_I`*Q

Dùng thử trực tuyến: Trình diễn

Giải trình

*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

Sau khi đọc rất nhiều câu hỏi được mã hóa, tôi bắt đầu nghĩ rằng Pyth sẽ là JS / Java / Ruby / Python tiếp theo ...
agilob

5
@agilob trời ơi, xin đừng.
Alexander - Tái lập Monica

7

Java, 164 159 126 108 94 byte

Phiên bản chơi gôn:

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

Phiên bản bị đánh cắp:

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

Hét lên Emigna và Kevin Cruijssen vì đã đóng góp cải tiến và cắt giảm các byte gần một nửa :)


1
Không phải là x % a == 0dư thừa khi bạn khởi tạo x là a và chỉ tăng nó lên một? Ngoài ra, việc so sánh với sự đảo ngược của chuỗi có thể được thực hiện trong khi có điều kiện không?
Emigna

Bạn có thể loại bỏ import org.apache.commons.lang.StringUtils;và sử dụng org.apache.commons.lang.StringUtils.reversetrực tiếp. for(;;)ngắn hơn while(1>0). Không cần một chương trình đầy đủ, chỉ cần int c(int a){...}làm một câu trả lời hợp lệ, vì câu hỏi có quy tắc sau: " Bạn có thể lấy đầu vào làm đối số hàm. Bạn có thể trả về đầu ra từ một hàm. " @Emigna thực sự đúng kiểm tra modulo là không cần thiết.
Kevin Cruijssen

Ồ, và chào mừng tất nhiên! Bạn có thể thích bài đăng này: Mẹo chơi golf trong Java .
Kevin Cruijssen

@Emigna: bạn hoàn toàn đúng, đã làm điều đó.
p336

@KevinCruijssen: vì tôi chỉ lặp qua các số chia hết cho một (bởi x += a). Tôi không phải kiểm tra tính phân chia :) và cảm ơn về các mẹo chơi gôn!
p336

7

C #, 103 80 byte

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

Bị đánh cắp

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

2
Bạn có thể lưu một số byte bằng cách xóa i và tăng qua x + = p.
stannius

1
thay thế x.ToString()bằng 'x + "" `sẽ tiết kiệm được một loạt các ký tự.

6

Python 2, 46 byte

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

Nghĩa là nó!

Giải pháp đệ quy với cnhư bộ đếm.

Trường hợp 0này là thú vị, bởi vì mặc dù c=0đáp ứng điều kiện palindrom, nó sẽ không được trả lại, bởi vì ccc and 0 or xxxluôn luôn trả về xxx.


1
Nó ngắn hơn một chút để làm c*(`c`[::-1]==`c`)or.
xnor

5

PHP, 39 byte

while(strrev($i+=$argv[1])!=$i);echo$i;
  • Lấy số N làm đối số $ argv [1];
  • ; sau khi không làm gì cả
  • strrev trả lại chuỗi ngược

Cùng chiều dài với vòng lặp for

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


5

Javascript (ES6), 55 51 byte

4 byte nhờ 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>


Từ việc chơi xung quanh trong khi tạo đoạn mã cho bạn, việc đầu tiên +dường như không cần thiết.
Neil

Sẽ (x,c=x)cho phép bạn tránh &&c?
Neil

Tôi nghĩ bạn có thể làm c^[...c+""].reverse().join``?f(x,x+c):cđể tiết kiệm thêm một byte.
Arnauld

c-sẽ làm việc cho số lượng cao hơn một chút so với c^, nếu cần thiết.
Neil


4

C, 217 189 byte

Phiên bản độc lập:

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

Gọi tới một phiên bản chức năng:

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

Ung dung:

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

Gọi đến một chức năng vô căn cứ:

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
}

Tôi bao gồm các phiên bản độc lập cho lịch sử.

Đây là codegolf đầu tiên của tôi, bất kỳ bình luận nào đều được chào đón!


Tôi khuyên bạn nên tạo một chức năng riêng cho thử thách và không tính main()bất kể sở thích của bạn. Bạn sẽ không chơi bóng chày bằng cách chạy mười hai vòng đầu tiên trước khi gắn thẻ "bởi vì tôi thích nó", bạn sẽ không bao giờ tiếp cận an toàn. Đây là một cuộc cạnh tranh và quy tắc chính là sử dụng bất kỳ phương tiện cần thiết và hợp pháp nào để giảm số byte.

1
@Snowman fair enouth, tôi đã chỉnh sửa câu trả lời của mình để bao gồm phiên bản 'gọi đến một chức năng'. Điều này cho phép tôi lấy một tham số int làm tham số và lấy đi một vài byte nữa.
Valentin Mariette

hàm của bạn có biên dịch mà không có "bao gồm <string.h>" không? nếu câu trả lời không hơn tôi có thể sử dụng trả về #define F cho hoặc trả về #define R mà không cần tính ...
RosLuP

@RosLuP yeah, tôi nhận được một vài cảnh báo nhưng gcc có thể biên dịch nó.
Valentin Mariette

Xin chào!, Tôi muốn bỏ một số gợi ý! 1) C có ẩn int để bạn có thể thay đổi mã như thế này int f(int a)-> f(a) 2) nếu bạn phải khai báo một số ints, bạn có thể sử dụng các tham số hàm: int f(int a){int b;-> f(a,b){ 3) sprintfsẽ không bao giờ trả về 0 vì vậy bạn nên sử dụng trong while: while(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 ) sử dụng K & R C để xác định Hàm để bạn có thể kết hợp với gợi ý thứ 2 của tôi: 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

Bị đánh cắp

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)))kiểm tra xem tại mỗi vị trí của agiá trị avà ngược lại của nó có giống nhau không (nghĩa là nếu alà palindromic).
Có thể chơi golf một số byte bằng cách làm rối tung với types.


4

Trên thực tế , 15 14 byte

Yêu cầu trả lời bởi Leaky Nun. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

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

vô dụng

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

Bao gồm +2 cho -ap

Chạy với đầu vào trên STDIN:

palidiv.pl <<< 16

palidiv.pl:

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



2

MATL , 10 byte

0`G+tVtP<a

Hãy thử trực tuyến!

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

Lâu vì cách xử lý đảo ngược trong PowerShell - không tốt lắm. ;-)

Đưa đầu vào $args[0], lưu trữ vào $i(biến vòng lặp của chúng tôi) và $n(đầu vào của chúng tôi). Vòng lặp vô hạn, tăng dần $itheo $ntừng thời điểm (để đảm bảo tính phân chia).

Mỗi lần lặp lại, chúng tôi kiểm tra xem có phải $ilà một bảng màu không. Có một số mánh khóe xảy ra ở đây, vì vậy hãy để tôi giải thích. Trước tiên chúng tôi lấy $ivà xâu chuỗi nó với "$i". Sau đó, mảng được lập chỉ mục theo thứ tự ngược lại ["$i".length..0]trước khi được chỉnh -joinlại thành chuỗi. Điều đó được đưa vào phía bên phải của -eqtoán tử uality, điều này hoàn toàn đưa chuỗi trở lại thành một [int], vì đó là toán hạng bên trái. Lưu ý: quá trình truyền này không loại bỏ bất kỳ số 0 đứng đầu nào khỏi bảng màu, nhưng vì chúng tôi đảm bảo đầu vào không chia hết cho10 , nên không sao.

Sau đó, ifnó là một bảng màu, chúng tôi chỉ cần đặt $ilên đường ống vàexit . Đầu ra là ẩn ở cuối thực hiện.

Các trường hợp thử nghiệm

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

Định dạng cuộc gọi là p(302)kết quả là một chuỗi.

Không có gì thông minh ở đây. Nó thực hiện tìm kiếm tuyến tính, sử dụng các hàm num2str()fliplr().

Sự sắp xếp xấu xí này là một liên lạc ngắn hơn so với sử dụng một while(1) ... if ... break endmô hình.

Bị đánh cắp

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

Toán học, 49 byte

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

Bắt đầu tìm kiếm tại c = N, và tăng cnếu không phải là một bảng màu và không chia hết cho N. Khi điều kiện được đáp ứng, đầu ra c.


2

Thạch, 12 byte

¹µ+³ßµDU⁼Dµ?

Hãy thử trực tuyến!

Giải trình:

Liên kết này có 1 đối số. Các µs chia nó thành 4 phần. Bắt đầu từ cuối cùng và di chuyển sang trái:

           ? 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

Python 2, 66 65 byte

ilà đầu vào và xlà (cuối cùng) đầu ra

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

Sau khi cuộn qua các câu trả lời khác, tôi tìm thấy câu trả lời Python 2 ngắn hơn nhưng tôi đã nỗ lực vào giải pháp của mình để có thể ném nó vào đây. ¯ \ _ (ツ) _ /


Bạn có thể loại bỏ không gian trong [::-1] else.
mbomb007

bạn không thể loại bỏ sự phân công của y và chỉ cần đặt biểu thức ở cuối phần hoàn trả? return x if x%i==0&&x ==x [::-1]else f(i,x+1), điều đó có nghĩa là bạn có thể biến nó thành lambda và chơi nhiều byte hơn?
Lemon phá hủy


2

Python 2 , 44 byte

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

Hãy thử trực tuyến!

Tôi biết rằng câu hỏi đã được đăng hơn sáu tháng trước, nhưng câu hỏi này ngắn hơn bất kỳ bài nộp Python nào khác.


2

QBIC , 29 byte

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

Giải trình:

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

Giải trình:

-> \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 không bao gồm my &f=)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.