ইথিওপিয়ান গুণ


17

এই প্রশ্নটি এই উত্তর দ্বারা অনুপ্রাণিত হয় । কাকতালীয়ভাবে, আমি যখন ছোট ছিলাম তখন আমি ইথিওপীয় বহুগুণ ব্যবহার করতাম, তবে এই পদ্ধতির নাম কিছুদিন আগে জানা ছিল না।

ইথিওপীয় গুণগুলি কেবল সংযোজন, দ্বিগুণ এবং অর্ধনমিতকরণ ব্যবহার করে পূর্ণসংখ্যাকার পূর্ণসংখ্যার একটি পদ্ধতি।

পদ্ধতি:

  1. গুণতে দুটি সংখ্যা নিন এবং দুটি কলামের শীর্ষে এগুলি লিখুন।
  2. বাম-হাতের কলামে বারবার শেষ সংখ্যাটি অর্ধেক করুন, কোনও অবশিষ্টাংশকে ছাড়িয়ে দিন এবং একই কলামে শেষের নীচে ফলাফলটি লিখুন, যতক্ষণ না আপনি 1 এর মান লিখেন।
  3. ডান হাতের কলামে বারবার শেষ সংখ্যাটি দ্বিগুণ করুন এবং ফলাফলটি নীচে লিখুন। আপনি যখন বাম হাতের কলামটি 1 দেখায় ঠিক একই সারিতে ফলাফল যুক্ত করবেন তখন থামুন।
  4. উত্পাদিত টেবিলটি পরীক্ষা করুন এবং বাম কলামের মান সমান এমন কোনও সারি বাতিল করুন। ডান-হাতের কলামের মানগুলি যোগ করুন যা মূল দুটি সংখ্যাকে একসাথে গুণ করার ফলাফল তৈরি করতে পারে।

উদাহরণস্বরূপ: 17 x 34

17    34

প্রথম কলামটি অর্ধেক করা:

17    34
 8
 4
 2
 1

দ্বিতীয় কলাম দ্বিগুণ করা:

17    34
 8    68
 4   136 
 2   272
 1   544

স্ট্রাইক আউট সারি যার প্রথম ঘরটি সমান, আমরা স্কোর বন্ধনীতে ডানদিকে এই সংখ্যাগুলি আবদ্ধ করে এটি করব:

17    34
 8   [68]
 4  [136]
 2  [272]
 1   544

ডান-হাতের কলামে অবশিষ্ট সংখ্যাগুলি যোগ করুন:

17    34
 8   [68]
 4  [136]
 2  [272]
 1   544
    =====
     578

সুতরাং 17 ইথিয়পিয়ান পদ্ধতি দ্বারা 34 দ্বারা গুন 578 হয়।

কাজটি:

গল্ফ কোড যা 1 এবং 1000 এর মধ্যে দুটি সংখ্যা নেয় এবং নীচের পণ্যটি প্রদর্শন করে একই লেআউট এবং অ্যালগরিদম সম্পাদন করে।

ইনপুট পদ্ধতি: তবে আপনি চয়ন করেন ...

উদাহরণ ইনপুট:

19 427

ফলাফল আউটপুট:

19   427
 9   854
 4 [1708]
 2 [3416]
 1  6832
   ======
    8113

অঙ্কগুলির প্রান্তিককরণটি নোট করুন। এটি বিন্যাসে সবচেয়ে গুরুত্বপূর্ণ। এছাড়াও লক্ষ করুন যে সমান চিহ্ন দ্বারা বিভক্ত ডাবল লাইনটি সামগ্রিক উত্তরের চেয়ে দুটি অক্ষর দীর্ঘ হতে হবে এবং অবশ্যই কেন্দ্রিক ন্যায়সঙ্গত হতে হবে।

পরীক্ষামূলক

আপনি কিভাবে এটি পরীক্ষা করবেন? দুটি সংখ্যা ব্যবহার করে আপনার প্রোগ্রামের একটি রান সরবরাহ করে। এই নম্বরগুলি আপনার ব্যবহারকারীর আইডি নম্বর থেকে বের করা যেতে পারে (শীর্ষ উইন্ডোতে আপনার অবতারের উপরে আপনার কার্সারটি ঘুরিয়ে নিয়ে এটি পাওয়া যেতে পারে)। আপনার নাম্বারটি নিন এবং শেষ তিনটি অঙ্ক নিন, এটি বি নম্বর হবে, সামনে যা থাকবে তা নিয়ে যান, এটি নম্বর এ হবে Then তারপরে A বার বি পরীক্ষা করুন

পরীক্ষার উদাহরণ:

আমার ব্যবহারকারীর আইডি নম্বর 8555, সুতরাং আমার সংখ্যাগুলি 8 এবং 555। তাই আমার আউটপুটটি এটির মতো দেখা উচিত:

8  [555]
4 [1110]
2 [2220]
1  4440
  ======
   4440

সীমাবদ্ধতা:

অ্যালগরিদমে উল্লিখিত অনুসারে কোনও দ্বিগুণ অপারেটরকে "দ্বিগুণ" ব্যবহারের জন্য সংরক্ষণের অনুমতি নেই। অন্য কথায়, আপনি যদি * এর মতো কোনও অপারেটর ব্যবহার করেন তবে এটি কেবলমাত্র 2 দ্বারা গুণনের জন্য ব্যবহার করা যেতে পারে।

যেগুলি প্রবেশ করে না সেগুলিকে বিবেচনা করা হবে না এবং ব্যবহারকারীকে তাদের জিনিসপত্রের পূর্ণ কার্ডবোর্ড বাক্সের সাহায্যে প্রাঙ্গনে বাইরে নিয়ে যাওয়া হবে। প্রতিটি প্রবেশের কোড থাকবে, এবং আপনার ব্যবহারকারীর আইডি নম্বরের উপর ভিত্তি করে পরীক্ষা।

এটি কোড গল্ফ। সবচেয়ে কম সংখ্যক বাইট তাদের সমবয়সীদের পুরষ্কার, গৌরব এবং প্রশংসা পাবেন ... (এবং সম্ভবত কোনও লাম্বোরগিনি ... আমি বলেছিলাম "সম্ভবত"!)


5
"সত্যিকারের কোনও গুণটি অবশ্যই ঘটবে না" " - এটি অযৌক্তিক। আপনি কয়েকটি অক্ষর (যেমন *বা x) ব্যবহার সীমাবদ্ধ করতে পারেন তবে গুণটি ব্যবহৃত হয়েছে কি না তা সনাক্ত করা অসম্ভব। সেই অংশটি বাদে চ্যালেঞ্জটি আকর্ষণীয়।

হতে পারে আপনি কোডটির সম্পূর্ণ বিবরণ চেয়েছিলেন যা প্রমাণ করে যে অ্যালগরিদমটি কোনও গুণ ছাড়াই প্রয়োগ করা হয়েছে বা একটি সীমাহীন সিমুলেশন যা পছন্দসই আউটপুট সরবরাহ করে। তবে এটি আমার কাছে দুটি স্বতন্ত্র চ্যালেঞ্জের মতো দেখাচ্ছে।
আর্নল্ড

1
যেমন স্যান্ডবক্সে উল্লেখ করা হয়েছে, সম্পর্কিত, সম্ভাব্য দ্বৈত । @ ফেলিক্সপ্যালম্যান, হ্যাঁ, এটি বাইনারিতে দীর্ঘ গুণ।
পিটার টেলর

উত্তর:


8

কাঠকয়লা , 91 বাইট

≔⟦⟧τ≔⁰σNθNηWθ«⊞τ⪫  Iθ⊞υ⪫⎇﹪θ²  ¦[]Iη≔⁺σ∧﹪θ²ησ≔÷θ²θ≔⁺ηηη»⊞υ…=⁺²LIσ⊞υ⪫  Iσ←E⮌τ⮌ιM⌈EυLιLυ←E⮌υ⮌ι

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

≔⟦⟧τ≔⁰σ

সেট tখালি লিস্টে এবং sকরতে 0। ( uইতিমধ্যে খালি তালিকায় ডিফল্ট)

NθNη

দুটি সংখ্যা ইনপুট করে।

Wθ«

qননজারো থাকা অবস্থায় পুনরাবৃত্তি করে ।

   ⊞τ⪫  Iθ

qপ্যাডিংয়ে মোড়ানো এবং এটি তালিকায় যুক্ত করুন t

   ⊞υ⪫⎇﹪θ²  ¦[]Iη

মোড়ানো hপারেন প্যাডিং অথবা []কিনা তার উপর নির্ভর করে qবিজোড় হয়, এবং তালিকায় যোগ u

   ≔⁺σ∧﹪θ²ησ

যোগ hকরার জন্য sযদি qবিজোড় হয়।

   ≔÷θ²θ

পূর্ণসংখ্যা q2 দ্বারা বিভক্ত ।

   ≔⁺ηηη»

যোগ hনিজেই।

⊞υ…=⁺²LIσ

=তালিকায় চিহ্নের উপযুক্ত স্ট্রিং যুক্ত করুন u

⊞υ⪫  Iσ

sতালিকায় প্যাডড যোগ যোগ করুন u

←E⮌τ⮌ι

তালিকাটি ঘোরান t180 ° দ্বারা এবং এটিকে উপরের দিকে নীচে মুদ্রণ করুন, সুতরাং এটি ডান-সমর্থনযোগ্য করে তোলা।

M⌈EυLιLυ←E⮌υ⮌ι

কার্সারটি এমনভাবে সরান যাতে uডান-জায়েজ হওয়ার সাথে সাথে তার শীর্ষ বাম কোণার রেখাগুলি উপরের-ডান দিকের কোণায় পৌঁছে যায় এবং uডান-ন্যায়সঙ্গত প্রিন্ট করে ।


আশ্চর্যজনক কাজ. আপনার এখন পর্যন্ত সীসা রয়েছে, @ নীল। ভাষা সম্পর্কে আমি আরও কোথায় জানতে পারি, সেখানে কোনও লিঙ্ক আছে?
ওয়েলওয়েস্ট

1
@WallyWest শিরোনামটি গিটহাব পৃষ্ঠায় লিঙ্ক করা হয়েছে এবং সেখান থেকে আপনি আরও তথ্যের জন্য উইকি পড়তে পারেন।
নীল

8

পাইথন 2 , 203 202 187 133 বাইট

a,b=input()
s=0
while a:print'%3s%9s'%(a,'[ %%dd] '[a%2::2]%b);s+=[0,b][a%2];a/=2;b*=2
print'%10s==\n%11s'%(''.rjust(len(`s`),'='),s)

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

আমি যদি *স্ট্রিং গুণ ( '='*R) এর জন্য এবং 'নির্বাচক' (এর b*(a%2)পরিবর্তে [0,b][a%2]) হিসাবে ব্যবহার করতে পারি তবে আমি পেয়েছি:

118 বাইট

a,b=input()
s=0
while a:print'%3s%9s'%(a,'[ %%dd] '[a%2::2]%b);s+=a%2*b;a/=2;b*=2
print'%10s==\n%11s'%('='*len(`s`),s)

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


ব্যাখ্যা:

a,b=input()                   #Get input
L=len(`a`)                    #Get length of first number for adjusting text
l=[]                          #Output list
s=0                           #Sum
while a:
 B=['[%d]',' %d '][a%2]%b     #B is either '[b]' or ' b ' depending on if a is odd/even
 l+=[(`a`,B)]                 #Add a,B to output list
 s+=[0,b][a%2]                #Add b to sum if a is odd
 a/=2;                        #Halve a
 b*=2;                        #Double b
R=len(B)                      #Length of last B for adjusting output
l+=[('',''.rjust(R,'='))]     #Add double line ==== to output list
l+=[('','%d '%s)]             #Add sum to output list
for x,y in l:
 print x.rjust(L),y.rjust(R)  #Print adjusted numbers


4

জাভা (ওপেনজেডিকে 8) , 353 316 267 214 210 বাইট

(a,b)->{int g=0;for(;a>0;g+=a%2*b,a/=2,b*=2)System.out.printf("%1$8d%2$10s\n",a,a%2<1?"["+b+"]":b+" ");System.out.printf("%1$19s%2$18s","".valueOf(new char[(int)Math.log10(g)+3]).replace("\0","=")+"\n",g+" ");}

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


1
214 বাইট:(a,b)->{int g=0;for(;a>0;g+=a%2*b,a/=2,b*=2)System.out.printf("%1$8d%2$10s\n",a,a%2<1?"["+b+"]":" "+b+" ");System.out.printf("%1$19s%2$18s","".valueOf(new char[(int)Math.log10(g)+3]).replace("\0","=")+"\n",g+" ");}
নেভায়ে

@নিভায় a%2*bসুন্দর এবং সহজ, আপনাকে ধন্যবাদ
রবার্তো গ্রাহাম

4

গণিত, 264 বাইট

(s=#;k=(i=IntegerLength)@s;t=#2;w=0;P=Print;T=Table;While[s>0,If[OddQ@s,P[""<>T[" ",k-i@s],s,"  ",""<>T[" ",i[s(t)]-i@t],t];w=w+t,P[""<>T[" ",k-i@s],s,""<>T[" ",i[s(t)]-i@t]," [",t,"]"]];s=Quotient[s,2];t=2t];P[" "<>T[" ",k],""<>T["=",i@w+2]];P["  "<>T[" ",k],w])&


ইনপুট

[19.427]

আউটপুট

19   427  
 9   854  
 4 [1708]  
 2 [3416]  
 1  6832  
   ======  
    8113  

আপনি সম্ভবত ইনফিক্স নোটেশন ব্যবহার করে একটি সম্পূর্ণ এক বাইট সংরক্ষণ করতে পারেন s=Quotient[s,2]:)
নামমানিয়াক


3

জাভাস্ক্রিপ্ট 2017, 221 বাইট

বেশিরভাগই আউটপুট বিন্যাসের সমস্যা

(a,b)=>{for(t=b,r=0,l=[],w=`${a}`.length;a;l.push([a,t]),a>>=1,t+=t)z=`${r+=a&1&&t}`.length+2;P=(s,w)=>`${s}`.padStart(w);return[...l.map(([a,b])=>P(a,w)+P(a&1?b+' ':`[${b}]`,z+1)),P('='.repeat(z),z-~w),P(r,z+w)].join`
`}

কম গল্ফড

(a, b) => {
  var w=`${a}`.length, r=0, l=[]
  while(a) {
    r += a&1 && b
    l.push([a,b])
    a >>= 1
    b += b
  }
  // algo complete, result in r, now display it and the steps in l[]
  var z=`${r}`.length+2
  var P= (s,w) => `${s}`.padStart(w)
  return [... l.map( ([a,b]) => P(a,w) + P(a&1?b+' ' : `[${b}]`, z+1) )
    , P('='.repeat(z), z+w+1)
    , P(r, z+w)
  ].join`\n`
}

পরীক্ষা

var F=
(a,b)=>{for(t=b,r=0,l=[],w=`${a}`.length;a;l.push([a,t]),a>>=1,t+=t)z=`${r+=a&1&&t}`.length+2;P=(s,w)=>`${s}`.padStart(w);return[...l.map(([a,b])=>P(a,w)+P(a&1?b+' ':`[${b}]`,z+1)),P('='.repeat(z),z-~w),P(r,z+w)].join`
`}

function update(){
  var i=I.value, [a,b]=i.match(/\d+/g)
  O.textContent=F(+a,+b)
}

update()
<input id=I value='21x348' oninput='update()'><pre id=O></pre>


এই প্রশ্নটি পুনরায় দেখা হচ্ছে ... প্যাড স্টার্ট ঠিক কী করছে? আমি এই পদ্ধতিটি চিনতে পারি না ...
ওলি ওয়েস্ট


IE এ এটি চালানো স্তন্যপান হবে! ;)
ওয়েলওয়েস্ট

3

সি, সি ++, 319 313 301 299 বাইট

-8 বাইট জ্যাকারি ধন্যবাদ

printfযাদু করার জন্য দুর্দান্ত ধন্যবাদ আমি সম্পাদনাগুলির মধ্যে 60 মিনিটের মধ্যেই শিখেছি

#include<string.h>
#include<stdio.h>
#define O printf("%*d %c%*d%c\n",5,a,a%2?32:91,9,b,a%2?32:93);
void m(int a,int b){int r=0,i=0;O while(a>1){r+=a%2*b;a/=2;b*=2;O}r+=b;char t[20],p[20];memset(t,0,20);memset(p,0,20);sprintf(t,"%d",r);memset(p,61,strlen(t)+2);printf("%*c%*s\n%*d",5,32,12,p,16,r);}

সি ++ অপ্টিমাইজেশান, হেডার প্রতিস্থাপন stdio.hদ্বারা cstdioএবং string.hদ্বারাcstring , 2 বাইট সংরক্ষণ

এমএসভিসির সাথে সংকলনটি #pragma warning(disable:4996)ব্যবহারের জন্য যুক্ত করতে হবেsprintf

আমার পিপিসি আইডি দিয়ে পরীক্ষা করা:

72 x 535 =>

   72 [      535]
   36 [     1070]
   18 [     2140]
    9       4280
    4 [     8560]
    2 [    17120]
    1      34240
          =======
           38520

এটি নিয়মকে সম্মান করে, অঙ্কটি সারিবদ্ধ হয় এবং সমান চিহ্নগুলি সর্বদা চূড়ান্ত সংখ্যার চেয়ে 2 চর বড় হবে। 17 x 34 => সহ উদাহরণ

   17         34
    8 [       68]
    4 [      136]
    2 [      272]
    1        544
            =====
             578

আমি মনে করি আপনি শেষ দুটি লাইন পরিবর্তন করতে পারবেন #define O printf("%*d %c%*d%c\n",5,a,a%2?' ':'[',9,b,a%2?' ':']');এবংvoid m(int a,int b){int r=0,i=0;O while(a>1){r+=a%2*b;a/=2;b*=2;O}r+=b;char t[20],p[20];memset(t,0,20);memset(p,0,20);sprintf(t,"%d",r);for(;i<strlen(t)+2;++i)p[i]='=';printf("%*c%*s\n%*d",5,' ',12,p,16,r);}
জাকারি

হ্যাঁ, আমি এটা জানি, তবে কেন এটি গুরুত্বপূর্ণ? বিজ্ঞাপন এছাড়াও, এর নজির %এবং *একই, তাই r+=a%2*bকাজ করা উচিত।
জাকারি

@ জ্যাচারে আসলে আমি ভুল ছিলাম, আপনি ঠিক বলেছেন
হাটসুপয়েন্টারকুন

এমনকি আপনার এখানে <cstdio> অন্তর্ভুক্ত করা দরকার, আপনি এখানে একই কৌশল ব্যবহার করতে পারবেন না ?
জাকারি


3

[বাশ], 144 142 140 131 128 বাইট

প্রদর্শনের আরও ভাল শ্রদ্ধা, দ্রষ্টব্য সেখানে স্থানের অক্ষর রয়েছে

read a b;for((;a;));{ ((a%2))&&((r+=b))&&x=$b\ ||x=[$b];printf %3s%9s\\n $a "$x"
((a/=2,b+=b));};printf %12s\\n =${r//?/=}= $r\ 

প্রথম উত্তর

read a b;while((a));do ((a%2))&&((r+=b))&&printf "%6s  %6s
" $a $b||printf "%6s [%6s]
" $a $b;((a/=2,b+=b));done;printf "%6s %7s
" \  ==== \  $r

2

হাস্কেল , 305 বাইট

i=iterate
s=show
l=length.s
a!b=zip((takeWhile(>0).i(`div`2))a)(i(*2)b)
a?b=sum[y|(x,y)<-a!b,rem x 2>0]
a%b=l(snd.last$a!b)
a#b=unlines$[(' '<$[1..l a-l x])++s x++(' '<$[-1..a%b-l y])++if mod x 2<1then show[y]else(' ':s y)|(x,y)<-a!b]++map((++)(' '<$[-1..l a+a%b-l(a?b)]))['='<$[1..l a+1+a%b],' ':(s$a?b)]

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

!অপারেটর দুটি তালিকা তৈরি করে, ?পণ্যের নির্ণয় করে। %এবং #আসকি লেআউটের জন্য ব্যবহৃত হয়।


1

সি, 205 201 190 183 156 150 143 বাইট

এটি সি 98 হিসাবে সতর্কবার্তা সংকলন করবে এবং আমি বিশ্বাস করি না এটি কার্যকর সি 99, তবে এটি হ্যাটসু পয়েন্টারকুনের সংস্করণের চেয়ে ছোট হয়ে যায়, কারণ এটি অপ্রকাশিত হওয়ার কারণে প্রিন্টফের #includeগতিশীল দৈর্ঘ্য ব্যবহার না করে, & প্রয়োজনীয়গুলির log10()সংখ্যা গণনা করতে ব্যবহার করে =:

r;m(a,b){r=0;while(a){printf(a%2?"%4d%10d\n":"%4d [%8d]\n",a,b);r+=a%2?b:0;a/=2;b<<=1;}printf("%15.*s\n%14d",(int)log10(r)+3,"==========",r);}

আমার নম্বরটি হিসাবে 64586, আমি গণনার জন্য এই পরীক্ষা প্রোগ্রামটি ব্যবহার করেছি 64 * 586:

#include <stdio.h>
int m(int a, int b);
int main(void)
{
    m(64, 586);
    putchar('\n');
}

এবং এটি ফলাফল:

  64 [     586]
  32 [    1172]
  16 [    2344]
   8 [    4688]
   4 [    9376]
   2 [   18752]
   1     37504
        =======
         37504

সম্পাদন করা

"অন্তর্নিহিত ইনট" বিধি দ্বারা 4 বাইট সংরক্ষণ করা হয়েছে

সম্পাদনা 2

একটি do...while()লুপে পরিবর্তন করে এবং ম্যাক্রো থেকে প্রিন্টফটিকে লুপে সরিয়ে 11 বাইট সংরক্ষণ করেছেন । এছাড়াও সঠিকভাবে কাজ করা উচিত যদি a=1

সম্পাদনা 3

7 টি বাইট সংরক্ষণ করেছে এবং কোডটি সঠিকভাবে তৈরি করেছে।

সম্পাদনা 4

কিছু মুদ্রণ কৌশল দ্বারা 26 বাইট সংরক্ষণ করা হয়েছে।

5 সম্পাদনা করুন

অতিরিক্ত প্যাডিংকে 1 সংখ্যায় ভেঙে 6 টি বাইট সংরক্ষণ করেছেন।

সম্পাদনা 6

টর্নেরি অপারেটরের সাথে প্রিন্টফ ট্রিক্রি দিয়ে 7 টি বাইট সংরক্ষণ করেছে এবং অব্যবহৃত ভেরিয়েবল ঘোষণা না করে


দুর্দান্ত কাজ, জাস্টিন! আগামী সপ্তাহগুলিতে আপনার কাছ থেকে আরও দেখার প্রত্যাশায়!
ওয়েলওয়েস্ট

ধন্যবাদ. আমি আশা করি আগামী সপ্তাহগুলিতেও আরও কিছু করতে পারব।
জাস্টিনসিবি

1

এক্সেল ভিবিএ, 183 বাইট

একটি বেনামে ভিবিই তাত্ক্ষণিক উইন্ডো ফাংশন যা [A1:B1]কনসোলে রেঞ্জ এবং আউটপুটগুলি থেকে ইনপুট নেয় ।

a=[A1]:b=[B1]:While a:c=a Mod 2=0:?Right(" "& a,2);Right("   "&IIf(c,"["&b &"]",b &" "),7):s=s+IIf(c,0,b):a=Int(a/2):b=b*2:Wend:?Right("     "&String(Len(s)+2,61),9):?Right("    "&s,8)

Ungolfed

Sub EthiopianMultiply(ByVal a As Integer, b As Integer)
    While a
        Let c = a Mod 2 = 0
        Debug.Print Right(" " & a, 2);
        Debug.Print Right("    " & IIf(c, "[" & b & "]", b & " "), 7)
        Let s = s + IIf(c, 0, b)
        Let a = Int(a / 2)
        Let b = Int(b * 2)
    Wend
    Debug.Print Right("     " & String(Len(s) + 2, 61), 9)
    Debug.Print Right("     " & s, 8)
End Sub

আউটপুট

61   486 
30  [972]
15  1944 
 7  3888 
 3  7776 
 1 15552 
  =======
   29646
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.