Hitung Jumlah Selisih Digit dari suatu Angka

39

Pertimbangkan mengambil bilangan bulat non-negatif seperti 8675309 dan menghitung nilai absolut dari perbedaan antara semua pasangan angka tetangga.

Untuk 8675309kita |8-6| = 2, |6-7| = 1, |7-5| = 2, |5-3| = 2, |3-0| = 3, |0-9| = 9. Merangkai hasil ini bersama-sama menghasilkan, integer lain yang lebih kecil non-negatif: 212239. Mengulangi proses memberi 11016, kemudian 0115, yang oleh konvensi bahwa nol depan tidak ditulis menyederhanakan 115, menjadi 04atau 4yang tidak dapat direduksi lebih jauh. Dengan merangkum semua nilai ini, kita dapatkan 8675309 + 212239 + 11016 + 115 + 4 = 8898683.

Mari kita definisikan Digit Difference Sum (atau DDS) sebagai operasi berulang-ulang mengambil perbedaan digit angka untuk membentuk angka baru, lalu menambahkan semua angka yang dihasilkan ke aslinya.

Berikut adalah 20 nilai pertama dalam urutan DDS yang sesuai:

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

Berikut adalah nilai 10000 pertama , grafik yang cukup aneh:

DDS 10.000 plot

Terutama karena tampilannya sama ketika Anda merencanakannya menjadi 1000 atau bahkan 100:

DDS 1000 plot

DDS 100 plot

(Saya akan menyebutnya tangga dokter gigi ...)

Tantangan

Tulis program atau fungsi yang menggunakan bilangan bulat non-negatif dan mencetak atau mengembalikan nilai DDS-nya. Misalnya, jika inputnya adalah 8675309, output seharusnya 8898683.

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
tangga dokter gigi?
Martijn
12
@MartijnR Tangga dokter gigi.
Calvin Hobbies
@ Tangga Calo Ortodontis dari Hobi?
Beta Decay
1
Tangga Dokter Gigi @BetaDecay .
Alex A.

Jawaban:

11

Pyth, 17

s.ui.aM-VJjNTtJTQ

Cobalah di sini atau jalankan Test Suite

Penjelasan:

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]
FryAmTheEggman
sumber
Bahasa apa ini? Sangat samar! T_T
asgs
1
@ asgs Selamat datang di PPCG :) Ini disebut Pyth, Anda dapat menemukan penerjemah dan beberapa dokumentasi di halaman Github -nya . Sebagian besar pengguna bahasa ini aktif di situs ini, jadi jika Anda memiliki pertanyaan tentang hal itu jangan ragu untuk bertanya dalam obrolan atau ruangan yang didedikasikan untuk itu :)
FryAmTheEggman
17

Python 2, 73

Untungnya, saya berhasil menghindari operasi string.

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 adalah fungsi yang menghitung jawabannya.

feersum
sumber
4
Apa ini ilmu hitam ?!
Beta Decay
7
@ BetaDecay saya percaya ini disebut "matematika".
lirtosiast
Saya tidak tahu cukup baik untuk mengatakan Python, tetapi bisakah Anda menerapkan operasi sisanya untuk kedua istilah dalam satu pukulan? Artinya, apakah akan (n-n/10)%10beroperasi sama dengan n%10-n/10%10? Atau bahkan mungkin (9*n/10)%10?
Glen O
@ GlenO Dalam Python, %adalah operator modulus sejati, bukan sisanya, sehingga tidak akan berfungsi.
feersum
15

Matlab, 101 105 byte

Terima kasih banyak kepada @beaker atas sarannya untuk digunakan polyvalsebagai gantinya base2dec. Itu memungkinkan saya untuk melakukannya

  • simpan 4 byte;
  • sangat menyederhanakan generalisasi ke basis sewenang-wenang (lihat di bawah) dan menyimpan 22 byte di sana; dan yang terpenting,
  • membantu saya menyadari bahwa kode untuk kasus umum salah (angka nol di depannya tidak dihapus). Kode dan grafik sudah benar sekarang.

Kode:

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

Contoh:

>> f(8675309)
ans =
     8898683

Bonus: basis sewenang-wenang

Generalisasi kecil memungkinkan seseorang untuk menggunakan basis angka arbitrer, tidak harus desimal:

  • Basis sewenang-wenang dari 2 hingga 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
    

    Alasan mengapa ini bekerja hanya untuk dasar hingga 10adalah bahwa Matlab dec2basemenggunakan fungsi digit 0, 1, ..., 9, A, B, ..., dan ada lonjakan karakter (ASCII) kode dari 9ke A.

  • Basis sewenang-wenang dari 2 hingga 36, 124 146 byte

    Lompatan dari 9ke yang Adisebutkan di atas membutuhkan perawatan khusus. Basis maksimum adalah 36sesuai dec2basefungsi 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
    

Beginilah cara tangga dokter gigi mencari pangkalan yang berbeda:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Luis Mendo
sumber
1
Inilah yang akan saya lakukan ... waktu untuk memikirkan jawaban lain lol. +1.
rayryeng
@rayryeng :-) Terima kasih
Luis Mendo
@BetaDecay Terima kasih! :-) Mereka memang cantik
Luis Mendo
11

CJam, 22 21 byte

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

Perhatikan bahwa program ini keluar dengan kesalahan, yang diizinkan secara default .

Dengan Java interpreter, kesalahan dapat ditekan dengan menutup STDERR. Jika Anda mencoba kode ini secara online di interpreter CJam , abaikan semua output sebelum baris terakhir.

Terima kasih kepada @ Sp3000 karena menunjukkan kesalahan dalam revisi asli.

Terima kasih kepada @ MartinBüttner untuk bermain golf 1 byte.

Contoh dijalankan

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

Bagaimana itu bekerja

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 akan selalu benar saat diperiksa oleh h. Namun, begitu saya adalah bilangan bulat satu digit, 2ewakan gagal dengan kesalahan setelah mengkonsumsi array yang dipanggil. Ini hanya menyisakan hasil yang diinginkan pada tumpukan, yang dicetak sebelum keluar.

Dennis
sumber
2
Diposting dalam 7 menit rata: O
Hobbies Calvin
10

Labyrinth , 176 134 127 119 103 97 88 82 79 76 72 byte

Terima kasih kepada Sp3000 untuk menghemat 1 byte dan membuka jalan untuk 2 lebih.

Ini mungkin masih bisa disingkat, tapi hei, itu mengalahkan Java Matlab Python ...

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

Cobalah online.

Ini berakhir dengan kesalahan tetapi pesan kesalahan ditulis ke STDERR (itulah sebabnya Anda tidak melihatnya di TIO).

Implementasinya cukup mudah. Kami menambahkan nilai saat ini ke total berjalan. Jika nilai saat ini lebih besar dari 9, kami menghitung basis-10 digitnya (melalui div-mod yang diulang), dan membentuk angka baru dari perbedaan absolut. Jika kita sampai 9atau kurang, kita mencetak total yang berjalan.

Angka-angka dari angka saat ini dikumpulkan pada tumpukan tambahan dengan angka paling signifikan di atas.

Yah, implementasi mewah dari abs(...)saya di sini ternyata sangat rumit dibandingkan dengan solusi baru ... Saya akan menambahkan penjelasan yang diperbarui ketika saya selesai bermain golf ini lebih jauh.

Martin Ender
sumber
5

Java - 300 byte

Versi Golf

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

Tidak lengkap / Versi lengkap

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();
    }
}
Sang Coder
sumber
@Loovjo, Cheers ..
The Coder
1
Selamat datang di PPCG! Ini masih bisa bermain golf banyak. Saya belum banyak melihat logikanya tetapi: 1) Tarik semua ini ke dalam satu fungsi karena Anda tidak benar-benar membutuhkan yang terpisah (atau program / kelas penuh dalam hal ini) 2) Singkirkan statics setelah menarik mereka dalam 3) (a+"")umumnya sama dengan a.toString(), tetapi lebih pendek 4) Anda tidak perlu Scanner jika itu hanya sebuah fungsi, cukup lama selama input.
Geobits
2
Sebagai contoh, tanpa mengubah banyak pekerjaan, dan hanya menghapus cruft, itu sekitar 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, itu teman yang luar biasa. Saya baru mengenal Code Golf, jadi saya akan mencoba meningkatkan efisiensi codign saya. Cherrs ..
The Coder
5

Julia, 81 60 byte

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

Tidak Disatukan:

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

Cobalah online

Disimpan 21 byte berkat feersum dan Glen O!

Alex A.
sumber
1
Apakah ada alasan ndigits(n)>1yang berbeda n>9?
feersum
Saran: int(join(abs(diff(["$n"...]))))menghemat 9 byte. Alihkan ke n>9seperti yang disarankan oleh feersum untuk 9 byte lainnya yang disimpan. Simpan tiga byte lagi dengan melakukan kedua penugasan dalam loop sementara dalam satu langkah (dan menghapus titik koma, yang sekarang tidak perlu):n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)
Glen O
@feersum Um, tidak. Terima kasih!
Alex A.
@ GlenO Luar Biasa, terima kasih!
Alex A.
5

OK , 37 32 24 23 byte

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

Beraksi:

  +/(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 memiliki beberapa fitur yang cocok untuk ini- "encode" dan "decode" dapat melakukan konversi basis, masing-masing pasangan ( ':) memasangkan elemen berurutan dalam daftar dan pemindaian titik tetap ( \) dapat menghasilkan urutan iterated sampai berhenti berubah. Kurangnya primitif abs()mengarah ke beberapa massal tak sedap dipandang dalam bentuk {(x;-x)x<0}', meskipun.

Edit:

Alih-alih {(x;-x)x<0}', saya dapat (agak boros) mengambil akar kuadrat dari urutan (( {%x*x}menghemat 5 byte).

Edit 2:

Terinspirasi oleh solusi APL @maurinus, saya dapat mengganti "decode" ( ((#$x)#10)\x) dengan mengevaluasi setiap karakter representasi string dari angka- .:'$x! Ini juga memungkinkan saya menggunakan bentuk diam-diam dari seluruh ekspresi, menyimpan karakter tambahan.

JohnE
sumber
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:]))))

Secara rekursif menambahkan nomor saat ini dan mengambil perbedaan digit. Banyak konversi antara angka dan string. Mungkin bisa diperbaiki.

Tidak
sumber
4

Julia, 55 48 byte

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

Tidak Disatukan:

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

Pada dasarnya, ini berulang hingga ke level satu digit (di mana tidak ada perbedaan digit yang dapat dilakukan), kemudian menjumlahkan kembali saat keluar dari rekursi, level demi level.

Glen O
sumber
3

Haskell, 140 byte

d melakukan pekerjaan.

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

Adakah yang tahu cara menghindari impor fungsi konversi yang lama?

Leif Willerts
sumber
intToDigitadalah toEnum.(+48)dan digitToIntsekarang (\i->fromEnum i-48). Anda juga dapat mengubah ske versi pointfree dengan =<<dalam konteks daftar: s=snd.span(==0).m abs.(zipWith(-)=<<tail). Akhirnya, (==0)adalah (<1), karena kami bekerja dengan bilangan bulat non-negatif.
nimi
... oh, dan jika spointfree, tidak perlu memberi nama. Sebut saja secara langsung:iterate(snd.span ... tail))
nimi
... ini saya lagi untuk memperbaiki kesalahan dalam komentar pertama saya: =<<digunakan dalam konteks fungsi, bukan konteks daftar, maaf.
nimi
Cemerlang! Juga, apakah ini prosedur umum di sini untuk menggunakan ekstensi GHC? NoMonomorphismRestrictionakan membiarkan saya memiliki dpointfree juga.
Leif Willerts
1
chrdan ordkeduanya masuk Data.Char, sehingga Anda tidak dapat menghilangkan import. Bendera kompiler juga dihitung sebagai byte, jadi NoMonomorphismRestrictiontambah skor Anda hingga 25.
nimi
3

K5, 50 byte

+/{(r;x)@~r:.,/"0",{$(0;-r;r)@(~^r)+0<r:x-y}':$x}\
kirbyfan64sos
sumber
3

APL (22)

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

Penjelasan:

  • ⍵≤9:⍵: jika ⍵ ≤ 9, kembali ⍵ tidak berubah.
  • ⍎¨⍕⍵: konversikan ⍵ menjadi string, lalu evaluasi setiap karakter
  • 2-/: kurangi setiap dua angka yang berdekatan
  • |: ambil nilai absolut
  • 10⊥: ubah array menjadi angka dasar-10
  • ⍵+∇: panggil fungsi secara rekursif dengan nilai baru ini, dan tambahkan hasilnya ke input
marinus
sumber
3

Mathematica, 72 69 65 byte

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

Saya terbuka untuk saran di sini.

LegionMammal978
sumber
Tr@FixedPointList[FromDigits@*Abs@*Differences@*IntegerDigits,#]&
alephalpha
@alephalpha Konsep yang menarik, menciptakan angka nol ekstra ...
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)))

Ini tidak semakin pendek: / Saya akan mencoba lebih banyak pendekatan tapi ini yang terpendek sejauh ini

Downgoat
sumber
Jika Anda membiarkannya sebagai fungsi anonim alih-alih menugaskannya tmasih valid dan menghemat 2 byte.
Patrick Roberts
@ Patrickrickober ya tapi saya menggunakan rekursi jadi saya harus menyebutkannya
Downgoat
Oh, merindukan itu, cukup adil.
Patrick Roberts
2

JavaScript (ES6), 69

Tes menjalankan cuplikan di bawah ini di peramban yang mendukung EcmaScript 6 (tapi bukan Chrome karena masih tidak mendukung operator penyebaran ...) MS Edge mungkin?

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>

Alternatif, menggunakan pemahaman array yang sekarang ditargetkan 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))
edc65
sumber
2

Python 3, 125 byte

Aku dulu seperti sesak regex sampai saya mencoba untuk menggunakannya untuk tantangan ini ... re.findall('\d\d',s,overlapped=True)adalah tidak pada;)

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)

Ceria @Todd :)

Peluruhan Beta
sumber
1
Anda dapat melakukan penambahan inplace pada bilangan bulat bukan daftar yang akan menghapus kebutuhan untuk tanda kurung siku dan jumlah akhir. 's = p (input ())' akan memungkinkan Anda menghapus konversi int pada loop while dan penugasan ke x. Pertimbangkan juga perulangan melalui zip g dan g [1:] yang akan menghemat beberapa byte.
Todd
1

J, 70 byte

 +/([:10&#.[:(2|@:-/\])[:10&(]#:~[#~[:>.[^.])])`]@.(11&>)^:a:".(1!:1)3
protista
sumber
0

C 162 byte

golf:

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);
}
Zaibis
sumber
0

R, 134 Bytes

Kode

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

Uji secara online .

Tidak disatukan

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

Berikut adalah plot perbedaan dari seri "Digit Difference Sum of a Number" dari f (1) hingga f (1m). Hanya karena saya suka beda.

Kode plot

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

MATLAB (141)(137)

Sunting : kurang 4 byte, terima kasih kepada @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
  • Doest ini mengalahkan jawaban @LuisMendo tetapi setidaknya saya dapat mengurangi waktu eksekusi, yang oleh, saya hanya akan mencoba melakukan diversifikasi cara untuk mengatasi masalah ini.
  • Saya bisa mengurangi lebih banyak tetapi karena saya pergi untuk waktu yang lebih sedikit, saya buang lebih banyak byte, jadi di sini adalah prinsipnya:

Program ini merangkum digit dari baris yang sama sebelum digit yang digarisbawahi, itu berarti ia menggunakan pembagian integer "n / 10" log_10 (n) kali saja, kompleksitasnya adalah O (N).

Jika n= a b c d

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

Program saya menghitung:

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

Pemakaian:

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

a =

1

 b =

   16098
Abr001am
sumber
Anda bisa meluangkan 4 byte dengan menghilangkan opsional ,enddari functiondeklarasi.
Andras Deak
Harap pertimbangkan untuk merevisi tata bahasa pos Anda. Saya tidak mengerti apa yang Anda katakan.
rayryeng
0

Prolog, 143 byte

Kode:

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

Dijelaskan:

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 melakukan perhitungan yang mengubah angka menjadi Perbedaan Digitnya.
r secara rekursif memanggil q dan merangkum hasilnya untuk menemukan Jumlah Perbedaan Digit.
p adalah titik masuk. Mengambil nomor, memanggil r dan mencetak jawabannya.

Contoh:

>p(8675309).
8898683

Cobalah online di sini .

Emigna
sumber
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;

Tidak disatukan

<?
$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;
tidak terdefinisi
sumber
0

Perl 6 , 56 byte

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

pemakaian:

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
Brad Gilbert b2gills
sumber