疯狂但理性的基础


11

基于10、2、36甚至-10,我们面临许多挑战,但是其他所有理性基础又如何呢?

任务

给定以10为底的整数和有理底数,请以该底数返回整数(作为数组,字符串等)。

处理

很难想象一个合理的基础,因此让我们使用爆炸点将其可视化:

考虑这个动画,以基数3表示17:

在此处输入图片说明

每个点代表一个单位,框代表数字:最右边的框是一个位置,中间的框是3 ^ 1位置,最左边的框是3 ^ 2位置。

我们可以从一个地方的17个点开始。但是,这是基数3,因此该位置必须小于3。因此,我们“爆炸” 3个点,并在左侧的框上创建一个点。我们重复此过程,直到最终得到一个没有爆炸点的稳定位置(即同一框中的3个点)。

因此,以10为底的17是以3为底的122。


分数基数类似于将一些点分解为一个以上的点。基数3/2将爆炸3个点以创建2。

以3/2为基数表示17:

在此处输入图片说明

因此,以10为底的17是以3/2为底的21012。


负基的工作原理与此类似,但是我们必须跟踪符号(使用所谓的反点,等于-1;用空心圆表示)。

以-3表示17:

在此处输入图片说明

注意,还有额外的爆炸使所有框的符号相同(忽略零)。

因此,以10为底的17是以-3为底的212。

否定的有理基础在以上两种情况的组合中也类似地起作用。

规则

  • 没有标准漏洞。
  • 输出中每个“数字”的符号必须相同(或为零)。
  • 所有数字的绝对值必须小于基数分子的绝对值。
  • 您可以假定基数的绝对值大于1。
  • 您可以假设一个理性基数是其最小化形式。
  • 您可以在输入中分别计算基数的分子和分母。
  • 如果一个数字具有多种表示形式,则可以输出其中任何一种。(例如,12在基体10可以是{-2, -8}{1, 9, 2}在碱-10)

测试用例:

格式: {in, base} -> result

{7, 4/3}        ->  {3, 3}
{-42, -2}       ->  {1, 0, 1, 0, 1, 0}
{-112, -7/3}    ->  {-6, -5, 0, -1, 0}
{1234, 9/2}     ->  {2, 3, 6, 4, 1}
{60043, -37/3}  ->  {-33, -14, -22, -8}

由于某些输入可能具有多种表示形式,因此我建议在TIO上使用此Mathematica代码段测试输出

这是,因此每种语言中字节数最少的提交将获胜!


有关爆炸点的更多信息,请访问全球数学项目网站!他们有很多很棒的数学东西!


Answers:


6

Python 2中42 39个字节

n,a,b=input()
while n:print n%a;n=n/a*b

在线尝试!

感谢@xnor查找较短的形式。

过时的版本(42个字节):

f=lambda n,a,b:n and[n%a]+f(n/a*b,a,b)or[]

在线尝试!

参数:输入,分子(带符号)和分母。

返回一个数组,从最低位开始。

这是可行的,因为Python中的除法和取模遵循分母的符号,因此我们不必显式关心相同的符号。

测试用例输出:

f(7, 4, 3)       == [3, 3]
f(-42, -2, 1)    == [0, -1, -1, -1, -1, -1, -1]
f(-112, -7, 3)   == [0, -1, 0, -5, -6]
f(1234, 9, 2)    == [1, 4, 6, 3, 2]
f(60043, -37, 3) == [-8, -22, -14, -33]

4
通常,程序看起来更短
xnor

@xnor谢谢,我总是忘记那种写东西的方式……
Bubbler

4

Aheui(esotope),91字节

벙수벙섞벙석
희빠챠쌳뻐삭빠빠싻싸삯라망밣밭따맣사나삮빠싸사땨

在线尝试!

注意到integernumerator of basedenominator of base

由于TIO解释器的限制,每个输入必须以换行符结尾。

实施@起泡的Python的2回答。幸运的是,这个Aheui解释器是用Python编写的,因此我们可以使用相同的技巧。


4
o_O这是什么语言……D:
HyperNeutrino

3

05AB1E11 10字节

[D_#²‰`,³*

在线尝试!

注意到integernumerator of base并且denominator of base像所有的答案。由于05AB1E解释器是用Python(?)编写的,因此Bubbler的Python 2答案技巧也可以在05AB1E中使用。

说明

[D_#²‰`,³*
[ 无限循环
 D_#如果数字为0,则退出循环(隐式输入
                                         在第一次迭代中)
     ²获取底数的分子
      ‰Divmod
       `将所有元素推入堆栈
        ,打印剩余的
         ³获取底数的分母
          *相乘。

因此,该程序的工作原理与以下Python代码大致相同:

i1,i2,i3 = input()
堆栈= []
而1:
 堆栈=(堆栈或[i1])
 堆栈+ = [堆栈[-1]]
 如果没有堆栈[-1]:中断
 堆叠+ = [i2]
 堆栈=堆栈[:-2] + [divmod(堆栈[-2],堆栈[-1])]
 堆栈=堆栈[:-1] +列表(堆栈[-1])
 打印堆栈[-1]
 堆栈=堆栈[:-1]
 堆叠+ = [i3]
 堆栈=堆栈[:-2] + [堆栈[-2] *堆栈[-1]]

11> 10感谢Neil


我想你可以用_代替0Q这里。
尼尔

@Neil哦,是的,我忘了负面的布尔值!
Shieru Asakoto
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.