Zastanów się nad wzięciem nieujemnej liczby całkowitej, takiej jak 8675309 i obliczeniem wartości bezwzględnych różnic między wszystkimi parami sąsiednich cyfr.
Dla 8675309
mamy |8-6| = 2
, |6-7| = 1
, |7-5| = 2
, |5-3| = 2
, |3-0| = 3
, |0-9| = 9
. Sznurka wyniki te razem daje inny, mniejszy nieujemną liczbę całkowitą: 212239
. Powtórzenie tego procesu daje 11016
zatem 0115
, że zgodnie z konwencją, że wiodące zera nie są zapisywane, upraszcza as 115
, który staje się 04
lub 4
którego nie można już dalej zmniejszać. Podsumowując wszystkie te wartości, otrzymujemy 8675309 + 212239 + 11016 + 115 + 4 = 8898683
.
Zdefiniujmy różnicę cyfr różnicowych (lub DDS) jako tę operację polegającą na wielokrotnym przyjmowaniu różnic liczbowych liczby w celu utworzenia nowej liczby, a następnie dodawaniu wszystkich uzyskanych liczb do oryginału.
Oto pierwsze 20 wartości w odpowiedniej sekwencji 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
Oto pierwsze 10000 wartości , których wykres jest dość ciekawy:
Zwłaszcza, że wygląda tak samo, gdy wydrukujesz go na 1000, a nawet 100:
(Nazwałbym to schodami dentysty ...)
Wyzwanie
Napisz program lub funkcję, która przyjmuje nieujemną liczbę całkowitą i drukuje lub zwraca jej wartość DDS. Na przykład, jeśli wejście było 8675309
, wyjście powinno być 8898683
.
Najkrótszy kod w bajtach wygrywa.
źródło
Odpowiedzi:
Pyth, 17 lat
Wypróbuj tutaj lub uruchom pakiet testowy
Wyjaśnienie:
źródło
Python 2, 73
Na szczęście udało mi się uniknąć jakichkolwiek operacji na łańcuchach.
g
to funkcja, która oblicza odpowiedź.źródło
(n-n/10)%10
działałoby to tak samo jakn%10-n/10%10
? A może nawet(9*n/10)%10
?%
jest prawdziwym operatorem modułu, a nie resztą, więc to nie zadziała.Matlab, 101
105bajtówBardzo dziękuję @beaker za jego sugestię użycia
polyval
zamiast tegobase2dec
. To mi pozwoliłoKod:
Przykład:
Bonus: dowolna podstawa
Niewielkie uogólnienie pozwala na użycie dowolnej liczby liczbowej, niekoniecznie dziesiętnej:
Podstawa arbitralna od 2 do 10,
108104 bajtówPowodem, dlaczego to działa tylko na bazie maksymalnie
10
jest to, że MATLAB jestdec2base
użycie funkcji cyfry0
,1
, ...,9
,A
,B
, ..., a tam skok znaków (ASCII) kody od9
doA
.Podstawa arbitralna od 2 do 36, 124
146bajtówSkok ze
9
doA
której mowa powyżej wymaga specjalnego traktowania. Maksymalna podstawa jest36
zgodna zdec2base
funkcją Matlaba .W ten sposób schody dentysty szukają różnych podstaw:
źródło
CJam,
2221 bajtówPamiętaj, że ten program kończy działanie z błędem, który jest domyślnie dozwolony .
Za pomocą interpretera Java błędy można stłumić, zamykając STDERR. Jeśli wypróbujesz ten kod online w interpretatorze CJam , zignoruj wszystkie dane wyjściowe przed ostatnim wierszem.
Dzięki @ Sp3000 za wskazanie błędu w oryginalnej wersji.
Dzięki @ MartinBüttner za grę w golfa na 1 bajcie.
Przykładowy przebieg
Jak to działa
A zawsze będzie zgodne z prawdą, gdy zostanie sprawdzone przez
h
. Jednak gdy będę jednocyfrową liczbą całkowitą,2ew
zakończy się niepowodzeniem z błędem po zużyciu tablicy, do której został wywołany. Pozostawia to tylko pożądany wynik na stosie, który jest drukowany przed wyjściem.źródło
Labirynt ,
176134127119103978882797672 bajtyDzięki Sp3000 za oszczędność 1 bajtu i torowanie drogi dla 2 kolejnych.
Prawdopodobnie można to jeszcze skrócić, ale hej, to bije
JavaMatlabPython ...Wypróbuj online.
To kończy się błędem, ale komunikat o błędzie jest zapisywany w STDERR (dlatego nie widzisz go w TIO).
Wdrożenie jest dość proste. Dodajemy bieżącą wartość do bieżącej sumy. Jeśli bieżąca wartość była większa niż
9
, obliczamy jej 10-cyfrowe cyfry (za pomocą powtarzanego div-mod) i tworzymy nową liczbę z różnic bezwzględnych. Jeśli dojdziemy do9
lub mniej, drukujemy bieżącą sumę.Cyfry bieżącego numeru są gromadzone na stosie pomocniczym, z najbardziej znaczącą cyfrą na górze.
Cóż, fantazyjna implementacja
abs(...)
, którą tu miałem, okazała się absurdalnie skomplikowana w porównaniu do nowego rozwiązania ... Dodam zaktualizowane wyjaśnienie, kiedy skończę grać w golfa.źródło
Java - 300 bajtów
Wersja golfowa
Wersja bez golfa / pełna
źródło
static
s po pociągnięciu w 3)(a+"")
jest na ogół taki sama.toString()
, ale krótszy 4) Nie potrzebujesz skanera, jeśli jest to tylko funkcja, po prostu zajmij chwilę.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;}
Julia,
8160 bajtówNie golfowany:
Wypróbuj online
Zaoszczędzono 21 bajtów dzięki feersum i Glen O!
źródło
ndigits(n)>1
jest inny niżn>9
?int(join(abs(diff(["$n"...]))))
oszczędza 9 bajtów. Przełącz nan>9
zgodnie z sugestią feersum dla kolejnych 9 zapisanych bajtów. Zaoszczędź jeszcze trzy bajty, wykonując oba przypisania w pętli while w jednym kroku (i usuwając dodatkowy, teraz niepotrzebny średnik):n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)
ok ,
37322423 bajtówW akcji:
K5 ma kilka cech, które dobrze do tego nadają - „kodowanie” i „dekodowanie” może przeprowadzać konwersję zasad, każda para (
':
) paruje elementy sekwencyjne na liście, a skanowanie z ustalonym punktem (\
) może tworzyć sekwencję iterowaną aż do zatrzymania wymiana pieniędzy. Jednak brak prymitywuabs()
prowadzi do jakiejś nieestetycznej masy w postaci{(x;-x)x<0}'
.Edytować:
Zamiast tego
{(x;-x)x<0}'
mogę (nieco marnotrawić) wziąć pierwiastek kwadratowy z sekwencji ({%x*x}
oszczędzając 5 bajtów.Edycja 2:
Zainspirowany rozwiązaniem APL @maurinus, mogę zastąpić „dekodowanie” (
((#$x)#10)\x
) oceną każdego znaku reprezentującego ciąg liczbowy.:'$x
! Pozwala mi to również na użycie milczącej formy całego wyrażenia, oszczędzając dodatkowe znaki.źródło
Python 2, 87 bajtów
Rekurencyjnie dodaje bieżący numer i przyjmuje różnice cyfr. Dużo konwersji liczb i ciągów. Prawdopodobnie można to poprawić.
źródło
Julia,
5548 bajtówNie golfowany:
Zasadniczo, to powraca do poziomu jednocyfrowego (gdzie nie można wykonać różnicy cyfr), a następnie sumuje się, gdy opuszcza rekurencję, poziom po poziomie.
źródło
Haskell, 140 bajtów
d
wykonuje pracę.Czy ktoś wie, jak uniknąć importowania długich funkcji konwersji?
źródło
intToDigit
jesttoEnum.(+48)
idigitToInt
jest(\i->fromEnum i-48)
. Można również włączyćs
do wersji z pointfree=<<
w kontekście listy:s=snd.span(==0).m abs.(zipWith(-)=<<tail)
. Wreszcie(==0)
jest(<1)
, ponieważ pracujemy z nieujemnych liczb całkowitych.s
ma sensu, nie trzeba nadawać jej nazwy. Nazwij to bezpośrednio:iterate(snd.span ... tail))
=<<
jest używany w kontekście funkcji, a nie w kontekście listy, przepraszam.NoMonomorphismRestriction
pozwolę też miećd
bezcelowe.chr
iord
oba są włączoneData.Char
, więc nie można pominąćimport
. Flagi kompilatora są również liczone jako bajty, więcNoMonomorphismRestriction
zwiększa twój wynik o 25.K5, 50 bajtów
źródło
APL (22)
Wyjaśnienie:
⍵≤9:⍵
: jeśli ⍵ ≤ 9, zwróć ⍵ bez zmian.⍎¨⍕⍵
: zamień ⍵ na ciąg, a następnie oceń każdy znak2-/
: odejmuj co dwie sąsiednie liczby|
: weź wartości bezwzględne10⊥
: zamień tablicę na liczbę podstawową 10⍵+∇
: wywołaj funkcję rekurencyjnie z tą nową wartością i dodaj wynik do wejściaźródło
Mathematica,
726965 bajtówJestem otwarty na sugestie tutaj.
źródło
Tr@FixedPointList[FromDigits@*Abs@*Differences@*IntegerDigits,#]&
JavaScript ES6, 73 bajty
To nie jest coraz krótsze: / Spróbuję więcej podejść, ale jak dotąd jest to najkrótszy
źródło
t
niej, nadal będzie ważna i pozwoli Ci zaoszczędzić 2 bajty.JavaScript (ES6), 69
Testować uruchomienie poniższego fragmentu w przeglądarce zgodnej z EcmaScript 6 (ale nie w Chrome, ponieważ nadal nie obsługuje on operatora rozprzestrzeniania
...
) Może MS Edge?Alternatywnie, przy użyciu rozumienia tablic, które jest obecnie ukierunkowane na EcmaScript 2016 (ES7), 67 bajtów:
źródło
Python 3, 125 bajtów
Kiedyś lubiłem brak wyrażenia regularnego, dopóki nie próbowałem go użyć do tego wyzwania ... nie
re.findall('\d\d',s,overlapped=True)
jest włączony;)Pozdrawiam @Todd :)
źródło
J, 70 bajtów
źródło
C 162 bajty
grał w golfa:
bez golfa:
źródło
R, 134 bajtów
Kod
Przetestuj online .
Bez golfa
Oto wykres różnicy serii „Suma różnic cyfr” od f (1) do f (1m). Tylko dlatego, że lubię się różnić.
Kod działki
źródło
MATLAB
(141)(137)Program sumuje cyfry tego samego wiersza przed cyframi wstawionymi, co oznacza, że używał tylko dzielenia liczb całkowitych „n / 10” log_10 (n) razy, złożoność wynosi O (N).
Jeśli
n= a b c d
Mój program oblicza:
Stosowanie:
a =
1
źródło
,end
zfunction
oświadczeniem.Prolog, 143 bajty
Kod:
Wyjaśniono:
q wykonuje obliczenia, które konwertują liczbę na różnicę cyfr.
r rekurencyjnie wywołuje q i podsumowuje wyniki, aby znaleźć sumę różnicy cyfr.
p jest punktem wejścia. Pobiera numer, dzwoni r i drukuje odpowiedź.
Przykład:
Wypróbuj online tutaj .
źródło
PHP - 198 bajtów
Bez golfa
źródło
Perl 6 , 56 bajtów
stosowanie:
źródło