Konvertieren Sie zwischen ausgeglichenen Basen!

13

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 bals balb- ausgeglichene Base 4 = dargestellt werden bal4.

In der Definition dieser Herausforderung ist der Bereich der Ziffern in einer ausgeglichenen Basis der Basis bvon -(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 nderzeit 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 cvon zurück n. Die Ausgabe kann auch flexibel sein.

Das Programm / die Funktion muss die Länge von naus der Eingabe selbst bestimmen .

I / O-Flexibilität:

Ihre Ein- nund 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 nund 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 , also gewinnt der kürzeste Code in Bytes!

Clismique
quelle
In Ihrer ersten Antwort ist 4 keine legale 7-stellige Zahl. Ich glaube, die Antwort sollte [1, -3, -1] sein. Und ich bekomme auch unterschiedliche Antworten für den zweiten Testfall ([1,2,2, -1,2]) und den dritten Testfall ([1,1,0, -2,1,0]) ...?
Greg Martin
@ GregMartin Ah, whoops - ich habe die von Hand berechnet, also musste es einige Probleme geben. Danke fürs bemerken! Können Sie Ihre Lösungen für alle Fälle überprüfen?
Clismique
@ GregMartin @ Qwerp-Derp Der dritte Testfall ist[1,1,1,-2,1,0]
Genisis

Antworten:

2

Mathematica, 85 Bytes

#~FromDigits~#2~IntegerDigits~#3//.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}&

Erläuterung

#~FromDigits~#2

Konvertieren Sie #1(1 ist impliziert - Eingabe 1, eine Liste von Ziffern) in eine Ganzzahlbasis #2(Eingabe 2).

... ~IntegerDigits~#3

Konvertieren Sie die resultierende Ganzzahl in Basis #3(Eingabe 3), und erstellen Sie eine Liste von Ziffern.

... //.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}

Ersetzen Sie wiederholt die Liste der Ziffern; Ist eine Ziffer größer als das Stockwerk ( #3/ 2), dann subtrahieren #3Sie diese und addieren Sie 1sie zur Ziffer links. Wenn auf der linken Seite nichts mehr zu sehen ist, fügen Sie ein ein 0und fügen Sie hinzu 1.

JungHwan min
quelle
In der Regel wird empfohlen, ein wenig über Ihre Lösung zu sprechen und sie denjenigen zu erklären, die Mathematica möglicherweise nicht kennen.
ATaco
@ATaco Erklärung hinzugefügt!
JungHwan Min
Ich bin ein wenig verwirrt darüber. Ich habe noch nie optionale Muster gesehen, die nur für Funktionsdefinitionen verwendet wurden. Sie brauchen das Äußere nicht, {...}da es nur eine Ersatzregel gibt.
Genisis
1
@JungHwanMin Stimmt, ich denke, was mich verwirrt, ist, wie sich dies auf das Spiel für auswirkt p___. Findet dies das kürzeste p___gefolgt von entweder a_,b_oder b_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)?
Genisis
1
@ngenisis Ich glaube, ich habe mich im vorherigen Kommentar geirrt (gelöscht) und das Ergebnis von beobachtet 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ögliche p) und wird dann {p___,b_,q___}abgeglichen. Die zweite Ersetzung gilt nur, wenn sie bam Anfang steht, denn wenn es eine bin der Mitte gibt, die die Bedingung erfüllt, {p___,a_,b_,q___}würde sie dieser entsprechen.
JungHwan Min
1

Perl 6 , 121 Bytes

->\n,\b,\c{sub f{sum [R,](@^n)Z*($^b X**0..*)}
first {f(b,n)==f c,$_},map {[$_-($_>floor c/2)*c for .base(c).comb]},0..*}

Langsame Brute-Force-Lösung.

Wie es funktioniert:

  • map {[ .base(c).comb]}, 0..*- Generieren Sie die faule unendliche Folge natürlicher Zahlen in der Basis c, wobei jede Zahl als Array von Ziffern dargestellt wird.
  • $_ - ($_ > floor c/2) * c- Wandeln Sie es um, indem Sie cvon 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 wird c, dem Eingabearray entsprichtn interpretiert wird, dem als Basiszahl interpretiertenb .
  • sub f { sum [R,](@^n) Z* ($^b X** 0..*) }- Hilfsfunktion, die ein Array @^nin eine Zahl in der Basis $^bumwandelt, indem die Summe der Produkte berechnet wird, die durch Zippen des umgekehrten Arrays mit der Potenzreihenfolge der Basis erhalten werden.
smls
quelle
1

JavaScript (ES6), 89 Byte

(n,b,c,g=(n,d=n%c,e=d+d<c)=>[...(n=n/c+!e|0)?g(n):[],e?d:d-c])=>g(n.reduce((r,d)=>r*b+d))

100 Bytes funktionieren für negative Werte von n.

(n,b,c,g=(n,d=(n%c+c)%c)=>[...(n-=d,n/=c,d+d<c||(d-=c,++n),n?g(n):[]),d])=>g(n.reduce((r,d)=>r*b+d))
Neil
quelle
0

Mathematica, 118 114 Bytes

IntegerDigits[#3~FromDigits~#2,k=⌊#/2⌋;#]//.{{a_,x___}/;a>k:>{1,a-#,x},{x___,a_,b_,y___}/;b>k:>{x,a+1,b-#,y}}&

und sind die 3-Byte - Zeichen U+230Aund U+230Bauf. Konvertiert #3von der Basis zur 10Basis #2und dann zur Basis #(daher wird die Argumentreihenfolge gegenüber den Beispielen umgekehrt). Wenn eine Ziffer größer ist als die maximal zulässige Ziffer k=⌊#/2⌋, verringern Sie diese Ziffer um# und erhöhen Sie die nächste Ziffer (muss möglicherweise vorangestellt werden 1). Machen Sie so lange weiter, bis alle Ziffern kleiner als sind k.

Genisis
quelle