คำนวณผลรวมความแตกต่างของตัวเลข


39

ลองพิจารณาจำนวนเต็มที่ไม่เป็นลบเช่น 8675309 และคำนวณค่าสัมบูรณ์ของความแตกต่างระหว่างคู่หลักทั้งหมดที่อยู่ใกล้เคียง

สำหรับการ8675309ที่เราได้รับ|8-6| = 2, |6-7| = 1, |7-5| = 2, |5-3| = 2, ,|3-0| = 3 คบผลลัพธ์เหล่านี้เข้าด้วยกันอัตราผลตอบแทนอื่นจำนวนเต็มไม่ใช่เชิงลบที่มีขนาดเล็ก:|0-9| = 9 212239ทำซ้ำกระบวนการให้11016แล้ว0115ซึ่งโดยการประชุมที่ศูนย์นำไม่เขียนลดความซับซ้อนเป็น115ซึ่งจะกลายเป็น04หรือ4ซึ่งไม่สามารถลดได้อีกต่อไป 8675309 + 212239 + 11016 + 115 + 4 = 8898683ข้อสรุปค่าทั้งหมดเหล่านี้ที่เราได้รับ

ลองกำหนด Digit Difference Sum (หรือ DDS) เป็นการดำเนินการของการรับความแตกต่างของตัวเลขเพื่อสร้างตัวเลขใหม่จากนั้นเพิ่มตัวเลขผลลัพธ์ทั้งหมดลงในต้นฉบับ

นี่คือ 20 ค่าแรกในลำดับ DDS ที่เกี่ยวข้อง:

N   DDS(N)
0   0
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10  11
11  11
12  13
13  15
14  17
15  19
16  21
17  23
18  25
19  27

นี่คือ 10,000 ค่าแรกกราฟที่ค่อนข้างอยากรู้:

พล็อต DDS 10,000

โดยเฉพาะอย่างยิ่งเนื่องจากมันดูเหมือนกันเมื่อคุณพล็อตเป็น 1,000 หรือ 100

พล็อต DDS 1,000

พล็อต DDS 100

(ฉันเรียกมันว่าบันไดของทันตแพทย์... )

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้จำนวนเต็มแบบไม่ลบและพิมพ์หรือส่งคืนค่า DDS ตัวอย่างเช่นถ้าใส่เป็นผลผลิตที่ควรจะเป็น86753098898683

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


บันไดทันตแพทย์
Martijn

12
@MartijnR บันไดของทันตแพทย์
งานอดิเรกของ Calvin

@ Calvin'sHobbies บันไดของทันตแพทย์จัดฟัน?
Beta Decay

1
@BetaDecay บันไดของทันตแพทย์
Alex A.

คำตอบ:


11

Pyth, 17

s.ui.aM-VJjNTtJTQ

ลองที่นี่หรือเรียกใช้ชุดทดสอบ

คำอธิบาย:

s.u            Q   # Cumulative reduce, i.e. getting the intermediate values of each reduce
                     step and returning them as a list, then sum the list
   i ... T         # Convert the resulting list of numbers into a base 10 number
   .aM             # Get the absolute value of each element of ...
      -VJjNTtJ     # Perform vector subtraction on the lists given by
        JjNT       # assign J the number we currently have converted to its base 10 digits
            tJ     # and J[1:]. e.x. for 123 we get J = [1,2,3] then we do
                   # zip(J,J[1:]) which gives [[1,2],[2,3]] then element wise subtract
                   # to get [-1, -1]

นี่คือภาษาอะไร? ลึกลับมาก! T_T
asgs

1
@asgs ยินดีต้อนรับสู่ PPCG :) มันเรียกว่า Pyth คุณสามารถหาล่ามและเอกสารบางอย่างที่มันหน้า Github ผู้ใช้งานส่วนใหญ่ของภาษานี้มีการใช้งานในเว็บไซต์นี้ดังนั้นหากคุณมีคำถามเกี่ยวกับมันสามารถถามได้ในการแชทหรือห้องที่ทุ่มเทให้กับมัน :)
FryAmTheEggman

17

Python 2, 73

โชคดีที่ฉันพยายามหลีกเลี่ยงการทำงานของสตริง

t=lambda n:n>9and abs(n%10-n/10%10)+10*t(n/10)
g=lambda n:n and n+g(t(n))

g เป็นฟังก์ชั่นที่คำนวณคำตอบ


4
เวทมนตร์สีดำนี้คืออะไร!
สลายตัวเบต้า

7
@BetaDecay ฉันเชื่อว่าเรียกว่า "คณิตศาสตร์"
lirtosiast

ฉันไม่รู้จัก Python ค่อนข้างดีพอที่จะบอกได้ แต่คุณสามารถใช้การดำเนินการที่เหลือกับทั้งสองคำในการเข้าชมครั้งเดียวได้หรือไม่? นั่นคือจะ(n-n/10)%10ใช้งานเหมือนกันn%10-n/10%10หรือไม่ หรือแม้กระทั่ง(9*n/10)%10?
เกลน O

@GlenO ใน Python %เป็นตัวดำเนินการโมดูลัสจริงไม่ใช่ส่วนที่เหลือดังนั้นมันจะไม่ทำงาน
feersum

15

Matlab, 101 105ไบต์

ขอบคุณมากที่จะ @beaker สำหรับข้อเสนอแนะของเขาที่จะใช้แทนถ้าpolyval base2decที่อนุญาตให้ฉัน

  • บันทึก 4 ไบต์
  • ลดความซับซ้อนของการวางนัยทั่วไปลงบนฐานโดยพลการ (ดูด้านล่าง) และประหยัด 22 ไบต์ที่นั่น และที่สำคัญที่สุด
  • ช่วยฉันรู้ว่ารหัสสำหรับกรณีทั่วไปผิด (เลขศูนย์นำไม่ถูกลบ) รหัสและกราฟถูกต้องแล้ว

รหัส:

function y=f(y)
x=+num2str(y);while numel(x)>1
x=polyval(abs(diff(x)),10);y=y+x;x=+dec2base(x,10);end

ตัวอย่าง:

>> f(8675309)
ans =
     8898683

โบนัส: ฐานโดยพลการ

การวางนัยทั่วไปขนาดเล็กทำให้สามารถใช้ฐานจำนวนโดยพลการไม่จำเป็นต้องเป็นทศนิยม:

  • ฐานแบบสุ่มจาก 2 ถึง 10, 108 104 ไบต์

    function y=f(y,b)
    x=+dec2base(y,b);while numel(x)>1
    x=polyval(abs(diff(x)),b);y=y+x;x=+dec2base(x,b);end
    

    เหตุผลนี้ทำงานเฉพาะสำหรับฐานขึ้นไป10ก็คือว่า Matlab ของdec2baseตัวเลขการใช้งานฟังก์ชั่น0, 1, ... , 9, A, B, ... , และมีกระโดดในตัวอักษร (ASCII) รหัสจากไป9A

  • ฐานแบบสุ่มจาก 2 ถึง 36, 124 146ไบต์

    การกระโดดจาก9ไปยังที่Aกล่าวถึงข้างต้นจำเป็นต้องได้รับการดูแลเป็นพิเศษ ฐานสูงสุดเป็นไป36ตามdec2baseหน้าที่ของ Matlab

    function y=f(y,b)
    x=+dec2base(y,b);x(x>57)=x(x>57)-7;while numel(x)>1
    x=abs(diff(x));x=x(find(x,1):end);y=y+polyval(x,b);end
    

นี่คือวิธีที่บันไดของทันตแพทย์มองหาฐานที่แตกต่างกัน:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


1
นี่คือสิ่งที่ฉันจะทำ ... เวลาที่จะคิดคำตอบอื่น ๆ ฮ่า ๆ +1
rayryeng - Reinstate Monica

@rayryeng :-) ขอบคุณ
Luis Mendo

@BetaDecay ขอบคุณ! :-) พวกเขาสวยแน่นอน
Luis Mendo

11

CJam, 22 21 ไบต์

ri_{\s2ew::-:zsi_@+}h

โปรดทราบว่าโปรแกรมนี้ออกกับข้อผิดพลาดซึ่งจะได้รับอนุญาตโดยค่าเริ่มต้น

ด้วยล่าม Java สามารถระงับข้อผิดพลาดได้โดยปิด STDERR หากคุณลองใช้รหัสนี้ทางออนไลน์ในล่าม CJamให้ละเว้นเอาต์พุตทั้งหมดก่อนบรรทัดสุดท้าย

ขอบคุณ @ Sp3000 สำหรับการชี้ให้เห็นข้อผิดพลาดในการแก้ไขต้นฉบับ

ขอบคุณ @ MartinBüttnerสำหรับการลงเล่น 1 ไบต์

ตัวอย่างการวิ่ง

$ cjam digit-difference.cjam 2>&- <<< 8675309     
8898683

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

ri_   e# Read an integer (I) from STDIN and push a copy (A).
{     e# Do:
  \   e#   Swap I on top of A.
  s   e#   Cast I to string.
      e#   For example, 123 -> "123".
  2ew e#   Push the overlapping slices of length 2 (pair of adjacent digits).
  ::- e#   Replace each pair by its difference.
  :z  e#   Apply absolute value to each difference.
  si  e#   Cast to string, then to integer. This is the new I.
      e#   For example, [1 2 3] -> "123" -> 123.
  _   e#   Push a copy of I.
  @   e#   Rotate A on top of the copy of I.
  +   e#   Add I to A, updating A.
}h    e# While A is truthy, repeat the loop.

จะเป็น truthy hเมื่อตรวจสอบโดย อย่างไรก็ตามเมื่อฉันเป็นจำนวนเต็มหลักเดียว2ewจะล้มเหลวด้วยข้อผิดพลาดหลังจากใช้อาร์เรย์ที่ถูกเรียกใช้ สิ่งนี้จะทิ้งเฉพาะผลลัพธ์ที่ต้องการบนสแต็ก


2
โพสต์ใน 7 นาทีแบน: O
งานอดิเรกของ Calvin

10

เขาวงกต , 176 134 127 119 103 97 88 82 79 76 72 ไบต์

ขอบคุณ Sp3000 สำหรับการบันทึก 1 ไบต์และช่วยเพิ่มอีก 2 ทาง

นี่อาจจะสั้นลง แต่เดี๋ยวก่อนมันเต้นJava Matlab Python ...

?
_
)/:}+{:`};!
9       "
_ :}-"" :_10
;;{: `" "  :
  {  (_:/=%}
  0+;`"

ลองออนไลน์

สิ่งนี้สิ้นสุดลงด้วยข้อผิดพลาดแต่ข้อความข้อผิดพลาดถูกเขียนไปยัง STDERR (ซึ่งเป็นสาเหตุที่คุณไม่เห็นใน TIO)

การดำเนินการค่อนข้างตรงไปตรงมา เราเพิ่มมูลค่าปัจจุบันให้เป็นยอดรวม หากค่าปัจจุบันมากกว่า9เราคำนวณตัวเลขฐาน 10 (ผ่าน div-mod ซ้ำ) และสร้างตัวเลขใหม่จากความแตกต่างที่แน่นอน หากเราไปถึง9หรือน้อยกว่านั้นเราจะพิมพ์ผลรวมสะสม

ตัวเลขของตัวเลขปัจจุบันจะถูกรวบรวมในสแต็คเสริมที่มีตัวเลขที่สำคัญที่สุดอยู่ด้านบน

การใช้งานแฟนซีของabs(...)ฉันที่นี่กลายเป็นความซับซ้อนอย่างน่าขันเมื่อเทียบกับโซลูชั่นใหม่ ... ฉันจะเพิ่มคำอธิบายที่อัปเดตเมื่อฉันเล่นกอล์ฟต่อไป


5

Java - 300 ไบต์

เวอร์ชัน Golfed

static Long t=new Scanner(System.in).nextLong();static char[]c=t.toString().toCharArray();public static void main(String[]z){while(c.length>1)s();System.out.print(t);}static void s(){String s="";for(int i=0;i<c.length-1;)s+=Math.abs(c[i]-c[++i]);Long a=new Long(s);t+=a;c=a.toString().toCharArray();}

Ungolfed / เวอร์ชั่นเต็ม

import java.util.Scanner;

public class DigitDifference {

    static Long t = new Scanner(System.in).nextLong();
    static char[] c = t.toString().toCharArray();

    public static void main(String[] args){
        while( c.length > 1 )
            s();
        System.out.print(t);
    }

    static void s(){
        String s="";
        for(int i = 0; i < c.length-1;)
            s += Math.abs(c[i]-c[++i]);
        Long a = new Long(s);
        t += a;
        c = a.toString().toCharArray();
    }
}

@ Loovjo, ไชโย ..
The Coder

1
ยินดีต้อนรับสู่ PPCG! นี้ยังสามารถเล่นกอล์ฟได้มาก ฉันไม่ได้ดูตรรกะมากนัก แต่: 1) ดึงทั้งหมดนี้เป็นฟังก์ชั่นเดียวเพราะคุณไม่จำเป็นต้องแยกอีกอันหนึ่ง (หรือโปรแกรม / คลาสเต็มสำหรับเรื่องนั้น) 2) กำจัดstatics หลังจากดึง(a+"")โดยทั่วไปแล้วใน 3) จะเหมือนกันa.toString()แต่สั้นกว่า 4) คุณไม่จำเป็นต้องใช้สแกนเนอร์หากเป็นเพียงแค่ฟังก์ชั่น
Geobits

2
ตัวอย่างเช่นโดยไม่ต้องเปลี่ยนการทำงานมากนักและเพียงแค่เอา cruft ออกมามันประมาณ 164:long f(long t){long a=t;char[]c;while((c=(a+"").toCharArray()).length>1){String s="";for(int i=0;i<c.length-1;)s+=Math.abs(c[i]-c[++i]);t+=a=new Long(s);}return t;}
Geobits

2
@Geobits นั่นเป็นเพื่อนที่น่าทึ่ง ฉันใหม่สำหรับ Code Golf ดังนั้นฉันจะพยายามปรับปรุงประสิทธิภาพ codign ของฉัน Cherrs ..
Coder

5

Julia, 81 60 ไบต์

n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)

Ungolfed:

function f(n::Int)
    # Initialize a sum to the input
    s = n

    while n > 9
        # Get absolute values of the pairwise differences of the
        # digits of n, join as a string, convert it to an integer,
        # and reassign n
        n = int(join(abs(diff(["$n"...]))))

        # ["$n"...] actually splits n as a string into a vector
        # of its characters, but the difference between ASCII
        # codes is the same as the difference between the numbers
        # so it works as expected

        # Add the new n to the running sum
        s += n
    end

    # Return the sum
    return s
end

ลองออนไลน์

บันทึกแล้ว 21 ไบต์ด้วย feersum และ Glen O!


1
มีเหตุผลใดที่ndigits(n)>1แตกต่างไปจากนี้n>9หรือไม่?
feersum

คำแนะนำ: int(join(abs(diff(["$n"...]))))บันทึก 9 ไบต์ เปลี่ยนn>9เป็น feersum ที่แนะนำสำหรับการบันทึกอีก 9 ไบต์ บันทึกสามไบต์เพิ่มเติมด้วยการดำเนินการทั้งสองอย่างในขณะที่ลูปในขั้นตอนเดียว (และลบเซมิโคลอนพิเศษตอนนี้ไม่จำเป็น):n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)
เกลน O

@feersum อืมไม่ ขอบคุณ!
Alex A.

@GlenO ดีมากขอบคุณ!
Alex A.

5

oK , 37 32 24 23 ไบต์

+/(10/{%x*x}1_-':.:'$)\

ในการดำเนินการ:

  +/(10/{%x*x}1_-':.:'$)\8675309
8898683

  (+/(10/{%x*x}1_-':.:'$)\)'!20
0 1 2 3 4 5 6 7 8 9 11 11 13 15 17 19 21 23 25 27

K5 มีคุณสมบัติบางอย่างที่เหมาะกับการเข้ารหัส - นี้และ "ถอดรหัส" สามารถทำการแปลงฐานแต่ละคู่ ( ':) จับคู่องค์ประกอบตามลำดับในรายการและการสแกนจุดคงที่ ( \) สามารถสร้างลำดับซ้ำจนกว่ามันจะหยุด เปลี่ยนแปลง การขาดแบบดั้งเดิมabs()นำไปสู่บางกลุ่มที่น่าเกลียดในรูปแบบของ{(x;-x)x<0}'แม้ว่า

แก้ไข:

แทน{(x;-x)x<0}'ฉันสามารถ (ค่อนข้างสิ้นเปลือง) นำสแควร์รูทของสแควร์ของลำดับ ( {%x*x}ประหยัด 5 ไบต์)

แก้ไข 2:

แรงบันดาลใจจากโซลูชั่น APL ของ @maurinus ฉันสามารถแทนที่ "ถอดรหัส" ( ((#$x)#10)\x) ด้วยการประเมินอักขระแต่ละตัวของการแทนค่าสตริงของตัวเลข - .:'$x! นอกจากนี้ยังช่วยให้ฉันใช้รูปแบบโดยปริยายของการแสดงออกทั้งการบันทึกอักขระเพิ่มเติม


4

Python 2, 87 ไบต์

f=lambda n:n and n+f(int('0'+''.join(`abs(int(a)-int(b))`for a,b in zip(`n`,`n`[1:]))))

เพิ่มหมายเลขปัจจุบันซ้ำและใช้ความแตกต่างของตัวเลข การแปลงจำนวนมากระหว่างตัวเลขและสตริง อาจปรับปรุงได้


4

จูเลีย55 55ไบต์

h=n->(n>9&&h(int(join(abs(diff(["$n"...]))))))+n

Ungolfed:

function h(n)
  if n>9
    # If multiple digits, find the digit difference...
    digitdiff=int(join(abs(diff(["$n"...]))))
    # ... recurse the function...
    downsum=h(digitdiff)
    # ... and return the sum so far (working up from the bottom)
    return downsum+n
  else
    # If single digit, no further recursion, return the current number
    return n
  end
end

โดยพื้นฐานแล้วสิ่งนี้จะกลับไปสู่ระดับหลักเดียว (โดยที่ไม่มีความแตกต่างของตัวเลข) จากนั้นจึงทำการสำรองข้อมูลเมื่อออกจากการสอบถามซ้ำในแต่ละระดับ


3

Haskell, 140 ไบต์

d ทำงาน

import Data.Char
d n=sum.m(read.m intToDigit).fst.span(/=[]).iterate s.m digitToInt.show$n
s l@(h:t)=snd$span(==0)$m abs$zipWith(-)l t
m=map

ไม่มีใครรู้วิธีหลีกเลี่ยงการนำเข้าฟังก์ชั่นการแปลงที่ยาวนาน?


intToDigitเป็นtoEnum.(+48)และเป็นdigitToInt (\i->fromEnum i-48)นอกจากนี้คุณยังสามารถเปิดsกับรุ่น pointfree ที่มี ในบริบทรายการ:=<< s=snd.span(==0).m abs.(zipWith(-)=<<tail)ท้ายที่สุด(==0)ก็คือ(<1)เพราะเรากำลังทำงานกับจำนวนเต็มไม่ลบ
nimi

... โอ้และถ้าsเป็นแบบไร้สาระคุณไม่จำเป็นต้องตั้งชื่อ เรียกมันว่าโดยตรง:iterate(snd.span ... tail))
nimi

... ฉันอีกครั้งเพื่อแก้ไขข้อผิดพลาดในความคิดเห็นแรกของฉัน: =<<ใช้ในบริบทของฟังก์ชันไม่ใช่บริบทของรายการขออภัย
nimi

ยอดเยี่ยม! นอกจากนี้ยังเป็นขั้นตอนทั่วไปที่นี่เพื่อใช้ส่วนขยาย GHC หรือไม่ NoMonomorphismRestrictionจะให้ฉันมีdpointfree ด้วย
Leif Willerts

1
chrและordมีทั้งในดังนั้นคุณจึงไม่สามารถละเว้นData.Char importธงคอมไพเลอร์จะนับเป็นไบต์เช่นกันดังนั้นNoMonomorphismRestrictionเพิ่มคะแนนของคุณ 25
nimi


3

APL (22)

{⍵≤9:⍵⋄⍵+∇10⊥|2-/⍎¨⍕⍵}

คำอธิบาย:

  • ⍵≤9:⍵: ถ้า⍵≤ 9 ให้ผลตอบแทน⍵ไม่เปลี่ยนแปลง
  • ⍎¨⍕⍵: แปลง⍵เป็นสตริงจากนั้นประเมินแต่ละอักขระ
  • 2-/: ลบทุก ๆ หมายเลขที่อยู่ติดกัน
  • |: รับค่าสัมบูรณ์
  • 10⊥: เปลี่ยนอาเรย์เป็นเลขฐาน 10
  • ⍵+∇: เรียกใช้ฟังก์ชันซ้ำด้วยค่าใหม่นี้และเพิ่มผลลัพธ์ลงในอินพุต

3

Mathematica, 72 69 65 ไบต์

Tr@FixedPointList[FromDigits@*Abs@*Differences@*IntegerDigits,#]&

ฉันเปิดรับข้อเสนอแนะที่นี่


Tr@FixedPointList[FromDigits@*Abs@*Differences@*IntegerDigits,#]&
alephalpha

@alephalpha แนวคิดที่น่าสนใจการสร้างศูนย์พิเศษ ...
LegionMammal978

2

JavaScript ES6, 73 ไบต์

t=n=>(b=10,M=Math).ceil(n&&n+t((j=n=>n>9&&M.abs(n%b-n/b%b)+b*j(n/b))(n)))

นี่ไม่ได้สั้นไปกว่า: / ฉันจะลองใช้วิธีอื่นมากกว่านี้ แต่มันจะสั้นที่สุด


หากคุณเพียงแค่ปล่อยให้มันเป็นฟังก์ชั่นนิรนามแทนการกำหนดให้tมันยังคงใช้ได้และประหยัด 2 ไบต์
Patrick Roberts

@PatrickRoberts ใช่ แต่ฉันกำลังใช้การสอบถามซ้ำดังนั้นฉันต้องตั้งชื่อมัน
Downgoat

โอ้พลาดแล้วยุติธรรมพอ
Patrick Roberts

2

JavaScript (ES6), 69

ทดสอบการเรียกใช้ข้อมูลโค้ดด้านล่างในเบราว์เซอร์ที่สอดคล้องกับ EcmaScript 6 (แต่ไม่ใช่ Chrome เนื่องจากยังไม่รองรับผู้ให้บริการสเปรด...) MS Edge อาจเป็นเช่นนั้นหรือ

f=n=>n&&(n+=r='',[...n].map(d=>(r+=d>p?d-p:p-d,p=d),p=n[0]),+n+f(+r))

function test()
{
  var i=+I.value
  O.innerHTML = i+' -> '+f(i) + '\n' + O.innerHTML 
}
<input id=I value=8675309><button onclick=test()>-></button>
<pre id=O></pre>

ทางเลือกโดยใช้ความเข้าใจของอาเรย์ที่ตอนนี้มีการกำหนดเป้าหมาย EcmaScript 2016 (ES7), 67 ไบต์:

f=n=>n&&(n+=r='',p=n[0],[for(d of n)(r+=d>p?d-p:p-d,p=d)],+n+f(+r))

2

Python 3, 125 ไบต์

ฉันเคยชอบถี่ regex จนกว่าฉันจะพยายามที่จะใช้สำหรับความท้าทายนี้ ... re.findall('\d\d',s,overlapped=True)คือไม่ได้บน;)

s=input()
p=int
x=p(s)
while p(s)>9:g=str(s);s=p(''.join(str(abs(p(g[i])-p(g[i+1])))for i in range(len(g)-1)));x+=s 
print(x)

ไชโย @Todd :)


1
คุณสามารถดำเนินการเติม inplace ในจำนวนเต็มแทนที่จะเป็นรายการซึ่งจะลบความจำเป็นในการวงเล็บเหลี่ยมและผลรวมสุดท้าย 's = p (input ())' จะช่วยให้คุณสามารถลบการแปลง int ในขณะที่ลูปและการกำหนดให้ x ลองพิจารณาการวนซ้ำผ่าน zip ของ g และ g [1:] ซึ่งควรบันทึกไบต์บางส่วน
ทอดด์


0

C 162 ไบต์

แข็งแรงเล่นกอล์ฟ:

main(int argc,char **argv){char *c=argv[1];int u=atoi(c),d;do{while(c[1]!=0){*c=abs(*c-*(c+1))+48;c++;}*c=0;c=argv[1];d=atoi(c);u+=d;}while(d>9);printf("%d",u);}

ungolfed:

main(int argc, char **argv)
{
    char *c=argv[1];
    int u=atoi(c),d;

    do
    {
        while(c[1]!=0)
        {
            *c=abs(*c-*(c+1))+48;
            c++;
        }

        *c=0;
        c=argv[1];
        d=atoi(c);
        u+=d;
    }
    while(d>9);

    printf("%d\n",u);
}

0

R, 134 ไบต์

รหัส

f=function(x){z=x;while(z>9){n=seq(nchar(z));z=abs(diff(strtoi(substring(z,n,n))));z=sum(z*10**(rev(seq(length(z)))-1));x=x+z};cat(k)}

ทดสอบออนไลน์

Ungolfed

f=function(x){
  z=x;
  while(z>9){
    n=seq(nchar(z));
    z=abs(diff(strtoi(substring(z,n,n))));
    z=sum(z*10**(rev(seq(length(z)))-1));
    x=x+z
  };
  cat(x)
}

นี่คือพล็อตของความแตกต่างของซีรี่ส์ "ผลรวมตัวเลขที่แตกต่างของตัวเลข" จาก f (1) ถึง f (1m) เพียงเพราะฉันชอบที่จะแตกต่าง

รหัสลงจุด

s <- seq(1,100000)
serie <- sapply(s,f)
plot(diff(ts(serie)),xlab="",ylab="")

0

MATLAB (141)(137)

แก้ไข:น้อยกว่า 4 ไบต์ขอบคุณ @Andras

function[s j]=n(T,b,c),if(T/b>9),u=fix(T/10);[x e]=n(T,b*10,0);y=n(u,b,0);[w z]=n(u,b,c);s=abs(x-y);j=s+e+10*c*z;else,s=mod(T,10);j=s;end
  • สิ่งนี้เอาชนะคำตอบของ @LuisMendo แต่อย่างน้อยฉันก็สามารถลดเวลาในการดำเนินการได้ซึ่งโดยฉันจะพยายามกระจายความหลากหลายของวิธีการแก้ปัญหานี้
  • ฉันสามารถลดได้มากขึ้น แต่เมื่อฉันใช้เวลาน้อยลงฉันก็จะเสียไบต์มากขึ้นดังนั้นนี่คือหลักการ:

โปรแกรมจะสรุปตัวเลขในแถวเดียวกันก่อนที่จะมีการขีดเส้นใต้หมายความว่ามันใช้การหารจำนวนเต็ม "n / 10" log_10 (n) ครั้งเท่านั้นความซับซ้อนคือ O (N)

ถ้า n= a b c d

a          b           c           d
   |a-b|       |b-c|       |c-d|
    ||a-b|-|b-c|| ||b-c|-|c-d||
   ....

โปรแกรมของฉันคำนวณ:

a+|a-b| + | |a-b|-|b-c| |  +  |  | |a-b|-|b-c| | - | |b-c|-|c-d| |  |
+10*(
b+|b-c| + | |b-c|-|c-d| |
+10*(
c+|c-d|
+10*(
d
)
)
)

การใช้งาน:

  [a b]=n(13652,1,1)

a =

1

 b =

   16098

คุณสามารถสำรอง 4 ไบต์โดยไม่ใส่ก็ได้,endของการfunctionประกาศ
Andras Deak

โปรดพิจารณาแก้ไขไวยากรณ์ของโพสต์ของคุณ ฉันไม่เข้าใจสิ่งที่คุณพูด
rayryeng - Reinstate Monica

0

อารัมภบท, 143 ไบต์

รหัส:

q(X,N):-X<9,N=0;A is abs(X mod 10-X//10 mod 10),Y is X//10,q(Y,M),N is A+M*10.
r(X,N):-X<9,N=X;q(X,Y),r(Y,M),N is X+M.
p(X):-r(X,N),write(N).

อธิบาย:

q(X,N):-X<9,N=0;                                                         % If only one digit, the difference is 0
        A is abs(X mod 10-X//10 mod 10),Y is X//10,q(Y,M),N is A+M*10.   % Else, the difference is the difference between the last 2 digits + the recursive difference of the number without the last digit
r(X,N):-X<9,N=X;                                                         % If we only have 1 digit the final answer is that digit
        q(X,Y),r(Y,M),N is X+M.                                          % Else, the final answer is the current number + the recursive difference of that number
p(X):-r(X,N),write(N).         

qการคำนวณที่แปลงตัวเลขให้เป็นความต่างของตัวเลข
rเรียกซ้ำqและสรุปผลลัพธ์เพื่อค้นหาผลต่างของตัวเลข
pคือจุดเริ่มต้น ใช้หมายเลขโทรrและพิมพ์คำตอบ

ตัวอย่าง:

>p(8675309).
8898683

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


0

PHP - 198 ไบต์

<?$x=$t=$_GET['V'];function z($x){global$t;for($i=0;$i<strlen($x)-1;$i++){$z=str_split($x);$r.=str_replace('-','',$z[$i]-$z[$i+1]);}$r=ltrim($r,'0');$t+=$r;return strlen($r)>1?z($r):0;}z($x);echo$t;

Ungolfed

<?
$x=$t=$_GET['V']; // Gets the value from input
function z($x){
    global$t;
    for($i=0;$i<strlen($x)-1;$i++){
        $z=str_split($x); //Turns the string into an array
        $r.=str_replace('-','',$z[$i]-$z[$i+1]); // Sums the two values and removes the minus signal
    }
    $r=ltrim($r,'0'); // Remove trailing zeroes
    $t+=$r; // Adds to global var
    return strlen($r)>1?z($r):0; // Checks the size of the string. If >1, calls the function again
}

z($x);
echo$t;

0

Perl 6 , 56 ไบต์

{[+] $_,{+.comb.rotor(2=>-1)».map((*-*).abs).join}…0} # 56 bytes

การใช้งาน:

my &code = {...} # insert code from above

(180..190).map: &code;
# (259 258 259 260 261 262 263 264 265 266 280)

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