X + Y = Z-しかし、どのベース?


20

チャレンジ

3つの数字が与えられXYそしてZベースにB、見つけるBでの追加ASE XY収量をZ。入力x = 20Y = 12およびZ = 32もたらし得る5ため、20 + 12 = 32ベース5。

  • あなたは常に追加が正しいベースがあると仮定するかもしれません( @ MasonWheelerと@ Not that Charlesの例のおかげでベースが存在しない場合があります)。
  • 可能な最小の基数は1です。単項の数字として1または0を使用できますが、それらを混在させることはできません。

I / O

  • 入力数値の桁は、負でない整数になります。
  • 入力番号に先行ゼロが含まれていると仮定することができるため、特定の(またはすべて同じ)長さがあります。
  • 前処理されていない限り、最も便利な形式で数値を取得できます。これには、3つの入力番号の全体的な形式と、それらの各番号の数字の形式が含まれます。使用する形式を明確にしてください。
  • 複数の可能なベースがある場合、すべてまたは1つだけを出力できます。
  • 基数と入力数は、言語の数値制限内に収まると想定できます。

ルール

  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最も少なくなります。Tiebreakerは以前の提出です。

テストケース

ここでの入力形式は、各数値を表す整数のリストです。3つのリストはコンマで区切られています。
複数のベースが可能な場合があることに注意してください。ここでは、1つの(ランダムな)ソリューションのみが出力されます。

[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、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、1、0、0、1、0]-> 2
[1]、[1]、[1,1]-> 1

このPythプログラムを使用して、追加のテストケースを生成できます。最初の行との小数点値のベース入力XY次の2行です。
また、このPythプログラムを使用して、ランダムな値を使用して複数のテストケースを一度に作成できます。必要な量のテストケースを入力するだけです。

ハッピーコーディング!


回答:


12

ゼリー、16 11 7バイト

_/N,‘FṀ

このアプローチは、@ beakerのOctave answerに大きく基づいています

入力形式はZ、Y、Xで、リトルエンディアンの桁順で、単項の桁0を使用します。

オンラインでお試しください!または、すべてのテストケースを実行します

使い方

これは、潜在的な基底をインクリメンタルにテストするのではなく、配列P:= X + Y-Zに対応する多項式を解きます。これは、P≠0の最大係数(少なくとも1つの有効なベースがあるためルートでなければなりません)、または1ずつ増分されたXY、およびZの最高桁を返します。

_/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が必要です。

テストスイート

基本的に、可能な限りすべてのベースをテストし、最大桁より1つ多く開始します。テストでは、各数値を問題の基数に変換し、次に数値を減算して折り返し、論理的に結果を否定します。


5
だから、これはゼロとして魅力的ではありませんか?
ファンドモニカの訴訟

3
@QPaysTaxes私はあなたが単項を意味すると推測しています、そしてはい。
メゴ

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に感謝します。)

ideoneでのサンプル実行。


簡単な説明:

キャリーを含まないケースを取り上げます。

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

この場合、「数字」よりも大きい限り、ベースに制限はありません。z(asのz >= x,y)最大要素を取り、1(または任意の正の整数)を追加します。

キャリーアウト(無キャリーイン付き)の場合は、我々は、いずれかの列との間の差でベースを超えましたx+yし、zベースであります:

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

2番目の列の合計もベースを超えており、キャリーインとキャリーインが必要な場合、その値はになります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最大桁数よりも大きい)。最初の1つを選択し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
または、maximumとしてのテストb<-[1..],all(<b)$id=<<l
xnor

これは、ベース1が唯一のソリューションである入力に対して機能しますか?私が見つけたオンラインコンパイラではこれを実行できないので、自分でテストすることはできません。
デンカー

@DenkerAffe:数字はならないd基本のb数は可能0 <= d < bなので、ベースのために1のみ可能桁がありますか0f [[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>

私の翻訳オクターブ答え 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
単項は、最近のオートコレクトでは非常に魅力的ではありません
チャーリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.