इथियोपिया गुणन


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

कृपया अंकों के संरेखण पर ध्यान दें। लेआउट में यह सबसे महत्वपूर्ण है। यह भी ध्यान दें कि समान संकेतों द्वारा निर्धारित दोहरी लाइन समग्र उत्तर की तुलना में दो वर्णों से अधिक लंबी होनी चाहिए और केंद्र द्वारा उचित होनी चाहिए।

परिक्षण

आप इसका परीक्षण कैसे करेंगे? दो नंबर का उपयोग करके अपने प्रोग्राम का रन प्रदान करके। ये नंबर आपके यूजर आईडी नंबर से निकाले जा सकते हैं (यह शीर्ष विंडो पर आपके अवतार पर आपके कर्सर को मँडराकर प्राप्त किया जा सकता है)। अपना नंबर लें और अंतिम तीन अंक लें, यह नंबर B होगा, जो कुछ भी बाकी है उसे सामने रखें, वह नंबर A होगा। फिर A बार B के लिए परीक्षण करें।

परीक्षण उदाहरण:

मेरी उपयोगकर्ता आईडी संख्या 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⮌τ⮌ι

सूची tको 180 ° से घुमाएं और इसे ऊपर-नीचे प्रिंट करें, इस प्रकार इसे सही-सही ठहराया जाए।

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

कर्सर को ले जाएँ ताकि जब uदाएं-ठीक इसके शीर्ष बाएँ कोने की रेखाएँ ऊपर-दाएँ कोने के साथ ऊपर पहुँचें, तो हम पहुँच गए, और uदाएँ-दाएँ प्रिंट करें ।


अद्भुत कार्य। आपके पास अभी तक @Neil है। मुझे भाषा के बारे में अधिक जानकारी कहां मिल सकती है, क्या कोई लिंक है?
वैलीवेस्ट

1
@WallyWest शीर्षक GitHub पेज से जुड़ा हुआ है और वहां से आप अधिक जानकारी के लिए विकी पढ़ सकते हैं।
नील

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>


बस इस सवाल पर फिर से गौर करना ... क्या पैडस्टार्ट वास्तव में है? मैं इस विधि को नहीं पहचानता ...
WallyWest


इस IE में चल रहा चूसना होगा! ;)
15

3

सी, सी ++, 319 313 301 299 बाइट्स

-8 बाइट्स Zacharý को धन्यवाद

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);}

C ++ ऑप्टिमाइजेशन, हेडर stdio.hको रिप्लेस करके cstdioऔरstring.h बाय cstring, 2 बाइट बचाता है

MSVC के साथ संकलन #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);}
Zacharý

हाँ, मुझे पता है कि, लेकिन वह बात क्यों करता है ?. विज्ञापन भी, की पूर्वता %और *समान हैं, इसलिए r+=a%2*bकाम करना चाहिए।
ज़ाचरी

@ Zacharý वास्तव में, मैं गलत था, तुम सही हो
HatsuPointerKun

क्या आपको भी <cstdio> शामिल करने की आवश्यकता है, क्या आप उसी चाल का उपयोग नहीं कर सकते जो आपने यहाँ किया था ?
Zacharý


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

इसे ऑनलाइन आज़माएं!

!ऑपरेटर दो सूचियों बनाता है, ?उत्पाद की गणना करता है। %और #ascii लेआउट के लिए उपयोग किया जाता है।


1

सी, 205 201 190 183 156 150 143 बाइट्स

यह C89 के रूप में चेतावनी के साथ संकलित करेगा, और मुझे विश्वास नहीं है कि यह मान्य C99 है, लेकिन यह HatsuPointerKun के संस्करण की तुलना में छोटा है, क्योंकि यह बाइटिंग द्वारा बाइट्स बचाता है #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

संपादित करें

"अंतर्निहित int" नियम द्वारा 4 बाइट्स सहेजे गए

संपादित करें २

एक do...while()लूप में बदलकर और एक मैक्रो से लूप में प्रिंटफ़ को स्थानांतरित करके 11 बाइट्स बचाए । साथ ही अगर सही तरीके से काम करना चाहिएa=1

संपादित करें ३

7 बाइट्स सहेजे गए और कोड को सही बनाया।

संपादित करें ४

26 प्रिंट के साथ कुछ प्रिंटफट ट्रिक से बचे।

संपादित करें ५

1 नंबर में अतिरिक्त पैडिंग को ध्वस्त करके 6 बाइट्स को बचाया।

संपादित करें ६

टर्नरी ऑपरेटर के साथ प्रिंटफ प्रवंचना द्वारा 7 बाइट्स को बचाया और अप्रयुक्त चर घोषित नहीं किया


महान काम, जस्टिन! आने वाले हफ्तों में आपसे अधिक देखने के लिए तत्पर हैं!
वैलेस्ट

धन्यवाद। मैं आने वाले हफ्तों में और भी कुछ करने की उम्मीद करता हूं।
जस्टिनसीबी

1

एक्सेल VBA, 183 बाइट्स

एक अनाम VBE तत्काल विंडो फ़ंक्शन जो रेंज से इनपुट लेता है [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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.