주어진 방정식이 참인 밑을 구합니다


22

3 개의 정수가 주어지면 처음 두 정수가 세 번째로 곱할 수있는 가장 낮은 기준을 결정하십시오. 인생의 궁극적 인 질문에 대한 답을 생각한다면, 우주와 모든 것, 6 * 9 == 42는 기초 13에서 참입니다.

입력은 숫자가 0-9, az 및 AZ 문자를 사용하는 숫자를 포함 할 수 있습니다. 여기서 a10은 10이고 10 Z은 61입니다.

입력은 원하는 방식으로 입력해야하며 (하드 코딩 제외) 개별 기능 또는 전체 프로그램을 작성할 수 있습니다.

고려해야 할 최대베이스는베이스 62이고 최소베이스는베이스 2입니다.

처음 두 값이 세 번째 값보다 작다고 가정 할 수 있습니다. 최소 기준이 입력에서 가장 높은 자릿수 / 문자보다 하나 더 크다고 결론을 내릴 수도 있습니다 (예를 들어, 입력이 3 1a 55인 경우 최소 기준은 a가장 높은 자릿수 이기 때문에 최소 기준은 11 이됩니다).

그러한 기반이 없으면 선택한 정크 값을 반환하십시오.

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.

테스트 사례

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

STDIN이 더 좋을 것이라고 생각합니다.
erdekhayser

@ MartinBüttner 두 형식 중 하나만 입력해야합니까?
erdekhayser

1
명확하게 설명하기 위해 마지막 예제 (현재 제거되었지만 10 * 10 = 100)와 같이 여러 개의 염기가 유효한 경우 수행해야 할 작업은 10에서 유효하며 실제로 관심있는 다른 염기는 무엇입니까? 언급 ...
Chris

1
@Kay 기본 시스템 b보다 일반적인 방법으로 위치 시스템을 정의하면 a_0 b^0 + a_1 b^1 + a_2 b^2 + ...( a_01 가장 작은 숫자가있는 곳 ) 확실히 의미가 있습니다. 더욱이 OP의 결론은 현재 가장 큰 숫자가 0 인 경우 검색에 밑이 1을 포함 할 것입니다.
Martin Ender

2
기본 1에 대해 단항은 숫자 시스템입니다. en.m.wikipedia.org/wiki/Unary_numeral_system
erdekhayser

답변:


3

CJam, 52 51 48 바이트

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

여기에서 테스트하십시오. 온라인 테스터는 ARGV를 통한 입력을 지원하지 않습니다. 가장 가까운 대안은 입력 6 9 42을 STDIN에 넣고 다음을 사용하는 것입니다.

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

-1최대 62 개의 유효한베이스를 찾을 수없는 경우 인쇄 합니다.

숫자 파싱 코드에 대해 Peter에게 감사드립니다!

카운트에 14 바이트를 추가하는 많은 문제를 해결했습니다. 다음 설명은 여전히 ​​원본 제출에 대한 것이며 내일 시간에 업데이트하겠습니다.

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.";

프로그램 종료시 색인이 자동으로 인쇄됩니다.


GS에서 숫자는로 구문 분석 될 수 있습니다 32base~\[-16.35 9]=+. CJam은 기본 변환이 짧다는 것을 알고 있습니다.
피터 테일러

7

APL (Dyalog Unicode) , 30 바이트 SBCS

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

온라인으로 사용해보십시오!

도움을 주신 Adám에게 감사드립니다.

설명:

⊢{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

보다 유용한 In형식으로 입력을 받기 위해 도우미 함수 인을 사용 합니다. 그렇지 않으면 입력에 3 열의 행렬이 수신됩니다.

'3 9 42' 예를 들어 (위에서 아래로 읽은 다음 왼쪽에서 오른쪽으로) :

0 0 4
3 9 2

그리고 'aA bB 36jk'(여기서는 a10, b11, A36 등)

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

2

파이썬 2-197 213

이 괴물은 ... (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]

불행히도 int의 기본 변환은 최대 36 개의 기본 만 처리 할 수 ​​있습니다. 따라서 직접 구현해야했습니다. ( 이 훌륭한 해결책을보십시오 .)


이것은 가장 큰 자릿수 이하의 밑을 반환하지 않습니까?
Martin Ender

@ MartinBüttner : 잘 모르겠습니다. 적어도 명시 적으로는 아닙니다. 이것이 문제가되는 테스트 사례가 있습니까? (실제로 테스트 사례 생성은 OP에서 처리해야합니다 ...)
Falko

오류가 발생한 경우 밑이 3 인 2 * 3 = 20을 시도하십시오. 3은 3 진수 시스템의 숫자가 아닙니다.
kay

2

CJam, 53 바이트

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

STDIN에서 3 개의 입력을 다음과 같이 취합니다.

6 9 42

0베이스에 제품이없는 경우 인쇄

그것을 더 골프하려고합니다.

여기 사용해보십시오


1

자바 스크립트 (E6) 129139

2에서 62까지의 모든 염기를 재귀 적으로 시도하고 값이 없으면 -1을 반환합니다.
JavaScript parseInt 함수는 최대 36 개까지 사용할 수 있으므로 더 큰베이스에는 약간의 도움이 필요합니다.
매개 변수 x, y, z는 숫자가 아니라 문자열입니다.
생각보다 어렵습니다. 첫 번째 버전의 기본 버그를 지적한 Martin에게 감사합니다.

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

덜 골프

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

FireFox / FireBug 콘솔에서 테스트하십시오 .
이 시험은 다른 염기 (62 개가 아닌 36 개)로 1000 개의 숫자를 시도합니다. 발견 된 기준은 정확하지만 테스트 사례를 생성 한 기준보다 적을 수 있습니다.

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 매개 변수는 문자열입니다 (가능한 값은 aA bB 36jk ...와 같습니다). 답이 명확 해졌다.
edc65

아 맞다.
Martin Ender

1

, 28 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. None유효한 염기를 찾을 수없는 경우 출력 합니다. 설명:

         θ                      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

게시 한 실제 코드를 사용하는 TIO 프로그램을 가질 수 있습니까?
mbomb007

@ mbomb007 온라인으로 해볼 수 있습니다 ! 하지만 발전기가 생각하는 것 같습니다 AST는 것입니다 Any... 어떤 이유

0

얼랭 (Escript)-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.

반드시 있어야하는 두 개의 줄 바꿈을 추가하십시오.

읽을 수있는 내용 :

#!/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.

기도:

$ 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

이것은 가장 큰 자릿수 이하의 밑을 반환하지 않습니까?
Martin Ender

그렇습니다. if Digit < Base -> … end부분은 그것을 처리합니다. 는 IF if블록이 진정한 지점이 없다,는 예외가에 잡힐있는 슬로우됩니다 try … catch _:_ -> … end.
kay

0

하스켈 216 자 (177?)

이것을 최대한 골프하려고했습니다. 수입이 계산되면 가장 짧은 코드입니다 (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)]

그러나 수입은 계산되지 않았으며 이것이 내 최고의 버전 (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)]

이것은 x보다 큰 계수가없는 조건에서 각 수를 다항식 P (x)로 취급합니다. 그런 다음 각 가능한 기준에 대한 다항식을 평가하여 동등 P (x) * Q (x) = R (x)를 만족하는 것에 도달하면 멈 춥니 다. '기준이 가장 큰 자릿수보다 큽니다.'규칙은 패턴 일치의 마지막 가드, 즉로 적용 n>(m.map(m.f)$k)됩니다. 다른 골프 챌린지와 다른 챌린지 제작자들은 점수에 대한 수입과 관련하여 다른 정책을 가지고 있다는 것을 알고 있습니다.


솔루션은 실제로 각각 216177 바이트 / 문자입니다. 그러나 OP가 명시 적으로 달리 지정하지 않는 한 수입 계산 되기 때문에 두 번째 솔루션은 유효하지 않습니다. 여기서는 말할 수 없습니다.
nyuszika7 시간

0

프롤로그-195 바이트

기본적으로 Erlang 답변과 동일한 아이디어입니다.

:-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).

읽을 수있는 내용 :

:- 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).

기도:

$ 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]))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.