Chuyển đổi giữa các cơ sở cân bằng!


13

Căn cứ cân bằng:

Các cơ sở cân bằng về cơ bản giống như các cơ sở bình thường, ngoại trừ các chữ số có thể dương hoặc âm, trong khi ở các cơ sở bình thường, các chữ số chỉ có thể dương.

Từ đây trở đi, các cơ sở cân bằng của cơ sở bcó thể được biểu diễn dưới dạng balb- vì vậy cơ sở cân bằng 4 = bal4.

Trong định nghĩa của thách thức này, phạm vi các chữ số trong một cơ sở cân bằng blà từ -(k - 1)đến b - k, trong đó

k = ceil(b/2)

Ví dụ về phạm vi chữ số trong các cơ sở cân bằng khác nhau:

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

Đại diện của các số trong các cơ sở cân bằng về cơ bản là giống như các cơ sở bình thường. Ví dụ: việc biểu diễn số 27(cơ sở 10) thành bal4(cơ sở 4 cân bằng) là 2 -1 -1bởi vì

  2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)

Bài tập:

Nhiệm vụ của bạn là, đưa ra ba đầu vào:

  • số được chuyển đổi ( n)
    • đầu vào này có thể linh hoạt, xem "Linh hoạt I / O"
  • cơ sở nhiện đang ở ( b)
  • cơ sở nđược chuyển đổi thành ( c)

Ở đâu 2 < b, c < 1,000.

Trả về số trong cđại diện cơ sở cân bằng của n. Đầu ra cũng có thể linh hoạt.

Chương trình / chức năng phải xác định độ dài ntừ chính đầu vào.

Linh hoạt I / O:

Đầu vào nvà đầu ra của bạn có thể được thể hiện theo những cách sau:

  • định nghĩa ngôn ngữ của bạn về một mảng
  • một chuỗi, với bất kỳ ký tự nào làm dấu phân cách (ví dụ: dấu cách, dấu phẩy)

Ví dụ:

Lưu ý rằng những cái này sử dụng một mảng Python như nvà đầu ra. Bạn có thể sử dụng bất cứ điều gì phù hợp với ngôn ngữ của bạn, miễn là nó phù hợp với định nghĩa của "I / O Flexility".

[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]

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


Trong câu trả lời đầu tiên của bạn, 4 không phải là chữ số bal7 hợp pháp; Tôi tin rằng câu trả lời phải là [1, -3, -1]. Và tôi nhận được các câu trả lời khác nhau cho trường hợp thử nghiệm thứ hai ([1,2,2, -1,2]) và trường hợp thử nghiệm thứ ba ([1,1,0, -2,1,0]) cũng ...?
Greg Martin

@GregMartin Ah, rất tiếc - Tôi đã tính toán chúng bằng tay, vì vậy chắc chắn sẽ có một số vấn đề. Cảm ơn đã chú ý! Bạn có thể kiểm tra lại các giải pháp của bạn, chỉ trong trường hợp?
clismique

@GregMartin @ Qwerp-Derp Trường hợp thử nghiệm thứ ba là[1,1,1,-2,1,0]
ngenisis

Câu trả lời:


2

Toán học, 85 byte

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

Giải trình

#~FromDigits~#2

Chuyển đổi #1(1 được ngụ ý - đầu vào 1, danh sách các chữ số) thành cơ sở số nguyên #2(đầu vào 2).

... ~IntegerDigits~#3

Chuyển đổi số nguyên kết quả thành cơ sở #3(đầu vào 3), tạo danh sách các chữ số.

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

Liên tục thay thế danh sách các chữ số; nếu một chữ số lớn hơn sàn ( #3/ 2), thì hãy trừ #3nó và thêm 1vào chữ số bên trái. Nếu không có gì ở bên trái, chèn a 0và thêm 1.


Chúng tôi thường khuyên bạn nên nói về giải pháp của bạn một chút và giải thích cho những người không biết Mathicala.
ATaco

@ATaco Đã thêm lời giải thích!
JungHwan Min

Tôi có một chút bí ẩn bởi điều này. Tôi chưa bao giờ thấy các mẫu tùy chọn được sử dụng ở bất cứ đâu ngoài các định nghĩa hàm. Bạn không cần bên ngoài {...}vì chỉ có một quy tắc thay thế.
ngenisis

1
@JungHwanMin Đúng, tôi đoán điều khiến tôi bối rối là điều này ảnh hưởng đến trận đấu như thế nào p___. Điều này có tìm thấy ngắn nhất p___theo sau a_,b_hoặc b_, hoặc nó kiểm tra toàn bộ mẫu yêu cầu từng mẫu tùy chọn và sau đó giảm dần các mẫu tùy chọn cho đến khi tìm thấy kết quả khớp (hoặc một số tùy chọn thứ ba)?
ngenisis

1
@ngenisis Tôi tin rằng tôi đã sai trong nhận xét trước đó (đã xóa), quan sát kết quả của 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___}được khớp trước (cho tất cả có thể p), và sau đó {p___,b_,q___}được khớp. Sự thay thế thứ hai chỉ áp dụng khi bbắt đầu bởi vì nếu có một bở giữa thỏa mãn điều kiện, {p___,a_,b_,q___}sẽ phù hợp với nó thay thế.
JungHwan Min

1

Perl 6 , 121 byte

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

Giải pháp vũ lực chậm.

Làm thế nào nó hoạt động:

  • map {[ .base(c).comb]}, 0..*- Tạo chuỗi số tự nhiên vô hạn lười biếng trong cơ sở c, với mỗi số được biểu diễn dưới dạng một mảng các chữ số.
  • $_ - ($_ > floor c/2) * c- Biến đổi nó bằng cách trừ ctừ mỗi chữ số lớn hơn sàn (c / 2).
  • first { f(b, n) == f(c, $_) }, ...- Lấy mảng đầu tiên của chuỗi đó khi được hiểu là csố cơ sở , bằng với mảng đầu vào được nhiểu là bsố cơ sở .
  • sub f { sum [R,](@^n) Z* ($^b X** 0..*) }- Hàm trợ giúp biến một mảng @^nthành một số trong cơ sở $^b, bằng cách lấy tổng của các sản phẩm mang lại bằng cách nén mảng đảo ngược với chuỗi lũy thừa của cơ sở.

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 byte hoạt động cho các giá trị âm của 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))

0

Toán học, 118 114 byte

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

là các ký tự 3 byte U+230AU+230B, tương ứng. Chuyển đổi #3sang cơ sở 10từ cơ sở #2, sau đó chuyển đổi sang cơ sở #(vì vậy thứ tự đối số được đảo ngược từ các ví dụ). Nếu bất kỳ chữ số nào lớn hơn chữ số tối đa được phép k=⌊#/2⌋, hãy giảm số đó đi #và tăng chữ số tiếp theo lên (có thể cần phải trả trước 1). Tiếp tục làm điều này cho đến khi tất cả các chữ số nhỏ hơn k.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.