Konwertuj między zrównoważonymi bazami!

13

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 bmogą być przedstawiane jako balb- tak zrównoważona baza 4 = bal4.

W definicji tego wyzwania zakres cyfr w zbalansowanej bazie bjest 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 njest obecnie w ( b)
  • podstawa, która nma zostać przekonwertowana na ( c)

Gdzie 2 < b, c < 1,000.

Zwraca liczbę w zrównoważonej creprezentacji podstawowej dla n. Dane wyjściowe mogą być również elastyczne.

Program / funkcja musi określać długość nsamego wejścia.

Elastyczność we / wy:

Twój wkład ni 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 ni 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 , więc wygrywa najkrótszy kod w bajtach!

clismique
źródło
W pierwszej odpowiedzi 4 nie jest prawną cyfrą bal7; Uważam, że odpowiedź powinna wynosić [1, -3, -1]. I otrzymuję różne odpowiedzi dla drugiego przypadku testowego ([1,2,2, -1,2]) i trzeciego przypadku testowego ([1,1,0, -2,1,0]) również ...?
Greg Martin
@GregMartin Ah, ups - policzyłem je ręcznie, więc musiały wystąpić pewne problemy. Dzięki za zauważenie! Czy na wszelki wypadek możesz dokładnie sprawdzić swoje rozwiązania?
clismique
@GregMartin @ Qwerp-Derp Trzeci przypadek testowy to[1,1,1,-2,1,0]
ngenisis

Odpowiedzi:

2

Mathematica, 85 bajtów

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

Wyjaśnienie

#~FromDigits~#2

Konwertuj #1(1 implikowany - wejście 1, lista cyfr) na bazę liczb całkowitych #2(wejście 2).

... ~IntegerDigits~#3

Przekształć wynikową liczbę całkowitą w podstawową #3(wejście 3), tworząc listę cyfr.

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

Wielokrotnie zastępuj listę cyfr; jeśli cyfra jest większa niż floor ( #3/ 2), odejmij #3ją i dodaj 1do cyfry po lewej stronie. Jeśli po lewej nic nie ma, włóż a 0i dodaj 1.

JungHwan Min
źródło
Zwykle zaleca się porozmawianie o swoim rozwiązaniu i wyjaśnienie go osobom, które mogą nie znać Mathematica.
ATaco,
@ATaco Dodano wyjaśnienie!
JungHwan Min 12.01.17
Trochę mnie to dziwi. Nigdy nie widziałem nigdzie opcjonalnych wzorów używanych poza definicjami funkcji. Nie potrzebujesz zewnętrznej, {...}ponieważ istnieje tylko jedna zasada wymiany.
ngenisis
1
@JungHwanMin Prawda, chyba mylę to, jak wpływa to na dopasowanie p___. Czy to znaleźć najkrótszą p___następnie albo a_,b_albo b_, 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ę)?
ngenisis
1
@ngenisis Uważam, że się myliłem w poprzednim komentarzu (usunięty), obserwując wynik 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żliwych p), a następnie {p___,b_,q___}dopasowywany. Drugi zamiennik ma zastosowanie tylko wtedy, gdy bjest na początku, ponieważ jeśli bw środku jest taki, który spełnia warunek, {p___,a_,b_,q___}pasowałby do niego.
JungHwan Min 12.01.17
1

Perl 6 , 121 bajtów

->\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..*}

Powolne rozwiązanie brutalnej siły.

Jak to działa:

  • map {[ .base(c).comb]}, 0..*- Wygeneruj leniwą nieskończoną sekwencję liczb naturalnych w bazie c, przy czym każda liczba reprezentowana jest przez tablicę cyfr.
  • $_ - ($_ > floor c/2) * c- Przekształć go, odejmując cod każdej cyfry większej niż podłoga (c / 2).
  • first { f(b, n) == f(c, $_) }, ...- Uzyskaj pierwszą tablicę tej sekwencji, która interpretowana jako cliczba podstawowa , równa się tablicy wejściowej ninterpretowanej jako bliczba podstawowa .
  • sub f { sum [R,](@^n) Z* ($^b X** 0..*) }- Funkcja pomocnicza, która zamienia tablicę @^nw liczbę w bazie $^b, biorąc sumę produktów uzyskanych przez skompresowanie odwróconej tablicy sekwencją mocy bazy.
smls
źródło
1

JavaScript (ES6), 89 bajtów

(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 bajtów działa dla ujemnych wartości 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
źródło
0

Mathematica, 118 114 bajtów

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

i są odpowiednio 3-bajtowymi znakami U+230Ai U+230B. Konwertuje #3na bazę 10z 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 cyfra k=⌊#/2⌋, zmniejsz tę cyfrę o #i zwiększaj następną cyfrę w górę (może być konieczne wstawienie 1). Rób to dalej, aż wszystkie cyfry będą mniejsze niż k.

ngenisis
źródło