যে বেসটি দেওয়া সমীকরণটি সত্য তা নির্ধারণ করুন


22

তিনটি পূর্ণসংখ্যা দেওয়া, তৃতীয়টিতে গুণমানের জন্য প্রথম দুটি পূর্ণসংখ্যার সর্বনিম্ন সম্ভাব্য বেস নির্ধারণ করুন। আপনি যদি জীবনের চূড়ান্ত প্রশ্নের উত্তরটি মনে করেন, মহাবিশ্ব এবং সমস্ত কিছু, 6 * 9 == 42, 13 বেসে সত্য 13

ইনপুটগুলিতে এমন কোনও সংখ্যার অন্তর্ভুক্ত থাকতে পারে যার অঙ্কগুলি 0-9, অ্যাজ, এবং এজেড অক্ষর ব্যবহার করে, যেখানে aবেস 10 এর 10 সমান, এবং বেস 10 Zএ 61 হয়।

ইনপুটগুলি আপনার পছন্দ মতো (হার্ড-কোডিং ব্যতীত) ইনপুট করা উচিত এবং আপনি কোনও পৃথক ফাংশন বা একটি সম্পূর্ণ প্রোগ্রাম লিখতে পারেন write

যে সর্বাধিক বেসটি বিবেচনা করতে হবে তা বেস 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

@ মার্টিনব্যাটনার সুতরাং আমি কি কেবল কোনও আকারে ইনপুটটি অনুমতি দেব?
erdekhayser

1
স্পষ্টকরণের একটি বিষয় হিসাবে যদি একাধিক ঘাঁটি বৈধ হয় তবে কী করা উচিত যেমন আপনার শেষ উদাহরণ (যা এখন সরিয়ে দেওয়া হয়েছে - এটি ছিল 10 * 10 = 100) যেখানে এটি বেস 10 এও বৈধ এবং সত্যই আপনার অন্য কোনও বেসকে যত্ন নেওয়া উচিত উল্লেখ ...
ক্রিস

1
@ কে আমি যদি বেসের অবস্থানের ব্যবস্থাটি bসাধারণভাবে বেস হিসাবে সংজ্ঞায়িত করি তবে বেস 1 এর চেয়ে কম a_0 b^0 + a_1 b^1 + a_2 b^2 + ...(যেখানে a_0সর্বনিম্ন তাৎপর্যপূর্ণ সংখ্যা রয়েছে) অবশ্যই বোধগম্য হয়। তদুপরি, ওপির উপসংহারে সর্বাধিক বর্তমান সংখ্যা 0 হলে অনুসন্ধানে বেস 1 অন্তর্ভুক্ত করবে
মার্টিন ইন্ডার

2
বেস 1 সম্পর্কে, unary একটি সংখ্যা সিস্টেম। en.m.wikedia.org/wiki/Unary_numeral_system
erdekhayser

উত্তর:


3

সিজেম, 52 51 48 বাইট

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

এটি এখানে পরীক্ষা করুন। অনলাইন পরীক্ষক এআরজিভি এর মাধ্যমে ইনপুট সমর্থন করে না। নিকটতম বিকল্পটি 6 9 42এসটিডিআইএন-এর মতো ইনপুটটি রাখুন এবং ব্যবহার করুন:

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

-162 টি পর্যন্ত কোনও বৈধ বেস পাওয়া যাবে না তবে এই মুদ্রণগুলি ।

ডিজিট পার্সিং কোডের জন্য পিটারকে অনেক ধন্যবাদ!

আমি প্রচুর সমস্যা সমাধান করেছি যা গণনাতে 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.";

সূচিটি প্রোগ্রাম শেষে স্বয়ংক্রিয়ভাবে মুদ্রিত হয়।


জিএস-তে অঙ্কগুলি পার্স করা যায় 32base~\[-16.35 9]=+। আমি জানি সিজেমের সংক্ষিপ্ত বেস রূপান্তর আছে।
পিটার টেলর

7

এপিএল (ডায়ালগ ইউনিকোড) , 30 বাইট এসবিসিএস

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

এটি অনলাইন চেষ্টা করুন!

সহায়তার জন্য আদমকে ধন্যবাদ

ব্যাখ্যা:

⊢{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, Aহ'ল 36, ইত্যাদি)

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

2

পাইথন 2 - 197 213

কী দানব ... (সিজেমের সাথে তুলনা করে)

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 অবধি বেসগুলি পরিচালনা করতে পারে So সুতরাং আমার নিজের দ্বারা এটি প্রয়োগ করা দরকার। ( এই দুর্দান্ত সমাধান দেখুন ।)


এটি কি নিশ্চিত করে যে কোনও সংখ্যা সবচেয়ে বড় সংখ্যার চেয়ে কম বা এর সমান না ফেরে?
মার্টিন ইন্ডার

@ মার্টিনবাটনার: আমি নিশ্চিত নই। অন্তত স্পষ্টভাবে না। আপনার কোন পরীক্ষার কেস আছে যেখানে এটি একটি সমস্যা? (প্রকৃতপক্ষে, ওপি দ্বারা পরীক্ষার কেস তৈরির যত্ন নেওয়া উচিত ...)
ফ্যালকো ২

2 * 3 = 20 চেষ্টা করুন যার ত্রুটির ক্ষেত্রে বেস 3 রয়েছে। 3 একটি তিনবারের সংখ্যা ব্যবস্থায় একটি অঙ্ক নয়।
কে ২


1

জাভাস্ক্রিপ্ট (E6) 129 139

সমস্ত ঘাঁটিটি 2 থেকে 62 পর্যন্ত পুনরায় চেষ্টা করুন, কোনও মান ঠিক না থাকলে -1 ফিরে আসুন।
জাভাস্ক্রিপ্ট পার্সইন্ট ফাংশন 36 পর্যন্ত বেসের সাথে কাজ করে, তাই বৃহত্তর ঘাঁটিগুলির জন্য একটু সহায়তা প্রয়োজন।
সাবধান, এক্স, y, z প্যারামিটারগুলি স্ট্রিং, সংখ্যা নয়।
এটি মনে হয় তার চেয়ে বেশি কঠিন difficult প্রথম সংস্করণে একটি মৌলিক বাগ চিহ্নিত করার জন্য মার্টিনকে ধন্যবাদ।

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

টেস্ট ফায়ারফক্স / ফায়ারবাগ কনসোলটি।
পরীক্ষাটি বিভিন্ন ঘাঁটি (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)
}

@ মার্টিনব্যাটনার প্যারামিটারগুলি স্ট্রিং (সম্ভাব্য মানগুলি এএ বিবি 36 জেকের মতো ...)। উত্তরে স্পষ্ট করা হয়েছে।
edc65

ওহ ঠিক আছে, এটা বোঝা যায়।
মার্টিন এন্ডার

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

আপনার পোস্ট করা আসল কোডটি ব্যবহার করে এমন কোনও টিআইও প্রোগ্রাম থাকা কি সম্ভব?
mbomb007

@ mbomb007 আপনি এটি অনলাইনে চেষ্টা করতে পারেন ! কিন্তু এবং AST জেনারেটরের মনে বলে মনে হয় হয় Anyকোনো কারণে ...
নিল

0

এরলং (এসক্রিপ্ট) - 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

এটি কি নিশ্চিত করে যে কোনও সংখ্যা সবচেয়ে বড় সংখ্যার চেয়ে কম বা এর সমান না ফেরে?
মার্টিন ইন্ডার

হ্যাঁ, if Digit < Base -> … endঅংশটি এটি যত্ন করে। যদি কোনও ifব্লকের কোনও সত্যিকারের শাখা থাকে না, তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়, যা ধরা পড়ে try … catch _:_ -> … end
কে

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 হল বেস, এই শর্তে যে কোনও সহগ x এর চেয়ে বড় নয়; আমি তারপরে প্রতিটি সম্ভাব্য বেসের উপরে বহুভুজগুলি মূল্যায়ন করি, যখন আমি সমানতাকে পি (এক্স) * কিউ (এক্স) = আর (এক্স) সন্তুষ্ট করে এমন একটি পৌঁছায় তখন থামছি। 'বেসটি সবচেয়ে বড় অঙ্কের চেয়ে বড়' নিয়মটি প্যাটার্ন ম্যাচে শেষ গার্ডের সাথে প্রয়োগ করা হয়, যথা n>(m.map(m.f)$k)। আমি জানি যে বিভিন্ন গল্ফিং চ্যালেঞ্জ এবং বিভিন্ন চ্যালেঞ্জ-নির্মাতাদের ভিজ-এ-ভিজু স্কোরিং সম্পর্কে আমদানি সম্পর্কিত বিভিন্ন নীতি রয়েছে, তাই দ্বিতীয়টিকে লবণের দানা দিয়ে নিন।


সমাধানগুলি যথাক্রমে 216 এবং 177 বাইট / অক্ষর। কিন্তু দ্বিতীয় সমাধান কারণ আমদানি, অবৈধ হয় সংখ্যাত যদি না ওপি স্পষ্টভাবে অন্যথায় নির্দিষ্ট করে, যে ক্ষেত্রে এখানে যতটা আমি বলতে পারেন না।
nyuszika7h

0

প্রোলোগ - 195 বাইট

মূলত আমার ইরং এর উত্তর হিসাবে একই ধারণা:

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