X + Y = Z-但是在哪个基数上?


20

挑战

给定3个数字XYZ以底数为单位B,找到一个B加和XY产生的酶Z。输入x = 20,由于基数为5 ,Y = 12因此Z = 32可能会产生收益。520 + 12 = 32

  • 您可能会假设总有一个正确的加法基础(在某些情况下,不存在任何基数,这要感谢@ MasonWheeler和@ Not that Charles提供的一些示例)。
  • 最低的底数是1。您可以使用1或0作为一进制数字,但是您不能混合使用这些数字。

输入输出

  • 输入数字的位数为非负整数。
  • 您可以假定输入数字包含前导零,因此输入数字具有特定(或全部相同)的长度。
  • 您可以采用最方便的格式获取数字,前提是未经预处理。这包括三个输入数字的整体格式以及每个数字的数字格式。请明确说明您使用的格式。
  • 如果存在多个可能的基准,则可以输出全部或其中之一。
  • 您可以假定基数和输入数字将在您的语言的数字范围内。

规则

测试用例

输入格式是代表每个数字的整数列表。这三个列表用逗号分隔。
请注意,有时可能有多个基准。此处仅输出一个(随机)解决方案。

[12,103],[4,101],[16,204]-> 349
[4,21,25],[5,1,20],[9,23,17]-> 28
[16,11],[25,94],[41,105]-> 147
[2,140],[21,183],[24,100]-> 223
[8,157],[1,28],[9,185]-> 227
[2,158],[88],[3,12]-> 234
[8,199],[1,34],[9,233]-> 408
[3,247],[7,438],[11,221]-> 464
[3,122],[3,2],[6,124]-> 480
[6,328],[3,31],[9,359]-> 465
[2,1,0,0,0,0],[1,2,0,0,1,0,1,0],[1,2,2,1,1,1,0,1,0]- > 3
[16,105],[16,120],[33,84]-> 141
[15,60],[9,30],[24,90]-> 268
[2,0],[1,2],[3,2]-> 5
[1、3、3、7],[1、2、3],[1、4、6、0]-> 10
[0],[1,12,8],[1,12,8]-> 16
[1,0,0,0,1,0,0,0,1,1,1,0,0,1],[1,0,0,1,0,1,1,1,0,0 ,1],[1,0,0,1,1,0,1,1,1,1,0,0,1,0]-> 2
[1],[1],[1,1]-> 1

您可以使用此Pyth程序生成其他测试用例。在第一行输入一个底数XY在后两行输入的十进制值。
您也可以使用此Pyth程序通过使用随机值一次创建多个测试用例。只需在输入中输入所需数量的测试用例即可。

编码愉快!


Answers:


12

果冻,16 11 7个字节

_/N,‘FṀ

这种方法很大程度上基于@beaker的Octave答案

输入格式为Z,Y,X,以小端数字顺序显示,一进制数字为0

在线尝试!运行所有测试用例

怎么运行的

而不是增量测试势垒,而是求解与数组P:= X + Y-Z对应的多项式。这将返回P≠0的最大系数(必须有一个根,因为至少有一个有效的底数),或者返回XYZ的最高位数加1

_/N,‘FṀ  Main link. Argument: [Z, Y, X]

_/       Reduce by subtraction; yield Z - X - Y.
         This works since Z must have at least as many digits as X and Y.
  N      Negate to yield X + Y - Z.
    ‘    Yield [Z, Y, X], with all digits increments by 1.
   ,     Pair the results to the left and to the right.
     F   Flatten the resulting, nested list.
      Ṁ  Compute the maximum.

11

Pyth,13个字节

f!-FiRTQheSsQ

期望Z,然后是X和Y。

测试套件

从本质上讲,我们测试所有可能的基数,其起始位数要比最大位数多一位。测试是,我们将每个数字转换为所讨论的底数,然后将减号对折,然后在逻辑上求反。


5
因此,这个数字没有吸引力作为零吗?
基金莫妮卡的诉讼

3
@QPaysTaxes我猜你的意思是一元,是的。
Mego 2016年

4
@Mego我的意思是一元,自动更正意味着它想要的意思。
基金莫妮卡的诉讼

10

八度,67 75 38 32字节

因为“遍历所有事物”工作量太大。

@(x,y,z)max([m=max(x+y-z) z])+~m

需要填充0以使输入数组具有相同的大小,例如:

[2, 158],[88],[3, 12]
becomes
[2, 158],[0, 88],[3, 12]

由于0用于填充,1因此用作一元标记。

(感谢@DenkerAffe对问题的澄清。)

样品在亚乙基酮上运行。


简短说明:

以不涉及进位的情况为例:

   [ 8, 199]
 + [ 1,  34]
 -------------
     9, 233
 - [ 9, 233]
 -------------
     0,   0 --- no carries

在这种情况下,只要底数大于任何“数字”,就没有限制。只需取z(as z >= x,y)的max元素并加1(或任何正整数)。

在搬出的情况下(无进位),我们已经超过了基地的一列之间的差异x+y,并z为基地:

   [ 2, 140]
 + [21, 183]
--------------
    23, 323
 - [24, 100]
 -------------
    -1  223
     ^   ^------ base
     |---------- carry in

如果第二列的总和也超过了基数,并且需要结转和结转,则其值将为base+(-1)。我们将在右侧的某个地方有一个带进位的列,而没有带有正确(更大)基值的进位。


9

Haskell,90 73字节

f l=[b|b<-[1..],all(<b)$id=<<l,[x,y,z]<-[foldl((+).(b*))0<$>l],x+y==z]!!0

用法示例:f [[3, 247],[7, 438],[11, 221]]->464

只需尝试所有底数bb大于数字的最大值)。选择第一个x+y==z

编辑:@xnor主要通过摆脱节省了许多字节import Data.Digits


1
如果unDigits b我认为的话,应缩短实施为foldl(\x y->b*x+y)0或等效foldl((+).(b*))0
xnor

1
这是短取maximum压平之后:b<-[1+(maximum$id=<<l)..]
xnor

1
或者,测试maximumb<-[1..],all(<b)$id=<<l
xnor

这对于以1为底的唯一解决方案的输入有效吗?我无法使用找到的在线编译器执行此操作,因此无法测试自己。
Denker

@DenkerAffe:d基数的数字不应该b0 <= d < b,因此对于基数1,唯一可能的数字是0吗? f [[0],[0],[0,0]]评估为1
nimi

8

MATL,20字节

`GY:@XJZQ2:"wJZQ-]]J

输入采用以下格式(请注意大括号):

{[4, 21, 25],[5, 1, 20],[9, 23, 17]}

这适用于当前版本(15.0.0)

在线尝试!

说明

`        % do...while index
  G      %   push input. First time pushed nothing but asks for input implicitly
  Y:     %   unpack the cell array, pushing the three numeric arrays
  @      %   loop index: candidate base
  XJ     %   copy into clipboard J
  ZQ     %   evaluate polynomial: interpret third array in that base
  2:"    %   for loop: do this twice (subtract the other numbers from the third)
    w    %     swap, to process another array
    J    %     push base
    ZQ   %     evaluate polynomial: interpret array in that base
    -    %     subtract
  ]      %   end for loop. A result 0 indicates a solution has been found
]        % end do....while loop. Exit if top of stack is 0
J        % push found base. Implicitly display

8

MATL,13 12字节

--X>t~1G+hX>

将我的Octave答案转换为MATL。(我的第一个MATL答案!)

  • 输入顺序是Z, X, Y(或者,Z, Y, X如果您愿意,我很容易)
  • 输入数组用零填充到相等的长度
  • 将无吸引力视为1

在线尝试!

说明

--X>t~1G+hX>

--            % M = Z - X - Y
  X>          % P = max(M)
    t~        % Duplicate and negate
      1G      % Push 1st argument (Z) 
        +     % ~P + Z
         h    % Concatenate [P (~P + Z)]
          X>  % Return max

3
这些天来,AutoCorrect对一元广告非常没有吸引力
查理
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.