Xác định cơ sở trong đó phương trình đã cho là đúng


22

Cho 3 số nguyên, xác định cơ sở thấp nhất có thể để hai số nguyên đầu tiên nhân thành số nguyên thứ ba. Nếu bạn nghĩ về Câu trả lời cho Câu hỏi cuối cùng về Sự sống, Vũ trụ và Mọi thứ, 6 * 9 == 42, là đúng trong Cơ sở 13.

Các đầu vào có thể bao gồm bất kỳ số nào có chữ số sử dụng các ký tự 0-9, az và AZ, trong đó abằng 10 trong Cơ sở 10 và Zlà 61 trong Cơ sở 10.

Các đầu vào phải được nhập vào theo bất kỳ cách nào bạn muốn (ngoại trừ mã hóa cứng) và bạn có thể viết một hàm riêng lẻ hoặc toàn bộ chương trình.

Cơ sở tối đa phải được xem xét là Cơ sở 62 và cơ sở tối thiểu là Cơ sở 2.

Bạn có thể giả sử rằng hai giá trị đầu tiên nhỏ hơn giá trị thứ ba. Bạn cũng có thể kết luận rằng cơ sở tối thiểu lớn hơn một chữ số / ký tự cao nhất từ ​​các đầu vào (ví dụ: nếu các đầu vào là 3 1a 55, cơ sở tối thiểu sẽ là Cơ sở 11, vì alà chữ số cao nhất).

Nếu không có cơ sở như vậy, trả lại một giá trị rác của sự lựa chọn của bạn.

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng.

Các trường hợp thử nghiệm

6 9 42     -->   13
a a 64     -->   16
aA bB 36jk -->   41
2 3 20     -->   <junk value>
10 10 100  -->   2

Tôi nghĩ rằng STDIN có thể sẽ tốt hơn, và một trong hai sẽ ổn thôi.
erdekhayser

@ MartinBüttner Vì vậy, tôi chỉ nên cho phép đầu vào ở một trong hai hình thức?
erdekhayser

1
Như một điểm cần làm rõ, nên làm gì nếu nhiều cơ sở hợp lệ, chẳng hạn như ví dụ cuối cùng của bạn (hiện đã bị xóa - đó là 10 * 10 = 100) trong đó cơ sở cũng hợp lệ trong cơ sở 10 và thực sự là bất kỳ cơ sở nào khác mà bạn quan tâm đề cập đến ...
Chris

1
@Kay Nếu tôi xác định hệ thống vị trí trong cơ sở btheo cách chung như a_0 b^0 + a_1 b^1 + a_2 b^2 + ...(trong đó a_0chữ số có nghĩa ít nhất) so với cơ sở 1 chắc chắn có ý nghĩa. Hơn nữa, kết luận của OP cũng sẽ bao gồm cơ sở 1 trong tìm kiếm nếu chữ số hiện tại lớn nhất là 0.
Martin Ender

2
Về cơ sở 1, unary là một hệ thống số. en.m.wikipedia.org/wiki/Unary_numeral_system
erdekhayser

Câu trả lời:


3

CJam, 52 51 48 byte

63,{_ea{i32b~\([G-35-9]=-_Xe>:X;}f%fbW%~*=\X>*}#

Kiểm tra nó ở đây. Trình kiểm tra trực tuyến không hỗ trợ đầu vào thông qua ARGV. Cách thay thế gần nhất là đặt đầu vào như 6 9 42vào STDIN và sử dụng:

lS/:E;
63,{_E{i32b~\([G-35-9]=-_Xe>:X;}f%fbW%~*=\X>*}#

Bản in này -1nếu không có cơ sở hợp lệ lên đến 62 có thể được tìm thấy.

Rất cám ơn Peter cho mã phân tích chữ số!

Tôi đã sửa rất nhiều vấn đề trong đó thêm 14 byte vào số đếm. Lời giải thích sau đây vẫn dành cho bài dự thi ban đầu của tôi và tôi sẽ cập nhật nó vào ngày mai.

63,{_ea{i32b~\([G-35-9]=-_Xe>:X;}f%fbW%~*=\X>*}#
63,                                              "Push the array [0 1 .. 62].";
   {                                          }# "Find the first index for which the block returns
                                                  a truthy value.";
    _                                            "Duplicate the current base.";
     ea                                          "Read ARGV into an array of strings.";
       {                        }f%              "Apply this block to each character.";
        i32b                                     "Convert to code point, and then to base-32. The
                                                  most significant digit now identifies the 'type'
                                                  of digit.";
            ~\(                                  "Unwrap the array. Swap the digits. Decrement.";
               [G-35-9]                          "Push array [16 -35 -9] of digit offsets.";
                       =-                        "Select the relevant offset and subtract it from 
                                                  the least significant digit.";
                         _                       "Duplicate the current digit D.";
                          Xe>:X;                 "X := max(X,D). X is predefined as 1.";
                                   fb            "Convert all numbers to the current base.";
                                     W%          "Reverse the list of numbers.";
                                       ~         "Unwrap the array.";
                                        *=       "Multiply factors. Check equality with product.";
                                          \      "Swap result with current base.";
                                           X>    "Ensure base is greater than X.";
                                             *   "Multiply boolean results.";

Chỉ mục được in tự động vào cuối chương trình.


Trong GS, các chữ số có thể được phân tích thành 32base~\[-16.35 9]=+. Tôi biết CJam có chuyển đổi cơ sở ngắn hơn.
Peter Taylor

7

APL (Dyalog Unicode) , 30 byte SBCS

⊢{3e=×/2e←⍵⊥⍺:⍵⋄⍺∇⍵+1}1+⌈/∘,

Hãy thử trực tuyến!

Cảm ơn Adám đã giúp đỡ.

Giải trình:

⊢{3e=×/2e←⍵⊥⍺:⍵⋄⍺∇⍵+1}1+⌈/∘,  
                               left argument ⍺: the vector (do nothing)
                        1+⌈/∘,  right argument ⍵: our starting base.
                             ,              start by flattening the matrix of arguments                               ⌈/                reduce by max (find the highest number)
                                           compose both of these together
                        1+                  increment by one
 {         ⍵⊥⍺         }        convert inputs to the current base
 {       e            }        store the converted values in 3
 {      2             }        take the first 2 values
 {    ×/               }        multiply them together (reduce-multiply)
 {  e=                 }        compare with e (the converted inputs)
 {3                   }        only keep the result of the comparison with the 3rd element (expected result)
 {             :⍵      }        if truthy, return the current base.
 {                    }        otherwise...
 {                ⍺∇⍵+1}        ...recurse with the base incremented

Chúng tôi sử dụng chức năng trợ giúp In, để nhận đầu vào thành định dạng hợp lý hơn. Nếu không, đầu vào được nhận một ma trận gồm 3 cột.

'3 9 42' sẽ đưa ra, ví dụ (đọc từ trên xuống rồi từ trái sang phải):

0 0 4
3 9 2

Và cho 'aA bB 36jk'(tương tự ở đây, alà 10, blà 11, Alà 36, v.v.)

 0  0  3
 0  0  6
10 11 19
36 37 20

2

Con trăn 2 - 197 213

Thật là một con quái vật ... (so với CJam)

from string import*
I=raw_input()
x,y,z=I.split()
B=lambda s,b:sum(b**i*(digits+lowercase+uppercase).find(s[-i-1])for i in range(len(s)))
print([b for b in range(B(max(I),10)+1,62)if B(x,b)*B(y,b)==B(z,b)]+[0])[0]

Thật không may int, chuyển đổi cơ sở chỉ có thể xử lý các cơ sở lên đến 36. Vì vậy, tôi cần phải tự mình thực hiện nó. (Xem giải pháp tuyệt vời này .)


Điều này có đảm bảo không trả về một cơ sở nhỏ hơn hoặc bằng các chữ số lớn nhất không?
Martin Ender

@ MartinBüttner: Tôi không chắc chắn. Ít nhất là không rõ ràng. Bạn có một trường hợp thử nghiệm trong đó đây là một vấn đề? (Trên thực tế, việc tạo các trường hợp thử nghiệm nên được OP quan tâm ...)
Falko

Hãy thử 2 * 3 = 20 trong đó có cơ sở 3 trong trường hợp lỗi. 3 không phải là một chữ số trong một hệ thống số thứ ba.
kay

2

CJam, 53 byte

lA,s'{,97>+'[,65>+f#_$W=1e>)63,>_@Wa/W%f{fb~*=}1#\0+=

Lấy ba đầu vào từ STDIN như

6 9 42

In 0nếu sản phẩm trong bất kỳ cơ sở là không thể

Sẽ cố gắng để chơi golf hơn nữa.

Hãy thử nó ở đây


1

JavaScript (E6) 129 139

Thử đệ quy tất cả các cơ sở từ 2 đến 62, trả về -1 nếu không có giá trị nào ổn.
Hàm parseInt của JavaScript hoạt động với cơ sở lên tới 36, vì vậy cần một chút trợ giúp cho các cơ sở lớn hơn.
Coi chừng, các tham số x, y, z là các chuỗi, không phải là số.
Nó khó khăn hơn nó dường như. Cảm ơn Martin đã chỉ ra một lỗi cơ bản trong phiên bản đầu tiên.

F=(x,y,z,b=2,N=n=>[for(d of(t=0,n))t=(v=parseInt(d,36)+(d>'@'&d<'a')*26)<b?t*b+v:NaN]&&t)=>b<63?N(x)*N(y)!=N(z)?F(x,y,z,b+1):b:-1

Ít chơi gôn

F=(x,y,z,b=2,
   D=d=>parseInt(d,36)+(d>'@'&d<'a')*26, // parse a single digit
   N=n=>[for(d of(t=0,n))t=(v=D(d))<b?t*b+v:NaN]&&t // parse a string
)=>b<63?N(x)*N(y)!=N(z)?F(x,y,z,b+1):b:-1

Kiểm tra trong bảng điều khiển FireFox / FireBug.
Thử nghiệm thử 1000 số với các cơ sở khác nhau (tối đa 36, ​​không phải 62). Điều đáng chú ý là cơ sở tìm thấy có thể đúng nhưng ít hơn cơ sở đã tạo ra trường hợp thử nghiệm.

for(i=0;i<1000;i++)
{
   x=Math.random()*100|0,y=Math.random()*100|0,z=x*y,b=Math.random()*35+2|0
   bx=x.toString(b),by=y.toString(b),bz=z.toString(b),
   nb=F(bx,by,bz)
   nx=parseInt(bx,nb),ny=parseInt(by,nb),nz=parseInt(bz,nb)
   // if (nx*ny != nz) // uncomment to se output for errors only
     console.log(x,y,z,'base '+b,bx,by,bz, 'found base '+nb,nx,ny,nz,nx*ny)
}

@ MartinBüttner các tham số là các chuỗi (vì các giá trị có thể là một cái gì đó giống như aA bB 36jk ...). Làm rõ trong câu trả lời.
edc65

Oh đúng, điều đó có ý nghĩa.
Martin Ender

1

Than , 28 byte

I⌊Φ…⊕⍘⌈⁺⁺θηζ⁶²¦⁶³⁼×⍘θι⍘ηι⍘ζι

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Đầu ra Nonenếu không có cơ sở hợp lệ có thể được tìm thấy. Giải trình:

         θ                      First input
        ⁺                       Concatenated with
          η                     Second input
       ⁺                        Concatenated with
           ζ                    Third input
      ⌈                         Maximum character (by ordinal)
     ⍘                          Converted from base
            ⁶²                  Literal 62
    ⊕                           Incremented
   …                            Range up to
               ⁶³               Literal 63
  Φ                             Filtered by
                    θ           First input
                   ⍘            Converted from base
                     ι          Current value
                  ×             Multiplied by
                       η        Second input
                      ⍘         Converted from base
                        ι       Current value
                 ⁼              Equals
                          ζ     Third input
                         ⍘      Converted from base
                           ι    Current value
 ⌊                              Minimum
I                               Cast to string
                                Implicitly print

Có thể có một chương trình TIO sử dụng mã thực tế mà bạn đã đăng không?
mbomb007

@ mbomb007 Bạn có thể dùng thử trực tuyến! nhưng trình tạo AST dường như nghĩ Anyvì một lý do nào đó ...
Neil

0

Erlang (bản mô tả) - 200

main(X)->m(2,X).
m(63,_)->0;m(C,X)->try[F,G,I]=[c(0,C,Y)||Y<-X],I=F*G,io:fwrite("~p",[C])catch _:_->m(C+1,X)end.
c(A,B,[H|T])->D=H-if$A>H->$0;$a>H->29;0<1->87end,if D<B->c(A*B+D,B,T)end;c(A,_,_)->A.

Thêm hai dòng mới hàng đầu phải có mặt.

Có thể đọc được:

#!/usr/bin/env escript

main(Args) -> test(2, Args).

test(63, _) -> 0;
test(Base, Args) ->
    try
        [Factor1, Factor2, Product] = [convert(0, Base, Arg) || Arg <- Args],
        Product = Factor1 * Factor2,
        io:fwrite("~p", [Base])
    catch _:_ ->
        test(Base + 1, Args)
    end.

convert(Accumulator, Base, [Head|Tail]) ->
    Digit = Head - if Head < $A -> $0;
                      Head < $a -> $A - 10 - 26;
                      true      -> $a - 10
                   end,
    if Digit < Base ->
        convert(Accumulator * Base + Digit, Base, Tail)
    end;
convert(Accumulator, _, _) -> Accumulator.

Cầu nguyện:

$ escript x.erl 6 9 42
13
$ escript -i x.erl a a 64
16
$ escript -i x.erl aA bB 36jk
41
$ escript -i x.erl 2 3 20
(no output)
$ escript -i x.erl 10 10 100
2

Điều này có đảm bảo không trả về một cơ sở nhỏ hơn hoặc bằng các chữ số lớn nhất không?
Martin Ender

Vâng, if Digit < Base -> … endphần chăm sóc nó. Nếu một ifkhối không có nhánh thực sự, thì một ngoại lệ được ném ra, được đưa vào try … catch _:_ -> … end.
kay

0

Haskell 216 char (177?)

Đã thử chơi golf này càng nhiều càng tốt. Nếu nhập khẩu được tính, thì đây là mã ngắn nhất của tôi (216)

import Data.Char
import Data.List
m=maximum
j[]=0;j(x:_)=x
f=reverse.map(\x->ord x-48)
g[]_=0;g(m:n)x=m+x*g n x
main=do
l<-getLine
let k@[x,y,z]=words l
print$j[n|n<-[2..62],g(f x)n*g(f y)n==g(f z)n,n>(m.map(m.f)$k)]

Tuy nhiên, nhập khẩu không được tính, thì đây là phiên bản tốt nhất của tôi (177):

import Data.Char
import Data.List
import Control.Applicative
m=maximum
j[]=0;j(x:_)=x
f=reverse.map(\x->ord x-48)
g[]_=0;g(m:n)x=m+x*g n x
main=words<$>getLine>>= \k@[x,y,z]->print$j[n|n<-[2..62],g(f x)n*g(f y)n==g(f z)n,n>(m.map(m.f)$k)]

Điều này coi mỗi số là một đa thức P (x) trong đó x là cơ sở, với điều kiện không có hệ số nào lớn hơn x; Sau đó, tôi đánh giá các đa thức trên mỗi cơ sở có thể, dừng lại khi tôi đạt được một thỏa mãn đẳng thức P (x) * Q (x) = R (x). Quy tắc 'cơ sở lớn hơn chữ số lớn nhất' được thi hành với người bảo vệ cuối cùng trong trận đấu mẫu, cụ thể là n>(m.map(m.f)$k). Tôi biết rằng các thử thách chơi gôn khác nhau và các nhà sản xuất thử thách khác nhau có các chính sách khác nhau liên quan đến việc nhập điểm, vì vậy hãy thực hiện lần thứ hai với một hạt muối.


Các giải pháp thực sự lần lượt là 216177 byte / ký tự. Nhưng giải pháp thứ hai là không hợp lệ, bởi vì nhập khẩu được tính trừ khi OP chỉ định rõ ràng khác, đó không phải là trường hợp ở đây như tôi có thể nói.
nyuszika7h

0

Prolog - 195 byte

Về cơ bản ý tưởng tương tự như câu trả lời Erlang của tôi:

:-use_module(library(main)).
main(A):-between(2,62,B),maplist(x(B),A,[F,G,P]),0is F*G-P,write(B).
c(I,B,Q,O):-Q=[H|T]->(H<65->D=48;H<97->D=29;D=87),H-D<B,c(I*B+H-D,B,T,O);O=I.
c(B)-->name,c(0,B).

Có thể đọc được:

:- use_module(library(main)).

main(Args) :-
    between(2, 62, Base),
    maplist(convert(Base), Args, [Factor1, Factor2, Product]),
    0 is Factor1 * Factor2 - Product,
    write(Base).

convert(Accumulator, Base, List, Output) :-
    List = [Head|Tail] ->
        (   Head < 65 -> Offset = 48;
            Head < 97 -> Offset = 29;
                         Offset = 87),
        Head - Offset < Base,
        convert(Accumulator * Base + Head - Offset, Base, Tail, Output);
    Output = Accumulator.

convert(Base, Input, Output) :-
    name(Input, List),
    convert(0, Base, List, Output).

Cầu nguyện:

$ swipl -qg main x.pl 6 9 42
13
$ swipl -qg main x.pl aA bB 36jk
41
$ swipl -qg main x.pl 2 3 20
ERROR: Unknown message: goal_failed(main([2,3,20]))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.