Sayının Rakam Fark Toplamını Hesapla


39

8675309 gibi bazı negatif olmayan bir tamsayı almayı ve tüm komşu basamak çiftleri arasındaki farkların mutlak değerlerini hesaplamayı düşünün.

İçin 8675309aldığımız |8-6| = 2, |6-7| = 1, |7-5| = 2, |5-3| = 2, |3-0| = 3, |0-9| = 9. Birlikte bu sonuçlar çekimi başka, daha küçük negatif olmayan bir sayıyı elde edilir: 212239. İşlemi tekrarlamak 11016, o zaman 0115, baştaki sıfırların yazılı olmadığı sözleşmesiyle 115, hangisinin daha fazla azaltılamayacağını 04veya 4hangilerinin azaltılacağını basitleştirir . Tüm bu değerleri toplayarak alıyoruz 8675309 + 212239 + 11016 + 115 + 4 = 8898683.

Rakam Farkı Toplamını (veya DDS) yeni bir sayı oluşturmak için art arda sayı farklarını alıp ardından tüm sayıları orijinaline ekleyerek bu işlem olarak tanımlayalım.

Karşılık gelen DDS dizisindeki ilk 20 değer:

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

Grafik, oldukça meraklı olan ilk 10000 değerleri :

DDS 10000 arsa

Özellikle de 1000 veya 100'e koyarken aynı gözüktüğü için:

DDS 1000 arsa

DDS 100 arsa

(Ben dişçi merdiveni derdim ...)

Meydan okuma

Negatif olmayan bir tamsayı alan ve DDS değerini basan veya veren bir program veya işlev yazın. Örneğin, giriş olsaydı 8675309, çıkış olmalıdır 8898683.

Bayt cinsinden en kısa kod kazanır.


dişçi merdiveni?
Martijn

12
@ MartijnR Diş Hekiminin merdivenleri.
Calvin'in Hobileri

@ Calvin's Hobbies Ortodontistin merdivenleri?
Beta Çürüme

1
@ BetaDecay Diş Hekiminin merdivenleri.
Alex A.

Yanıtlar:


11

Pyth, 17

s.ui.aM-VJjNTtJTQ

Burada deneyin veya Test Suite'i çalıştırın

Açıklama:

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]

Bu hangi dil? Çok kriptik! T_T
15'te

1
@asgs PPCG'ye Hoşgeldiniz :) Pyth olarak adlandırılır, tercüman ve bazı dökümanları Github sayfasında bulabilirsiniz . Bu dilin kullanıcılarının çoğu bu sitede aktiftir, bu nedenle bu konuda sorularınız varsa sohbete veya kendisine özel bir odaya sormaktan çekinmeyin :)
FryAmTheEggman

17

Python 2, 73

Neyse ki, herhangi bir string işlemden kaçınmayı başardım.

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 Cevabı hesaplayan fonksiyondur.


4
Bu kara büyü nedir?
Beta

7
@ BetaDecay Ben buna "matematik" dendiğine inanıyorum.
lirtosiast

Python'u söyleyecek kadar iyi tanımıyorum, ancak geri kalan işlemi her iki terime de tek seferde uygulayabilir misiniz? Yani, (n-n/10)%10aynı şekilde çalışır n%10-n/10%10mıydı? Ya da belki (9*n/10)%10?
Glen O

@GlenO Python'da, %geriye kalan değil gerçek modüllü bir operatördür, bu yüzden işe yaramaz.
feersum 21:15 '

15

Matlab, 101 105 bayt

Onun polyvalyerine önerinizi kullanmanız için @beaker'a teşekkür ederiz base2dec. Bu bana izin verdi

  • 4 bayt tasarruf edin;
  • genelleştirmeyi keyfi bir temele (aşağıya bakın) büyük ölçüde basitleştirin ve 22 baytı kaydedin; ve hepsinden önemlisi,
  • Genel davanın kodunun yanlış olduğunu fark etmeme yardımcı oldu (baştaki sıfırlar kaldırılmıyordu). Kod ve grafikler şimdi doğru.

Kod:

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

Örnek:

>> f(8675309)
ans =
     8898683

Bonus: keyfi temel

Küçük bir genelleme, zorunlu bir sayı tabanı kullanmaya izin verir, mutlaka ondalık değil:

  • 2'den 10'a kadar isteğe bağlı temel, 108 104 bayt

    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
    

    Buna tabanı için sadece kadar çalışır nedeni 10Matlab'ın olmasıdır dec2basefonksiyon kullanımları rakam 0, 1, ..., 9, A, B, ..., ve gelen karakter (ASCII) kodları bir sıçrama var 9etmek A.

  • 2 - 36, 124 146 bayt arasında keyfi temel

    Yukarıda belirtilenlere atlamak 9için Aözel işlem gerekir. Maksimum taban, 36Matlab'ın dec2baseişlevine göredir .

    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
    

Dişhekiminin merdivenlerinde farklı üslerin aranması şöyle:

görüntü tanımını buraya girin görüntü tanımını buraya girin görüntü tanımını buraya girin görüntü tanımını buraya girin görüntü tanımını buraya girin görüntü tanımını buraya girin


1
Bu, yapabileceğim şeydi ... başka bir cevap lol düşünmek için zaman. +1.
rayryeng - Monica

@rayryeng :-) Thanks
Luis Mendo

@ BetaDecay Teşekkürler! :-) Gerçekten çok güzeller
Luis Mendo

11

CJam, 22 21 bayt

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

Bu programın varsayılan olarak izin verilen bir hatayla çıktığını unutmayın .

Java tercümanı ile, STDERR kapatılarak hatalar önlenebilir. Bu kodu CJam yorumlayıcısında çevrimiçi olarak denerseniz , son satırdan önceki tüm çıktıları yoksayın.

Orijinal revizyondaki bir hatayı gösteren @ Sp3000'e teşekkürler.

1 byte'lık golf için @ MartinBüttner'e teşekkürler.

Örnek çalışma

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

Nasıl çalışır

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 tarafından kontrol edildiğinde her zaman truthy olacaktır h. Ancak, bir kez tek basamaklı bir tamsayı olduğumda , 2ewçağrıldığı diziyi kullandıktan sonra bir hata ile başarısız olur. Bu, çıkmadan önce yazdırılan yığında yalnızca istenen sonucu bırakır.


2
7 dakika önce gönderildi: O
Calvin'in Hobileri

10

Labirent , 176 134 127 119 103 97 88 82 79 76 72 bayt

1 byte tasarruf sağladığın ve 2 daha yol kat edebileceği için Sp3000'e teşekkürler.

Bu muhtemelen hala kısaltılabilir, ama hey, Java Matlab Python'u yener ...

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

Çevrimiçi deneyin.

Bu bir hata ile sonlanır ancak hata mesajı STDERR'ye yazılır (bu nedenle TIO'da görmezsiniz).

Uygulama oldukça basit. Mevcut değeri çalışan bir toplama ekleriz. Eğer mevcut değer bundan büyükse 9, üs-10 hanesini (tekrarlanan div-mod ile) hesaplıyoruz ve mutlak farklılıklardan yeni bir sayı oluşturuyoruz. Eğer yaklaşır 9ya da azlarsak, toplamı yazdırırız.

Mevcut sayının rakamları, en üstteki hanenin en üstünde olan yardımcı yığında toplanır.

abs(...)Buradaki fantezi uygulamasının , yeni çözüme kıyasla gülünç bir şekilde karmaşık olduğu ortaya çıktı ... Bunu daha fazla golf oynadığımda güncellenmiş bir açıklama ekleyeceğim.


5

Java - 300 bayt

Golf Sürümü

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 / Tam sürüm

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, Alkış ..
Coder

1
PPCG'ye Hoşgeldiniz! Bu hala çok golf oynayabilir. Ben çok mantık baktım ama henüz: Eğer gerçekten kurtulun ayrı bir (ya da tam programı bu konuda / sınıfı) 2) gerekmez çünkü 1) bir fonksiyonun içine tüm bu çekin staticçekerek sonra s Bunların içinde 3) (a+"")genellikle aynıdır a.toString(), ancak daha kısadır 4) Eğer sadece bir işlevse bir Tarayıcıya ihtiyacınız yok, sadece girdi kadar uzun sürün.
Geobits

2
Örneğin, çalışmaların çoğunu değiştirmeden ve sadece 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;}
kıtlığı

2
@Geobits, bu inanılmaz bir dostum. Code Golf'ta yeniyim, bu yüzden kodlama etkinliğimi artırmaya çalışacağım. Cherrs ..
Kodlayıcı

5

Julia, 81 60 bayt

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

Çevrimiçi deneyin

Feersum ve Glen O sayesinde 21 byte kurtarıldı!


1
Bundan ndigits(n)>1farklı bir sebep var mı n>9?
feersum 20:15

Öneri: int(join(abs(diff(["$n"...]))))9 bayt kaydeder. Geçiş n>9kaydedilmiş başka 9 bayt için feersum tarafından önerildiği gibi. While döngüsünde her iki ödevi bir adımda gerçekleştirerek üç bayttan tasarruf edin (ve fazladan, artık gereksiz noktalı virgülleri kaldırarak):n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)
Glen O

@feersum Um, hayır. Teşekkürler!
Alex A.

@GlenO Awesome, teşekkürler!
Alex A.

5

OK , 37 32 24 23 bayt

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

Eylemde:

  +/(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, "kodlama" ve "kod çözme", temel dönüşüm gerçekleştirebilen, buna uygun olan birkaç özelliğe sahiptir, her bir çift ( ':), bir listedeki sıralı öğeleri çiftler ve sabit nokta taraması ( \), duruncaya kadar yinelenen diziyi üretebilir. değiştirme. İlkel bir eksikliği olsa da, abs()bazı çirkin kitlelere yol açar {(x;-x)x<0}'.

Düzenle:

Bunun yerine {(x;-x)x<0}'(biraz israfla) dizinin karesinin karekökünü alabilirim ( {%x*x}5 bayttan tasarruf edebilirim).

Düzenleme 2:

@Maurinus'un APL çözümünden esinlenerek, "decode" ( ((#$x)#10)\x) ifadesini, sayının karakter dizisinin her karakterini değerlendirerek değiştirebilirim..:'$x ! Bu aynı zamanda, tüm karakterlerin gizli bir biçimini kullanmama ve ek karakterler kaydetmeme izin veriyor.


4

Python 2, 87 bayt

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

Sürekli olarak mevcut numarayı ekler ve rakam farklılıklarını alır. Sayılar ve dizgiler arasında dönüştürme çok. Muhtemelen geliştirilebilir.


4

Julia, 55 48 bayt

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

Temel olarak bu, tek basamaklı seviyeye geri çekilir (burada hiçbir rakam farkının yapılamadığı), daha sonra tekrarlamadan çıktıkça, seviye seviyesine kadar toplanır.


3

Haskell, 140 bayt

d işi yapar.

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

Uzun dönüştürme işlevlerini içe aktarmanın nasıl önleneceğini bilen var mı?


intToDigitolduğu toEnum.(+48)ve digitToIntbir (\i->fromEnum i-48). Ayrıca açabilirsiniz sile pointfree sürümüne =<<liste bağlamında: s=snd.span(==0).m abs.(zipWith(-)=<<tail). Son olarak, (==0)bir (<1)biz negatif olmayan tamsayılar ile çalışıyoruz çünkü.
nimi,

... oh, ve eğer spuansız ise , bir isim vermenize gerek yok. Doğrudan arayın:iterate(snd.span ... tail))
nimi

... ilk yorumumdaki bir hatayı düzeltmek için yine benim: =<<fonksiyon bağlamında kullanılır, liste bağlamında değil, üzgünüm.
nimi

Parlak! Ayrıca, burada GHC uzantılarını kullanmak yaygın bir prosedür mü? NoMonomorphismRestrictionBana da dpuansız sahip olacağım.
Leif Willerts,

1
chrve ordikisi de Data.Chariçeride olduğu için ihmal edemezsiniz import. Derleyici bayrakları bayt olarak sayılır de öyle NoMonomorphismRestriction25'e puanınızı artırır
nimi


3

APL (22)

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

Açıklama:

  • ⍵≤9:⍵: ⍵ ≤ 9 ise, ⍵ değişmeden geri dönün.
  • ⍎¨⍕⍵: bir dizgeye ⍵ dönüştürmek, sonra her karakteri değerlendirmek
  • 2-/: her iki bitişik sayıyı çıkar
  • |: mutlak değerleri al
  • 10⊥: diziyi 10 numaraya dönüştürün
  • ⍵+∇: Fonksiyonu tekrar tekrar bu yeni değerle çağırın ve sonucu girişe ekleyin.

3

Mathematica, 72 69 65 bayt

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

Burada önerilere açığım.


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

@alephalpha İlginç bir konsept, fazladan sıfırlar ...
LegionMammal978

2

JavaScript ES6, 73 bayt

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

Bu daha kısa sürmüyor: / Daha fazla yaklaşım deneyeceğim ancak bu şimdiye kadarki en kısa


Bunu sadece atamak yerine adsız bir işlev olarak bırakırsanız, tyine de geçerlidir ve size 2 bayt kazandırır.
Patrick Roberts

Ben Adını gerek yani evet @PatrickRoberts ama özyinelemeye kullanıyorum
Downgoat

Ah, kaçırdım, yeterince adil.
Patrick Roberts

2

JavaScript (ES6), 69

Aşağıdaki parçacığı EcmaScript 6 uyumlu bir tarayıcıda çalıştırmayı test edin (ancak forma operatörünü desteklemediğinden Chrome'da değil ...) MS Edge belki?

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, şimdi EcmaScript 2016 (ES7), 67 bayt'ı hedef alan dizi anlama özelliğini kullanarak :

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 bayt

Bu meydan okuma için kullanmaya çalıştığı kadar regex darlığı severdim ... re.findall('\d\d',s,overlapped=True)olduğu değil on;)

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)

Şerefe @Todd :)


1
Köşeli parantez ve son toplamı ortadan kaldıracak bir tamsayı yerine bir tamsayı ek yerinde gerçekleştirebilirsiniz. 's = p (input ())', while döngüsü üzerindeki int dönüşümünü kaldırmanıza ve x'e atamanıza izin verir. Ayrıca, bazı baytları kurtarması gereken g ve g [1:] zip'leri arasında dolaşmayı da düşünün.
Todd,

1

J, 70 bayt

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

0

C 162 bayt

golfed:

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 Bayt

kod

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

Çevrimiçi olarak test edin .

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

İşte "Sayının Rakam Fark Toplamı" serisinin f (1) ile f (1m) arasındaki farkın grafiği. Sırf farketmeyi sevdiğim için.

Arsa kodu

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

0

MATLAB (141)(137)

EDIT: 4 byte daha az, @Andras sayesinde

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
  • Bu doest @ LouisMendo'nun cevabını yendi ancak en azından bu sorunu çözmenin yollarını çeşitlendirmeye çalışacağım yürütme süresini azaltabilirdim.
  • Daha fazla azaltabilirim ama daha az zaman harcadığım için daha fazla bayt harcıyorum, işte burada ilke:

Program aynı satırdaki basamakları satır içi rakamlardan önce toplamaktadır, bunun anlamı "n / 10" log_10 (n) tamsayı bölümünü kullanması, sadece karmaşıklığın O (N) olmasıdır.

Eğer n= a b c d

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

Programım hesaplar:

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

Kullanımı:

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

a =

1

 b =

   16098

İsteğe bağlı atlanması ile 4 bayt ayırabilirim ,endait functionbeyanı.
Andras Deak

Lütfen gönderinizin dilbilgisini gözden geçirmeyi düşünün. Ne dediğini tam olarak anlayamıyorum.
rayryeng - Monica

0

Prolog, 143 bayt

Kod:

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

Açıklaması:

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 , bir sayıyı Rakam Farkına dönüştüren hesaplamaları yapar.
r, yinelemeli aramaları q ve sonuçlar özetliyor Rakam Fark Miktar bulmak.
p , giriş noktasıdır. Bir numara alır, r'yi arar ve cevabı yazdırır.

Örnek:

>p(8675309).
8898683

Burada çevrimiçi deneyin .


0

PHP - 198 bayt

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.