在平衡基数之间转换!


13

平衡基数:

平衡基数与正常基数基本相同,除了数字可以为正数或负数,而在正常基数中,数字只能为正数。

从这里开始,平衡的底数b可以表示为balb-平衡的底数4 = bal4

在此挑战的定义中,平衡的基数范围中的数字范围b是从-(k - 1)b - k,其中

k = ceil(b/2)

以各种平衡基数表示的数字范围的示例:

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

平衡基数中的数字表示形式与普通基数基本相同。例如,数字27(以10为底)到bal4(平衡以4为底)的表示为2 -1 -1,因为

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

任务:

给定三个输入,您的任务是:

  • 要转换的数字(n
    • 此输入可以是灵活的,请参阅“ I / O灵活性”
  • n当前位于(b)中的基数
  • n要转换为(c)的基数

在哪里2 < b, c < 1,000

以的平衡基数c表示形式返回数字n。输出也可以是灵活的。

程序/功能必须确定n输入本身的长度。

I / O灵活性:

您的输入n和输出可以通过以下方式表示:

  • 您的语言对数组的定义
  • 字符串,任何字符作为分隔符(例如,空格,逗号)

例子:

请注意,它们使用Python数组作为n和输出。只要符合“ I / O灵活性”的定义,就可以使用适合您的语言的任何内容。

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

这是,因此以字节为单位的最短代码胜出!


在您的第一个答案中,4不是合法的bal7数字;我相信答案应该是[1,-3,-1]。对于第二个测试用例([1,2,2,-1,2])和第三个测试用例([1,1,0,-2,1,0]),我也得到了不同的答案...?
格雷格·马丁

@GregMartin啊,哎呀-我是手工计算的,所以肯定会有一些问题。感谢您的关注!您可以仔细检查您的解决方案,以防万一吗?
clismique

@GregMartin @ Qwerp-Derp第三个测试用例是[1,1,1,-2,1,0]
ngenisis,2017年

Answers:


2

Mathematica,85个字节

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

说明

#~FromDigits~#2

转换#1(隐含1-输入1,一个数字列表)为整数基#2(输入2)。

... ~IntegerDigits~#3

将结果整数转换为基数#3(输入3),创建一个数字列表。

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

反复替换数字列表;如果数字大于floor(#3/ 2),#3则从1该数字中减去并添加到左侧的数字。如果左侧没有任何内容,请插入0并添加1


通常建议稍微谈谈您的解决方案,并向可能不了解Mathematica的人进行解释。
ATaco

@ATaco添加了解释!
JungHwan Min

我对此有些疑惑。除了函数定义外,我从未见过在其他任何地方使用可选模式。{...}因为只有一个替换规则,所以您不需要外部。
ngenisis

1
@JungHwanMin是的,我想让我感到困惑的是这如何影响的比赛p___。这会找到最短的p___后跟一个a_,b_b_,还是会检查需要每个可选模式的整个模式,然后逐步删除可选模式,直到找到匹配项(或某个第三选项)?
ngenisis

1
@ngenisis我认为上一个评论(已删除)是错误的,观察的结果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___}首先匹配(对于所有可能的匹配p),然后{p___,b_,q___}匹配。第二个替换项仅b在开始时适用,因为如果b中间有一个满足条件的{p___,a_,b_,q___}匹配项,则会代替它。
JungHwan Min

1

Perl 6,121个字节

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

慢速蛮力解决方案。

怎么运行的:

  • map {[ .base(c).comb]}, 0..*-在base中生成自然数的懒惰无限序列c,每个数字表示为一个数字数组。
  • $_ - ($_ > floor c/2) * c-通过c从大于floor(c / 2)的每个数字中减去来进行变换。
  • first { f(b, n) == f(c, $_) }, ...-获取该序列的第一个数组,该数组在解释为基数c时等于输入数组,该输入数组被n解释为基数b
  • sub f { sum [R,](@^n) Z* ($^b X** 0..*) }-辅助函数,通过将反转数组与基数的幂压缩后获得的乘积总和,将数组@^n转换为$^b基数。

1

JavaScript(ES6),89个字节

(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字节适用于的负值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

Mathematica,118114字节

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

是3字节字符U+230AU+230B。从base 转换#3为base ,然后转换为base (因此,参数顺序与示例相反)。如果任何数字大于最大允许数字,请将该数字递减并向上增加下一个数字(可能需要添加)。继续这样做,直到所有数字都小于。10#2#k=⌊#/2⌋#1k

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.