Nehmen Sie eine nicht negative Ganzzahl wie 8675309 und berechnen Sie die absoluten Werte der Differenzen zwischen allen Paaren benachbarter Ziffern.
Für 8675309
wir bekommen |8-6| = 2
, |6-7| = 1
, |7-5| = 2
, |5-3| = 2
, |3-0| = 3
, |0-9| = 9
. Diese Ergebnisse zusammen Bespannen liefert eine weitere, kleinere nicht-negative ganze Zahl ist : 212239
. Das Wiederholen des Vorgangs ergibt 11016
dann 0115
, was durch die Konvention, dass führende Nullen nicht geschrieben werden, vereinfacht wird, wie 115
, was wird 04
oder 4
was nicht weiter reduziert werden kann. Wenn wir all diese Werte zusammenfassen, erhalten wir 8675309 + 212239 + 11016 + 115 + 4 = 8898683
.
Definieren wir die Zifferndifferenzsumme (DDS) als diesen Vorgang, bei dem die Zifferndifferenzen einer Zahl wiederholt werden, um eine neue Zahl zu bilden, und dann alle resultierenden Zahlen zum Original hinzugefügt werden.
Hier sind die ersten 20 Werte in der entsprechenden DDS-Sequenz:
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
Hier sind die ersten 10000 Werte , für die die Grafik recht merkwürdig ist:
Zumal es beim Plotten auf 1000 oder sogar 100 gleich aussieht:
(Ich würde es die Treppe des Zahnarztes nennen ...)
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine nicht negative Ganzzahl einliest und deren DDS-Wert ausgibt oder zurückgibt. Wenn zum Beispiel die Eingabe war 8675309
, sollte die Ausgabe sein 8898683
.
Der kürzeste Code in Bytes gewinnt.
quelle
Antworten:
Pyth, 17
Probieren Sie es hier aus oder starten Sie die Test Suite
Erläuterung:
quelle
Python 2, 73
Zum Glück habe ich es geschafft, String-Operationen zu vermeiden.
g
ist die Funktion, die die Antwort berechnet.quelle
(n-n/10)%10
genauso funktionieren wien%10-n/10%10
? Oder vielleicht sogar(9*n/10)%10
?%
ist es ein echter Modul-Operator, kein Rest, das würde also nicht funktionieren.Matlab, 101
105BytesVielen Dank an @beaker für seinen Vorschlag,
polyval
stattdessen if zu verwendenbase2dec
. Das hat mir erlaubtCode:
Beispiel:
Bonus: beliebige Basis
Eine kleine Verallgemeinerung erlaubt die Verwendung einer willkürlichen Zahlenbasis, nicht notwendigerweise einer Dezimalzahl:
Beliebige Basis von 2 bis 10,
108104 BytesDer Grund , warum dies nur für die Basis arbeitet bis zu
10
ist , dass Matlab -dec2base
Funktion verwendet Ziffern0
,1
, ...,9
,A
,B
, ..., und es gibt einen Sprung in Zeichen (ASCII - Codes) aus9
zuA
.Beliebige Basis von 2 bis 36, 124
146BytesDer Sprung von
9
bisA
zu über Bedürfnissen spezielle Behandlung im Sinne. Die maximale Basis entspricht der36
Matlab-dec2base
Funktion.So sehen die Treppen des Zahnarztes für verschiedene Basen aus:
quelle
CJam,
2221 BytesBeachten Sie, dass dieses Programm mit einem Fehler beendet wird, der standardmäßig zulässig ist .
Mit dem Java-Interpreter können Fehler durch Schließen von STDERR unterdrückt werden. Wenn Sie diesen Code online im CJam-Interpreter ausprobieren , ignorieren Sie alle Ausgaben vor der letzten Zeile.
Vielen Dank an @ Sp3000 für den Hinweis auf einen Fehler in der Originalversion.
Vielen Dank an @ MartinBüttner für das Golfen ab 1 Byte.
Beispiellauf
Wie es funktioniert
A wird immer wahr sein, wenn es von überprüft wird
h
. Sobald ich jedoch eine einstellige Ganzzahl bin , tritt2ew
nach dem Aufrufen des Arrays ein Fehler auf. Dadurch bleibt nur das gewünschte Ergebnis auf dem Stapel, der vor dem Beenden gedruckt wird.quelle
Labyrinth ,
176134127119103978882797672 BytesDank an Sp3000 für das Speichern von 1 Byte und das Vorbereiten des Weges für 2 weitere.
Dies könnte wahrscheinlich noch gekürzt werden, aber hey, es schlägt
JavaMatlabPython ...Probieren Sie es online aus.
Dies wird mit einem Fehler beendet, aber die Fehlermeldung wird in STDERR geschrieben (weshalb Sie sie in TIO nicht sehen).
Die Implementierung ist recht unkompliziert. Wir addieren den aktuellen Wert zu einer laufenden Summe. Wenn der aktuelle Wert größer als war
9
, berechnen wir die 10-stelligen Basiswerte (durch wiederholtes div-mod) und bilden aus den absoluten Differenzen eine neue Zahl. Wenn wir zu9
oder weniger kommen, drucken wir die laufende Summe.Die Ziffern der aktuellen Nummer werden auf dem Zusatzstapel mit der höchstwertigen Ziffer oben gesammelt.
Nun, die originelle Implementierung von
abs(...)
hier hat sich im Vergleich zur neuen Lösung als lächerlich kompliziert herausgestellt ... Ich werde eine aktualisierte Erklärung hinzufügen, wenn ich mit dem Golfspielen fertig bin.quelle
Java - 300 Bytes
Golf Version
Ungolfed / Vollversion
quelle
static
s nach dem Ziehen sie in 3)(a+"")
sind im Allgemeinen die gleichen wiea.toString()
, aber kürzer 4) Sie brauchen keinen Scanner, wenn es nur eine Funktion ist, nehmen Sie einfach eine lange als Eingabe.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 BytesUngolfed:
Probieren Sie es online aus
21 Bytes gespart dank feersum und Glen O!
quelle
ndigits(n)>1
anders ist alsn>9
?int(join(abs(diff(["$n"...]))))
Spart 9 Bytes.n>9
Wechseln Sie für weitere 9 Bytes, die gespeichert werden, zu, wie von feersum vorgeschlagen. Sparen Sie drei weitere Bytes, indem Sie beide Zuweisungen in der while-Schleife in einem Schritt ausführen (und das zusätzliche, jetzt nicht mehr benötigte Semikolon entfernen):n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)
ok ,
37322423 bytesIn Aktion:
K5 verfügt über einige Funktionen, die sich gut dafür eignen: "Codieren" und "Decodieren" können eine Basiskonvertierung durchführen, jedes Paar (
':
) paart aufeinanderfolgende Elemente in einer Liste und Festkommaabtastung (\
) kann die iterierte Sequenz bis zum Ende erzeugen Ändern. Das Fehlen eines Primitivsabs()
führt jedoch zu einer unschönen Masse in Form von{(x;-x)x<0}'
.Bearbeiten:
Stattdessen
{(x;-x)x<0}'
kann ich (etwas verschwenderisch) die Quadratwurzel des Quadrats der Sequenz nehmen ({%x*x}
und 5 Bytes sparen).Bearbeiten 2:
Inspiriert von der APL-Lösung von @maurinus, kann ich das "decode" (
((#$x)#10)\x
) ersetzen, indem ich jedes Zeichen der Zeichenfolgendarstellung der Zahl auswerte -.:'$x
! Dadurch kann ich auch eine implizite Form des gesamten Ausdrucks verwenden und zusätzliche Zeichen speichern.quelle
Python 2, 87 Bytes
Addiert rekursiv die aktuelle Nummer und nimmt die Ziffernunterschiede auf. Viele Konvertierungen zwischen Zahlen und Zeichenfolgen. Kann wahrscheinlich verbessert werden.
quelle
Julia,
5548 BytesUngolfed:
Im Wesentlichen wird dies auf die einstellige Ebene zurückgeführt (auf der keine Ziffernunterschiede vorgenommen werden können) und dann beim Verlassen der Rekursion Level für Level aufsummiert.
quelle
Haskell, 140 Bytes
d
macht den Job.Weiß jemand, wie man es vermeidet, die langen Konvertierungsfunktionen zu importieren?
quelle
intToDigit
isttoEnum.(+48)
unddigitToInt
ist(\i->fromEnum i-48)
. Sie können auch drehens
mit auf eine pointfree Version=<<
in Listenkontext:s=snd.span(==0).m abs.(zipWith(-)=<<tail)
. Schließlich(==0)
ist(<1)
, weil wir mit nicht negativen ganzen Zahlen arbeiten.s
es sinnlos ist, muss es nicht benannt werden. Rufen Sie es direkt an:iterate(snd.span ... tail))
=<<
wird im Funktionskontext verwendet, nicht im Listenkontext, sorry.NoMonomorphismRestriction
lass mich auch frei habend
.chr
undord
sind beideData.Char
drin, also kannst du das nicht auslassenimport
. Compiler-Flags werden ebenfalls als Bytes gezählt.NoMonomorphismRestriction
Erhöhen Sie also Ihre Punktzahl um 25.K5, 50 Bytes
quelle
APL (22)
Erläuterung:
⍵≤9:⍵
: Wenn ⍵ ≤ 9, ⍵ unverändert zurückgeben.⍎¨⍕⍵
: konvertiere ⍵ in einen String und bewerte dann jedes Zeichen2-/
: subtrahiere jeweils zwei benachbarte Zahlen|
: nimm die absoluten Werte10⊥
: verwandle das Array in eine Basis-10-Zahl⍵+∇
: Rufe die Funktion rekursiv mit diesem neuen Wert auf und füge das Ergebnis zur Eingabe hinzuquelle
Mathematica,
726965 BytesIch bin offen für Vorschläge hier.
quelle
Tr@FixedPointList[FromDigits@*Abs@*Differences@*IntegerDigits,#]&
JavaScript ES6, 73 Byte
Das wird nicht kürzer: / Ich werde mehr Ansätze ausprobieren, aber dies ist der kürzeste bisher
quelle
t
es weiterhin gültig und spart Ihnen 2 Bytes.JavaScript (ES6), 69
Testen Sie das folgende Snippet in einem EcmaScript 6-kompatiblen Browser (aber nicht in Chrome, da der Spread-Operator immer noch nicht unterstützt wird
...
). MS Edge vielleicht?Alternative, bei Verwendung des Array-Verständnisses , das jetzt auf EcmaScript 2016 (ES7) abzielt, 67 Byte:
quelle
Python 3, 125 Bytes
Ich mochte die Kürze von Regex, bis ich versuchte, es für diese Herausforderung zu nutzen ...
re.findall('\d\d',s,overlapped=True)
ist nicht eingeschaltet ;)Prost @Todd :)
quelle
J, 70 Bytes
quelle
C 162 Bytes
Golf gespielt:
ungolfed:
quelle
R, 134 Bytes
Code
Testen Sie es online .
Ungolfed
Hier ist die Darstellung der Differenz der Reihe "Zifferndifferenzsumme einer Zahl" von f (1) bis f (1m). Nur weil ich es liebe zu diff.
Plotcode
quelle
MATLAB
(141)(137)Das Programm summiert Ziffern derselben Zeile vor inline Ziffern. Dies bedeutet, dass es nur die Ganzzahldivision "n / 10" log_10 (n) mal verwendet hat, die Komplexität ist O (N).
Wenn
n= a b c d
Mein Programm berechnet:
Verwendungszweck:
a =
1
quelle
,end
derfunction
Deklaration weglassen .Prolog, 143 Bytes
Code:
Erklärt:
q führt die Berechnungen durch, die eine Zahl in ihre Zifferndifferenz umwandeln.
r ruft rekursiv q auf und summiert die Ergebnisse, um die Zifferndifferenzsumme zu finden.
p ist der Einstiegspunkt. Nimmt eine Nummer, ruft r an und druckt die Antwort.
Beispiel:
Probieren Sie es hier online aus .
quelle
PHP - 198 Bytes
Ungolfed
quelle
Perl 6 , 56 Bytes
Verwendungszweck:
quelle