Ich denke, die meisten Leute hier wissen, was eine 7-Segment-Anzeige für Ziffern ist:
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
Wir können die 7-Segment-Differenz (7SD) zwischen zwei Ziffern als die Anzahl der Segmente definieren, die umgeschaltet werden müssen, um von einem zum anderen zu wechseln. ZB die 7SD zwischen 1
und 2
ist 5 (die drei horizontalen Segmente und die unteren beiden vertikalen Segmente müssen umgeschaltet werden), und die 7SD zwischen 6 und 8 ist 1 .
Außerdem können wir die 7SD zwischen zwei Zahlen als die Summe der 7SDs zwischen den entsprechenden Ziffern definieren. Wenn eine Zahl länger als die andere ist, gehen wir davon aus, dass sie rechtsbündig sind, und fügen die Anzahl der Segmente hinzu, die erforderlich sind, um die zusätzlichen höchstwertigen Ziffern der größeren Zahl anzuzeigen. Betrachten Sie als Beispiel die 7SD zwischen 12345
und 549
:
x: 1 2 3 4 5
y: 5 4 9
7SD: 2+5+2+0+1 = 10
Ihre Aufgabe ist es, 7SD zwischen n und n + 1 bei n zu berechnen .
Der Einfachheit halber finden Sie hier die vollständige Tabelle der 7SDs zwischen den einzelnen Ziffern. Die Zeile steht _
für eine leere Position.
_ 0 1 2 3 4 5 6 7 8 9
_ 0 6 2 5 5 4 5 6 3 7 6
0 6 0 4 3 3 4 3 2 3 1 2
1 2 4 0 5 3 2 5 6 1 5 4
2 5 3 5 0 2 5 4 3 4 2 3
3 5 3 3 2 0 3 2 3 2 2 1
4 4 4 2 5 3 0 3 4 3 3 2
5 5 3 5 4 2 3 0 1 4 2 1
6 6 2 6 3 3 4 1 0 5 1 2
7 3 3 1 4 2 3 4 5 0 4 3
8 7 1 5 2 2 3 2 1 4 0 1
9 6 2 4 3 1 2 1 2 3 1 0
Eingang
- Die Eingabe ist eine einzelne positive Ganzzahl
n
. - Sie können ein Programm oder eine Funktion schreiben und Eingaben über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen.
- Sie können davon ausgehen, dass die Eingabe höchstens eine Zahl kleiner ist als die größte Zahl, die durch den Standard-Integer-Typ Ihrer Sprache dargestellt werden kann, sofern dieser Typ mindestens Werte bis einschließlich 127 unterstützt.
Ausgabe
- Sie sollten eine einzelne Ganzzahl ausgeben, die 7SD zwischen
n
undn+1
. - Sie können über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder ein Funktionsargument (out) ausgeben.
Wertung
Es gelten die Standardregeln für Code-Golf . Der kürzeste Code (in Byte) gewinnt.
Testfälle
Aus irgendeinem unbekannten Grund ist diese Sequenz noch nicht in OEIS enthalten, obwohl es die eng verwandte Sequenz A123587 gibt . Hier sind die ersten 100 Zahlen (beginnend mit n = 1, 2, 3, ...
):
5, 2, 3, 3, 1, 5, 4, 1, 4, 4, 5, 2, 3, 3, 1, 5, 4, 1, 7, 4, 5, 2, 3, 3, 1,
5, 4, 1, 4, 4, 5, 2, 3, 3, 1, 5, 4, 1, 5, 4, 5, 2, 3, 3, 1, 5, 4, 1, 5, 4,
5, 2, 3, 3, 1, 5, 4, 1, 3, 4, 5, 2, 3, 3, 1, 5, 4, 1, 7, 4, 5, 2, 3, 3, 1,
5, 4, 1, 6, 4, 5, 2, 3, 3, 1, 5, 4, 1, 3, 4, 5, 2, 3, 3, 1, 5, 4, 1, 6, 4
Der erste Eingang, für den die 7SD größer als 9 ist 1999
, sollte 11 ergeben. Hier einige andere größere Beispiele:
n 7SD
1999 11
12345 1
999999 14
5699999 15
8765210248 1
Python,
5048 BytesErläuterung
Diese Funktion arbeitet mit der niedrigstwertigen Ziffer der Zahl
n
und summiert die 7SD der Ziffern, wenn sie um eins erhöht wird, bis nach der ersten nicht-9
Ziffer.26523308
ist eine Bitmaske, die das Mapping für die Ziffern codiert0-8
. Wennn=0
, die nur auftritt, wennn
nur9
s umfasst , wird die Antwort von zwei sein. Dies wird durch den Ausdruck kompensiert0**n*2
. Was die Ziffer9
betrifft, wird die Bitmaske mit Null bewertet, wodurch der rekursive Aufruf beim Hinzufügen2
zur 7SD ausgelöst wird.quelle
05AB1E ,
3130282726 BytesCode:
Erklärung ( veraltet ):
Wir ändern Folgendes auf die letzte Ziffer, die nicht 9 ist:
Für die besonderen Fälle:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
28 Byte Alternative:
D[¤©•2X›ùì•sès®9Ê#¨]\rÚ9Q4*O
.quelle
Java, 63 Bytes
Die Welt ist in Ordnung, als Python erneut Java übergibt.
Weil, weißt du, Java.
Sieh es auf ideone
Maxes out bei 2147483647, da dies Javas ist
Integer.MAX_VALUE
.Dies ist ein Port meiner Python-Antwort, der ein Port der ES6-Antwort ist .
quelle
MATL ,
613936 BytesProbieren Sie es online!
Erläuterung
quelle
Julia, 44 Bytes
Probieren Sie es hier aus.
Dennis hat ein Byte gespeichert!
quelle
Python,
7166 Bytes48 Bytes xsot . Noch mehr magische Mathematik!
Sieh es auf ideone
Weil die vorherige Python-Antwort nicht funktioniert und alles andere als optimal ist. Ein einfacher Port einer früheren ES6-Version . Verwenden Sie jetzt Bit Twiddling (aus der alternativen ES6-Formulierung), um einen Cast auszuschneiden!
Kann dazu gebracht werden, mit Python 3 zu arbeiten, indem floordiv explizit für +1 Byte verwendet wird.
quelle
9
e
ein gültiger Buchstabe zum Beispiel nach einer Zahl steht9e9
.n%10==9
zun%10<9
kein Speicherplatz in dieser Reihenfolge benötigt wird.Jolf, 32 Bytes
Probieren Sie es hier aus!
Erläuterung
Dies ist eine Umsetzung von Neils Antwort.
quelle
Pyth -
783027 BytesDas erste war peinlich.
Test Suite .
quelle
J, 53 Bytes
Ursprünglich basiert auf @ Neils Lösung . Anschließend können Sie das Ergebnis verbessern, indem Sie ein Byte mit derselben Formel in @ Lynns Lösung speichern .
Die 54-Byte-Version, die auf dem String basiert, ist
Verwendung
quelle
Retina , 34 Bytes
Probieren Sie es online! (In der ersten Zeile können nur mehrere Testfälle gleichzeitig verarbeitet werden.)
Erläuterung
Wie die meisten Antworten inzwischen festgestellt haben, müssen wir nicht die vollständige Tabelle verwenden, da
9
sich beim Inkrementieren nur die niedrigstwertigen, nicht einstelligen Änderungen ergeben. So funktioniert auch diese Antwort.Dies entspricht (
M
) dem regulären Ausdruck,.9*$
dh der ersten Ziffer, die nur durch9
s vom Ende getrennt ist. Das!
weist Retina an, die Eingabe durch dieses Match zu ersetzen und alles zu verwerfen, was die 7SD nicht beeinflusst.Beginnt die Eingabe nun mit einem
9
, dh, die Eingabe selbst bestand nur aus9
s, so muss der 7-Segment-Anzeige ein,1
was kostet , vorangestellt werden2
. Die einfachste Möglichkeit, dies zu handhaben, besteht darin, die führende9
in diesem Fall durch eine zu ersetzen0
, da die Kosten für das Inkrementieren von a9
(bis0
)2
und die Kosten für das Inkrementieren von0
(bis1
) so sind4
, dass sich die Gesamtkosten nach2
Bedarf erhöhen.Jetzt haben wir eine Transliterationsphase, in der jede Ziffer durch die Kosten für ihre Erhöhung ersetzt wird (da die zu
d
erweitert wird0123456789
). Beachten Sie, dass dies die erste Subdiagonale der 7SD-Tabelle ist.Dies ersetzt jede Ziffer
n
durchn
Kopien von1
, dh es konvertiert jede Ziffer in unär, und da es keine Trennzeichen gibt, addiert es diese sofort zusammen.Schließlich zählen wir die Anzahl der Zeichen (dh die Anzahl der Übereinstimmungen von
.
) im Ergebnis, wodurch die unäre Summe zurück in eine Dezimalzahl umgewandelt wird.quelle