यूक्लिडियन एल्गोरिदम की कल्पना करें


17

यूक्लिडियन एल्गोरिथ्म दो सकारात्मक पूर्णांकों के सबसे बड़े सामान्य भाजक (GCD) की गणना के लिए एक व्यापक रूप से ज्ञात एल्गोरिथम है।

एल्गोरिथ्म

इस चुनौती के उद्देश्य के लिए, एल्गोरिथ्म को नीचे वर्णित किया गया है:

  1. एक निश्चित चरित्र के आसन्न लाइनों के रूप में दो इनपुट प्रदर्शित करें
    जैसे 3,4कि आसन्न लाइनों द्वारा एक इनपुट का प्रतिनिधित्व किया जा सकता है000 और0000

  2. पहले length(short_line)अक्षर को लंबी रेखा में दूसरे वर्ण में बदल दें, मान लें कि -
    यह अब जैसा दिखता है 000और है---0

  3. length(short_line)लंबी लाइन में पहले वर्णों को हटा दें ।
    अब 000,0

  4. दोहराएँ चरण 2 और 3 दो जब तक प्रत्येक यात्रा के बाद छोटे और लंबे समय तक लाइनों का उपयोग कर, समान लंबाई है, उदाहरण के लिए
    000, 0
    -00, 0
    00, 0
    -0, 0
    0,0

  5. आप चुन सकते हैं कि यहां रुकना है या चलना जारी रखना है और लाइनों में से एक को खाली रेखा में बदलना है।

इन चरणों में से प्रत्येक को 0.3 और 1.5 के बीच के अंतराल से अलग किया जाना चाहिए।

चुनौती

एक प्रोग्राम लिखें जो दो प्राकृतिक संख्याओं को इनपुट के रूप में दिया गया है, एक आउटपुट बनाता है जो ऊपर दिए गए एल्गोरिदम के आउटपुट के समान दिखता है। आप उपयोग कर सकते हैं अन्य गैर-सफ़ेद से प्रिंट योग्य ASCII वर्ण 0और- , लेकिन अनुरूप होना चाहिए और केवल दो अक्षरों का प्रयोग। आप वैकल्पिक एल्गोरिदम का उपयोग भी कर सकते हैं, जो आउटपुट प्रदान करता है, जिसमें समय भी शामिल है, ठीक वैसा ही है जैसा कि ऊपर दिए गए एल्गोरिदम द्वारा निर्मित किया जाएगा।

उदाहरण

यह इनपुट के साथ एक उदाहरण है 24,35, जो कॉपीराइट हैं इसलिए उनका जीसीडी 1 है।

यहाँ छवि विवरण दर्ज करें

यह इनपुट के साथ एक उदाहरण है 16,42, जिसमें जीसीडी 2 है।

यहाँ छवि विवरण दर्ज करें

नियम


स्पष्टीकरण

  • वे पंक्तियाँ जो संख्याओं का प्रतिनिधित्व करती हैं, उन्हें अपने मूल क्रम में रहने की आवश्यकता होती है, अर्थात् पहले प्रदर्शित "फ्रेम" की पहली और दूसरी पंक्तियों को क्रमशः बाद की सभी और दूसरी पंक्तियों में होना चाहिए।
  • एल्गोरिथ्म समाप्त होने के बाद, कोई भी अतिरिक्त दृश्यमान इकाई नहीं दिखाई देनी चाहिए। हालांकि, इसका मतलब यह भी है कि लाइनों को खाली करना ठीक है, यदि आप सुनिश्चित करते हैं कि अंतिम "फ्रेम" कम से कम उसी समय के लिए प्रदर्शित किया जाता है जैसा कि खाली करने से पहले अन्य सभी फ़्रेमों ने किया था।

@WheatWizard महान सुझाव, इस पर
बसुकक्सुआन

क्या लाइनों को एक ही सापेक्ष क्रम में रहना पड़ता है? या वे पुनरावृत्तियों के बीच पुन: व्यवस्थित हो सकते हैं? (यह जाँचना क्योंकि अधिकांश भाषाओं में उत्तरार्द्ध अधिक संक्षिप्त होने की संभावना है, और इस प्रकार मुझे यह जानना आवश्यक है कि क्या मुझे उस अनुकूलन का उपयोग करना चाहिए या sepc का उल्लंघन करने के कारण इसे अनदेखा करना चाहिए।)

@ ais523 हाँ वे करते हैं:-)
बसुकक्सुआन

@ ais523 हाँ, इसे खाली करना ठीक है, लेकिन सुनिश्चित करें कि अंतिम फ़्रेम को अन्य फ़्रेमों के समान प्रदर्शन समय दिया गया है
बसुकक्सुआन

1
@busukxuan व्यक्तिगत रूप से मुझे लगता है कि मैं अनुगामी स्थानों की अनुमति दूंगा, लेकिन शायद "सार्थक" पात्रों में से एक के रूप में स्थान नहीं है
लुइस मेंडो

जवाबों:


3

जेली , 29 बाइट्स

VY“ñc‘ỌœS.⁸
1ẋǵ+M¦ṚÇt€2ǵ⁻/¿

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

यह एक फ़ंक्शन को परिभाषित करता है 2Ŀ(एक पूर्ण कार्यक्रम नहीं; TIO लिंक में एक पाद लेख होता है जो एक फ़ंक्शन को एक प्रोग्राम में परिवर्तित करता है) जो इनपुट के रूप में दो तत्वों की एक सूची लेता है, और स्क्रीन पर आउटपुट प्रदर्शित करता है (हमारे कानूनी I / O तरीकों में से एक) , और एक जो इस चुनौती के लिए आवश्यक है, क्योंकि यह स्क्रीन पर उपस्थिति के बारे में बात करता है)। यह मानता है कि कार्यक्रम एएनएसआई मानक का अनुपालन करने वाले टर्मिनल में चलाया जाता है (मैंने इस्तेमाल किया gnome-terminalलेकिन सबसे काम करेगा), और यह कि टर्मिनल शुरू में खाली है (जो सबसे समझदार डिफ़ॉल्ट की तरह लगता है); ध्यान दें कि यह ऑनलाइन कोशिश करो! करता नहीं इन मान्यताओं के अनुरूप, और इस प्रकार उत्पादन वहाँ विकृत है (मैं सत्यापित करें कि यह के रूप में की उम्मीद एनिमेट स्थानीय स्तर पर कार्यक्रम भाग गया)। मैं 1उस जगह का उपयोग करता हूं जहां प्रश्न का उपयोग होता है ।0 , और2-

व्याख्या

हेल्पर फ़ंक्शन 1Ŀ (अंकों की दो सूचियों की एक सूची दी गई है, स्क्रीन की पहली और दूसरी पंक्ति पर उन्हें आउटपुट करता है, फिर 0.5 सेकंड का समय देता है; इसका इनपुट लौटाता है)

VY“ñc‘ỌœS.⁸
V                   Convert each list of digits to an integer
 Y                  Separate these integers by newlines
  “ñc‘              {Output that; then restart with} the list [27, 99]
      Ọ             Convert codepoints to characters (i.e. "\x1bc"
       œS.          Wait (œS) 0.5 (.) seconds
          ⁸         {Output that; then return} the initial argument

स्ट्रिंग "\ X1bc", जब ANSI- संगत टर्मिनल को भेजा जाता है, तो टर्मिनल को रीसेट करने के लिए नियंत्रण कोड के रूप में व्याख्या की जाती है; यह स्क्रीन को साफ़ करता है और कर्सर को ऊपरी बाएँ कोने में ले जाता है (इस प्रकार अगले आउटपुट के लिए तैयार टर्मिनल को रीसेट करता है)।

हेल्पर फ़ंक्शन का नाम दिया गया है 1Ŀ(जेली फ़ंक्शंस के लिए इस फॉर्म के नामों को ऑटोजेनरेट्स करता है, और वास्तव में उन्हें नाम देने का कोई अन्य तरीका नहीं है), लेकिन इसे Çमुख्य कार्यक्रम से बस के रूप में संदर्भित किया जा सकता है (क्योंकि भाषा में पास संख्याओं वाले कार्यों के लिए आशुलिपि है) )।

मुख्य कार्य 2Ŀ (प्रश्न में अनुरोधित कार्य को लागू करता है)

1ẋǵ+M¦ṚÇt€2ǵ⁻/¿
1ẋ                  Convert input to unary
  Ç                 Call helper function (producing one animation frame)
   µ         µ  ¿   While
              ⁻/      the elements differ:
     M¦               Change the largest element
    +  Ṛ                by adding corresponding elements of the other element
        Ç             Call helper function (producing one animation frame)
         t€2          Delete all 2s from each side of each element
            Ç         Call helper function (producing one animation frame)

6

जावास्क्रिप्ट (ईएस 6), 128 124 बाइट्स

t=0
f=
(a,b,o,c,d)=>setInterval(e=>{e=[b,d,a,c];o.data=`-0
-0`.replace(/./g,c=>c.repeat(e.pop()));c|d?c=d=0:a>b?a-=c=b:b-=d=a},1e3)
<form><input id=a><input id=b><button onclick=clearTimeout(t),t=f(+a.value,+b.value,o.firstChild)>Go!</button><pre id=o>



2

जावास्क्रिप्ट (ES6), 215 194 ... 135 129 127 बाइट्स

a=>b=>F=(c=0)=>alert('-'[d='repeat'](e=c&a>b&&b)+'0'[d](a-=e)+`
`+'-'[d](f=c&a<b&&a)+'0'[d](b-=f))|a-b|c&&setTimeout(F,1e3,1-c)

प्रयोग

यह करी पर भिन्नता में इनपुट लेता है। इसका उपयोग करने के लिए, फ़ंक्शन फ़ंक्शन को एक चर (उदाहरण के लिए G) पर असाइन करता है , फिर इसे इस तरह से कॉल करें:

G(5)(6)()

व्याख्या

कुछ हद तक पुनरावर्ती फ़ंक्शन जो कि एल्गोरिथ्म समाप्त होने तक 1 सेकंड के बाद खुद को कॉल करता है। यह एक तिहाई चर का ट्रैक रखता है cकि निर्धारित करता है कि aऔर bबदला जाना चाहिए (यदि cहै 1बदलाव के लिए, यह समय)।

सबसे पहले, फ़ंक्शन कंसोल को कुछ लिखता है। यदि cहै 0, तो यह एक नई लाइन इनबेटीवन के साथ शून्य के दो तार लिखता है। के बाद से cकरने के लिए initialised है 0, हम इस का लाभ ले सकते हैं, और वैश्विक चर की स्थापना की fऔर gकुछ तार हम अक्सर जरूरत है कि पकड़ (जैसे0 और repeat)।

अन्यथा, यह शून्य और minuses के साथ एक स्ट्रिंग बनाता है। इस तरह के सभी तार दो भागों से मिलकर बने होते हैं: पहले कुछ (इस राशि को कॉल करें A) minuses, फिर कुछ (इस राशि को कॉल करें B) शून्य, फिर एक नई रेखा, फिर कुछ (इस राशि को कॉल करें)D ) minuses और अंतिम रूप से कुछ (इस राशि को कॉल करें E) zeroes।

यदि पहला इनपुट दूसरे इनपुट से छोटा है, तो हमें दूसरे इनपुट से शून्य निकालने की आवश्यकता है, इसलिए Aशून्य है, Bपहला इनपुट के Dबराबर है, पहला इनपुट के Eबराबर है और दूसरा इनपुट शून्य से पहले इनपुट के बराबर है। यदि पहला इनपुट दूसरे इनपुट से छोटा नहीं है, तो रिवर्स लागू होता है ( Aदूसरा इनपुट Bहै, पहला इनपुट माइनस दूसरा इनपुट है)।

इनपुट और एक स्विच किए गए चर के लिए इन नए मूल्यों के साथ c, फ़ंक्शन को 1e3मिलीसेकंड में फिर से बुलाया जाना तय है , जो एक सेकंड के बराबर है।

टिप्पणियाँ

  • alertआउटपुट के लिए उपयोग करता है
  • उदाहरणों की तरह ही, उपयोग 0और-
  • चरणों के बीच विलंब 1000 एमएस (1 सेकंड) है
  • पहले चरण के बाद, फ़ंक्शन (जावास्क्रिप्ट की प्रकृति के कारण) कुछ संख्या लौटाएगा जिसे अनदेखा किया जाना है
  • TIO पर संस्करण एक ही बार में सब कुछ आउटपुट करता है, ब्राउज़र कंसोल में कोड चिपकाने से ठीक से देरी हो जाएगी

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

यहाँ यह कोशिश करो!


2

पायथन 2 , 208 204 194 बाइट्स

-4 स्नीकी ट्रिक के लिए @math_junkie को धन्यवाद time.sleep

-10 "स्पष्ट स्क्रीन" नियम को स्पष्ट करने के लिए @busukxuan के लिए धन्यवाद।

def z(a,b,y='-',w=1):
 import time;c,d,n,s='0'*a,'0'*b,'\n',time.sleep
 if w:print c+n+d;s(1)
 if b>a:d=y*a+d[a:]
 else:c=y*b+c[b:]
 print c+n+d;s(1)
 if c!=d:z(len(c),len(d),('','-')[y!='-'],0)

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

बहुत यकीन है कि यह अधिक गोल्फ हो सकता है। यह मुझे डुप्लिकेट बनाने के लिए printऔर forलूप को डुप्लिकेट करने के लिए दर्द देता है , लेकिन मैं इसे फिलहाल एक तरह से गोल नहीं कर सकता।

टिप्पणियाँ

  • ठहराव अब @math_junkie से एक संकेत का उपयोग करता है
  • पूरी तरह से TIO पर काम नहीं करता है क्योंकि यह आउटपुट को स्टोर करता है और प्रोग्राम खत्म होने पर इसे बाहर निकाल देता है। कंसोल में हालांकि ठीक काम करता है।

1
आपको देरी के लिए लूप के बजाय कुछ बाइट्स को बचाने में सक्षम होना चाहिए import time, s=time.sleepऔर s(1)देरी के लिए एक लूप के बजाय
गणित नशेड़ी

धन्यवाद @math_junkie - मैंने अधिकांश संयोजनों का उपयोग करने की कोशिश की, time.sleepलेकिन वह चूक गया। इसे विदा कर देंगे।
ElPedro

@ मथ_जोंकी - मेरे लिए 215 आता है। शायद मुझे कुछ बेवकूफी याद आ रही है। क्या आप इसे ऑनलाइन आज़मा सकते हैं ?
ElPedro


1

पर्ल, 161 149 बाइट्स

... बिना इंडेंटेशन और नईलाइन्स के:

($a,$b)=map 0 x$_,@ARGV;
sub p{say"\n$a\n$b";sleep 1}p;
while($a ne$b){
  ($A,$B)=$b lt$a?(\$a,\$b):(\$b,\$a);
  map$$A=~s/0/-/,1..length$$B;
  p;
  $$A=~s/-//g;
  p
}

इसे एक फ़ाइल gcd.pl में डालें और इस तरह चलाएं:

perl -M5.010 gcd.pl 16 42

1
-M5.010तो आप का उपयोग करके कुछ बाइट्स बचा सकता है पर्ल को झंडा, नि: शुल्क है sayअधिक print…\n। इसके अतिरिक्त, मुझे पूरा यकीन है कि यह आपके अनाम सबरूटीन को एक चर में संग्रहित करने के बजाय एक नाम देने के लिए निडर है।

Thx to ais523 12 बाइट शेव करने के टिप्स के लिए
Kjetil S.

1

GNU सेड (साथ) e xec एक्सटेंशन के ), 88

स्कोर में -zrfविकल्पों के लिए +3 शामिल हैं sed

p
:
x
esleep 1
g
ta
:a
s/o+//p
t
s/^((O+)(O+)\n\2\b|(O+)\n\4\B)/\L\2\U\3\4\n\2\L\4\U/p
t

ऊपरी मामले का उपयोग करते हुए इनपुट को दो न्यूलाइन अलग किए गए पूर्णांक के रूप में दिया जाता है O अंकों के रूप ।

उदाहरण के लिए, 16, 42 उदाहरण के रूप में चलाया जा सकता है:

printf "%0*d\n%0*d\n" 16 0 42 0 | tr 0 O | sed -znrf euclidvis.sed

नवीनतम टिप्पणियों के अनुसार, मैं पुनरावृत्तियों के बीच स्क्रीन को साफ़ नहीं कर रहा हूँ।


0

वी , 47 44 बाइट्स

Àé0á
Àé0Hqwmmjlhmmkl@wqòHî@w
gs`mlhv0r-gsÓ-ò

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

TIO पर शीर्ष लेख और पाद लेख gsस्क्रीन के निचले भाग में वर्तमान दो पंक्तियों को कॉपी करने के लिए संशोधित करता है, और फिर अंत में पहले दो को हटाता है। यह TIO के लिए ऑपरेशन की कल्पना करता है, लेकिन अगर आपने इसे V (हेडर और फुटर के बिना) में चलाया है, तो यह प्रत्येक ऑपरेशन के बीच एक सेकंड का इंतजार करेगा।

Àé0                     " Print (Arg1) zeroes
   á                    " Newline
Àé0                     " Print (Arg2) zeroes
   H                    " Go home
    qwmmjlhmmkl@wq      " Store a recursive macro in w that finds the shorter line
                  ò     " recursively
                   Hî@w " find the longest line
gs                      " wait a second
  `mlhv0r-              " replace the zeroes of the long line with -
          gs            " wait a second
            Ó-          " delete all -
              ò         " end recursion

क्या आपको वास्तव में समाप्ति की आवश्यकता है ò?
क्रिस्ति लिथोस

यह इसके बिना लटका हुआ है, अनिश्चित क्यों। प्रतीक्षा करने के लिए जा रहा है जब तक मैं वी के साथ एक कंप्यूटर है किसी भी डिबग करने के लिए
nmjcman101
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.