সর্বাধিক সাধারণ বিভাজকের ভিজ্যুয়ালাইজ করুন


28

পটভূমি

সর্বশ্রেষ্ঠ সাধারণ বিভাজক ( সংক্ষেপে জিসিডি ) হ'ল সুবিধাজনক গাণিতিক ফাংশন, কারণ এতে অনেকগুলি দরকারী বৈশিষ্ট্য রয়েছে। এর মধ্যে একটি হ'ল বাজাউটের পরিচয় : যদি d = gcd(a, b), তবে এখানে পূর্ণসংখ্যা xএবং এর yমতো উপস্থিত রয়েছে d = x*a + y*b। এই চ্যালেঞ্জে আপনার কাজটি হ'ল সাধারণ এএসসিআইআই আর্ট দিয়ে এই সম্পত্তিটি ভিজ্যুয়ালাইজ করা।

ইনপুট

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

আউটপুট

আপনার আউটপুটটি sদৈর্ঘ্যের একটি স্ট্রিং lcm(a, b) + 1( এলসিএম সর্বনিম্ন সাধারণ একাধিক) stands sপূর্ণসংখ্যার চরিত্রগুলি থেকে শুরু 0করে lcm(a, b)। চরিত্রটি s[i]একটি ছোট হাতের হয় oযদি iএকাধিক aবা bএক সময় হয় .otherwise নোট করুন যে শূন্য প্রতিটি সংখ্যার একাধিক। এখন, Bézout পরিচয় কারণে সেখানে অক্ষরের অন্তত এক জোড়া হতে হবে oমধ্যে sযার দূরত্ব ঠিক gcd(a, b)। বামতম এই জাতীয় জুটি বড় হাতের দ্বারা প্রতিস্থাপন করা হবে O; এটিই চূড়ান্ত আউটপুট।

উদাহরণ

ইনপুট a = 4এবং বিবেচনা করুন b = 6। তারপরে আমাদের আছে gcd(a, b) = 2এবং lcm(a, b) = 12তাই দৈর্ঘ্য sহবে 13। এর গুণিতক aএবং bনিম্নরূপ হাইলাইট করা হয়:

0  1  2  3  4  5  6  7  8  9 10 11 12
o  .  .  .  o  .  o  .  o  .  .  .  o

দুটি oদুরত্বের সাথে দুটি জোড়া রয়েছে , তবে আমরা কেবলমাত্র বামদিকের Oগুলি এর সাথে প্রতিস্থাপন করব , সুতরাং চূড়ান্ত আউটপুট

o...O.O.o...o

বিধি এবং স্কোরিং

আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন। সর্বনিম্ন বাইট গণনা জয়, এবং মান লুফোলগুলি অনুমোদিত নয়।

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

 1  1 -> OO
 2  2 -> O.O
 1  3 -> OOoo
 4  1 -> OOooo
 2  6 -> O.O.o.o
 2  3 -> o.OOo.o
10  2 -> O.O.o.o.o.o
 4  5 -> o...OO..o.o.o..oo...o
 8  6 -> o.....O.O...o...o.o.....o
12 15 -> o...........O..O........o.....o.....o........o..o...........o
19 15 -> o..............o...o..........o.......o......o...........o..o..............OO.............o....o.........o........o.....o............o.o..............o.o............o.....o........o.........o....o.............oo..............o..o...........o......o.......o..........o...o..............o

1
আনরি ইনপুট নেওয়ার সময়, আমরা কোনও চরিত্র চয়ন করতে পারি? (বিশেষত, কীভাবে ., oবা O।) বা এটি হতে হবে 1? নাকি 0?
মার্টিন ইন্ডার

1
@ মার্টিনব্যাটনার এটি যে কোনও চরিত্র হতে পারে, আপনি যতক্ষণ না সামঞ্জস্য হন এবং উভয় ইনপুটগুলির জন্য একই ফর্ম্যাট ব্যবহার করেন।
জাগারব

2
আমি অবাক হয়েছি আপনি নিজের পরীক্ষার কেস হিসাবে 3 এবং 5 ব্যবহার করেন নি।
নীল

আমি বিল্টিন ব্যবহার করতে পারি?
আকাংকা

@ খ্রিস্টিয়ান ইরওয়ান হ্যাঁ, সমস্ত বিল্ট-ইন অনুমোদিত allowed
Zgarb

উত্তর:


7

জल्फ, 52 বাইট

on*'.wm9jJΡR m*Yhm8jJDN?<*%Sj%SJ1'o'.}"'o%o"n"O%O"n

আমি এই কোডটি দুটি ভাগে বিভক্ত করব।

on*'.wm9jJ
on         set n
  *'.       to a dot repeated
      m9jJ  the gcd of two numeric inputs

ΡR m*Yhm8jJDN?<*%Sj%SJ1'o'.}"'o%o"n"O%O"n
    *Y                                    multiply (repeat) Y (Y = [])
      hm8jJ                                by the lcm of two inputs + 1
  _m       DN              }              and map the array of that length
             ?<*%Sj%SJ1'o'.               "choose o if i%a*(i%b)<1; otherwise choose ."
 R                          "'            join by empty string
Ρ                            'o%o"n        replace once (capital Rho, 2 bytes): "o"+n+"o"
                                   "O%O"n   with "O"+n+"O"
                                          implicit printing

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


এখন পর্যন্ত সব কিছুর চেয়ে কম। : পি
আর

1
@ রিকারডাব্লু হ্যাঁ! আমি আশা করি একবারে জल्फ শেষ পর্যন্ত জিতবে।
কনর ও'ব্রায়ান

10

জুলিয়া, 111 110 107 103 96 বাইট

f(a,b)=replace(join([i%a*(i%b)<1?"o":"."for i=0:lcm(a,b)]),"o$(d="."^(gcd(a,b)-1))o","O$(d)O",1)

এটি এমন একটি ফাংশন যা দুটি পূর্ণসংখ্যা গ্রহণ করে এবং একটি স্ট্রিং প্রদান করে।

Ungolfed:

function f(a::Int, b::Int)
    # Construct an array of dots and o's
    x = [i % a * (i % b) < 1 ? "o" : "." for i = 0:lcm(a, b)]

    # Join it into a string
    j = join(x)

    # Replace the first pair with distance gcd(a, b) - 1
    replace(j, "o$(d = "."^(gcd(a, b) - 1))o", "O$(d)O", 1) 
end

নিমিকে ধন্যবাদ একটি বাইট সংরক্ষণ করা!


10

রেটিনা , 112 109 99 94 91 বাইট

^
. 
+r`(?<!^\1+). (.+) 
$'$0
.(?=.* (.+) (.+))(?=\1* |\2* )
o
o(\.*)o((\1\.*o)*) .*
O$1O$2

আমার মনে হয় খুব বেশি প্রতিযোগিতামূলক নয়, তবে রেটিনার সংখ্যার তত্ত্বটি সর্বদা মজাদার। :)

আনারি অংক হিসাবে ইউনারি নম্বর হিসাবে ইনপুট নেয় .

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

ব্যাখ্যা

^
. 

এটি ইনপুটটির .সামনে একটি এবং একটি স্থান সন্নিবেশ করায় । এটি শেষ পর্যন্ত আউটপুট হয়ে যাবে।

+r`(?<!^\1+). (.+) 
$'$0

এটি স্ট্রিংয়ের aএবং এর LCM প্রিপেন্ড করে b। যেহেতু আমাদের ইতিমধ্যে একটি .আছে, আমরা শেষ করব lcm(a,b)+1bযতক্ষণ aনা এই নতুন উপসর্গটি বিভক্ত হয় না বার বার প্রিপেন্ডিং দ্বারা এটি সম্পন্ন হয় । আমরা aএকটি গ্রুপে ক্যাপচার করি এবং তারপরে আমরা একবারে সেই ক্যাপচারটি মিলিয়ে স্ট্রিংয়ের শুরুতে পৌঁছতে পারি কিনা তা পরীক্ষা করি। bএর পরে স্ট্রিংয়ের মধ্যে খুব কম ব্যবহৃত হয়ে স্ট্রিংটি প্রবেশ করানো হয় $'যা ম্যাচের পরে প্রতিস্থাপনের মধ্যে সবকিছু সন্নিবেশ করে।

.(?=.* (.+) (.+))(?=\1* |\2* )
o

এটি একের সাথে এমন পদের অক্ষরের সাথে মেলে যা ভাগ aবা দ্বারা বিভক্ত b। ফলাফলটি প্রতিসাম্যযুক্ত তা ব্যবহার করে: যেহেতু lcm(a,b)উভয় দ্বারা বিভক্ত aএবং bবাম দিকে উদাহরণগুলি বিয়োগ করে aবা এগুলি যোগ করে bডানদিকে যাওয়ার একই প্যাটার্নটি 0দেয়। প্রথম চেহারাটি কেবল ক্যাপচার করে aএবং b। দ্বিতীয় চেহারাটি প্রথম স্থানের আগে প্রতিটি aবা bঅক্ষরের একাধিক রয়েছে তা পরীক্ষা করে ।

o(\.*)o((\1\.*o)*) .*
O$1O$2

উইকিপিডিয়ায় যেমন বলা হয়েছে, বাউজাউটের পরিচয় ছাড়াও এটিও সত্য

সবচেয়ে বড় সাধারণ বিভাজক dহ'ল ক্ষুদ্রতম ধনাত্মক পূর্ণসংখ্যা যা হিসাবে লেখা যেতে পারে ax + by

এর দ্বারা বোঝা যায় যে জিসিডি oআউটপুটটিতে দুটি এর মধ্যে সংক্ষিপ্ত ব্যবধানের সাথে সামঞ্জস্য করবে । সুতরাং আমাদের মোটেও জিসিডি সন্ধান করার ঝামেলা করার দরকার নেই। পরিবর্তে আমরা কেবল সংক্ষিপ্ত ব্যবধানের প্রথম উদাহরণটি সন্ধান করি। o(\.*)oএকটি প্রার্থী ফাঁক সাথে মিলে যায় এবং গ্রুপ 1. মধ্যে নিজের প্রস্থ ধারন করে তারপর আমরা প্রথম দল 1 এবং একটি backreference মধ্যে পর্যায়ক্রমে দ্বারা স্থান পৌঁছানোর চেষ্টা o(ঐচ্ছিক অতিরিক্ত সঙ্গে গুলি .গুলি)। ডানদিকে আরও একটি ছোট ফাঁক থাকলে, এটি মেলে ব্যর্থ হবে, কারণ আমরা পিছনের সাথে এই ফাঁকটি পার করতে পারি না। যত তাড়াতাড়ি আরও সমস্ত ফাঁকগুলি বর্তমানের হিসাবে কমপক্ষে বিস্তৃত হবে, এটি মেলে। আমরা এলসিএম-স্ট্রিংয়ের শেষটি গ্রুপ 2-তে ক্যাপচার করি এবং স্ট্রিংয়ের বাকী অংশটি এর সাথে মেলে .*। আমরা বড় হাতের অক্ষরে ফিরে লিখিOs (এর মধ্যে ব্যবধানের সাথে) পাশাপাশি LCM স্ট্রিংয়ের অবশিষ্ট অংশটি সরিয়ে ফেলুন aএবং bচূড়ান্ত ফলাফল থেকে সরিয়ে, স্থান থেকে শুরু করে সমস্ত কিছু ফেলে দিন ।


আমি রেটিনা নম্বর তত্ত্ব সম্পর্কে খুব বেশি কিছু জানি না, তবে কি ইনপুট চরিত্রটি এমন কোনও কিছুর জন্য সেট করব না যার জন্য বাইটগুলি সংরক্ষণের প্রয়োজন নেই? আই (\.*)=>(a*)
কনর ও'ব্রায়ান

@ সিও'বʀɪᴇɴ হ্যাঁ, তবে তারপরে আমাকে এটির সাথে .পরে প্রতিস্থাপন করতে হবে , যার চারটি বাইট খরচ হবে (এবং পালিয়ে যাওয়া থেকে মুক্তি পেতে কেবল 3 টি সাশ্রয় হয়)।
মার্টিন ইন্ডার

ওহ। শান্ত! খুব আকর্ষণীয় উত্তর।
কনর ও'ব্রায়ান

5

𝔼𝕊𝕄𝕚𝕟, 50 অক্ষর / 90 বাইট

⩥Мū⁽îí+1)ⓜ$%î⅋$%í?⍘.:⍘o)⨝ċɼ(`o⦃⍘.ĘМũ⁽îí-1)}o”,↪$ú⬮

Try it here (Firefox only).

এটি আরও গল্ফ করার উপায় আছে!

ব্যাখ্যা

এটি একটি মৌলিক দ্বি-পর্যায়ের অ্যালগরিদম। এটি আসলে বেশ সহজ।

ধাপ 1

⩥Мū⁽îí+1)ⓜ$%î⅋$%í?⍘.:⍘o)⨝

প্রথমত, আমরা 0 থেকে LCM + 1 পর্যন্ত একটি পরিসীমা তৈরি করি। তারপরে আমরা এটির উপরে ম্যাপ করছি, ইনপুটগুলির মধ্যে যে কোনও একটিই পরিসরের বর্তমান আইটেমের একটি উপাদান কিনা তা পরীক্ষা করা। যদি তা হয় তবে আমরা সেই আইটেমটিকে একটি দিয়ে প্রতিস্থাপন করব o; অন্যথায়, আমরা এটি দ্বারা প্রতিস্থাপন .। এটিতে যোগ দেওয়া আমাদের ও গুলি এবং বিন্দুগুলির একটি সিরিজ দেয় যা আমরা দ্বিতীয় ধাপে যেতে পারি।

দশা ২

ċɼ(`o⦃⍘.ĘМũ⁽îí-1)}o”,↪$ú⬮

এটি কেবলমাত্র একটি বড় প্রতিস্থাপন ফাংশন। একটি রেজেক্স হিসাবে তৈরি করা হয় o[dots]o, যেখানে বিন্দুর পরিমাণ জিসিডি -১ দ্বারা নির্ধারিত হয়। যেহেতু এই রেজেক্সটি বিশ্বব্যাপী নয়, এটি কেবল প্রথম ঘটনার সাথে মিলবে। এর পরে, ম্যাচটি O[dots]Oএকটি টুঅপারকেস ফাংশন ব্যবহার করে প্রতিস্থাপন করা হয় ।


3

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

6.0.0 সংস্করণ ব্যবহার করে যা এই চ্যালেঞ্জের চেয়ে আগের। কোডটি মাতলাব এবং অক্টোবায় চলছে runs

2$tZm1+:1-bbvtbw\A~otbZ}ZdXK1+ltb(3X53$X+1K2$lh*t2=f1)tK+hwg1+Ib('.oO'w)

উদাহরণ

>> matl
 > 2$tZm1+:1-bbvtbw\A~otbZ}ZdXK1+ltb(3X53$X+1K2$lh*t2=f1)tK+hwg1+Ib('.oO'w)
 > 
> 1
> 1
OO

>> matl
 > 2$tZm1+:1-bbvtbw\A~otbZ}ZdXK1+ltb(3X53$X+1K2$lh*t2=f1)tK+hwg1+Ib('.oO'w)
 > 
> 2
> 3
o.OOo.o

>> matl
 > 2$tZm1+:1-bbvtbw\A~otbZ}ZdXK1+ltb(3X53$X+1K2$lh*t2=f1)tK+hwg1+Ib('.oO'w)
 > 
> 12
> 15
o...........O..O........o.....o.....o........o..o...........o

ব্যাখ্যা

এটি কীভাবে কাজ করে তা আমার কোনও ধারণা নেই । আমি কেবল এলোমেলোভাবে অক্ষর টাইপ করেছি। আমি মনে করি কিছু জড়িত জড়িত আছে।

সম্পাদনা করুন: এটি অনলাইন চেষ্টা করুন ! লিঙ্কের কোডটি ভাষার পরিবর্তনের সাথে সামঞ্জস্য করার জন্য সামান্য পরিবর্তন করা হয়েছে (2 শে জুন, ২০১ 2016)।


আপনি এলোমেলোভাবে একটি 72 বাইট প্রোগ্রাম টাইপ করতে পারবেন না। পরে সম্ভাবনা গণনা করবে (কিছুক্ষণ ঘুমোতে এবং অভিনয়ের পরে)
ক্যালকুলেটরফলাইন

2

জাপট , 83 বাইট

'.pD=U*V/(C=(G=@Y?G$($YX%Y :X} $($UV)+1 £Y%U©Y%V?".:o"} $.replace($E=`o{'.pC-1}o`Eu

এখনও পুরোপুরি গল্ফ করা হয়নি ... এবং গল্ফ হতে চায় না: /


আপনি কি rজায়গায় ব্যবহার করতে পারবেন না $.replace($?
ETH প্রোডাকশনস

@ আমি জি পতাকা ছাড়া কীভাবে প্রতিস্থাপন করব তা আমি খুঁজে পাইনি, তাই না, আমি পারি না।
নিকেল

2

জাভাস্ক্রিপ্ট, 170 164 161 153 145 141 136 বাইট

(a,b)=>[...Array(a*b/(c=(g=(a,b)=>b?g(b,a%b):a)(a,b))+1)].map((x,i)=>i%a&&i%b?'.':'o').join``.replace(`o${e='.'.repeat(c-1)}o`,`O${e}O`)

এটি বেশ দীর্ঘায়ু ....

ডেমো , স্পষ্টরূপে সংজ্ঞায়িত ভেরিয়েবলগুলি কারণ ইন্টারপ্রিটার কঠোর মোড ব্যবহার করে।


প্রতিস্থাপন করার চেষ্টা করুন i%a<1||i%b<1?'o':'.'সঙ্গেi%a&&i%b?'.':'o'
মামা মজা রোল

ওহ হ্যাঁ, আমি মনে করি আপনি ওরফে যোগ দিতে পারেন।
মামা ফান রোল

@ ɟ nɟuɐɯɹɐ ן oɯ ধন্যবাদ, সরল পুনরাবৃত্তি সহ অ্যারেগুলিও প্রতিস্থাপন করুন।
নিকেল 20

ওহ, তাহলে সেক্ষেত্রে আপনার সম্ভবত 3 টির উপস্থিতি না থাকলে আপনার সম্ভবত উলামে যোগদান করা উচিত নয়।
মামা ফান রোল

[...Array((d=a*b/(c=(g=(a,b)=>b?g(b,a%b):a)(a,b)))+1).keys()].map(i=>i%a&&i%b?'.':'o')আপনাকে দুটি বাইট বাঁচায় (আমি '।' এবং 'ও' তৈরি করতে স্ট্রিং ইনডেক্সিং ব্যবহার করার চেষ্টা করেছি তবে এটির জন্য দুটি বাইট ব্যয় হয়))
নীল

1

পাইথন 2, 217 200 191 বাইট

এটি একটি সামান্য ভোঁতা, কিন্তু এটি কাজ করে। যে কোনও গল্ফিং টিপসকে প্রশংসা করা হয়, বিশেষত যদি আপনি জানেন যে s[i] = s[v] = "o"আমি যে সমস্যার মুখোমুখি হয়েছি তা কীভাবে ঠিক করতে হয় , যেখানে এটি "ও" কে ওভাররাইট করে ফেলেছে!

g=lambda a,b:b and g(b,a%b)or a
def f(a,b):
 h=g(a,b);x=1+a*b/h;s=["."]*x;v=k=0
 for i in range(x):
    if(i%a)*(i%b)<1:
     if k:s[i]="o"
     else:k=i==h+v;s[i]=s[v]="oO"[k]
     v=i
 return''.join(s)

Ungolfed:

def gcd(a,b):                           # recursive gcd function
    if b:
        return g(b,a%b)
    else:
        return a
def f(a,b):
    h = gcd(a,b)
    x = 1 + a*b/h                       # 1 + lcm(a,b)
    s = ["."] * x
    v = 0
    k = 0
    for i in range(x):
        if i%a == 0 and i % b == 0:
            if k == 0:
                k = (i == h+v)          # correct distance apart?
                if k:                   # if "O" just found
                    s[i] = s[v] = "O"
                else:
                    s[i] = s[v] = "o"
            else:
                s[i] = "o"              # if "O" already found, always "o"
            v = i                       # If we found an "o" or an "O", i is the new v
    return ''.join(s)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.