Ausgewogene Grundlagen:
Ausgeglichene Basen sind im Wesentlichen die gleichen wie normale Basen, außer dass die Ziffern positiv oder negativ sein können, während in normalen Basen die Ziffern nur positiv sein können.
Ab hier können ausgeglichene Basen der Base b
als balb
- ausgeglichene Base 4 = dargestellt werden bal4
.
In der Definition dieser Herausforderung ist der Bereich der Ziffern in einer ausgeglichenen Basis der Basis b
von -(k - 1)
bis b - k
, wo
k = ceil(b/2)
Beispiele für den Ziffernbereich in verschiedenen symmetrischen Basen:
bal10:
k = ceil(10/2) = 5
range = -(5 - 1) to 10 - 5 = -4 to 5
= -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
bal5:
k = ceil(5/2) = 3
range = -(3 - 1) to 5 - 3 = -2 to 2
= -2, -1, 0, 1, 2
Die Darstellung von Zahlen in ausgeglichenen Basen ist grundsätzlich dieselbe wie bei normalen Basen. Zum Beispiel ist die Darstellung der Zahl 27
(Basis 10) bis bal4
(ausgeglichene Basis 4) 2 -1 -1
, weil
2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)
Aufgabe:
Ihre Aufgabe besteht aus drei Eingaben:
- die umzurechnende Zahl (
n
)- Dieser Eingang kann flexibel sein, siehe "E / A-Flexibilität"
- die Basis, die
n
derzeit in (b
) ist - die Basis
n
, zu der konvertiert werden soll (c
)
Wo 2 < b, c < 1,000
.
Geben Sie die Zahl in ausgeglichener Basisdarstellung c
von zurück n
. Die Ausgabe kann auch flexibel sein.
Das Programm / die Funktion muss die Länge von n
aus der Eingabe selbst bestimmen .
I / O-Flexibilität:
Ihre Ein- n
und Ausgabe kann folgendermaßen dargestellt werden:
- Die Definition eines Arrays in Ihrer Sprache
- eine Zeichenfolge mit einem beliebigen Zeichen als Trennzeichen (z. B. Leerzeichen, Kommas)
Beispiele:
Beachten Sie, dass diese ein Python-Array als n
und die Ausgabe verwenden. Sie können alles verwenden, was zu Ihrer Sprache passt, solange es in die Definition von "I / O Flexibility" passt.
[2, -1, -1] 4 7 = [1, -3, -1]
[1, 2, 3, 4] 9 5 = [1, 2, 2, -1, 2]
[10, -9, 10] 20 5 = [1, 1, 1, -2, 1, 0]
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
quelle
[1,1,1,-2,1,0]
Antworten:
Mathematica, 85 Bytes
Erläuterung
Konvertieren Sie
#1
(1 ist impliziert - Eingabe 1, eine Liste von Ziffern) in eine Ganzzahlbasis#2
(Eingabe 2).Konvertieren Sie die resultierende Ganzzahl in Basis
#3
(Eingabe 3), und erstellen Sie eine Liste von Ziffern.Ersetzen Sie wiederholt die Liste der Ziffern; Ist eine Ziffer größer als das Stockwerk (
#3
/ 2), dann subtrahieren#3
Sie diese und addieren Sie1
sie zur Ziffer links. Wenn auf der linken Seite nichts mehr zu sehen ist, fügen Sie ein ein0
und fügen Sie hinzu1
.quelle
{...}
da es nur eine Ersatzregel gibt.p___
. Findet dies das kürzestep___
gefolgt von entwedera_,b_
oderb_
oder überprüft es das gesamte Muster, das jedes der optionalen Muster erfordert, und löscht dann die optionalen Muster nach und nach, bis es eine Übereinstimmung findet (oder eine dritte Option)?FixedPointList[k=#3;#/.{p___,a_:0,b_,q___}/;b>⌊k/2⌋:>{p,a+1,b-k,q}&, #~FromDigits~#2~IntegerDigits~#3]&
.{p___,a_,b_,q___}
wird zuerst abgeglichen (für alles Möglichep
) und wird dann{p___,b_,q___}
abgeglichen. Die zweite Ersetzung gilt nur, wenn sieb
am Anfang steht, denn wenn es eineb
in der Mitte gibt, die die Bedingung erfüllt,{p___,a_,b_,q___}
würde sie dieser entsprechen.Perl 6 , 121 Bytes
Langsame Brute-Force-Lösung.
Wie es funktioniert:
map {[ .base(c).comb]}, 0..*
- Generieren Sie die faule unendliche Folge natürlicher Zahlen in der Basisc
, wobei jede Zahl als Array von Ziffern dargestellt wird.$_ - ($_ > floor c/2) * c
- Wandeln Sie es um, indem Siec
von jeder Ziffer, die größer ist als das Stockwerk (c / 2), abziehen .first { f(b, n) == f(c, $_) }, ...
- Holen Sie sich das erste Array dieser Sequenz, das, wenn es als Basiszahl interpretiert wirdc
, dem Eingabearray entsprichtn
interpretiert wird, dem als Basiszahl interpretiertenb
.sub f { sum [R,](@^n) Z* ($^b X** 0..*) }
- Hilfsfunktion, die ein Array@^n
in eine Zahl in der Basis$^b
umwandelt, indem die Summe der Produkte berechnet wird, die durch Zippen des umgekehrten Arrays mit der Potenzreihenfolge der Basis erhalten werden.quelle
JavaScript (ES6), 89 Byte
100 Bytes funktionieren für negative Werte von
n
.quelle
Mathematica,
118114 Bytes⌊
und⌋
sind die 3-Byte - ZeichenU+230A
undU+230B
auf. Konvertiert#3
von der Basis zur10
Basis#2
und dann zur Basis#
(daher wird die Argumentreihenfolge gegenüber den Beispielen umgekehrt). Wenn eine Ziffer größer ist als die maximal zulässige Zifferk=⌊#/2⌋
, verringern Sie diese Ziffer um#
und erhöhen Sie die nächste Ziffer (muss möglicherweise vorangestellt werden1
). Machen Sie so lange weiter, bis alle Ziffern kleiner als sindk
.quelle