বুদবুদ সাজানো


26

দ্রষ্টব্য, গণিত.স্ট্যাকেক্সেঞ্জারে জিজ্ঞাসা করা প্রশ্ন থেকে চ্যালেঞ্জ অনুলিপি করা হয়েছে ।

সাম্প্রতিককালে, আমি বুদবুদ ফুঁকতে বেশ দক্ষতা অর্জন করেছি। প্রথমে আমি বুদবুদগুলি এমনভাবে ফুঁকাতাম: এখানে চিত্র বর্ণনা লিখুন

তবে তারপরে বিষয়গুলি অদ্ভুত হতে শুরু করে:

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

কিছুক্ষণ পরে, আমি বেশ কিছু অদ্ভুত বুদবুদ ফুঁকছিলাম:

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

শত শত, এমনকি এমন হাজারো বুদবুদগুলি ফুটিয়ে দেওয়ার পরে, আমার কপালটি হঠাৎই প্রশ্নটির সাথে কুঁচকে গেল: এন বুদবুদ দেওয়া, আপনি কতগুলি আলাদা উপায়ে সেগুলি সাজিয়ে রাখতে পারেন? উদাহরণস্বরূপ যদি এন = 1, কেবলমাত্র 1 টি ব্যবস্থা রয়েছে। যদি এন = 2 হয় তবে 2 টি ব্যবস্থা আছে। যদি এন = 3 হয় তবে 4 টি ব্যবস্থা আছে। যদি এন = 4 হয় তবে 9 টি ব্যবস্থা রয়েছে।

এখানে 4 টি বুদবুদগুলির 9 টি ব্যবস্থা রয়েছে:
এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

এই দুর্দান্ত সব বুদবুদগুলি ফুটিয়ে দেওয়ার পরে, আমি স্থির করেছিলাম যে তাদের ব্যবস্থাগুলি গণনা করে আমার সাথে আনন্দ করা উচিত। সুতরাং এখানে আপনার কাজ:


লক্ষ্য

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


ইনপুট

n, বুদবুদ সংখ্যা। n> 0


আউটপুট

এই বুদবুদগুলি আপনি কীভাবে সাজিয়ে তুলতে পারবেন number


বিজয়ী মানদণ্ড

আমরা যদি আপনার কোডের চারপাশে কোনও বুদবুদ ফুঁকতে পারি তবে এটি সত্যিই দুর্দান্ত। আপনি আপনার কোডটি যত ছোট করবেন এটি করা তত সহজ হবে। সুতরাং যে ব্যক্তি সর্বনিম্ন সংখ্যক বাইট সহ কোড তৈরি করে সে প্রতিযোগিতাটি জিতবে।


অতিরিক্ত তথ্য

OEIS


5
বুদবুদগুলি ছেদ করতে পারে তবে এটি একটি খোলার সমস্যা , এন = 4 এর 173 সমাধান সহ ।
orlp

ভাগ্যক্রমে, এই বুদবুদগুলি ছেদ করে না।
TheNumberOne

1
কি 0একটি বৈধ ইনপুট?
মার্টিন এেন্ডার

@ কেনওয়াই-এন হ্যাঁ ইতিমধ্যে নীচে একটি OEIS লিঙ্ক রয়েছে
রোমান গ্রাফ

ওহো! বোকা মন্তব্যের সময় মুছুন ...
কেন ওয়াইএন

উত্তর:


12

পাইথন 2, 92 87 বাইট

a=lambda n:n<2or sum((k%d<1)*d*a(d)*a(n-k)for k in range(1,n)for d in range(1,1+k))/~-n

সরল ইংরাজীতে: গণনা করার জন্য a(n)আমরা প্রতিটি ধনাত্মক পূর্ণসংখ্যার d*a(d)*a(n-k)প্রতিটি বিভাজকের dজন্য kছোট বা সমান n, এর সমষ্টি, এবং বিভাজক হিসাবে গণনা করি n-1

এটা দ্রুত রান (প্রতিস্থাপন পাইথন 3 রান করা /সঙ্গে //উপরের ফাংশন) ও memoize:

import functools
a = functools.lru_cache(None)(a)

আপনি যদি এটি করেন তা a(50) = 425976989835141038353তাত্ক্ষণিকভাবে গণনা করে।


বাহ, এটা দুর্দান্ত। আমি ধরে নিই যে lru_cache()ফাংশনটি মেমোয়েজ করে?
প্যাট্রিক রবার্টস

@ পেট্রিকরোবার্টস হ্যাঁ, সাধারণত এটি একটি ফাংশন ডেকোরেটর হিসাবে ব্যবহৃত হয়, তবে আপনি এটি কোনও ফাংশনে ম্যানুয়ালি প্রয়োগ করতে পারেন।
orlp

@ পেট্রিকরোবার্টস এখানে ডক্স রয়েছেlru_cache
প্রধানমন্ত্রী 2 রিং

এই ফাংশনটি ফেরৎ Trueজন্য n<2। আমি অনুমান করি যে এটি ঠিক আছে n=1, যেহেতু পাইথন Trueসংখ্যার পরিপ্রেক্ষিতে 1 থেকে 1 পর্যালোচনা করে তবে a(0)ফিরে আসা উচিত 0 আপনি এটির সাথে এটি ঠিক n<2 and n or sum...করতে পারেন তবে আরও কমপ্যাক্ট উপায় থাকতে পারে।
প্রধানমন্ত্রী 2 রিং

আমার ধারণা, একটি যুক্তি তৈরি করা যেতে পারে যে শূন্য বুদ্বুদগুলি সাজানোর একটি উপায় আছে তবে এটি A000081 এর সাথে সামঞ্জস্যপূর্ণ নয়। OTOH, যদি আমাদের কেবলমাত্র ইতিবাচক সমাধানের প্রয়োজন হয় nতবে আমরা এই কোণার কেসটিকে নিরাপদে উপেক্ষা করতে পারি, যেহেতু এটি উচ্চতরগুলির জন্য পুনরাবৃত্ত কলগুলিকে প্রভাবিত করে না n
প্রধানমন্ত্রী 2 রিং

10

জিএনইউ প্রোলগ, 98 বাইট

b(x,0,x).
b(T/H,N,H):-N#=A+B+1,b(H,A,_),b(T,B,J),H@>=J.
c(X,Y):-findall(A,b(A,X,_),L),length(L,Y).

এই উত্তরটি কীভাবে এমনকি সহজ আই / ও ফর্ম্যাটগুলির সাথে লড়াই করতে পারে তার একটি দুর্দান্ত উদাহরণ। এটি সমস্যার সমাধানের জন্য অ্যালগরিদমের পরিবর্তে সমস্যা বর্ণনা করার মাধ্যমে সত্য প্রোলোগ স্টাইলে কাজ করে: এটি আইনগত বুদ্বুদ বিন্যাস হিসাবে গণ্য তা নির্দিষ্ট করে, প্রোলোগকে সমস্ত বুদ্বুদ বিন্যাস উত্পন্ন করতে বলে এবং তারপরে সেগুলি গণনা করে। প্রজন্ম 55 টি অক্ষর নেয় (প্রোগ্রামের প্রথম দুটি লাইন)। গণনা এবং I / O অন্যান্য 43 টি (তৃতীয় লাইন এবং নতুন লাইন যা দুটি অংশকে পৃথক করে) নেয়। আমি বাজি দিয়েছি যে এটি কোনও সমস্যা নয় যেটি ওপি ভাষাগুলি I / O এর সাথে লড়াইয়ের কারণ হিসাবে প্রত্যাশা করেছিল! (দ্রষ্টব্য: স্ট্যাক এক্সচেঞ্জের সিনট্যাক্স হাইলাইটিং এটিকে পড়া সহজ করে তোলে, সহজ নয়, তাই আমি এটি বন্ধ করে দিয়েছি)।

ব্যাখ্যা

আসুন একটি একই প্রোগ্রামের সিউডোকোড সংস্করণ দিয়ে শুরু করি যা আসলে কাজ করে না:

b(Bubbles,Count) if map(b,Bubbles,BubbleCounts)
                and sum(BubbleCounts,InteriorCount)
                and Count is InteriorCount + 1
                and is_sorted(Bubbles).
c(Count,NPossibilities) if listof(Bubbles,b(Bubbles,Count),List)
                       and length(List,NPossibilities).

এটি কীভাবে bকাজ করে তা মোটামুটি পরিষ্কার হওয়া উচিত : আমরা বাছাই করা তালিকার মাধ্যমে বুদবুদগুলি উপস্থাপন করছি (যেগুলি মাল্টিসেটগুলির একটি সাধারণ বাস্তবায়ন যা সমান মাল্টিসেটগুলির সাথে সমান তুলনা করে) এবং একটি একক বুদবুদের []একটি গণনা হয় 1 এর সাথে একটি বৃহত বুদ্বুদ রয়েছে প্লাস 1 এর ভিতরে বুদবুদগুলির মোট গণনার সমান 4 টি গণনার জন্য এই প্রোগ্রামটি (যদি এটি কাজ করে) নীচের তালিকা তৈরি করে:

[[],[],[],[]]
[[],[],[[]]]
[[],[[],[]]]
[[],[[[]]]]
[[[]],[[]]]
[[[],[],[]]]
[[[],[[]]]]
[[[[],[]]]]
[[[[[]]]]]

এই প্রোগ্রামটি বেশ কয়েকটি কারণে উত্তর হিসাবে অনুপযুক্ত, তবে সবচেয়ে চাপের বিষয়টি হ'ল প্রোলোগের আসলে কোনও প্রিকারেট নেই map(এবং এটি লেখার ক্ষেত্রে অনেক বেশি বাইট লাগবে)। সুতরাং পরিবর্তে, আমরা প্রোগ্রামটি আরও এভাবে লিখি:

b([], 0).
b([Head|Tail],Count) if b(Head,HeadCount)
                    and b(Tail,TailCount)
                    and Count is HeadCount + TailCount + 1
                    and is_sorted([Head|Tail]).
c(Count,NPossibilities) if listof(Bubbles,b(Bubbles,Count),List)
                       and length(List,NPossibilities).

এখানে অন্য প্রধান সমস্যাটি হ'ল প্রোলোগের মূল্যায়ন আদেশ যেভাবে কাজ করে তা চালানোর সময় এটি চালানোর সময় একটি অসীম লুপের মধ্যে চলে যাবে। তবে আমরা প্রোগ্রামটি সামান্য পুনরায় সাজিয়ে অসীম লুপটি সমাধান করতে পারি:

b([], 0).
b([Head|Tail],Count) if Count #= HeadCount + TailCount + 1
                    and b(Head,HeadCount)
                    and b(Tail,TailCount)
                    and is_sorted([Head|Tail]).
c(Count,NPossibilities) if listof(Bubbles,b(Bubbles,Count),List)
                       and length(List,NPossibilities).

এই মোটামুটি অদ্ভুত চেহারা পারে - আমরা একসাথে গন্য যোগ করছি আগে আমরা কি তারা জানেন - কিন্তু গনুহ Prolog এর #=noncausal গাণিতিক যে সাজানোর হ্যান্ডলিং করতে সক্ষম, এবং কারণ এটি প্রথম লাইন b, এবং HeadCountএবং TailCountঅবশ্যই উভয় চেয়ে কম হতে Count(যা পরিচিত), এটি প্রাকৃতিকভাবে পুনরাবৃত্তির পদটি কতবার মেলতে পারে তা সীমাবদ্ধ করার একটি পদ্ধতি হিসাবে কাজ করে এবং ফলস্বরূপ প্রোগ্রামটি সর্বদা শেষ করে দেয়।

পরবর্তী পদক্ষেপটি কিছুটা নিচে গল্ফ করা। হোয়াইটস্পেস সরিয়ে, একক-অক্ষর ভেরিয়েবল নাম ব্যবহার করে, এর :-জন্য ifএবং এর ,জন্য সংক্ষিপ্তসারগুলি andব্যবহার setofনা করে listof(এর সংক্ষিপ্ত নাম রয়েছে এবং এক্ষেত্রে একই ফলাফল প্রকাশ করে) এবং এর sort0(X,X)পরিবর্তে ব্যবহার করে is_sorted(X)(কারণ is_sortedবাস্তবে আসল ফাংশন নয়, আমি এটি তৈরি করেছি):

b([],0).
b([H|T],N):-N#=A+B+1,b(H,A),b(T,B),sort0([H|T],[H|T]).
c(X,Y):-setof(A,b(A,X),L),length(L,Y).

এটি মোটামুটি সংক্ষিপ্ত, তবে আরও ভাল করা সম্ভব। মূল অন্তর্দৃষ্টিটি হ'ল [H|T]তালিকার সিনট্যাক্সগুলি যেতেই সত্যই ভার্জোজ ose যেমন লিস্প প্রোগ্রামাররা জানতে পারবেন, একটি তালিকা মূলত স্রেফ কনস সেলগুলি দিয়ে তৈরি, যা মূলত কেবলমাত্র টিপলস, এবং এই প্রোগ্রামের কোনও অংশই তালিকা বিল্টিন ব্যবহার করছে না। প্রোলোগের বেশ কয়েকটি সংক্ষিপ্ত টুপল সিনট্যাক্স রয়েছে (আমার প্রিয়টি A-Bতবে আমার দ্বিতীয় প্রিয়টি A/B, যা আমি এখানে ব্যবহার করছি কারণ এটি এক্ষেত্রে সহজেই পঠন-পাঠযোগ্য ডিবাগ আউটপুট তৈরি করে); এবং আমরা nilদ্বি-চরিত্রের সাথে আটকে থাকার পরিবর্তে তালিকার শেষের জন্য আমাদের নিজস্ব একক-চরিত্রটিও []বেছে নিতে পারি (আমি বেছে নিয়েছি x, তবে মূলত কিছুতেই কাজ করে না)। এর পরিবর্তে [H|T], আমরা ব্যবহার করতে পারি T/Hএবং এর থেকে আউটপুট পেতে পারিb এটি দেখতে এইরকম দেখাচ্ছে (নোট করুন যে টিপলসগুলিতে বাছাই ক্রমের তালিকাগুলির তুলনায় কিছুটা আলাদা, সুতরাং এগুলি উপরের মতো একই ক্রমে নয়):

x/x/x/x/x
x/x/x/(x/x)
x/(x/x)/(x/x)
x/x/(x/x/x)
x/(x/x/x/x)
x/x/(x/(x/x))
x/(x/x/(x/x))
x/(x/(x/x/x))
x/(x/(x/(x/x)))

উপরের নেস্টেড তালিকার চেয়ে এটি পড়া আরও শক্ত, তবে এটি সম্ভব; মানসিকভাবে এসগুলি এড়িয়ে যান এবং একটি বুদ্বুদ হিসাবে xব্যাখ্যা করুন /()(বা /কোনও বিষয়বস্তু সহ একটি অবনমিত বুদ্বুদ হিসাবে কেবল প্লেইন , যদি এর ()পরে কিছুই না থাকে), এবং উপাদানগুলির উপরে তালিকাভুক্ত সংস্করণটির সাথে 1-থেকে -1 (বিশৃঙ্খলা থাকলে) চিঠিপত্র রয়েছে ।

অবশ্যই, এই তালিকার উপস্থাপনা, অনেক খাটো হওয়া সত্ত্বেও, একটি বড় অপূর্ণতা রয়েছে; এটি ভাষার অন্তর্নির্মিত নয়, সুতরাং sort0আমাদের তালিকাটি বাছাই করা হয়েছে কিনা তা পরীক্ষা করে আমরা ব্যবহার করতে পারি না । sort0যাইহোক, মোটামুটি ভার্জোজ, যদিও এটি হাতে হাতে করা কোনও বিশাল ক্ষতি নয় (বাস্তবে, [H|T]তালিকার উপস্থাপনের মাধ্যমে হাত দ্বারা এটি করা ঠিক একই সংখ্যক বাইটে আসে)। এখানে মূল অন্তর্দৃষ্টিটি হ'ল প্রোগ্রামটি লিখিত চেক হিসাবে তালিকাটি বাছাই করা হয়েছে কিনা, এর লেজটি বাছাই করা হয়েছে কিনা, যদি তার লেজটি সাজানো হয়, ইত্যাদি see প্রচুর রিলান্ড্যান্ট চেক রয়েছে এবং আমরা এটি কাজে লাগাতে পারি। পরিবর্তে, আমরা কেবল প্রথম দুটি উপাদান ক্রমযুক্ত কিনা তা নিশ্চিত করে পরীক্ষা করব (যা নিশ্চিত করে যে তালিকাটি তালিকাটি নিজেই তালিকা অনুসারে বাছাই করা হবে এবং এর সমস্ত প্রত্যয় চেক হয়ে গেছে)।

প্রথম উপাদানটি সহজেই অ্যাক্সেসযোগ্য; এটাই কেবল তালিকার শীর্ষস্থানীয় H। দ্বিতীয় উপাদানটি অ্যাক্সেস করা বরং আরও শক্ত, যদিও এটি বিদ্যমান নেই। ভাগ্যক্রমে, xআমরা যে সমস্ত টিপলগুলি বিবেচনা করছি তার চেয়ে কম (প্রোলোগের জেনারেলাইজড তুলনা অপারেটরের মাধ্যমে @>=), তাই আমরা একক তালিকার "দ্বিতীয় উপাদান "টিকে বিবেচনা করতে পারি xএবং প্রোগ্রামটি ঠিকঠাক কাজ করবে work প্রকৃতপক্ষে দ্বিতীয় উপাদানটি অ্যাক্সেস করার ক্ষেত্রে, সবচেয়ে ক্ষুদ্রতর পদ্ধতিটি একটি তৃতীয় যুক্তি (একটি আউট আর্গুমেন্ট) যুক্ত করা হয় b, যা xবেস কেসে এবং Hপুনরাবৃত্তির ক্ষেত্রে ফিরে আসে; এর অর্থ হ'ল আমরা দ্বিতীয় পুনরাবৃত্ত কল থেকে আউটপুট হিসাবে লেজের মাথাটি ধরতে পারি B, এবং অবশ্যই লেজের মাথাটি তালিকার দ্বিতীয় উপাদান। এখন bএটির মতো দেখাচ্ছে:

b(x,0,x).
b(T/H,N,H):-N#=A+B+1,b(H,A,_),b(T,B,J),H@>=J.

বেস কেসটি যথেষ্ট সহজ (খালি তালিকা, 0 এর একটি গণনা ফেরান, খালি তালিকার "প্রথম উপাদান" হ'ল x)। Recursive ক্ষেত্রে আগের মতই পথ শুরু হয় (ঠিক সঙ্গে T/Hস্বরলিপি বদলে [H|T], এবং Hযুক্তি আউট একটি অতিরিক্ত হিসাবে); আমরা মাথার रिकर्सিভ কল থেকে অতিরিক্ত যুক্তি উপেক্ষা করি, তবে এটি Jপুচ্ছের পুনরাবৃত্ত কলটিতে সঞ্চয় করি । তারপর আমরা যা করতে হবে তা নিশ্চিত করা হয় Hতার চেয়ে অনেক বেশী বা সমান Jঅনুক্রমে (যেমন "যদি তালিকা অন্তত দুটি উপাদান আছে, প্রথম চেয়ে মহান বা দ্বিতীয় সমান) তা নিশ্চিত করার জন্য তালিকা প্রান্ত পর্যন্ত সাজানো।

দুর্ভাগ্যক্রমে, setofযদি আমরা cএই নতুন সংজ্ঞাটির সাথে পূর্ববর্তী সংজ্ঞাটি একসাথে ব্যবহার করার চেষ্টা করি তবে bএটি কোনও এসকিউএল হিসাবে অব্যবহৃত পরামিতিগুলিকে আরও কম-বেশি একইভাবে আচরণ করে GROUP BY, যা আমরা যা চাই তা সম্পূর্ণ নয়। আমরা যা চাই তা করার জন্য এটি পুনরায় কনফিগার করা সম্ভব, তবে সেই পুনর্গঠনটির জন্য অক্ষরগুলির ব্যয় হয়। পরিবর্তে, আমরা ব্যবহার করি findall, যার একটি আরও সুবিধাজনক ডিফল্ট আচরণ রয়েছে এবং এটি কেবলমাত্র দুটি অক্ষর দীর্ঘ, আমাদের এই সংজ্ঞাটি প্রদান করে c:

c(X,Y):-findall(A,b(A,X,_),L),length(L,Y).

এবং এটি সম্পূর্ণ প্রোগ্রাম; অবিচ্ছিন্নভাবে বুদ্বুদ নিদর্শন উত্পন্ন করে, তারপরে গণনা করে পুরো লোড ব্যয় করুন ( findallজেনারেটরকে একটি তালিকায় রূপান্তর করার জন্য আমাদের একটি দীর্ঘ দীর্ঘ সময় প্রয়োজন , তারপরে দুর্ভাগ্যক্রমে lengthসেই তালিকার দৈর্ঘ্য যাচাই করার জন্য অক্ষরে অক্ষরে নামকরণ , একটি ফাংশন ঘোষণার জন্য বয়লারপ্লেট)।


"Prolog আসলে একটি মানচিত্র সম্পৃক্ত নেই" : Prolog আছে maplist/2-8সম্পৃক্ত যদিও আমি নিশ্চিত নই এই ইচ্ছার জিনিষ এখানে খাটো নির্মিত হয়।
13:38

@ ফ্যাটালাইজ: হুঁ, দেখতে এটি নতুন সংস্করণে যুক্ত হয়েছিল। এটি আমার কাছে থাকা | ?- maplist(reverse,[A,B]). uncaught exception: error(existence_error(procedure,maplist/2),top_level/0)

সত্যিই অদ্ভুত; maplistপ্রধান প্রলোগ বিতরণগুলিতে (এসডাব্লুআই-প্রোলগ এবং সিসিসটাসের মতো) সরবরাহ করা একটি খুব সাধারণভাবে ব্যবহৃত শিকারী
13:40

10

গণিত, 68 বাইট

আমি বাজি ধরতে পারি যে এটিকে (এমনকি ম্যাথমেটিকাতেও) কোনও স্ক্র্যাচ বাস্তবায়ন দিয়ে মারতে পারে তবে বিল্টিন সংস্করণটি এখানে:

<<NumericalDifferentialEquationAnalysis`
Last@ButcherTreeCount[#+1]&

ButcherTreeCount0-সূচীবদ্ধ করা হয়, অত [#+1], এবং তার যুক্তি সব মান একটি তালিকা আপ ফেরৎ, অত Last@। তবে অন্যথায় এটি এই ফাংশনের জন্য অন্তর্নির্মিত। যাইহোক, এটির জন্য একটি প্যাকেজ লোড করা প্রয়োজন, যা প্রথম লাইনটি তাই করে।


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