Zrównoważone bazy:
Zrównoważone zasady są zasadniczo takie same jak normalne zasady, z tym że cyfry mogą być dodatnie lub ujemne, podczas gdy w normalnych zasadach cyfry mogą być tylko dodatnie.
Odtąd zrównoważone podstawy bazy b
mogą być przedstawiane jako balb
- tak zrównoważona baza 4 = bal4
.
W definicji tego wyzwania zakres cyfr w zbalansowanej bazie b
jest od -(k - 1)
do b - k
, gdzie
k = ceil(b/2)
Przykłady zakresu cyfr w różnych zbalansowanych bazach:
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
Reprezentacje liczb w zbalansowanych zasadach są zasadniczo takie same jak normalne zasady. Na przykład reprezentacja liczby 27
(podstawa 10) do bal4
(zrównoważona podstawa 4) to 2 -1 -1
, ponieważ
2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)
Zadanie:
Twoim zadaniem jest, biorąc pod uwagę trzy dane wejściowe:
- liczba do konwersji (
n
)- to wejście może być elastyczne, patrz „Elastyczność we / wy”
- baza, która
n
jest obecnie w (b
) - podstawa, która
n
ma zostać przekonwertowana na (c
)
Gdzie 2 < b, c < 1,000
.
Zwraca liczbę w zrównoważonej c
reprezentacji podstawowej dla n
. Dane wyjściowe mogą być również elastyczne.
Program / funkcja musi określać długość n
samego wejścia.
Elastyczność we / wy:
Twój wkład n
i wynik można przedstawić w następujący sposób:
- twoja językowa definicja tablicy
- ciąg znaków, z dowolnym znakiem jako separatorem (np. spacje, przecinki)
Przykłady:
Zauważ, że używają one tablicy Python jako n
i danych wyjściowych. Możesz używać wszystkiego, co pasuje do twojego języka, o ile mieści się ono w definicji „elastyczności we / wy”.
[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]
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
źródło
[1,1,1,-2,1,0]
Odpowiedzi:
Mathematica, 85 bajtów
Wyjaśnienie
Konwertuj
#1
(1 implikowany - wejście 1, lista cyfr) na bazę liczb całkowitych#2
(wejście 2).Przekształć wynikową liczbę całkowitą w podstawową
#3
(wejście 3), tworząc listę cyfr.Wielokrotnie zastępuj listę cyfr; jeśli cyfra jest większa niż floor (
#3
/ 2), odejmij#3
ją i dodaj1
do cyfry po lewej stronie. Jeśli po lewej nic nie ma, włóż a0
i dodaj1
.źródło
{...}
ponieważ istnieje tylko jedna zasada wymiany.p___
. Czy to znaleźć najkrótsząp___
następnie alboa_,b_
albob_
, czy też sprawdzić cały wzór wymaga każdy z opcjonalnymi wzorami i następnie stopniowo spadać opcjonalne wzory aż znajdzie dopasowanie (lub jakąś trzecią opcję)?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___}
jest dopasowywany najpierw (dla wszystkich możliwychp
), a następnie{p___,b_,q___}
dopasowywany. Drugi zamiennik ma zastosowanie tylko wtedy, gdyb
jest na początku, ponieważ jeślib
w środku jest taki, który spełnia warunek,{p___,a_,b_,q___}
pasowałby do niego.Perl 6 , 121 bajtów
Powolne rozwiązanie brutalnej siły.
Jak to działa:
map {[ .base(c).comb]}, 0..*
- Wygeneruj leniwą nieskończoną sekwencję liczb naturalnych w baziec
, przy czym każda liczba reprezentowana jest przez tablicę cyfr.$_ - ($_ > floor c/2) * c
- Przekształć go, odejmującc
od każdej cyfry większej niż podłoga (c / 2).first { f(b, n) == f(c, $_) }, ...
- Uzyskaj pierwszą tablicę tej sekwencji, która interpretowana jakoc
liczba podstawowa , równa się tablicy wejściowejn
interpretowanej jakob
liczba podstawowa .sub f { sum [R,](@^n) Z* ($^b X** 0..*) }
- Funkcja pomocnicza, która zamienia tablicę@^n
w liczbę w bazie$^b
, biorąc sumę produktów uzyskanych przez skompresowanie odwróconej tablicy sekwencją mocy bazy.źródło
JavaScript (ES6), 89 bajtów
100 bajtów działa dla ujemnych wartości
n
.źródło
Mathematica,
118114 bajtów⌊
i⌋
są odpowiednio 3-bajtowymi znakamiU+230A
iU+230B
. Konwertuje#3
na bazę10
z bazy#2
, a następnie konwertuje na bazę#
(więc kolejność argumentów jest odwrócona w przykładach). Jeśli jakakolwiek cyfra jest większa niż maksymalna dozwolona cyfrak=⌊#/2⌋
, zmniejsz tę cyfrę o#
i zwiększaj następną cyfrę w górę (może być konieczne wstawienie1
). Rób to dalej, aż wszystkie cyfry będą mniejsze niżk
.źródło