palindrome ที่เล็กที่สุดหารด้วยอินพุต


23

ป.ร. ให้ไว้เป็นจำนวนเต็มบวกNเอาท์พุทจำนวนเต็มบวกที่เล็กที่สุดเช่นว่าจำนวนนี้เป็น palindrome (คือเป็นสิ่งที่ตรงกันข้ามของตัวเอง) Nและหารด้วย

palindrome (เช่นการส่งออก) จะต้องไม่จำเป็นต้องมีศูนย์นำจะเป็นประโยคเช่นไม่ได้เป็นคำตอบที่ถูกต้องสำหรับ08016

อินพุตจะไม่เป็นทวีคูณของ 10 เนื่องจากเหตุผลก่อนหน้า

โปรแกรมของคุณอาจใช้เวลานานเท่าที่จำเป็นแม้ว่าในทางปฏิบัติมันจะใช้เวลานานเกินกว่าจะตอบคำถามได้

อินพุตและเอาต์พุต

  • คุณสามารถรับอินพุตSTDINเป็นอาร์กิวเมนต์ของฟังก์ชันหรืออะไรก็ได้ที่คล้ายกัน
  • คุณอาจพิมพ์ผลลัพธ์ไปที่STDOUTส่งคืนจากฟังก์ชันหรือสิ่งอื่นที่คล้ายคลึงกัน
  • อินพุตและเอาต์พุตต้องอยู่ในฐานเลขฐานสิบ

กรณีทดสอบ

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

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


ข้อมูลจะถูกหารด้วย 10 หรือไม่
Leun Nun

@LeakyNun ไม่ได้เพราะไม่มีวิธีแก้ปัญหาเนื่องจาก palindrome ต้องไม่ต้องเป็นศูนย์นำหน้า ฉันจะทำให้ชัดเจน
ลดขนาด

อินพุตจะเป็นค่าบวกหรือไม่
ข้าวสาลีตัวช่วยสร้าง

1
@WheatWizard ใช่: กำหนดจำนวนเต็มบวกN
Fatalize

@ ขอให้ขอโทษ ฉันไม่รู้ว่าฉันคิดถึงมันอย่างไร
ตัวช่วยสร้างข้าวสาลี

คำตอบ:


9

2sable / 05AB1E , 6/7ไบต์

2sable

[DÂQ#+

คำอธิบาย

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

ลองออนไลน์

05AB1E

[DÂQ#¹+

ความแตกต่างของรหัส 2sable คืออินพุตนั้นมีนัยเพียงครั้งเดียวใน 05AB1E ดังนั้นที่นี่เราจำเป็นต้อง¹ได้รับอินพุตแรกอีกครั้ง

ลองออนไลน์

บันทึก 1 ไบต์ด้วย 2sable ตามที่Adnanแนะนำ


@Fatalize ผมก็แค่เขียนมันขึ้น :)
Emigna

หากคุณเปลี่ยนไป 2sable [DÂQ#+คุณสามารถบันทึกไบต์โดยทำเช่นนี้:
Adnan

@Adnan: ถูกต้อง! อินพุตโดยนัยซ้ำแล้วซ้ำอีกจะบันทึกเป็นไบต์ :)
Emigna


13

Pyth, 7 ไบต์

*f_I`*Q

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย

*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

หลังจากอ่านคำถาม codegold มากมายฉันเริ่มคิดว่า Pyth จะเป็น JS / Java / Ruby / Python ถัดไป ...
agilob

5
@agilob โอ้พระเจ้าที่รักโปรดอย่า
Alexander - Reinstate Monica

7

Java, 164 159 126 108 94 ไบต์

รุ่น Golfed:

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

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

ตะโกนไปที่ Emigna และ Kevin Cruijssen เพื่อช่วยปรับปรุงและลดจำนวนไบต์ลงเกือบครึ่ง :)


1
ไม่x % a == 0ซ้ำซ้อนเมื่อคุณเริ่มต้น x เป็น a และเพิ่มได้เพียง a หรือไม่ นอกจากนี้การเปรียบเทียบกับการกลับรายการของสตริงสามารถทำได้ในขณะที่มีเงื่อนไขหรือไม่
Emigna

คุณสามารถลบimport org.apache.commons.lang.StringUtils;และใช้งานorg.apache.commons.lang.StringUtils.reverseได้โดยตรง จะสั้นกว่าfor(;;) while(1>0)ไม่จำเป็นต้องใช้โปรแกรมเต็มรูปแบบเพียงint c(int a){...}ทำตามคำตอบที่ถูกต้องเนื่องจากคำถามมีกฎต่อไปนี้: " คุณอาจใช้อินพุตเป็นอาร์กิวเมนต์ของฟังก์ชันคุณอาจส่งคืนเอาต์พุตจากฟังก์ชัน " @Emigna ถูกต้องแน่นอนว่า การตรวจสอบโมดูโล่ไม่จำเป็น
Kevin Cruijssen

โอ้และยินดีต้อนรับแน่นอน! คุณอาจชอบโพสต์นี้: เคล็ดลับสำหรับการเล่นกอล์ฟในชวา
Kevin Cruijssen

@Emigna: ถูกต้องแล้วใช่ไหม
peech

@KevinCruijssen: เนื่องจากฉันทำซ้ำผ่านตัวเลขที่หารด้วย (โดยx += a) ฉันไม่ต้องตรวจสอบการแบ่งแยก :) และขอบคุณสำหรับเคล็ดลับการเล่นกอล์ฟ!
peech

7

C #, 103 80 ไบต์

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
คุณอาจบันทึกบางไบต์ด้วยการลบ i และเพิ่มทาง x + = p
stannius

1
การแทนที่x.ToString()ด้วย 'x + "" `จะช่วยประหยัดตัวอักษรจำนวนหนึ่ง

6

Python 2, 46 ไบต์

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

ไอเดียมัน!

โซลูชันแบบเรียกซ้ำโดยcเป็นตัวนับ

สำหรับกรณีที่0เป็นที่น่าสนใจเพราะแม้จะc=0สร้างความพึงพอใจสภาพ palindrome ก็จะไม่ถูกส่งกลับเพราะผลตอบแทนเสมอccc and 0 or xxxxxx


1
มันสั้นไปc*(`c`[::-1]==`c`)orหน่อย
xnor

5

PHP, 39 ไบต์

while(strrev($i+=$argv[1])!=$i);echo$i;
  • รับหมายเลข N เป็นอาร์กิวเมนต์ $ argv [1];
  • ; หลังจากนั้นไม่ทำอะไรเลย
  • strrev ส่งคืนสตริงย้อนกลับ

ความยาวเท่ากันกับ for-loop

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

5

Brachylogขนาด 8 ไบต์

:L#>*.r=

ลองออนไลน์! (ประมาณ 5 วินาที1234)

ตรวจสอบการทดสอบทั้งหมด (ประมาณ 20 วินาที)

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

5

Javascript (ES6), 55 51 ไบต์

4 ไบต์ต้องขอบคุณ 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>


จากการเล่นไปพร้อม ๆ กับการสร้างข้อมูลโค้ดสำหรับคุณสิ่งแรกที่+ดูเหมือนจะไม่จำเป็น
Neil

จะ(x,c=x)ช่วยให้คุณสามารถที่จะหลีกเลี่ยง&&c?
Neil

ฉันคิดว่าคุณสามารถทำได้c^[...c+""].reverse().join``?f(x,x+c):cเพื่อประหยัดอีกหนึ่งไบต์
Arnauld

c-จะทำงานกับตัวเลขที่สูงกว่าเล็กน้อยc^หากจำเป็น
Neil


4

C, 217 189 ไบต์

รุ่นสแตนด์อโลน:

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

โทรไปที่รุ่นฟังก์ชั่น:

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

โทรไปยังฟังก์ชั่นที่ไม่อัปโหลด:

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
}

ฉันรวมเวอร์ชันสแตนด์อโลนสำหรับประวัติศาสตร์

นี่คือ codegolf แรกของฉันความคิดเห็นใด ๆ ยินดีต้อนรับ!


ผมขอแนะนำให้ทำฟังก์ชั่นที่แยกต่างหากสำหรับความท้าทายและไม่นับmain()โดยไม่คำนึงถึงความต้องการของคุณ คุณจะไม่เล่นเบสบอลด้วยการวิ่งสิบสองรอบก่อนที่จะติดแท็ก "เพราะฉันชอบ" คุณจะไม่เข้าถึงอย่างปลอดภัย นี่คือการแข่งขันและกฎหลักคือการใช้วิธีการใด ๆ ที่จำเป็นและถูกกฎหมายเพื่อลดจำนวนไบต์

1
@Snowman fair enouth ฉันแก้ไขคำตอบของฉันเพื่อรวมเวอร์ชัน 'call to a function' สิ่งนี้ช่วยให้ฉันสามารถใช้ int เป็นพารามิเตอร์และทองเพิ่มขึ้นอีกสองสามไบต์
Valentin Mariette

ฟังก์ชันของคุณรวบรวมโดยไม่มี "include <string.h>" หรือไม่ ถ้าคำตอบไม่เกินฉันสามารถใช้ #define F สำหรับหรือ #define R return โดยไม่นับใน ...
RosLuP

@RosLuP ใช่ฉันได้รับคำเตือนเล็กน้อย แต่ gcc สามารถรวบรวมได้
Valentin Mariette

สวัสดี! ฉันต้องการวางคำแนะนำบางอย่าง! 1) C มีนัยโดยนัยดังนั้นคุณสามารถเปลี่ยนรหัสเช่นนี้int f(int a)-> f(a) 2) ถ้าคุณต้องประกาศบางอย่างintคุณสามารถใช้พารามิเตอร์ฟังก์ชั่น: int f(int a){int b;-> f(a,b){ 3) sprintfจะไม่ส่งคืน 0 ดังนั้นคุณสามารถใช้ในwhile: while(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 ) ใช้ K&R C เพื่อกำหนดฟังก์ชั่นเพื่อให้คุณสามารถคอมโบกับคำใบ้ที่ 2 ของฉัน: 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 101 ไบต์

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)))ตรวจสอบว่าในแต่ละตำแหน่งของaค่าของaและย้อนกลับเหมือนกันหรือไม่ (เช่นถ้าaเป็น palindromic)
มันอาจจะเป็นไปได้ที่จะออกกอล์ฟไบต์บางอย่างโดย messing typesรอบกับ


4

อันที่จริง , 15 14 ไบต์

ขอให้ตอบโดย Leaky Nun ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

╖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 ไบต์

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





2

PowerShell v2 +, 72 ไบต์

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

นานเพราะการจัดการการย้อนกลับใน PowerShell - ไม่ค่อยดี ;-)

รับอินพุต$args[0]เก็บไว้ใน$i(ตัวแปรลูปของเรา) และ$n(อินพุตของเรา) วนซ้ำไม่สิ้นสุดเพิ่มขึ้น$iโดย$nในแต่ละครั้ง (เพื่อรับประกันหาร)

การวนซ้ำแต่ละครั้งเราตรวจสอบว่า$iเป็น palindrome มีกลอุบายเกิดขึ้นที่นี่ดังนั้นให้ฉันอธิบาย ครั้งแรกที่เราใช้$iและ stringify "$i"มันด้วย จากนั้นอาร์เรย์["$i".length..0]จะถูกทำดัชนีตามลำดับย้อนกลับก่อนที่จะนำ-joinกลับไปเป็นสตริง นั่นคือป้อนเข้าทางด้านขวามือของตัว-eqดำเนินการ uality ซึ่งโดยนัยแล้วจะโยนสตริงกลับเข้าไป[int]เนื่องจากเป็นตัวถูกดำเนินการทางซ้าย หมายเหตุ: การคัดเลือกนักแสดงนี้จะตัดค่าศูนย์นำหน้าจาก palindrome แต่เนื่องจากเรารับประกันว่าการป้อนข้อมูลนั้นไม่สามารถหารด้วย10นั่นก็โอเค

จากนั้นifมันเป็น Palindrome เราเพียงแค่วาง$iลงบนท่อและexitลงบนท่อและเอาท์พุทเป็นนัยในตอนท้ายของการดำเนินการ

กรณีทดสอบ

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 ไบต์

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

รูปแบบการโทรคือ p(302)ผลลัพธ์คือสตริง

ไม่มีอะไรที่ฉลาดที่นี่ มันเป็นการค้นหาเชิงเส้นโดยใช้num2str()และfliplr()ฟังก์ชั่น

การจัดเรียงที่น่าเกลียดนี้เป็นสัมผัสสั้นกว่าการใช้ while(1) ... if ... break endรูปแบบ

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 ไบต์

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

เริ่มต้นการค้นหาที่c = Nและเพิ่มขึ้นcหากไม่ได้ palindrome Nและไม่หารด้วย เมื่อเงื่อนไขตรง, cเอาท์พุท


2

เยลลี่ 12 ไบต์

¹µ+³ßµDU⁼Dµ?

ลองออนไลน์!

คำอธิบาย:

ลิงก์นี้ใช้เวลา 1 ข้อโต้แย้ง µs แบ่งออกเป็น 4 ส่วน เริ่มต้นจากซ้ายสุดและไปทางซ้าย:

           ? 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 ไบต์

iคืออินพุตและxเอาต์พุต (ในที่สุด)

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

หลังจากเลื่อนดูคำตอบอื่น ๆ ฉันพบคำตอบของ Python 2 ที่สั้นกว่า แต่ฉันใช้ความพยายามในการแก้ปัญหาของฉันดังนั้นอาจทิ้งมันไว้ที่นี่ ¯ \ _ (ツ) _ / ¯


[::-1] elseคุณสามารถลบพื้นที่ใน
mbomb007

คุณไม่สามารถลบการมอบหมายของ y และเพียงแค่ใส่การแสดงออกในตอนท้ายของการกลับมา? return x if x%i==0&&x ==x [::-1]else f(i,x+1)ซึ่งหมายความว่าคุณสามารถทำให้เป็นแลมบ์ดาและเล่นกอล์ฟได้มากกว่าไบต์
เลมอนที่ถูกทำลายได้



2

QBIC , 29 ไบต์

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

คำอธิบาย:

:      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 ไบต์

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

คำอธิบาย:

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

  # find the first
  .first:

  # that is a palindrome
  { $_ == .flip }
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.