กำหนดฐานที่สมการที่กำหนดเป็นจริง


22

ให้ 3 จำนวนเต็มกำหนดฐานที่เป็นไปได้ต่ำสุดสำหรับจำนวนเต็มสองตัวแรกเพื่อคูณเป็นสาม หากคุณนึกถึงคำตอบของคำถามที่สุดยอดแห่งชีวิตจักรวาลและทุกสิ่ง 6 * 9 == 42 นั้นเป็นจริงในฐาน 13

อินพุตสามารถรวมตัวเลขใด ๆ ที่มีตัวเลขใช้อักขระ 0-9, az และ AZ ซึ่งaเท่ากับ 10 ในฐาน 10 และZ61 ในฐาน 10

อินพุตควรป้อนเข้าในแบบที่คุณชอบ (ยกเว้นการเข้ารหัสแบบแข็ง) และคุณสามารถเขียนได้ทั้งฟังก์ชั่นของแต่ละบุคคลหรือทั้งโปรแกรม

ฐานสูงสุดที่ต้องพิจารณาคือฐาน 62 และฐานขั้นต่ำคือฐาน 2

คุณสามารถสันนิษฐานได้ว่าสองค่าแรกมีขนาดเล็กกว่าค่าที่สาม คุณสามารถสรุปได้ว่าฐานขั้นต่ำนั้นมากกว่าตัวเลข / ตัวอักษรสูงสุดจากอินพุต (ตัวอย่างเช่นหากมีการป้อน3 1a 55ข้อมูลฐานขั้นต่ำจะเป็นฐานที่ 11 เพราะaเป็นหลักที่สูงที่สุด)

หากไม่มีฐานดังกล่าวคืนค่าขยะที่คุณต้องการ

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ

กรณีทดสอบ

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_0เป็นตัวเลขที่สำคัญน้อยที่สุด) กว่าฐาน 1 ทำให้รู้สึกอย่างแน่นอน นอกจากนี้ข้อสรุปของ OP ยังรวมถึงฐาน 1 ในการค้นหาหากตัวเลขที่ใหญ่ที่สุดในปัจจุบันคือ 0
Martin Ender

2
เกี่ยวกับ base 1, unary คือระบบตัวเลข 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

ขอบคุณมากสำหรับปีเตอร์สำหรับรหัสการแยกวิเคราะห์หลัก!

ฉันแก้ไขปัญหาจำนวนมากซึ่งเพิ่ม 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 มีการแปลงฐานที่สั้นกว่า
Peter Taylor

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'(เหมือนกันที่นี่aคือ 10, b11, Aคือ 36, ฯลฯ )

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

2

Python 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

ลอง 2 * 3 = 20 ซึ่งมีฐาน 3 ในกรณีข้อผิดพลาด 3 ไม่ใช่ตัวเลขในระบบเลขประกอบ
kay


1

JavaScript (E6) 129 139

ลองใช้ฐานทั้งหมดซ้ำตั้งแต่ 2 ถึง 62 โดยส่งคืน -1 ถ้าไม่มีค่าใด ๆ
ฟังก์ชั่น parseInt JavaScript ทำงานได้กับฐานสูงสุด 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

น้อย golfed

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
การทดสอบจะพยายาม 1,000 หมายเลขด้วยฐานต่างกัน (สูงสุด 36 ไม่ใช่ 62) เป็นที่น่าสังเกตว่าฐานที่พบนั้นอาจถูกต้อง แต่น้อยกว่าฐานที่สร้างกรณีทดสอบ

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

Erlang (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 try … catch _:_ -> … end
kay

0

Haskell 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)]

นี่ถือว่าแต่ละหมายเลขเป็นพหุนาม P (x) โดยที่ x เป็นฐานโดยมีเงื่อนไขว่าไม่มีสัมประสิทธิ์มากกว่า x; จากนั้นฉันประเมินค่าพหุนามในแต่ละฐานที่เป็นไปได้หยุดเมื่อฉันไปถึงหนึ่งที่สอดคล้องกับความเท่าเทียมกัน P (x) * Q (x) = R (x) n>(m.map(m.f)$k)'ที่ฐานมีขนาดใหญ่กว่าบาทที่ใหญ่ที่สุดกฎจะถูกบังคับใช้กับยามที่ผ่านมาในการแข่งขันรูปแบบคือ ฉันรู้ว่าความท้าทายในการเล่นกอล์ฟที่แตกต่างกันและผู้กำหนดความท้าทายที่แตกต่างกันมีนโยบายที่แตกต่างกันเกี่ยวกับการนำเข้าการให้คะแนนแบบเผชิญหน้าดังนั้นลองทำข้อสองกับเกลือเม็ด


การแก้ปัญหาเป็นจริง216และ177ไบต์ / ตัวอักษรตามลำดับ แต่วิธีที่สองนั้นไม่ถูกต้องเนื่องจากมีการนับการนำเข้าเว้นแต่ OP จะระบุเป็นอย่างอื่นอย่างชัดเจนซึ่งไม่ใช่กรณีที่นี่เท่าที่ฉันสามารถบอกได้
nyuszika7h

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.