รหัสขั้นตอนวิธี 196 กอล์ฟ


35

เขียนโปรแกรมสั้นสำหรับ196 ขั้นตอนวิธี อัลกอริทึมเริ่มต้นจากจำนวนเต็มจากนั้นเพิ่มการย้อนกลับของมันจนกว่าจะถึง Palindrome

เช่น

input = 5280
5280 + 0825 = 6105
6105 + 5016 = 11121
11121 + 12111 = 23232
output = 23232

อินพุต

จำนวนเต็มซึ่งไม่ได้เป็นจำนวน lyrchrel (นั่นคือในที่สุดมันก็ให้ผลเป็น palindrome ภายใต้อัลกอริทึมนี้แทนที่จะดำเนินการต่อไปเรื่อย ๆ )

เอาท์พุต

ถึง palindrome


6
เพราะคำถามของคุณน่าจะเป็นคำถามเดียวที่เกี่ยวข้องกับอัลกอริทึม 196 การสร้างแท็กแบบใช้ครั้งเดียวไม่มีประโยชน์
Chris Jester-Young

2
สิ่งที่ฉันหมายถึงคือคำถามของคุณน่าจะเป็นคำถามเดียวที่เกี่ยวข้องกับหัวข้อนี้แม้ในเวลา 2 ปี :-)
Chris Jester-Young

1
@Chris: อัลกอริทึม 196 เป็นหนึ่งที่ได้รับความนิยมค่อนข้างไปด้วยชื่อที่แตกต่างกัน เพียงเพื่อให้แน่ใจ แต่ผมจะโพสต์คำถามเกี่ยวกับมันอีกก่อนที่จะหมด 2 ปีเวลา;)
Eelvex

1
@GigaWatt ด้วยฉันได้อ่านคำถามที่คุณอ่านแล้ว :) ไม่ต้องสนใจกรณีของ A023108
Eelvex

1
@ Joel เช่นเดียวกับ A023108 เพียงแค่เพิกเฉยต่อพวกเขา (ทำตัวเหมือนที่คุณไม่รู้เกี่ยวกับพวกเขา); เราไม่รู้ว่ามีอยู่จริงหรือไม่
Eelvex

คำตอบ:


10

APL (22 ตัวอักษร)

{a≡⌽a←⍕(⍎⍵)+⍎⌽⍵:a⋄∇a}⍞

งานนี้ใน Dyalog APL นี่คือคำอธิบายจากขวาไปซ้าย:

  • { ... }⍞: รับข้อมูลจากผู้ใช้เป็นอักขระ ( ) และป้อนเข้าสู่ฟังก์ชั่นของเรา ( { ... })
  • ภายในฟังก์ชั่นโดยตรง ( แยกข้อความสั่งดังนั้นเราจึงดูจากซ้ายไปขวา):
    • a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a: Evaluate ( ) อาร์กิวเมนต์ที่ถูกต้องคือ ( ) reverse ( ) และเพิ่มเข้าไปในเวอร์ชันที่ประเมินของอาร์กิวเมนต์ที่เหมาะสมนั้นเอง จากนั้นให้จัดรูปแบบผลลัพธ์ ( ; เช่นให้การแสดงอักขระ), มอบหมาย ( ) ให้กับตัวแปรaและสุดท้ายทดสอบว่าการaย้อนกลับนั้นเทียบเท่ากับa(เช่นคือapalindrome หรือไม่) ถ้าเป็นจริงส่งคืนa; มิฉะนั้น...
    • ∇a: ป้อนaกลับเข้าสู่ฟังก์ชันของเรา ( เป็นการอ้างอิงตนเองโดยนัย)

ตัวอย่าง:

      {a≡⌽a←⍕(⍎⍵)+⍎⌽⍵:a⋄∇a}⍞
412371
585585

2
มันบันทึกอักขระสองสามตัวเพื่อใช้อินพุตเป็นตัวเลข {⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕. คุณบันทึกวงเล็บปีกกาย้อนกลับและ eval
marinus

10

GolfScript, 29 ตัวอักษร

~]{{.`.-1%.@={;0}{~+1}if}do}%

ความเห็นที่เลือก

เนื้อของโปรแกรมเป็นdoวงแน่นอน ดังนั้นฉันจะครอบคลุมที่

  1. .` คัดลอกหมายเลขและทำให้เป็นสตริง
  2. .-1% คัดลอกเวอร์ชันของสตริงนั้นและย้อนกลับ
  3. .@ คัดลอกเวอร์ชันที่กลับด้านและนำเวอร์ชันที่ไม่กลับด้านเดิมมาไว้ด้านหน้า

ดังนั้นพูดว่าตัวเลขคือ 5280. 5280 "0825" "0825" "5280"ในขั้นตอนนี้สแต็คเป็น: สเตจถูกตั้งค่าสำหรับการเปรียบเทียบ (หลังจากการเปรียบเทียบสแต็กจะถูกทิ้งไว้5280 "0825"ไม่ว่าจะมีอะไรโผล่ออกมา --- ไอเท็มเพื่อเปรียบเทียบถูกนำออกไป)

  1. หากสตริงและการย้อนกลับเหมือนกันเราไม่สนใจเกี่ยวกับสตริงที่ย้อนกลับดังนั้นเพียงแค่เปิดมันออก ( ;) และกลับ 0 (เพื่อสิ้นสุดการdoวนรอบ)
  2. หากพวกเขาไม่ตรงกันแล้วประเมิน ( ~) สตริงกลับ (เพื่อทำให้ตัวเลข) เพิ่ม ( +) ที่หมายเลขเดิมและกลับ 1 (เพื่อดำเนินการต่อdoวง)

4
คุณแน่ใจหรือว่าคุณไม่ได้กดปุ่มสุ่มบนคีย์บอร์ดของคุณ? ดูเหมือนว่า ...

1
@ M28: GolfScript ดูเหมือนเสียงรบกวนของสายมากกว่า Perl ใช่ไหม? ;-)
Chris Jester-Young

ฉันรู้สึกเสียใจสำหรับคุณมันจะต้องเจ็บปวดกับรหัสที่

@ M28: นั่นไม่ได้เกือบเป็นความเจ็บปวดเป็นวิธีแก้ปัญหาที่ผมเขียนสำหรับขั้นตอนวิธีการ Luhn แค่คิดดู :-P
Chris Jester-Young

ครอบครัวของคุณเป็นห่วงคุณ

10

Python 2, 55 ไบต์

ทำตามคำแนะนำของ JPvdMerwe:

n=input()
while`n`!=`n`[::-1]:n+=int(`n`[::-1])
print n

Python 2, 62:

n=raw_input()
while n!=n[::-1]:n=`int(n)+int(n[::-1])`
print n

Hehe .. ))))))))
Nakilon

2
โดยการดูที่nint คุณสามารถย่อให้เหลือ 6 ตัวอักษรตรวจสอบรหัส: meta.codegolf.stackexchange.com/q/75/62
JPvdMerwe

ดูเหมือนว่าฉันตั้งใจรวมบรรทัดใหม่เป็นกลุ่มแอบเพิ่มลงในตอนท้ายของไฟล์ของฉันในการนับของฉัน จำนวนจริงคือ 55
JPvdMerwe


7

เพียงแค่ใช้ทักษะ Pyth ของฉันไม่ใช่คู่แข่งที่จริงจัง

Pyth, 16 ไบต์

L?bqb_by`+vbi_bTyz

เทียบเท่ากับ Python 3:

y=lambda b:b if b==b[::-1] else y(str(eval(b)+int(b[::-1],10)))
print y(input())

แค่ลองใช้ความท้าทายเก่า ๆ ตอบแล้วไม่ใช่นักสู้ที่จริงจัง
swstephe

1
ผู้เขียนท้าทายบางคนจะอัปเดตคำตอบที่ยอมรับหากมีวิธีแก้ปัญหาที่สั้นกว่าเข้ามาดังนั้นฉันคิดว่ามันยุติธรรมที่จะแจ้งให้ OP ทราบว่านี่ไม่ใช่เทคนิคในการส่งที่ถูกต้อง (อย่าเข้าใจฉันผิดฉันชอบที่จะตอบความท้าทายเก่าแก่กับ CJam เพื่อความสนุกสนานเช่นกัน - และฉันเพิ่งทำไปเมื่อไม่กี่นาทีที่ผ่านมาฉันแค่พูดถ้าคุณทำโปรดทิ้งข้อความไว้ว่าภาษานั้นใหม่กว่า ความท้าทาย)
Martin Ender

ที่จริงแล้วการเป็น "ไม่ใช่นักสู้ที่จริงจัง" ทำให้คำตอบถูกลบ - แต่ฉันไม่เห็นเหตุผลใด ๆ ที่นี่ไม่ควรถือว่าเป็นคู่แข่งที่ร้ายแรง
pppery


6

CJam, 22 21 ไบต์

CJam ถูกสร้างขึ้นหลังจากถามคำถามนี้ดังนั้นในทางเทคนิคแล้วมันเป็นข้อผิดพลาดที่ไม่ถูกต้อง แต่ฉันพบคำถามที่น่าสนใจดังนั้นต่อไปนี้:

r{__W%:X=0{~X~+s1}?}g

คำอธิบาย:

r{                 }g    "Read the input number as string and enter a while-do loop";
  __                     "Make 2 copies of the string number";
    W%:X                 "Reverse the second and store it in X";
        =                "Check if the number is already palindrome";
         0{      }?      "Put 0 on stack if it is palindrome, else, run the code block";
           ~             "Convert the string to int";
            X~           "Put the reverse string on stack and convert it to int too";
              +s         "Add the two numbers and covert back the result to string";

เหตุผลหลักคือในการทำซ้ำในขณะที่ทำแต่ละครั้งแรกคุณตรวจสอบว่า palindrome สำเร็จหรือไม่ ถ้าไม่เพิ่มย้อนกลับไปยังหมายเลข ค่อนข้างอัลกอริทึมคืออะไร!

ลองออนไลน์ได้ที่นี่


5

นี่คือคู่แข่งจริงเนื่องจาก J ได้รับรอบมานานหลายทศวรรษ

J (16 ไบต์)

(+^:~:|.&.":)^:_

นี่เป็นคำกริยาดังนั้นจึงสามารถกำหนดให้กับตัวแปรในเซสชั่น J และใช้ดังนี้:

   f =. (+^:~:|.&.":)^:_
   f 5280
23232

มันทำงานอย่างไร:

(+^:~:|.&.":)^:_
 +^:~:           add if unequal
      |.&.":     reverse under string format
 +^:~:|.&.":     add reverse unless a palindrome
(           )^:_ repeat until unchanged




4

JAGLอัลฟ่า 1.2 - 19, 21 พร้อม stdin

ไม่โต้แย้งเพียงแค่ได้รับประสบการณ์เกี่ยวกับภาษาของฉัน
คาดว่าตัวเลขจาก stdin

T~d{DddgCi+dgdC=n}uSP

คำอธิบาย

T~                       Get a line of input, and eval to an integer
  d                      Duplicate (for first round)
   {Ddd                  Drop last and duplicate twice
       gCi               Convert to string, reverse, and convert back to integer
          +d             Add to original and duplicate
            gdC          Convert to string, duplicate, reverse
               =n}       If it isn't a palindrome, keep going
                  uSP    Run until palindrome reached, then print output number

แก้ไข @Optimizer
globby

โปรดอย่าแก้ไขการส่งทั้งหมดของคุณในครั้งเดียวสำหรับการแก้ไขเล็กน้อย (เช่นหมายเลขรุ่น) เนื่องจากจะทำให้หน้าแรกไม่จำเป็น ไม่เป็นไรถ้าคุณทำ 2 หรือ 3 ต่อครั้ง แต่โปรดรอสองสามชั่วโมงก่อนทำการแก้ไขเพิ่มเติมอย่างเป็นระบบ
Martin Ender

ลืมไปเลยว่ามันจะผลักไปที่หน้าฉันไม่ดี @ MartinBüttner
globby

4

05AB1E , 7 ไบต์ (ไม่แข่งขัน)

ไม่ใช่การแข่งขันเนื่องจากภาษาโพสต์ความท้าทาย

รหัส:

[DÂQ#Â+

คำอธิบาย:

[        # Infinite loop.
 DÂ      # Duplicate and bifurcate (which duplicates it and reverses the duplicate).
   Q#    # If the number and the number reversed are equal, break.
     Â+  # Add the reversed number to the initial number.

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .


คุณช่วยอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับกระบวนการแยกไปสองทางได้หรือไม่?
Conor O'Brien

1
@ helloCᴏɴᴏʀO'Bʀɪᴇɴตัวอย่างเช่นในกองเป็นสตริง การแยกไปสองทางจะเก็บสายเดิมและผลักสายกลับ มันสั้นสำหรับที่ซ้ำกันและย้อนกลับ
Adnan

อ้อเข้าใจแล้ว. เย็น! ขอบคุณ
Conor O'Brien

4

Brachylogขนาด 8 ไบต์

↔?|↔;?+↰

ลองออนไลน์!

ค่อนข้างคล้ายกับหนึ่งในโปรแกรม Brachylog แรกที่ผมเห็นและรู้สึกทึ่งจากวิดีโอแนะนำ Brachylog

?↔?.|↔;?+↰.  (initial ? and the .s are implicit)

?↔?          % If the input and its reverse are the same,
   .         %   then the input is the output
    |↔;?+↰   % Or, add the input and its reverse, and call this predicate recursively
          .  % The result of that is the output

3

PHP - 54 48 ตัวอักษร

<?for($s=`cat`;$s!=$r=strrev($s);$s+=$r);echo$s;

ทดสอบ:

$ php 196.php <<< 5280
23232

ฉันจะต้องจำ$str = สิ่งที่แมวสำหรับการเล่นกอล์ฟในอนาคต heck ของมากดีกว่าการใช้และยังคงดีกว่าSTDIN $argv[0]
Mr. Llama

@GigaWatt: $ s = 'm4'ควรทำงานเช่นกัน
ninjalj

3

Bash (64)

X=`rev<<<$1|sed s/^0*//`;[ $1 = $X ]&&echo $1||. $0 $(($1+$X))

โทรด้วย: bash <filename> <number>


<filename> มีไว้เพื่ออะไร
Eelvex

2
@Elxx สคริปต์จำเป็นต้องเรียกตัวเองดังนั้นคุณต้องเก็บไว้ในไฟล์
marinus

3

C # - 103 99 ตัวอักษร

public int P(int i)
{
    var r = int.Parse(new string(i.ToString().Reverse().ToArray())));
    return r == i ? i : P(i + r);        
}

C # เล่นกอล์ฟไม่เก่ง สง่างาม แต่ verbose


1
คุณสามารถเล่นกอล์ฟได้ง่ายขึ้น ใช้ "" + แทนที่จะเป็น. toString และกำจัดช่องว่าง
จาค็อบ

3

ใน Q (39 ตัวอักษร)

f:{while[x<>g:"I"$reverse -3!x;x+:g];x}

ตัวอย่างการใช้งาน:

q)f 5280
23232

แก้ไข:

ลงมาที่ 34 ตอนนี้การใช้งานเดียวกัน:

{while[x<>g:"I"$(|) -3!x;x+:g];x} 5280


3

เยลลี่ , 9 ไบต์ (ไม่ใช่คู่แข่งขัน)

คำตอบที่ง่ายมากเพียงแค่ความท้าทายในการเขียนโค้ดและภาษาที่ลึกลับ

ṚḌ+µŒḂ¬$¿

ṚḌ        : take the argument, reverse (and vectorize) it
  +µ      : add both
    ŒḂ¬$¿ : while the result isn't a palindrome

ลองออนไลน์!

หากคำตอบนี้ไม่ชัดเจนหรือผิดในทุกระดับรู้สึกอิสระที่จะชี้ให้เห็น

ขอบคุณเดนนิสที่ช่วยฉันออกด้วยโค้ดชิ้นแรก


ว้าวไม่ใช่ทุกคนที่ใช้เจลลี่ในโพสต์แรก
Nissa

มันอยู่ในรายการที่ต้องทำของฉันเพื่อโพสต์คำตอบใน PPCG โดยใช้ภาษาที่ลึกลับ เยลลี่ก็เป็นคนแรกที่ฉันคิด :)
z3r0

2

หลาม 85 ตัวอักษร:

s,i=str,int;rs=lambda q:s(q)[::-1];n=i(input());
while rs(n)!=s(n):n+=i(rs(n));print n

หากคุณไม่ต้องการเอาต์พุตในการวนซ้ำแต่ละครั้ง:

s,i=str,int;rs=lambda q:s(q)[::-1];n=i(input());
while rs(n)!=s(n):n+=i(rs(n))
print n

(ตัวละครน้อยลงหนึ่งตัว)


คำอธิบายภารกิจระบุว่าควรพิมพ์เฉพาะ Palindrome ขั้นสุดท้าย
Joey

2

Windows PowerShell (63)

for($a=+"$input";-join"$a"[99..0]-ne$a){$a+=-join"$a"[99..0]}$a

ฉันยังคงเกลียดชังว่าไม่มีวิธีง่ายๆในการย้อนกลับสตริง


สามารถทำให้สั้นลงด้วยอักขระสองตัวหากมีเพียงสิบหลักของอินพุตเท่านั้น วิธีนี้จะปลอดภัยด้วยlongเช่นกันซึ่งเป็น PowerShell ประเภทที่ใหญ่ที่สุดที่รองรับ แต่ก็ยังฉันเสียสองตัวอักษร
Joey

2

Haskell 89 87 ตัวอักษร

r=read.reverse.show
main=getLine>>=print.head.filter(\x->x==r x).iterate(\x->x+r x).read

รุ่นที่สามารถอ่านได้ค่อนข้าง:

myFind p = head . filter p
rev = read . reverse . show
isPalindrome x = x == rev x
next x = x + rev x
sequence196 = iterate next
palindrome196 = myFind isPalindrome . sequence196

main = getLine >>= print . palindrome196 . read

รุ่น golfed ถูกสร้างขึ้นโดยการทำคู่มือและเปลี่ยนชื่อฟังก์ชั่นที่เหลือเป็นชื่อตัวอักษรเดี่ยว


1
คุณสามารถลดระยะนี้ไม่น้อยโดยการใช้ประโยชน์จากฟังก์ชั่นป้อแป้untilจากโหมโรงเช่นเดียวกับการแยกรูปแบบของการใช้ผู้ประกอบการไบนารีไปและx r xนอกจากนี้ยังใช้readLnแทนและgetLine readผลการบันทึก 20 ตัวอักษร:f%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
hammar

@hammar: คุณสามารถใช้ฟังก์ชั่น monad และประหยัดมากยิ่งขึ้น: กำหนดและการใช้งานเพียงแค่r=(=<<read.reverse.show) r(==)`until`r(+)นอกเหนือจากการบันทึกแล้วไม่จำเป็นต้องเป็นโปรแกรมเต็มรูปแบบการส่งที่ถูกต้องอาจเป็นฟังก์ชันที่ไม่มีชื่อเมื่อก่อน วิธีนี้จะทำให้คุณมีขนาดถึง 41 ไบต์: ลองออนไลน์!
ბიმო

2

ก่อนหน้า, 57 ไบต์

"KCTS"4(&:0\v
\T\a*+\:0`jv>:a%\a/
0:+_v#-TD2$<^\
  @.<

แม้ว่ารหัสนั้นจะอยู่ในตาราง 4x19 ดังนั้นอาจเรียกว่า 76

  • บรรทัดแรกกำลังเริ่มต้นและอ่านหมายเลขอินพุต
  • บรรทัดที่สองกลับหมายเลขแรกในสแต็กและวางในตำแหน่งสแต็กที่สอง
  • และบรรทัดที่สามตรวจสอบว่าตัวเลขเป็นโทนสีหรือไม่

2

C ++ TMP (256 ตัวอักษร)

#include<cstdio>
#define Y(A,B,C,D)template<int N>struct A<C,D>{enum{v=B};};
#define Z(A)template<int N,int M>struct A{enum{v=
#define n 5194
Z(R)R<N/10,M*10+N%10>::v};};Y(R,N,0,N)Z(S)S<N+M,R<N+M,0>::v>::v};};Y(S,N,N,N)main(){printf("%d",S<n+R<n,0>::v,0>::v);}

รุ่นนี้อาจสั้นลงเล็กน้อย แต่คำตอบ 256 ตัวอักษรยากที่จะผ่าน นี่คือเวอร์ชันที่ไม่ตีกอล์ฟ:

#include <iostream>

template<size_t N>
class Reverse
{
    template<size_t M, size_t R>
    struct Inner
    {
        enum { value = Inner<M/10, R*10 + M%10>::value };
    };

    template<size_t R>
    struct Inner<0, R>
    {
        enum { value = R };
    };

public:
    enum { value = Inner<N, 0>::value };
};

template<size_t N>
class OneNineSix
{
    template<size_t M, size_t R=Reverse<M>::value>
    struct Inner
    {
        enum { value = OneNineSix<M + R>::value };
    };

    template<size_t M>
    struct Inner<M, M>
    {
        enum { value = M };
    };

public:
    enum { value = Inner<N + Reverse<N>::value>::value };
};

int main()
{
    const size_t N = 4123;

    std::cout << OneNineSix<N>::value << std::endl;
}


2

เพิ่ม ++ , 57 ไบต์

L,BDbRBv
D,f,@,1]A+
D,g,@,1]A=
D,h,@,{f}A{g}Q{h}
L,{h}2/i

ลองออนไลน์!

มันทำงานอย่างไร

L,	; Create a function 'lambda 1'
	; Example argument:   [5280]
    BD	; Digits;     STACK = [[5 2 8 0]]
    bR	; Reverse;    STACK = [[0 8 2 5]]
    Bv	; Undigits;   STACK = [825]

D,f,@,	; Define a monadic function 'f'
	; Example argument:         [5280]
    1]	; Call 'lambda 1';  STACK = [825]
    A+	; Add the argument; STACK = [6105]

D,g,@,	; Define a monadic function 'g'
	; Example argument:          [5280]
    1]	; Call 'lambda 1';   STACK = [825]
    A=	; Equal to argument; STACK = [0]

D,h,@,	; Define a monadic function 'h'
	; Example argument:  [5280]
   {f}	; Call 'f';  STACK = [6105]
   A{g}	; If 'g'...
   Q	;   Return
   {h}	; Else call 'h'

L,	; Define a function, 'lambda 2'
	; Example argument: [5280]
   {h}	; Call 'h'; STACK = [46464]
   2/i	; Halve;    STACK = [23232]

2

Powershell, 63 62 ไบต์

-1 ไบต์ขอบคุณ @AdmBorkBork

param($m)for(;$m-$s;$m=-join"$s"[-1..-"$s".Length]){$s+=$m};$s

สคริปต์ทดสอบ:

$f = {
param($m)for(;$m-$s;$m=-join"$s"[-1..-"$s".Length]){$s+=$m};$s
}

&$f 5280

1
คุณไม่จำเป็นต้องใช้;ระหว่างและparam($m) for
AdmBorkBork

2

GNU dc ขนาด 46 ไบต์

ต้องการ GNU dc เวอร์ชันขั้นต่ำ 1.4 (สำหรับRคำสั่ง)

[O~3RO*+rd0<R]sR[+lfx]sg[ddO~rd0<R+d3R!=g]dsfx

อินพุตและเอาต์พุตอยู่ด้านบนสุดของสแต็กตามปกติ มันต้องใช้รหัสที่น่าประหลาดใจในการย้อนกลับตัวเลขใน dc (เว้นแต่ฉันจะหายไปบางสิ่งซึ่งอยู่ไกลจากที่เป็นไปไม่ได้) มันมีช่วงตัวเลขที่จะทำงานได้ดีกับอินพุตเช่นสิ่งเหล่านี้ (ซึ่งจะเกินเลขคณิตที่ไม่ได้ลงนามแบบ 32 บิตเป็นต้น):

  • 89 ⇒ 8,813,200,023,188
  • 8997 ⇒ 16,668,488,486,661
  • 10677 ⇒ 4,668,731,596,684,224,866,951,378,664

คำอธิบาย

# Reverse digits, starting after first digit extracted
[O~3RO*+r d0<R]sR

# Recursion helper - add and recurse
[+ lfx]sg

# Main recursive function
[dd O~r d0<R+ d3R !=g]dsfx


อาจต้องการระบุว่าสิ่งนี้ใช้ได้กับ GNU dc 1.4 และใหม่กว่าเท่านั้นเนื่องจากใช้Rคำสั่งใหม่ ทางออกที่ดี แต่!
Sophia Lechner

ฉันกำลังทำงานในแนวทางที่แตกต่างอย่างสิ้นเชิง แต่ไม่แน่ใจว่ามันจะเล็กลง
Sophia Lechner

ขอบคุณโซเฟีย - ฉันไม่ได้ตระหนักว่าRเป็นสิ่งใหม่ รอคอยที่จะเห็นวิธีการของคุณ!
Toby Speight

อ่าไม่ ... ฉันลองใช้วิธีอื่นในการจัดเรียงลูปภายนอก แต่มันก็จบลงด้วยขนาดที่ใหญ่ขึ้นประมาณห้าไบต์และไม่สวยกว่า คุณชนะ. =)
Sophia Lechner

2

R , 193 109 105 ไบต์

-84 ไบต์ขอบคุณ Giuseppe! -4 byes ขอบคุณ JayCe!

function(x){"-"=utf8ToInt
S=strtoi
"!"=rev
while({z=paste(S(x)+S(intToUtf8(!-x),10));any(-z!=!-z)})x=z
z}

ลองออนไลน์!


1
คุณสามารถ (และควร) เลือกวิธีที่แตกต่างของการทำเช่นนี้มากกว่าการจัดการสตริง แต่นี่เป็นเคล็ดลับการเล่นกอล์ฟสำหรับวิธีการที่คุณเลือก: strsplit(x,"")สั้นกว่าstrsplit(x,NULL)และสั้นกว่าel(L) สั้นกว่าและสั้นกว่าทั้งสอง แทนที่จะตั้งค่าให้ใช้โดยตรงในใบแจ้งยอดของคุณ นี่เป็นฟังก์ชั่นเรียกซ้ำถ้าฉันไม่เข้าใจผิดดังนั้นคุณต้องใส่เป็นส่วนหนึ่งของการส่งของคุณ L[[1]]as.doubleas.numericstrtoitiff=
Giuseppe

@Giuseppe เข้าใจแล้ว ขอบคุณสำหรับเคล็ดลับ ฉันจะทำสิ่งนี้ต่อไป มันง่ายกว่าสำหรับฉันที่จะได้รับสิ่งที่ใช้งานได้จากนั้นย้อนกลับและปรับปรุง
Robert S.

1
Hehehe ไม่ต้องกังวล หากคุณกำลังเครียดกับการใช้สตริง (หรือถูกบังคับจากปัญหา) ให้พิจารณาutf8ToIntแปลงเป็นตัวเลขและintToUtf8แปลงกลับ นั่นจะเป็นการประหยัดขนาดใหญ่!
Giuseppe


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