X + Y = Z-그러나 어느베이스에서?


20

도전

3 개 개의 숫자를 감안할 때 X, Y그리고 Z베이스 B하는 찾을 BASE를하는의 추가 XY수율 Z. 입력은 x = 20, Y = 12그리고 Z = 32얻을 수 5있기 때문에 20 + 12 = 32기본 5.

  • 추가가 올바른 염기가 항상 있다고 가정 할 수 있습니다 (@ MasonWheeler 및 @ Not that Charles 덕분에 염기가 존재하지 않는 경우가 있습니다 ).
  • 가능한 가장 낮은 기준은 1입니다. 단항의 숫자로 1 또는 0을 사용할 수 있지만 혼합하여 사용할 수는 없습니다.

I / O

  • 입력 숫자의 숫자는 음이 아닌 정수입니다.
  • 입력 번호에 선행 0이 포함되어 있다고 가정하면 특정 (또는 모두 동일한) 길이를 갖습니다.
  • 사전 처리되지 않은 한 가장 편리한 형식으로 숫자를 사용할 수 있습니다. 여기에는 세 개의 입력 숫자의 전체 형식과 각 숫자의 자릿수 형식이 포함됩니다. 어떤 형식을 사용하고 있는지 명확히하십시오.
  • 여러 개의 가능한 염기가있는 경우 모두 또는 하나만 출력 할 수 있습니다.
  • 기본 및 입력 숫자가 언어의 숫자 제한 내에 있다고 가정 할 수 있습니다.

규칙

  • 기능 또는 전체 프로그램이 허용됩니다.
  • 입 / 출력의 기본 규칙 .
  • 표준 허점이 적용됩니다.
  • 이것은 이므로 바이트 수가 가장 적습니다. Tiebreaker는 이전에 제출되었습니다.

테스트 사례

여기의 입력 형식은 각 숫자를 나타내는 정수 목록입니다. 세 개의 목록은 쉼표로 구분됩니다.
가능한 경우 여러 개의 염기가있을 수 있습니다. 여기에는 단 하나의 (임의의) 솔루션 만 출력됩니다.

[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, 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 프로그램으로 추가 테스트 사례를 생성 할 수 있습니다 . 첫 번째 줄과의 진수 값에 대한 기본 입력 X하고 Y다음 두 줄에 있습니다.
또한 이 Pyth 프로그램 을 사용하여 임의의 값을 사용하여 한 번에 여러 테스트 사례를 작성할 수 있습니다. 입력에 원하는 양의 테스트 케이스를 입력하십시오.

행복한 코딩!


답변:


12

젤리, 16 11 7 바이트

_/N,‘FṀ

이 접근 방식은 @beaker의 Octave answer 에 크게 의존 합니다.

입력 형식은 Z, Y, X 이며 리틀 엔디안 숫자 순서이며 단항 에는 숫자 0 을 사용합니다 .

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 실행하십시오 .

작동 원리

잠재적 인베이스를 점진적으로 테스트하는 대신, 배열 P : = X + Y-Z에 해당하는 다항식을 해결합니다 . 이 함수는 P ≠ 0 의 가장 큰 계수를 반환합니다.이 계수는 적어도 하나의 유효한 기준이 있거나 1 씩 증가한 X , YZ 의 가장 높은 숫자이므로 루트 여야합니다 .

_/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
그래서 이것은 0으로 매력적이지 않습니까?
기금 모니카의 소송

3
@ QPaysTaxes 나는 당신이 단항을 의미한다고 생각합니다.
Mego

4
@ Mego 나는 단항식을, 자동 고침은 의미하는 것을 의미했습니다.
Fund Monica의 소송 23.36의

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+yz같습니다.

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

두 번째 열의 합이 기준을 초과하여 반입 및 반입이 필요한 경우 그 값은입니다 base+(-1). 오른쪽에 어딘가에 올바른 기본 값을 가진 반입 및 반입이없는 열이있을 것입니다.


9

하스켈, 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.

모든베이스를 시도하십시오 b( b최대 자릿수보다 큰 위치 ). 첫 번째를 선택하십시오 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기본 b숫자 의 자릿수 가 해서는 안되므로 0 <= 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원하는 경우 쉬움)
  • 입력 배열은 길이가 0으로 채워집니다.
  • 매력없는 것을 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
요즘 자동 고침에 의해 단항은 매우 매력적이지 않습니다
Charlie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.