সর্বশ্রেষ্ঠ সাধারণ বিভাজক


40

আপনার কাজটি হ'ল সংখ্যার কম বাইটে কোডের দুটি প্রদত্ত সংখ্যার পূর্ণতম সাধারণ বিভাজক (জিসিডি) গণনা করা ।

আপনি কোনও প্রোগ্রাম বা ফাংশন লিখতে পারেন , আমাদের গ্রহণযোগ্য মানক পদ্ধতির (এসটিডিআইএন / এসটিডিআউট, ফাংশন প্যারামিটার / রিটার্ন মান, কমান্ড-লাইন আর্গুমেন্ট ইত্যাদি সহ) ইনপুট এবং রিটার্ন আউটপুট গ্রহণ করতে পারেন।

ইনপুট দুটি অ-নেতিবাচক পূর্ণসংখ্যা হবে। আপনার ভাষার ডিফল্ট পূর্ণসংখ্যার ধরণ বা [0,255]যেকোন বৃহত্তর ব্যাপ্তি দ্বারা সমর্থিত সম্পূর্ণ পরিসরটি হ্যান্ডেল করতে সক্ষম হওয়া উচিত । আপনাকে গ্যারান্টিযুক্ত যে ইনপুটগুলির কমপক্ষে একটি হ'ল শূন্য হবে।

আপনাকে বিল্ট-ইনগুলি ব্যবহার করার অনুমতি নেই যা জিসিডি বা এলসিএম (কমপক্ষে সাধারণ একাধিক) গণনা করবে।

স্ট্যান্ডার্ড বিধি প্রযোজ্য।

পরীক্ষার মামলা

0 2     => 2
6 0     => 6
30 42   => 6
15 14   => 1
7 7     => 7
69 25   => 1
21 12   => 3
169 123 => 1
20 142  => 2
101 202 => 101

1
আমরা যদি নিবন্ধটি যেকোন রেজিস্টারে সুবিধাজনক হিসাবে ইনপুট রাখার অনুমতি দিচ্ছি, এবং যা কিছু রেজুলেশন সুবিধাজনক ফলাফল, আমাদের অবশ্যই ফাংশনগুলি বা কোডের টুকরো (যেমন কেবল একটি ফাংশন বডি) অনুমতি দেওয়া উচিত allowing আমার উত্তরটি সম্পূর্ণ ফাংশন করা এমএসের 32 বিট ভেক্টরক্যাল (একটি এক্সএইচজি ইক্স, একটি মুভি এবং একটি রেট) এর মতো একটি রেজিস্টার কলিং কনভেনশন সহ প্রায় 4 বি যুক্ত করবে বা স্ট্যাক কলিং কনভেনশন সহ আরও কিছু ঘটবে।
পিটার কর্ডেস

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

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

3
@ কোডসইনচাউস মেমরি এবং সময় সীমাবদ্ধতাগুলিকে সাধারণত উপেক্ষা করা হয় যতক্ষণ না অ্যালগোরিদম নিজেই নীতিগতভাবে সমস্ত ইনপুট পরিচালনা করতে পারে। নিয়মটি কেবল লুপগুলির জন্য কঠোরভাবে স্বেচ্ছাসেবক সীমাবদ্ধতাগুলি এড়ানোর জন্য বোঝানো হয় যা কৃত্রিমভাবে অ্যালগরিদমকে ছোট ছোট ইনপুটগুলিতে সীমাবদ্ধ করে। আমি একেবারে দেখতে পাচ্ছি না কীভাবে অপরিবর্তনীয়তা আসে?
মার্টিন এন্ডার

1
জিসিডি (0, এন) ত্রুটি নয় এন
রোজলুপি

উত্তর:


37

রেটিনা , 16

^(.+)\1* \1+$
$1

এটি ইউক্লিডের অ্যালগরিদম মোটেও ব্যবহার করে না - পরিবর্তে এটি রেজিসেক্স ম্যাচিং গ্রুপগুলি ব্যবহার করে জিসিডি আবিষ্কার করে।

এটি অনলাইনে চেষ্টা করুন। - এই উদাহরণটি জিসিডি গণনা করে (8,12)।

2 স্পেস-বিভাজিত পূর্ণসংখ্যার হিসাবে ইনপুট। নোট করুন যে I / O অবিচ্ছিন্ন অবস্থায় রয়েছে। যদি তা গ্রহণযোগ্য না হয়, তবে আমরা এটি করতে পারি:

রেটিনা, 30

\d+
$*
^(.+)\1* \1+$
$1
1+
$.&

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

@ মার্টিনব্যাটনার যেমন উল্লেখ করেছেন, এটি প্রচুর সংখ্যার জন্য পৃথক হয়ে পড়েছে (সাধারণভাবে অযৌক্তিক কোনও কিছুর ক্ষেত্রে হয়)। খুব কমপক্ষে, INT_MAX এর একটি ইনপুটটির জন্য 2GB স্ট্রিংয়ের বরাদ্দ প্রয়োজন।


2
আমি
এটির

এখনই সংখ্যা সীমার সাথে ভাল হওয়া উচিত। আমি কেবল ভাষার প্রাকৃতিক সংখ্যার পরিসর (বা [0,255] এর চেয়ে বেশি হলে) প্রয়োজনীয় করতে আমি (ওপিএসের অনুমতি সহ) অনুমিতি পরিবর্তন করেছি। আপনাকে যদিও জিরো সমর্থন করতে হবে, যদিও আমি মনে করি আপনার +এসগুলিতে পরিবর্তন করা *উচিত। এবং আপনি লম্বা কোডটির এটিকে হ্রাস করে শেষ পর্যায়ে উল্লেখযোগ্যভাবে ছোট করতে পারেন 1
মার্টিন এন্ডার

2
ভবিষ্যতের রেফারেন্সের জন্য, আমি কেবলমাত্র একটি বিকল্প 16-বাইট সমাধান পেয়েছি যা স্বেচ্ছাসেবী সংখ্যার ইনপুটগুলির জন্য কাজ করে (একটি সহ) যাতে এটি অন্যান্য প্রসঙ্গে আরও কার্যকর হতে পারে: retina.tryitonline.net/…
মার্টিন

1
কেবলমাত্র লক্ষ্য করা গেছে যে আপনার সমাধানগুলি বা আমার মন্তব্যে কোনওটিই উপরেরটির প্রয়োজন নেই ^, কারণ ম্যাচটি প্রথম অবস্থানে থেকে ব্যর্থ হওয়া অসম্ভব।
মার্টিন এন্ডার

28

i386 (x86-32) মেশিন কোড, 8 বাইট (স্বাক্ষরবিহীন 9B)

আমাদের যদি ইনপুটটিতে হ্যান্ডেল করতে হয় তবে + 1 বি b = 0

amd64 (x86-64) মেশিন কোড, 9 বাইট (স্বাক্ষরবিহীন জন্য 10 বি , বা 64 বি পূর্ণসংখ্যার জন্য 14 বি 13 বি স্বাক্ষরিত বা স্বাক্ষরযুক্ত)

এমডি 64 এ স্বাক্ষরিত হওয়ার জন্য 10 9 বি যা ইনপুট = 0 দিয়ে ব্রেক হয়


ইনপুটগুলি 32 বিট-নন-শূন্য স্বাক্ষরিত পূর্ণসংখ্যা eaxএবং ecx। আউটপুট ইন eax

## 32bit code, signed integers:  eax, ecx
08048420 <gcd0>:
 8048420:       99                      cdq               ; shorter than xor edx,edx
 8048421:       f7 f9                   idiv   ecx
 8048423:       92                      xchg   edx,eax    ; there's a one-byte encoding for xchg eax,r32.  So this is shorter but slower than a mov
 8048424:       91                      xchg   ecx,eax    ; eax = divisor(from ecx), ecx = remainder(from edx), edx = quotient(from eax) which we discard
    ; loop entry point if we need to handle ecx = 0
 8048425:       41                      inc    ecx        ; saves 1B vs. test/jnz in 32bit mode
 8048426:       e2 f8                   loop   8048420 <gcd0>
08048428 <gcd0_end>:
 ; 8B total
 ; result in eax: gcd(a,0) = a

এই লুপ কাঠামো যেখানে পরীক্ষার ক্ষেত্রে ব্যর্থ হয় ecx = 0। ( শূন্য দ্বারা বিভাজনে divএকটি #DEহার্ডওয়্যার নির্বাহের কারণ ঘটায় ((লিনাক্সে, কার্নেল একটি SIGFPE(ভাসমান পয়েন্ট ব্যতিক্রম) সরবরাহ করে) the লুপ এন্ট্রি পয়েন্টটি যদি ঠিক আগে থাকে তবে incআমরা সমস্যাটি এড়াতে চাই The x86-64 সংস্করণ এটি পরিচালনা করতে পারে বিনামূল্যে জন্য, নীচে দেখুন।

মাইকের শ্লান্টার উত্তরই এর সূচনা পয়েন্ট ছিল । আমার লুপটি তার মতো একই কাজ করে তবে স্বাক্ষরিত পূর্ণসংখ্যার জন্য কারণ এর cdqচেয়ে এক বাইট আরও খাটো xor edx,edx। এবং হ্যাঁ, এটি এক বা উভয় ইনপুট নেতিবাচক সাথে সঠিকভাবে কাজ করে। মাইকের সংস্করণটি দ্রুত সঞ্চালিত হবে এবং ইউওপ ক্যাশে কম স্থান নেবে ( xchgইন্টেল সিপিইউতে 3 টি উপ, এবং loopবেশিরভাগ সিপিইউতে সত্যই ধীর হয় ), তবে এই সংস্করণটি মেশিন-কোড আকারে জয়ী হয়।

আমি প্রথমে লক্ষ্য করিনি যে প্রশ্নটির জন্য স্বাক্ষরবিহীন 32 বিট দরকার। xor edx,edxপরিবর্তে ফিরে যেতে cdqএক বাইট খরচ হবে। divএকই আকারের idivএবং অন্য সমস্ত কিছু একই থাকতে পারে ( xchgডেটা মুভমেন্ট এবং inc/loopএখনও কাজ করার জন্য))

মজার বিষয় হল, 64 বিট অপারেন্ড-আকারের ( raxএবং rcx) জন্য, স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন সংস্করণগুলি একই আকার। স্বাক্ষরিত সংস্করণটির জন্য cqo(2 বি) জন্য একটি রেক্স প্রিফিক্স প্রয়োজন , তবে স্বাক্ষরযুক্ত সংস্করণটি এখনও 2 বি ব্যবহার করতে পারে xor edx,edx

Bit৪ বিট কোডে, inc ecx2 বি: একক বাইট inc r32এবং dec r32অপকডগুলি REX উপসর্গ হিসাবে পুনঃপ্রেরণ করা হয়েছিল। inc/loop64bit মোডে কোন কোড আকার সংরক্ষণ করে না, তাই হয়তো আপনি পাশাপাশি test/jnz। Bit৪ বিট পূর্ণসংখ্যার উপর অপারেটিং আরএক্স প্রিফিক্সগুলিতে নির্দেশ ব্যতীত অন্য একটি বাইট যুক্ত করে, বাদে loopবা ছাড়াই jnz। বাকী অংশের পক্ষে কম gcd((2^32), (2^32 + 1))32 বিতে (যেমন ) সমস্ত জিরো রাখা সম্ভব , তাই আমাদের পুরো আরসিএক্স পরীক্ষা করা দরকার এবং এটি দিয়ে একটি বাইট সংরক্ষণ করতে পারি না test ecx,ecx। তবে ধীর jrcxzইনসনটি কেবলমাত্র 2 বি, এবং আমরা ecx=0এন্ট্রি পরিচালনা করতে লুপের শীর্ষে রাখতে পারি :

## 64bit code, unsigned 64 integers:  rax, rcx
0000000000400630 <gcd_u64>:
  400630:       e3 0b                   jrcxz  40063d <gcd_u64_end>   ; handles rcx=0 on input, and smaller than test rcx,rcx/jnz
  400632:       31 d2                   xor    edx,edx                ; same length as cqo
  400634:       48 f7 f1                div    rcx                      ; REX prefixes needed on three insns
  400637:       48 92                   xchg   rdx,rax
  400639:       48 91                   xchg   rcx,rax
  40063b:       eb f3                   jmp    400630 <gcd_u64>
000000000040063d <gcd_u64_end>:
## 0xD = 13 bytes of code
## result in rax: gcd(a,0) = a

32 এবং 64 বি সংস্করণের জন্য গডবোল্ট কম্পাইলার এক্সপ্লোরারে উত্স এবং asm আউটপুটmain চালায় এমন একটি সহ পুরো চলমান টেস্ট প্রোগ্রাম । 32 বিবিট ( ), 64 বিবিট ( ) এবং এক্স 32 এবিআই ( ) এর জন্য পরীক্ষিত এবং কাজ করছে ।printf("...", gcd(atoi(argv[1]), atoi(argv[2])) ); -m32-m64-mx32

এছাড়াও অন্তর্ভুক্ত রয়েছে: কেবলমাত্র পুনরাবৃত্ত বিয়োগের ব্যবহার করে এমন একটি সংস্করণ , যা স্বাক্ষরবিহীন নয়, এমনকি x86-64 মোডের জন্য 9 বি, এবং যেকোন একটি ইনপুট একটি স্বেচ্ছাসেবী রেজিস্টারে নিতে পারে। তবে এটি প্রবেশের সময় 0 ইনপুট হ্যান্ডেল করতে পারে না (এটি subশূন্য উৎপন্ন করার সময় সনাক্ত করে, যা x - 0 কখনই করে না)।

32 বিট সংস্করণের জন্য জিএনইউ সি ইনলাইন asm উত্স (সংকলন gcc -m32 -masm=intel)

int gcd(int a, int b) {
    asm (// ".intel_syntax noprefix\n"
        // "jmp  .Lentry%=\n" // Uncomment to handle div-by-zero, by entering the loop in the middle.  Better: `jecxz / jmp` loop structure like the 64b version
        ".p2align 4\n"                  // align to make size-counting easier
         "gcd0:   cdq\n\t"              // sign extend eax into edx:eax.  One byte shorter than xor edx,edx
         "        idiv    ecx\n"
         "        xchg    eax, edx\n"   // there's a one-byte encoding for xchg eax,r32.  So this is shorter but slower than a mov
         "        xchg    eax, ecx\n"   // eax = divisor(ecx), ecx = remainder(edx), edx = garbage that we will clear later
         ".Lentry%=:\n"
         "        inc     ecx\n"        // saves 1B vs. test/jnz in 32bit mode, none in 64b mode
         "        loop    gcd0\n"
        "gcd0_end:\n"
         : /* outputs */  "+a" (a), "+c"(b)
         : /* inputs */   // given as read-write outputs
         : /* clobbers */ "edx"
        );
    return a;
}

সাধারণত আমি asm এ পুরো ফাংশনটি লিখতাম, তবে GNU C ইনলাইন asm একটি স্নিপেট অন্তর্ভুক্ত করার সেরা উপায় বলে মনে হয় যা আমরা বেছে নিই না কেন কিছু রেজিমে / আউটপুট থাকতে পারে। আপনি দেখতে পাচ্ছেন, জিএনইউ সি ইনলাইন asm সিনট্যাক্সটি asm কে কুশ্রী এবং গোলমাল করে। এটি asm শেখার সত্যিই একটি কঠিন উপায়

এটি প্রকৃতপক্ষে সংকলন এবং .att_syntax noprefixমোডে কাজ করবে , কারণ ব্যবহৃত সমস্ত ইনসগুলি হয় একক / না অপেরাড বা xchg। আসলেই কোনও দরকারী পর্যবেক্ষণ নয়।


2
@ মাইকশ্লান্টা: ধন্যবাদ আপনি যদি asm অপ্টিমাইজ করতে চান তবে স্ট্যাকওভারফ্লোতে আমার কয়েকটি উত্তর দেখুন। :)
পিটার কর্ডেস

2
@ মাইকশ্লান্টা: jrcxzuint64_t সংস্করণে আমি সর্বোপরি একটি ব্যবহার খুঁজে পেয়েছি :)। এছাড়াও, খেয়াল করেননি যে আপনি স্বাক্ষরবিহীন উল্লেখ করেছেন, তাই আমি তার জন্য বাইট সংখ্যাও অন্তর্ভুক্ত করেছি।
পিটার কর্ডেস

আপনি কেন jecxzএকই প্রভাবের জন্য 32-বিট সংস্করণে ব্যবহার করতে পারেন না?
কোডি গ্রে

1
@ কোডি গ্রে: inc/loop32-বিট সংস্করণে 3 বাইট, তবে 64-বিট সংস্করণে 4 বি। এটার মানে হল যে 64-বিট সংস্করণ শুধুমাত্র এটি ব্যবহার করতে অতিরিক্ত বাইট খরচ না jrcxzএবং jmpপরিবর্তে inc / loop
পিটার কর্ডেস

আপনি এন্ট্রি হিসাবে মাঝখানে নির্দেশ করতে পারবেন না?
l4m2

14

হেক্সাগনি , 17 বাইট

?'?>}!@<\=%)>{\.(

দুচোখে:

  ? ' ?
 > } ! @
< \ = % )
 > { \ .
  ( . .

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

পাশের দৈর্ঘ্য 3 এ এটি ফিট করা বাতাস ছিল। শেষের দিকে এই দুটি বাইট ছাঁটাই করা ছিল না ... আমি এটি সর্বোত্তম হিসাবেও নিশ্চিত নই, তবে আমি নিশ্চিত যে এটি কাছে বলে আমি মনে করি।

ব্যাখ্যা

আরেকটি ইউক্লিডিয়ান অ্যালগরিদম বাস্তবায়ন।

প্রোগ্রামটিতে তিনটি মেমরি প্রান্ত ব্যবহার করা হয়েছে, যা আমি , বি এবং সি কল করব , মেমোরি পয়েন্টার (এমপি) দিয়ে প্রদর্শিত হবে:

এখানে চিত্র বর্ণনা লিখুন

এখানে নিয়ন্ত্রণ প্রবাহ চিত্রটি রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

নিয়ন্ত্রণের প্রবাহটি ধূসর পথের সাথে ইনপুটটির জন্য একটি ছোট লিনিয়ার বিট দিয়ে শুরু হয়:

?    Read first integer into memory edge A.
'    Move MP backwards onto edge B.
?    Read second integer into B.

নোট করুন যে কোডটি এখন <বাম কোণে প্রান্তের চারপাশে মোড়ানো । এটি <একটি শাখা হিসাবে কাজ করে। যদি বর্তমান প্রান্তটি শূন্য হয় (অর্থাত ইউক্লিডিয়ান অ্যালগোরিদম সমাপ্ত হয়), আইপি বাম দিকে বিচ্ছিন্ন হয়ে যায় এবং লাল পথটি ধরে। অন্যথায়, ইউক্যালিডিয়ান অ্যালগরিদমের একটি পুনরাবৃত্তি সবুজ পথে গণনা করা হয়।

আমরা প্রথমে সবুজ পথ বিবেচনা করব। নোট করুন >এবং \সমস্ত আয়না হিসাবে কাজ করে যা কেবল নির্দেশ নির্দেশককে প্রতিফলিত করে। এছাড়াও নোট করুন যে নিয়ন্ত্রণ প্রবাহটি তিনবার প্রান্তের চারপাশে একবারে নীচে থেকে উপরে, একবার ডান কোণ থেকে নীচে সারিতে এবং অবশেষে নীচের ডান কোণ থেকে বাম কোণে অবস্থার পুনরায় পরীক্ষা করতে wra এছাড়াও নোট করুন যে .কোনও বিকল্প নেই।

এটি একটি একক পুনরাবৃত্তির জন্য নিম্নলিখিত লিনিয়ার কোডটি ছেড়ে দেয়:

{    Move MP forward onto edge C.
'}   Move to A and back to C. Taken together this is a no-op.
=    Reverse the direction of the MP so that it now points at A and B. 
%    Compute A % B and store it in C.
)(   Increment, decrement. Taken together this is a no-op, but it's
     necessary to ensure that IP wraps to the bottom row instead of
     the top row.

এখন আমরা করছি ফিরে যেখানে আমরা শুরু ছাড়া তিন প্রান্ত তাদের ভূমিকা পরিবর্তিত হয়েছে cyclically (মূল সি এখন ভূমিকা নেয় বি এবং মূল বি ভূমিকা একটি ...)। প্রভাব, আমরা ইনপুট relpaced থাকেন Aএবং Bসঙ্গে Bএবং A % Bযথাক্রমে।

একবার A % B(কিনার সিতে ) শূন্য হয়ে গেলে , জিসিডি বি প্রান্তে পাওয়া যাবে । আবার ন্যায়বিচারকরা >আইপিটিকে প্রতিফলিত করে, তাই আমরা চালিত লাল পথে:

}    Move MP to edge B.
!    Print its value as an integer.
@    Terminate the program.

9

32-বিট লিটল এন্ডিয়ান x86 মেশিন কোড, 14 বাইট

ব্যবহার করে উত্পন্ন nasm -f bin

d231 f3f7 d889 d389 db85 f475

    gcd0:   xor     edx,edx
            div     ebx
            mov     eax,ebx
            mov     ebx,edx
            test    ebx,ebx
            jnz     gcd0

4
আমি এটি ব্যবহার করে cdqএবং স্বাক্ষর করে 8 বাইটে নামিয়েছিলাম এবং এর পরিবর্তে idivএক বাইট পেয়েছি । 32 বিট কোডের জন্য: পরিবর্তে (আমি ব্যবহারের কোনও উপায় দেখতে পেলাম না এবং নেই )। আমি আমার চূড়ান্ত সংস্করণটিকে একটি নতুন উত্তর হিসাবে পোস্ট করেছি যেহেতু আমি মনে করি যে এটি পরিবর্তনগুলি ন্যায়সঙ্গত করার পক্ষে যথেষ্ট বড়। xchg eax, r32movinc/looptest/jnzjecxzjecxnz
পিটার কর্ডেস

9

টি-এসকিউএল, 153 169 বাইট

কেউ গল্ফিংয়ের জন্য সবচেয়ে খারাপ ভাষার কথা বলেছে?

CREATE FUNCTION G(@ INT,@B INT)RETURNS TABLE RETURN WITH R AS(SELECT 1D,0R UNION ALL SELECT D+1,@%(D+1)+@B%(D+1)FROM R WHERE D<@ and D<@b)SELECT MAX(D)D FROM R WHERE 0=R

একটি সারণী মূল্যবান ফাংশন তৈরি করে যা সাধারণ বিভাজনকারীদের কাজ করতে পুনরাবৃত্ত ক্যোয়ারি ব্যবহার করে। তারপরে এটি সর্বোচ্চ দেয় । এখন GCD আমার উত্তর থেকে প্রাপ্ত নির্ধারণ ইউক্লিডিয় আলগোরিদিম ব্যবহার করে এখানে

ব্যবহারের উদাহরণ

SELECT * 
FROM (VALUES
        (15,45),
        (45,15),
        (99,7),
        (4,38)
    ) TestSet(A, B)
    CROSS APPLY (SELECT * FROM G(A,B))GCD

A           B           D
----------- ----------- -----------
15          45          15
45          15          15
99          7           1
4           38          2

(4 row(s) affected)

1
যীশু যে শব্দবাচক।
সাইওস

9

জেলি, 7 বাইট

ṛß%ðḷṛ?

ইউক্লিডিয়ান অ্যালগোরিদমের পুনরাবৃত্তিমূলক বাস্তবায়ন। এটি অনলাইন চেষ্টা করুন!

যদি বিল্ট-ইনগুলি নিষিদ্ধ না করা হত, g(1 বাইট, অন্তর্নির্মিত জিসিডি) আরও ভাল স্কোর অর্জন করতে পারে।

কিভাবে এটা কাজ করে

ṛß%ðḷṛ?  Main link. Arguments: a, b

   ð     Convert the chain to the left into a link; start a new, dyadic chain.
 ß       Recursively call the main link...
ṛ %        with b and a % b as arguments.
     ṛ?  If the right argument (b) is non-zero, execute the link.
    ḷ    Else, yield the left argument (a).

এটি প্রায় হাহাকে প্রতারণার মতো মনে হচ্ছে, আমাকে অবশ্যই উল্লেখ করতে হবে যে উত্তরগুলি বাটলিনগুলি ব্যবহার করতে পারে না ...
মাইক শ্লান্টা

13
যদি আপনি এটি করার সিদ্ধান্ত নেন, আপনার তা দ্রুত করা উচিত। এটি বর্তমানে তিনটি উত্তরকে অকার্যকর করবে।
ডেনিস

লক্ষ্য করুন যে তিনি নির্দিষ্ট করেছেন দৈর্ঘ্য বাইটে রয়েছে - এই অক্ষরগুলি বেশিরভাগ> ইউটিএফ 8-তে 1 বাইট হয়।
কর্টিস

8
@ কর্টিস হ্যাঁ, সমস্ত কোড গল্ফ প্রতিযোগিতা ডিফল্টরূপে বাইটে স্কোর হয়। যাইহোক, জেলি ইউটিএফ -8 ব্যবহার করে না, তবে একটি কাস্টম কোড পৃষ্ঠা যা এটি 256 টি অক্ষরের প্রতিটি এনকোড করে এটি একক বাইট হিসাবে বোঝে।
ডেনিস 4

@ ডেনিস আহ, চালাক
আদালত 1

7

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

a#0=a
a#b=b#rem a b

ব্যবহারের উদাহরণ: 45 # 35-> 5

ইউক্লিড, আবার।

পিএস: অবশ্যই একটি বিল্ট- gcdইনও রয়েছে।


শর্তসাপেক্ষ চেক এড়াতে আপনার যে কৌশলটি ইনপুট অর্ডারকে বিপরীত করে তা ব্যাখ্যা করা উচিত
গর্বিত হাসেল্লার

@ প্রফেসহেস্কিলার: কী কৌশল? প্রত্যেকেই এই অ্যালগরিদমটি ব্যবহার করে, অর্থাত্ বন্ধ করা 0বা মডিউলাস নিয়ে চলছে।
নিমি

নেভরমাইন্ড, সবাই কৌশলটি ব্যবহার করছে
গর্বিত হাসেলেলার

এটি, কম গল্ফড, প্রায় ঠিক কীPrelude
মাইকেল ক্লিন

6

পাইথন 3, 31

Sp3000 ধন্যবাদ 3 বাইট সংরক্ষণ করা।

g=lambda a,b:b and g(b,a%b)or a

3
পাইথন 3.5++ এ:from math import*;gcd
Sp3000

@ এসপি 3000 ভাল, আমি জানি না যে তারা এটিকে গণিতে নিয়ে গেছে।
মরগান থ্রাপ

1
আপনি এতে থাকাকালীন:g=lambda a,b:b and g(b,a%b)or a
Sp3000

@ Sp3000 ধন্যবাদ! আমি কেবল একটি পুনরাবৃত্ত সমাধান সমাধান করেছি, তবে আমার যা ছিল তা থেকে এটি আরও ভাল।
মরগান থ্রাপ

জিসিডি এবং এলসিএম এর জন্য বিল্ট-ইনগুলি অনুমোদিত নয়, সুতরাং ২ য় সমাধান বৈধ হবে না।
mbomb007

6

এমএটিএল , 11 9 বাইট

এখন পর্যন্ত কেউ বর্বর শক্তি ব্যবহার করেছে বলে মনে হয় না, তাই এখানে।

ts:\a~f0)

ইনপুট দুটি সংখ্যার (পৃথক ;হিসাবে ব্যবহার করে ) একটি কলাম অ্যারে ।

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা

t     % Take input [a;b] implicitly. Duplicate
s     % Sum. Gives a+b
:     % Array [1,2,...,a+b]
\     % Modulo operation with broadcast. Gives a 2×(a+b) array
a~    % 1×(a+b) array that contains true if the two modulo operations gave 0
f0)   % Index of last true value. Implicitly display

5

সি, 38 বাইট

g(x,y){while(x^=y^=x^=y%=x);return y;}

1
আপনাকে আপনার বাইটকাউন্টে ফাংশনটির সংজ্ঞা অন্তর্ভুক্ত করতে হবে।
আর

1
@ রিকার এর জন্য দুঃখিত, আমি সংজ্ঞাটি সংযোজন করি এবং গণনাটি আপডেট করি
কীভাবে চেন

ফাংশনটির gপরিবর্তে নামকরণ করে আপনি দুটি বাইট সংরক্ষণ করতে পারেন gcd
স্টেডিবক্স

@ স্টেডিবক্স ঠিক আছে, হ্যাঁ, প্রথমবার এই সম্প্রদায়ে যোগদান করুন :)
কীভাবে চেন

1
পিপিসিজিতে আপনাকে স্বাগতম!
Rɪᴋᴇʀ

4

সি, 28 বাইট

ইউক্লিডের অ্যালগরিদম বাস্তবায়ন করার চেয়ে একটি সোজা কাজ কোনও বিকল্প অ্যালগরিদম ব্যবহার করে সংক্ষিপ্ততর হতে পারে।

g(a,b){return b?g(b,a%b):a;}

কেউ যদি একটু মেইন র‌্যাপার লিখেন

int main(int argc, char **argv)
{
  printf("gcd(%d, %d) = %d\n", atoi(argv[1]), atoi(argv[2]), g(atoi(argv[1]), atoi(argv[2])));
}

তারপরে একটি কয়েকটি মান পরীক্ষা করতে পারে:

$ ./gcd 6 21
জিসিডি (6, 21) = 3
$ ./gcd 21 6
gcd (21, 6) = 3
$ ./gcd 6 8
জিসিডি (6, 8) = 2
$ ./gcd 1 1
জিসিডি (1, 1) = 1
$ ./gcd 6 16
জিসিডি (6, 16) = 2
$ ./gcd 27 244
জিসিডি (27, 244) = 1 1

4

ল্যাবরেথ , 18 বাইট

?}
:
)"%{!
( =
}:{

একটি ত্রুটি দিয়ে শেষ করে তবে ত্রুটি বার্তাটি STDERR এ যায়।

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

এটি এখনও বেশ অনুকূল অনুভব করে না, তবে আমি এই সময়ে 3x3 এর নীচে লুপটি সংকুচিত করার কোনও উপায় দেখছি না।

ব্যাখ্যা

এটি ইউক্লিডিয়ান অ্যালগরিদম ব্যবহার করে।

প্রথমত, ইনপুট পড়ার জন্য এবং প্রধান লুপটিতে toোকার জন্য লিনিয়ার বিট রয়েছে। নির্দেশ পয়েন্টার (আইপি) পূর্ব দিকে যেতে উপরের বাম কোণে শুরু হয়।

?    Read first integer from STDIN and push onto main stack.
}    Move the integer over to the auxiliary stack.
     The IP now hits a dead end so it turns around.
?    Read the second integer.
     The IP hits a corner and follows the bend, so it goes south.
:    Duplicate the second integer.
)    Increment.
     The IP is now at a junction. The top of the stack is guaranteed to be
     positive, so the IP turns left, to go east.
"    No-op.
%    Modulo. Since `n % (n+1) == n`, we end up with the second input on the stack.

আমরা এখন কিছু ধরণের লুপ প্রবেশ করি যা ইউক্লিডিয়ান অ্যালগোরিদমকে গণনা করে। স্ট্যাকের শীর্ষগুলিতে থাকে aএবং b(একটি অন্তর্নিহিত অসীম পরিমাণ শূন্যের শীর্ষে, তবে আমাদের সেগুলির প্রয়োজন হবে না)। আমরা একে অপরের দিকে বৃদ্ধি করে স্ট্যাকগুলি পাশাপাশি রেখে প্রতিনিধিত্ব করব:

    Main     Auxiliary
[ ... 0 a  |  b 0 ... ]

লুপটি একবারে aশূন্য হয়। একটি লুপ পুনরাবৃত্তি নিম্নলিখিত হিসাবে কাজ করে:

=    Swap a and b.           [ ... 0 b  |  a 0 ... ]
{    Pull a from aux.        [ ... 0 b a  |  0 ... ]
:    Duplicate.              [ ... 0 b a a  |  0 ... ]
}    Move a to aux.          [ ... 0 b a  |  a 0 ... ]
()   Increment, decrement, together a no-op.
%    Modulo.                 [ ... 0 (b%a)  |  a 0 ... ]

আপনি দেখতে পারেন আমরা প্রতিস্থাপিত করে থাকেন aএবং bসঙ্গে b%aএবং aযথাক্রমে।

শেষ b%aঅবধি , একবার শূন্য হলে আইপি পূর্বদিকে অগ্রসর হয় এবং চালায়:

{    Pull the non-zero value, i.e. the GCD, over from aux.
!    Print it.
     The IP hits a dead end and turns around.
{    Pull a zero from aux.
%    Attempt modulo. This fails due to division by 0 and the program terminates.

4

জুলিয়া, 21 15 বাইট

a\b=a>0?b%a\a:b

ইউক্লিডিয়ান অ্যালগোরিদমের পুনরাবৃত্তিমূলক বাস্তবায়ন। এটি অনলাইন চেষ্টা করুন!

যদি বিল্ট-ইনগুলি নিষিদ্ধ না করা হত, gcd(3 বাইট, অন্তর্নির্মিত জিসিডি) আরও ভাল স্কোর অর্জন করতে পারে।

কিভাবে এটা কাজ করে

a\b=             Redefine the binary operator \ as follows:
    a>0?     :       If a > 0:
        b%a\a        Resursively apply \ to b%a and a. Return the result.
              b      Else, return b.

4

কিউবিক্স , 10 12 বাইট

?v%uII/;O@

এখানে চেষ্টা করুন

এটি নীচে ঘনক্ষেতের মোড়ক:

    ? v
    % u
I I / ; O @ . .
. . . . . . . .
    . .
    . .

ইউক্লিডিয়ান পদ্ধতি ব্যবহার করে।

IIদুটি নম্বর এসটিডিএন থেকে ধরা হয়েছে এবং স্ট্যাক প্রবাহিত করা হয়েছে মোড দ্য টপ অফ স্ট্যাকের
/প্রতিফলিত
%। স্ট্যাকের শীর্ষে বাম বাকি
?যদি টিওএস 0 থাকে তবে চালিয়ে যান, অন্যথায় ডানদিকে ঘুরুন না
vহলে নীচে পুনঃনির্দেশ করুন এবং uডানদিকে দু'বার ফিরে মোডের দিকে ঘুরুন
/যদি 0 ঘনকটির কাছাকাছি রিফ্লাক্টর
;ড্রপ টিওএস, Oআউটপুট টিওএস এবং @শেষ হয়


আমি শুধু একটি 12-বাইট Cubix উত্তর আপ লিখেছিলেন, তারপর উত্তর মাধ্যমে স্ক্রলিং যদি আমি উভয় হ্যান্ডেল করা প্রয়োজন দেখতে শুরু 0,xএবং x,0... তারপর আমি এই জুড়ে এসেছিল। সুন্দর!
ETH প্রোডাকশনগুলি


3

উইন্ডোজ ব্যাচ, 76 বাইট

পুনরাবৃত্তি ফাংশন। GCD a bফাইল নাম সহ এটি কল করুন gcd

:g
if %2 equ 0 (set f=%1
goto d)
set/a r=%1 %% %2
call :g %2 %r%
:d
echo %f%

3

এমএটিএল, 7 বাইট

pG1$Zm/

অনলাইনে চেষ্টা করে দেখুন!

ব্যাখ্যা

যেহেতু আমরা স্পষ্টভাবে builtin GCD ফাংশন ব্যবহার করতে পারবেন না ( ZdMATL মধ্যে), আমি যে লঘিষ্ট সাধারণ গুণিতক শোষিত আছে aএবং bসময়ের সবথেকে বড় সাধারণ হর aএবং bগুণফল সমান aএবং b

p       % Grab the input implicitly and multiply the two elements
G       % Grab the input again, explicitly this time
1$Zm    % Compute the least-common multiple
/       % Divide the two to get the greatest common denominator

দুটি পৃথক ইনপুট দিয়ে আপনি একটি বাইট সংরক্ষণ করতে পারেন:*1MZm/
লুইস মেন্ডো

3

র‌্যাকেট (স্কিম), 44 বাইট

র‌্যাকেটে ইউক্লিড বাস্তবায়ন (প্রকল্প)

(define(g a b)(if(= 0 b)a(g b(modulo a b))))

সম্পাদনা: @ নুমেরির সমাধান লোলটি দেখেনি। একরকম আমরা স্বাধীনভাবে সঠিক কোড পেয়েছি


এই উভয় কাজ করে?
নন ইনিহুর

@ ননওআইনি এখানে হ্যাঁ এটি উভয়ই কাজ করে
ক্রোনিকেজেশন

3

> <> , 32 বাইট

::{::}@(?\=?v{:}-
.!09}}${{/;n/>

স্ট্যাক থেকে দুটি মান গ্রহণ করে এবং তাদের জিসিডি উত্পাদন করতে ইউক্যালিডিয়ান অ্যালগরিদম প্রয়োগ করে।

আপনি এটি এখানে চেষ্টা করতে পারেন !

> <> এ আরও ভাল উত্তরের জন্য, সকের পরীক্ষা করে দেখুন !


1
আমি আজ একটি নতুন ভাষা পেয়েছি :)
nsane


2

জিএমএল, 57 বাইট

a=argument0
b=argument1
while b{t=b;b=a mod b;a=t}return a

2

ডেলফি 7, 148

ভাল, আমি মনে করি আমি গল্ফ করার জন্য নতুন খারাপ ভাষা খুঁজে পেয়েছি।

unit a;interface function g(a,b:integer):integer;implementation function g(a,b:integer):integer;begin if b=0then g:=a else g:=g(b,a mod b);end;end.

ওহ আমি জানি না, প্যারেন্থিসিসসংক্রান্ত golfing জন্য বেশ দরিদ্র
MickyT

2

হুন, 20 বাইট

|=
{@ @}
d:(egcd +<)

-

হুন # 2, 39 বাইট

|=
{a/@ b/@}
?~
b
a
$(a b, b (mod a b))

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

অন্যান্য বাস্তবায়ন হ'ল ডিফল্ট পুনরাবৃত্ত জিসিডি সংজ্ঞা।


2

পাইথন 3.5, 70 82 73 বাইট:

lambda*a:max([i for i in range(1,max(*a)+1)if not sum(g%i for g in[*a])])

notএই ক্ষেত্রে নিশ্চিত সমষ্টি সমস্ত নম্বর করা হবে *argsমডিউল iশূন্য হয়।

এছাড়াও, এখন এই ল্যাম্বডা ফাংশনটি আপনি যতটা মানচিত্র গ্রহণ করতে পারেন ততক্ষণ যতক্ষণ মানগুলির পরিমাণ গণিত মডিউলটির ফাংশনের >=2বিপরীতে থাকবে gcd। উদাহরণস্বরূপ, এটি মানগুলি গ্রহণ করতে পারে এবং 2,4,6,8,102 এর সঠিক GCD প্রদান করতে পারে ।


1
মাল্টিচার ভেরিয়েবল নামের জন্য আপনি গ্রেপ্তার রয়েছেন। (বা ফাংশন যুক্তি, তবে যাই হোক না কেন)
ক্যালকুলেটরফলাইন

2

রুবি, 23 বাইট

g=->a,b{b>0?a:g[b,a%b]}

মনে রাখবেন রুবি ব্লককে g [...] এর পরিবর্তে g [...] বা g.call (...) দিয়ে ডাকা হয়

আংশিক ক্রেডিট শূন্যস্থান থেকে


2
পরিবর্তে g.call(a,b)আপনি ব্যবহার করতে পারেন g[a,b]। পরিবর্তে proc{|a,b|, আপনি ব্যবহার করতে পারেন ->a,b{
সুস্পষ্ট

1
আপনি b>0পরিবর্তে b<=0অন্য অপারেটর ক্রম ব্যবহার করে এবং একটি বাইট সংরক্ষণ করতে পারেন ।
সুস্পষ্ট

2

এআরএম মেশিন কোড, 12 বাইট:

সমাবেশ:

gcd: cmp r0, r1
     sublt r0, r0, r1
     bne gcd

বর্তমানে এটি সংকলন করতে পারে না, তবে এআরএমের প্রতিটি নির্দেশিকাতে 4 বাইট লাগে। সম্ভবত এটি থাম্ব -২ মোড ব্যবহার করে গল্ফ ডাউন হতে পারে।


মেশিন কোডে এটি করেন এমন ভাল কাজের লোকটি আমার কাছ থেকে গুরুতর প্রপস পায়।
মাইক শ্লান্টা

এটি কেবল বিয়োগফলকে ব্যবহার করে ইউক্লিডের আলগোতে একটি প্রয়াস বলে মনে হয় , তবে আমি মনে করি এটি কার্যকর হয় না। তাহলে r0 > r1তারপর subltকিছুই করতে হবে ( ltসম্পৃক্ত মিথ্যা হয়) এবং bneএকটি অসীম লুপ হবে। আমি মনে করি আপনার যদি অদলবদল না হয় তবে ltএটি একই লুপটি করতে পারে b-=aবা a-=bপ্রয়োজন মতো করতে পারে । অথবা উপ-উত্পাদিত ক্যারি (ওরফে orrowণ) গ্রহণ করলে একটি উপেক্ষা করুন।
পিটার কর্ডেস

এই এআরএম নির্দেশিকা সেট নির্দেশিকাটি পূর্বাভাসের উদাহরণ হিসাবে একটি বিয়োগের জিসিডি অ্যালগরিদম ব্যবহার করে। (পৃষ্ঠা 25) তারা cmp r0, r1/ subgt r0, r0, r1/ sublt r1, r1, r0/ ব্যবহার করে bne gcd। এটিআরএম নির্দেশিকায় 16 বি, সম্ভবত 12 টি থাম্ব 2 নির্দেশিকায়?
পিটার কর্ডেস

1
X86-তে, আমি 9 বাইট পরিচালনা করেছি: sub ecx, eax/ jae .no_swap/ add ecx,eax/ xchg ecx,eax/ দিয়ে jne। সুতরাং একটি সিএমপি এর পরিবর্তে, আমি কেবল সাব করব, তারপরে পূর্বাবস্থায় ফেলা এবং অদলবদল করা উচিত যদি সাবটি অন্যভাবে চলে যাওয়া উচিত। আমি এটি পরীক্ষা করেছি এবং এটি কাজ করে। ( ভুল সময়ে প্রস্থান addকরবেন না jne, কারণ এটির শূন্য উত্পন্ন করতে পারে না যদি না কোনও ইনপুট শুরু করা শূন্য হয় এবং আমরা এটি সমর্থন করি না Update আপডেট: আমাদের ইনপুটটি শূন্য হওয়ায় সমর্থন করতে হবে: /)
পিটার কর্ডেস

থাম্ব 2 এর জন্য একটি iteনির্দেশ রয়েছে: যদি-তবে-অন্যথায় else সিএমপি / সাব এক পথে / অন্য উপায়ে উপযোগী হওয়া উচিত।
পিটার কর্ডেস

2

টিআই-বেসিক, 10 বাইট

Prompt A,B:gcd(A,B

গিসিডি বিল্ট-ইনগুলিকে নিষেধ করে নতুন নিয়মের কারণে প্রতিযোগিতামূলক


gcd(অন্তর্নির্মিত 17 বাইট সমাধান

Prompt A,B:abs(AB)/lcm(A,B

এলসিএমটি বিল্ট-ইনগুলি নিষেধ করে নতুন নিয়মের কারণে অ-প্রতিযোগী


27gcd( বা বাইটlcm( অন্তর্নিহিত সমাধান না:

Prompt A,B:While B:B→T:BfPart(A/B→B:T→A:End:A

বিল্ট-ইনগুলি gcd(বা lcm(বিল্ট-ইনগুলি ছাড়াই 35 বাইট রিকার্সিভ সমাধান (2.53 এমপি অপারেটিং সিস্টেম বা উচ্চতর প্রয়োজন, নামকরণ করতে হবে prgmG ):

If Ans(2:Then:{Ans(2),remainder(Ans(1),Ans(2:prgmG:Else:Disp Ans(1:End

{A,B}উদাহরণস্বরূপ {1071, 462}:prgmGফলন হ'ল আপনি পুনরাবৃত্ত রূপগুলিতে যুক্তিগুলি পাস করবেন 21


রঙিন আমাকে মুগ্ধ।
মাইক শ্লান্টা

আপনার সম্ভবত উল্লেখ করা উচিত যে শেষটি হিসাবে সংরক্ষণ করা দরকার prgmG
একটি স্প্যাগেটো

2

05 এ বি 1 ই , 10 বাইট

কোড:

EàF¹N%O>iN

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


বিল্ট-ইনগুলি সহ:

¿

ব্যাখ্যা:

¿   # Implicit input, computes the greatest common divisor.
    # Input can be in the form a \n b, which computes gcd(a, b)
    # Input can also be a list in the form [a, b, c, ...], which computes the gcd of
      multiple numbers.

এটি অনলাইন চেষ্টা করুন! অথবা একাধিক সংখ্যা দিয়ে চেষ্টা করুন


2

ওরাকল এসকিউএল 11.2, 104 118 বাইট

SELECT MAX(:1+:2-LEVEL+1)FROM DUAL WHERE(MOD(:1,:1+:2-LEVEL+1)+MOD(:2,:1+:2-LEVEL+1))*:1*:2=0 CONNECT BY LEVEL<=:1+:2;

0 ইনপুট জন্য স্থির


কোনও ইনপুট শূন্য হলে সঠিকভাবে কাজ করে না।
ডিম স্ক্রিপটুনফ 14

এটি আপনাকে কয়েকটি সঞ্চয় করতে হবেSELECT MAX(LEVEL)FROM DUAL WHERE MOD(:1,LEVEL)+MOD(:2,LEVEL)=0 CONNECT BY LEVEL<=:1+:2;
মিকিটি

2

> <> , 12 + 3 = 15 বাইট

:?!\:}%
;n~/

ইনপুট সংখ্যাগুলি স্ট্যাকটিতে উপস্থিত থাকার প্রত্যাশা করে, তাই -vপতাকাটির জন্য +3 বাইট । এটি অনলাইন চেষ্টা করুন!

ইউক্লিডিয়ান অ্যালগরিদমের আরেকটি বাস্তবায়ন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.