X + Y = Z - ama hangi bazda?


20

Meydan okuma

3 numara verilen X, Yve Zbir baz olarak Bbir arayan Base olan ek olarak Xve Yverimleri Z. Giriş x = 20, Y = 12ve Z = 32elde olabilir 5, çünkü 20 + 12 = 32taban 5.

  • Eklemenin doğru olduğu her zaman bir taban olacağını varsayabilirsiniz (bunun bazı örnekleri için @ MasonWheeler ve @ Charles değil sayesinde tabanın olmadığı durumlar vardır).
  • Mümkün olan en düşük taban 1'dir. 1s veya 0s değerlerini tekli olarak basamak olarak kullanabilirsiniz, ancak bunları karıştıramazsınız.

I / O

  • Giriş numaralarının rakamları negatif olmayan tamsayılar olacaktır.
  • Giriş numaralarının önde gelen sıfırlar içerdiğini varsayabilirsiniz, bu nedenle belirli bir (veya tümü aynı) uzunluğa sahiptir.
  • Önceden işlenmediği sürece sayıları en uygun biçimde alabilirsiniz. Bu, üç giriş numarasının genel biçimini ve bu sayıların her birinin hane biçimini içerir. Lütfen hangi biçimi kullandığınızı netleştirin.
  • Birden fazla olası taban varsa, bunların tümünü veya yalnızca birini çıktı alabilirsiniz.
  • Taban ve giriş numaralarının dilinizin sayısal sınırları içinde olduğunu varsayabilirsiniz.

kurallar

Test senaryoları

Buradaki girdi biçimi, her sayıyı temsil eden tamsayıların bir listesidir. Üç liste virgülle ayrılır.
Bazen birden fazla baz olabileceğini unutmayın. Burada sadece bir (rasgele) çözüm üretilir.

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

Bu Pyth programıyla ek test senaryoları oluşturabilirsiniz . İlk satıra bir taban ve sonraki iki satır için Xve onluk değerleri girin Y.
Ayrıca bu Pyth programını rastgele değerleri kullanarak aynı anda birden fazla test senaryosu oluşturmak için kullanabilirsiniz . Sadece girişe istenen miktarda test senaryosu girin.

Mutlu Kodlama!


Yanıtlar:


12

Jöle, 16 11 7 bayt

_/N,‘FṀ

Bu yaklaşım büyük ölçüde @ beaker'ın Octave cevabına dayanmaktadır .

Giriş formatı Z, Y, X , küçük endian basamaklı sıra ile, tekli için 0 rakamını kullanır .

Çevrimiçi deneyin! veya tüm test senaryolarını çalıştırın .

Nasıl çalışır

Potansiyel bazları artımlı olarak test etmek yerine, bu P: = X + Y - Z dizisine karşılık gelen polinomu çözer . Bu döner ya büyük katsayısı P ≠ 0 - ya da en yüksek basamaklı - en az bir geçerli bir temel olduğu için, bir kök olmak zorunda X , Y ve Z tarafından artırılır, 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 bayt

f!-FiRTQheSsQ

Z ve ardından X ve Y bekleniyor.

Test odası

Esasen, en büyük rakamdan birinden başlayarak mümkün olan her tabanı test ediyoruz. Test, her sayıyı söz konusu tabana dönüştürdükten sonra sayılardan çıkarmayı katladığımız ve sonucu mantıksal olarak reddettiğimizdir.


5
Yani bu sıfır olarak çekici değil mi?
Monica'nın Davası

3
@QPaysTaxes Sanırım sıradan demek istemiştiniz ve evet.
Mego

4
@Mego Tek, kastettiğim, otomatik düzeltme demek istediği her şey demekti.
Monica'nın Davası

10

Oktav, 67 75 38 32 bayt

Çünkü "TÜM şeyler üzerinde döngü" çok fazla iş.

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

Giriş dizilerini aynı boyutta yapmak için 0 dolgu gerektirir, örneğin:

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

Yana 0dolgu için kullanılır, 1tekli için belirteç olarak kullanılır.

( Sorudaki açıklama için @DenkerAffe'e teşekkürler .)

İdeone üzerinde örnek çalışma .


Kısa Açıklama:

Taşıma gerektirmeyen bir vaka alın:

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

Bu durumda, herhangi bir "rakam" dan daha büyük olduğu sürece tabanda herhangi bir kısıtlama yoktur. z(As z >= x,y) öğesinin maksimum öğesini almanız ve 1 (veya herhangi bir pozitif tam sayı) eklemeniz yeterlidir .

(Hayır taşıma-in) carry-out durumunda, biz sütunlardan biri arasındaki fark tabanını aştınız x+yve züs:

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

İkinci sütunun toplamı da bir aktarımın yanı sıra aktarım gerektiren tabanı aşarsa değeri olacaktır base+(-1). Doğru (daha büyük) taban değerine sahip taşıma ve taşıma olmadan sağda bir yerde bir sütun olacak.


9

Haskell, 90 73 bayt

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

Kullanım örneği: f [[3, 247],[7, 438],[11, 221]]-> 464.

Tüm üsleri deneyin b( bmaksimum basamaktan büyük olan yerlerde ). İlkini seçin x+y==z.

Düzenleme: @xnor öncelikle kurtulmak birçok bayt kurtardı import Data.Digits.


1
Eğer unDigits bne düşündüğümü yapıyor, o kadar uygulamak için kısa olmalıdır foldl(\x y->b*x+y)0ya da eşit foldl((+).(b*))0.
xnor

1
Bu almak daha kısa maximumdüzleştirme sonra: b<-[1+(maximum$id=<<l)..].
xnor

1
Veya, maximumas için test b<-[1..],all(<b)$id=<<l.
xnor

Bu, temel 1'in tek çözüm olduğu girdi için işe yarıyor mu? Bunu bulduğum çevrimiçi derleyicilerle yürütemiyorum, bu yüzden kendimi test edemiyorum.
Denker

@DenkerAffe: dBir taban bnumarasının rakamları olmamalı 0 <= d < b, bu yüzden taban 1için mümkün olan tek basamak 0mı? f [[0],[0],[0,0]]olarak değerlendirir 1.
nimi

8

MATL , 20 bayt

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

Girdi biçimindedir (dış süslü ayraçlara dikkat edin):

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

Bu, geçerli sürümde (15.0.0) çalışır .

Çevrimiçi deneyin!

açıklama

`        % 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 bayt

--X>t~1G+hX>

Benim çevrilmesi Octave cevap Matl içine. (İlk MATL cevabım!)

  • Giriş sırası Z, X, Y(veya Z, Y, Xisterseniz kolayım)
  • Giriş dizileri eşit uzunlukta sıfır dolgulu
  • Olarak itici olmayan alır 1

Çevrimiçi deneyin!

açıklama

--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
unary bugünlerde AutoCorrect tarafından çok çekici değil
Charlie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.