Tính tổng số hiệu của một số


39

Xem xét lấy một số nguyên không âm như 8675309 và tính toán các giá trị tuyệt đối của sự khác biệt giữa tất cả các cặp chữ số lân cận.

Đối với 8675309chúng ta |8-6| = 2, |6-7| = 1, |7-5| = 2, |5-3| = 2, |3-0| = 3, |0-9| = 9. Kết hợp các kết quả này lại với nhau mang lại một số nguyên không âm khác nhỏ hơn : 212239. 11016Sau đó 0115, lặp đi lặp lại quá trình đưa ra , theo quy ước, các số 0 đứng đầu không được viết đơn giản hóa 115, trở thành 04hoặc 4, không thể giảm thêm nữa. Tổng hợp tất cả các giá trị lên chúng tôi nhận được 8675309 + 212239 + 11016 + 115 + 4 = 8898683.

Hãy xác định Tổng số chênh lệch chữ số (hoặc DDS) là thao tác này liên tục lấy chênh lệch chữ số của một số để tạo thành một số mới, sau đó thêm tất cả các số kết quả vào ban đầu.

Dưới đây là 20 giá trị đầu tiên trong chuỗi DDS tương ứng:

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

Dưới đây là 10000 giá trị đầu tiên , biểu đồ khá tò mò:

Lô DDS 10000

Đặc biệt là vì nó trông giống nhau khi bạn vẽ nó tới 1000 hoặc thậm chí 100:

Lô DDS 1000

Lô DDS 100

(Tôi sẽ gọi nó là cầu thang của nha sĩ ...)

Thử thách

Viết chương trình hoặc hàm lấy số nguyên không âm và in hoặc trả về giá trị DDS của nó. Ví dụ, nếu đầu vào là 8675309, đầu ra phải là 8898683.

Mã ngắn nhất tính bằng byte thắng.


cầu thang của nha sĩ?
Martijn

12
@MartijnR Cầu thang của nha sĩ.
Sở thích của Calvin

@ Calvin'sHobbies Cầu thang chỉnh nha?
Beta Decay

1
@BetaDecay Cầu thang của nha sĩ .
Alex A.

Câu trả lời:


11

Bình thường, 17

s.ui.aM-VJjNTtJTQ

Dùng thử tại đây hoặc chạy Test Suite

Giải trình:

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]

Ngôn ngữ này là gì? Thật khó hiểu! T_T
vào

1
@asgs Chào mừng bạn đến với PPCG :) Nó được gọi là Pyth, bạn có thể tìm thấy một thông dịch viên và một số tài liệu tại trang Github của nó . Hầu hết người dùng của ngôn ngữ này đều hoạt động trên trang web này, vì vậy nếu bạn có thắc mắc về việc này, hãy hỏi trong trò chuyện hoặc phòng dành riêng cho nó :)
FryAmTheEggman

17

Con trăn 2, 73

May mắn thay, tôi quản lý để tránh bất kỳ hoạt động chuỗi.

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 là hàm tính toán câu trả lời.


4
Ma thuật đen này là gì?!
Beta Decay

7
@BetaDecay Tôi tin rằng nó được gọi là "toán học".
lirtosiast

Tôi không biết Python đủ rõ để nói, nhưng bạn có thể áp dụng thao tác còn lại cho cả hai thuật ngữ trong một lần nhấn không? Đó là, sẽ (n-n/10)%10hoạt động giống như n%10-n/10%10? Hoặc thậm chí có thể (9*n/10)%10?
Glen O

@GlenO Trong Python, %là một toán tử mô đun thực sự, không phải là phần còn lại, do đó sẽ không hoạt động.
frageum

15

Matlab, 101 105 byte

Cảm ơn rất nhiều cho @beaker về đề xuất của anh ấy để sử dụng polyvalthay thế nếu base2dec. Điều đó cho phép tôi

  • lưu 4 byte;
  • đơn giản hóa rất nhiều việc khái quát hóa thành cơ sở tùy ý (xem bên dưới) và lưu 22 byte ở đó; và hầu hết tất cả,
  • đã giúp tôi nhận ra rằng mã cho trường hợp chung là sai (các số 0 đứng đầu không bị xóa). Mã và các biểu đồ là chính xác ngay bây giờ.

Mã số:

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

Thí dụ:

>> f(8675309)
ans =
     8898683

Tiền thưởng: cơ sở tùy ý

Một khái quát nhỏ cho phép một người sử dụng một cơ sở số tùy ý, không nhất thiết phải là số thập phân:

  • Cơ sở tùy ý từ 2 đến 10, 108 104 byte

    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
    

    Lý do tại sao điều này chỉ hoạt động cho cơ sở lên đến 10là Matlab dec2basesử dụng chức năng chữ số 0, 1, ..., 9, A, B, ..., và có một bước nhảy trong ký tự (ASCII) mã số từ 9đến A.

  • Cơ sở tùy ý từ 2 đến 36, 124 146 byte

    Nhảy từ 9để Ađề cập ở trên cần điều trị đặc biệt. Cơ sở tối đa là 36theo dec2basechức năng của 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
    

Đây là cách cầu thang của nha sĩ tìm kiếm các cơ sở khác nhau:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


1
Đây là những gì tôi sẽ làm ... thời gian để nghĩ về một câu trả lời khác lol. +1.
rayryeng - Phục hồi Monica

@rayryeng :-) Cảm ơn
Luis Mendo

@BetaDecay Cảm ơn! :-) Họ thực sự xinh đẹp
Luis Mendo

11

CJam, 22 21 byte

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

Lưu ý rằng chương trình này thoát với một lỗi, được cho phép theo mặc định .

Với trình thông dịch Java, các lỗi có thể được loại bỏ bằng cách đóng STDERR. Nếu bạn thử mã này trực tuyến trong trình thông dịch CJam , hãy bỏ qua tất cả đầu ra trước dòng cuối cùng.

Cảm ơn @ Sp3000 đã chỉ ra một lỗi trong phiên bản gốc.

Cảm ơn @ MartinBüttner vì đã chơi golf 1 byte.

Chạy ví dụ

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

Làm thế nào nó hoạt động

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.

A sẽ luôn luôn trung thực khi kiểm tra bởi h. Tuy nhiên, một khi tôi là số nguyên một chữ số, 2ewsẽ không có lỗi sau khi sử dụng mảng được gọi. Điều này chỉ để lại kết quả mong muốn trên ngăn xếp, được in trước khi thoát.


2
Đăng trong 7 phút phẳng: O
Sở thích của Calvin

10

Mê cung , 176 134 127 119 103 97 88 82 79 76 72 byte

Cảm ơn Sp3000 vì đã tiết kiệm 1 byte và mở đường cho 2 người nữa.

Điều này có lẽ vẫn có thể được rút ngắn, nhưng này, nó đánh bại Java Matlab Python ...

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

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

Điều này chấm dứt với một lỗi nhưng thông báo lỗi được ghi vào STDERR (đó là lý do tại sao bạn không nhìn thấy nó trong TIO).

Việc thực hiện khá đơn giản. Chúng tôi thêm giá trị hiện tại vào tổng số đang chạy. Nếu giá trị hiện tại lớn hơn 9, chúng tôi tính toán 10 chữ số cơ bản của nó (thông qua div-mod lặp lại) và tạo thành một số mới từ sự khác biệt tuyệt đối. Nếu chúng tôi nhận được 9hoặc ít hơn, chúng tôi sẽ in tổng số đang chạy.

Các chữ số của số hiện tại được thu thập trên ngăn xếp phụ với chữ số có ý nghĩa nhất ở trên.

Chà, việc triển khai ưa thích của abs(...)tôi ở đây hóa ra lại phức tạp đến mức nực cười so với giải pháp mới ... Tôi sẽ thêm một lời giải thích cập nhật khi tôi chơi golf thêm nữa.


5

Java - 300 byte

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

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 / Phiên bản đầy đủ

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, Chúc mừng ..
Bộ giải mã

1
Chào mừng đến với PPCG! Điều này vẫn có thể được chơi golf rất nhiều. Tôi đã không nhìn vào logic nhiều nhưng: 1) Kéo tất cả những điều này vào một chức năng vì bạn không thực sự cần một chức năng riêng biệt (hoặc một chương trình / lớp đầy đủ cho vấn đề đó) 2) Loại bỏ statics sau khi kéo chúng trong 3) (a+"")thường giống như a.toString(), nhưng ngắn hơn 4) Bạn không cần Máy quét nếu đó chỉ là một chức năng, chỉ cần mất nhiều thời gian như đầu vào.
Geobits

2
Ví dụ: không thay đổi nhiều hoạt động và chỉ cần loại bỏ hành trình, khoảng 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, đó là người bạn tuyệt vời. Tôi chưa quen với Code Golf, vì vậy tôi sẽ cố gắng cải thiện hiệu quả của mình. Cherrs ..
Bộ giải mã

5

Julia, 81 60 byte

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

Ung dung:

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

Dùng thử trực tuyến

Đã lưu 21 byte nhờ frageum và Glen O!


1
Có lý do nào ndigits(n)>1khác hơn n>9?
frageum

Đề xuất: int(join(abs(diff(["$n"...]))))tiết kiệm 9 byte. Chuyển sang n>9như được đề xuất bởi frageum cho 9 byte khác được lưu. Lưu thêm ba byte bằng cách thực hiện cả hai phép gán trong vòng lặp while trong một bước (và loại bỏ dấu chấm phẩy thừa, bây giờ không cần thiết):n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)
Glen O

@feersum Um, không. Cảm ơn!
Alex A.

@GlenO Tuyệt vời, cảm ơn!
Alex A.

5

oK , 37 32 24 23 byte

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

Trong hành động:

  +/(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 có một vài tính năng rất phù hợp với điều này - "mã hóa" và "giải mã" có thể thực hiện chuyển đổi cơ sở, mỗi cặp ( ':) ghép các phần tử tuần tự trong một danh sách và quét điểm cố định ( \) có thể tạo ra chuỗi lặp cho đến khi dừng thay đổi. Mặc dù vậy, việc thiếu một nguyên thủy abs()dẫn đến một số lượng lớn khó coi ở dạng {(x;-x)x<0}'.

Chỉnh sửa:

Thay vì {(x;-x)x<0}', tôi có thể (hơi lãng phí) lấy căn bậc hai của bình phương của chuỗi ( {%x*x}, tiết kiệm 5 byte.

Chỉnh sửa 2:

Lấy cảm hứng từ giải pháp APL của @maurinus, tôi có thể thay thế "giải mã" ( ((#$x)#10)\x) bằng cách đánh giá từng ký tự của biểu diễn chuỗi của số- .:'$x! Điều này cũng cho phép tôi sử dụng một hình thức ngầm của toàn bộ biểu thức, lưu các ký tự bổ sung.


4

Python 2, 87 byte

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

Đệ quy thêm số hiện tại và lấy các chữ số khác nhau. Rất nhiều chuyển đổi giữa số và chuỗi. Có lẽ có thể được cải thiện.


4

Julia, 55 48 byte

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

Ung dung:

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

Về cơ bản, điều này đệ quy xuống mức một chữ số (trong đó không thể thực hiện sự khác biệt về chữ số), sau đó tổng hợp lại khi nó thoát khỏi đệ quy, theo cấp độ.


3

Haskell, 140 byte

d Làm công việc.

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

Có ai biết làm thế nào để tránh nhập các chức năng chuyển đổi dài?


intToDigittoEnum.(+48)digitToInt(\i->fromEnum i-48). Bạn cũng có thể chuyển ssang phiên bản không có điểm =<<trong bối cảnh danh sách : s=snd.span(==0).m abs.(zipWith(-)=<<tail). Cuối cùng, (==0)(<1)bởi vì chúng tôi đang làm việc với các số nguyên không âm.
nimi

... Ồ, và nếu slà vô nghĩa, thì không cần phải đặt tên cho nó. Gọi trực tiếp:iterate(snd.span ... tail))
nimi

... một lần nữa tôi lại sửa một lỗi trong nhận xét đầu tiên của mình: =<<được sử dụng trong ngữ cảnh hàm, không liệt kê bối cảnh, xin lỗi.
nimi

Rực rỡ! Ngoài ra, đây có phải là quy trình phổ biến ở đây để sử dụng tiện ích mở rộng GHC không? NoMonomorphismRestrictioncũng sẽ để tôi có dđiểm.
Leif Willerts

1
chrordcả hai trong Data.Char, vì vậy bạn không thể bỏ qua import. Cờ trình biên dịch cũng được tính là byte, do đó, NoMonomorphismRestrictiontăng số điểm của bạn thêm 25.
nimi


3

APL (22)

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

Giải trình:

  • ⍵≤9:⍵: nếu ⍵ 9, trả về ⍵ không đổi.
  • ⍎¨⍕⍵: chuyển đổi thành một chuỗi, sau đó đánh giá từng ký tự
  • 2-/: trừ đi mỗi hai số liền kề
  • |: lấy các giá trị tuyệt đối
  • 10⊥: biến mảng thành số cơ sở 10
  • ⍵+∇: gọi hàm đệ quy với giá trị mới này và thêm kết quả vào đầu vào

3

Toán học, 72 69 65 byte

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

Tôi đang mở để đề xuất ở đây.


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

@alephalpha Khái niệm thú vị, tạo thêm số không ...
LegionMammal978

2

JavaScript ES6, 73 byte

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

Điều này sẽ không nhận được bất kỳ ngắn hơn: / Tôi sẽ thử nhiều cách tiếp cận hơn nhưng đây là cách tiếp cận ngắn nhất cho đến nay


Nếu bạn chỉ để nó là một hàm ẩn danh thay vì gán nó cho tnó vẫn hợp lệ và giúp bạn tiết kiệm 2 byte.
Patrick Roberts

@PatrickRoberts có nhưng tôi đang sử dụng đệ quy nên tôi cần đặt tên cho nó
Downgoat

Ồ, bỏ lỡ điều đó, đủ công bằng.
Patrick Roberts

2

JavaScript (ES6), 69

Thử nghiệm chạy đoạn mã dưới đây trong trình duyệt tuân thủ EcmaScript 6 (nhưng không phải Chrome vì nó vẫn không hỗ trợ toán tử lây lan ...) MS Edge có thể?

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>

Thay thế, sử dụng khả năng hiểu mảng hiện được nhắm mục tiêu EcmaScript 2016 (ES7), 67 byte:

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 byte

Tôi đã từng thích những khó regex cho đến khi tôi cố gắng sử dụng nó cho thử thách này ... re.findall('\d\d',s,overlapped=True)không về;)

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)

Chúc mừng @Todd :)


1
Bạn có thể thực hiện bổ sung tại chỗ trên một số nguyên thay vì danh sách sẽ loại bỏ nhu cầu dấu ngoặc vuông và tổng cuối cùng. 'S = p (input ())' sẽ cho phép bạn loại bỏ chuyển đổi int trên vòng lặp while và gán cho x. Ngoài ra, hãy xem xét việc lặp qua zip của g và g [1:] để lưu một số byte.
Todd


0

C 162 byte

đánh gôn

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

vô dụng:

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 byte

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

Kiểm tra nó trực tuyến .

Bị đánh cắp

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

Dưới đây là cốt truyện về sự khác biệt của chuỗi "Tổng số khác biệt của một số" từ f (1) đến f (1m). Chỉ vì tôi thích khác biệt.

Mã lô

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

0

MATLAB (141)(137)

EDIT: 4 byte ít hơn, nhờ @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
  • Điều này đã đánh bại câu trả lời của @LuisMendo nhưng ít nhất tôi có thể giảm thời gian thực hiện, do đó, tôi sẽ cố gắng đa dạng hóa các cách giải quyết vấn đề này.
  • Tôi có thể giảm nó nhiều hơn nhưng vì tôi mất ít thời gian hơn, tôi lãng phí nhiều byte hơn, vì vậy đây là nguyên tắc:

Chương trình đang tổng hợp các chữ số của cùng một hàng trước các chữ số được nội tuyến, điều đó có nghĩa là nó chỉ sử dụng phép chia số nguyên "n / 10" log_10 (n) lần, độ phức tạp là O (N).

Nếu n= a b c d

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

Chương trình của tôi tính toán:

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

Sử dụng:

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

a =

1

 b =

   16098

Bạn có thể tha cho 4 byte bằng cách bỏ qua các tùy chọn ,endcủa functiontuyên bố.
Andras Deak

Vui lòng xem xét sửa đổi ngữ pháp của bài viết của bạn. Tôi không thể hiểu những gì bạn đã nói.
rayryeng - Phục hồi Monica

0

Prolog, 143 byte

Mã số:

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

Giải thích:

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 thực hiện các phép tính chuyển đổi một số thành Chênh lệch số.
r gọi đệ quy q và tổng hợp các kết quả để tìm Tổng số khác biệt.
p là điểm vào. Lấy một số, gọi r và in câu trả lời.

Thí dụ:

>p(8675309).
8898683

Hãy thử trực tuyến tại đây .


0

PHP - 198 byte

<?$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;

Bị đánh cắp

<?
$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 byte

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

sử dụng:

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