বিশৃঙ্খলার ড্রপ (একটি ন্যূনতম এপিওরিওডিক সিকোয়েন্স নির্মাণ করা)


9

এখানে ধারণাটি প্রায় পুনরাবৃত্তি প্যাটার্ন উত্পাদন করতে হয় । এটি হ'ল, কয়েকটি অনুক্রমের পুনরাবৃত্তি এড়াতে শেষ মুহুর্তে নির্মিত অনুক্রমটি পরিবর্তন হয় changes AA এবং ABA প্রকারের সাবসকেন্সগুলি এড়ানো হবে (যেখানে B আর এ এর ​​চেয়ে বেশি নেই)।

উদাহরণ:

আমি আমার বিবরণটি আরও পরিষ্কার করার জন্য ছোট ছোট সমস্ত উদাহরণের তালিকা দিয়ে শুরু করব। 0 দিয়ে শুরু করা যাক।

বৈধ: 0

অবৈধ: 00 (এএ প্যাটার্ন)
বৈধ: 01

অবৈধ: 010 (এবিএ প্যাটার্ন)
অবৈধ: 011 (এএ প্যাটার্ন)
বৈধ: 012

বৈধ: 0120
অবৈধ: 0121 (এবিএ প্যাটার্ন)
অবৈধ: 0122 (এএ প্যাটার্ন)

অবৈধ: 01200 (এএ প্যাটার্ন)
অবৈধ: 01201 (এবিএ প্যাটার্ন; 01-2-01)
অবৈধ: 01202 (এবিএ প্যাটার্ন)
বৈধ: 01203

এখন, আমি দৃ strongly়ভাবে বিশ্বাস করি যে এর 4কখনই প্রয়োজন হয় না, যদিও আমার কাছে প্রমাণ নেই, কারণ আমি সহজেই ব্যবহার করি এমন কয়েকশ অক্ষরের সিকোয়েন্সগুলি সহজেই পেয়েছি 0123। (এটি সম্ভবত একেবারে ঘনিষ্ঠভাবে জড়িত যে কীভাবে কেবল তিনটি অক্ষরের অসীম স্ট্রিং থাকতে হয় যার কোনও এএ প্যাটার্ন থাকে না। এটিতে উইকিপিডিয়া পৃষ্ঠা রয়েছে।)

ইনপুট আউটপুট

ইনপুটটি একটি একক, ধনাত্মক, অ-শূন্য পূর্ণ পূর্ণসংখ্যার n। আপনি এটা ধরে নিতে পারেন n <= 1000

আউটপুট হ'ল nনিষিদ্ধ প্যাটার্ন (এএ বা এবিএ) এর সাথে মেলে এমন কোনও উপসর্গের সাথে একটি চক্রের অনুক্রম।

নমুনা ইনপুট এবং আউটপুট

>>> ঘ
0

>>> 2
01

>>> 3
012

>>> 4
0120

>>> 5
01203

>>> 50
01203102130123103201302103120132102301203102132012

বিধি

  • কেবল অক্ষরই 0123অনুমোদিত।
  • বি আর নেই চেয়ে উ: এই পরিস্থিতি যেখানে এড়াতে হয় 012345দ্বারা অনুসরণ করা হয়েছে 6কারণ 0123451এই আছে: 1-2345-1। অন্য কথায়, ক্রমটি তুচ্ছ এবং উদ্বেগজনক হবে।
  • nহার্ড কোডিং ব্যতীত কাঙ্ক্ষিত যে কোনও পদ্ধতিতে ইনপুট করা যেতে পারে ।
  • আউটপুট হয় তালিকা বা স্ট্রিং হতে পারে, যার উপর নির্ভর করে সহজ।
  • নিষ্ঠুর শক্তি নেই ; রান সময়টি মিনিটের ক্রমে হওয়া উচিত, বেশিরভাগ এক ঘন্টার জন্য সত্যিকারের ধীর মেশিনে n=1000। (এটি এমন সমাধানগুলিকে অযোগ্য ঘোষণা করার উদ্দেশ্যে যা কেবলমাত্র সর্ব- nদৈর্ঘ্যের অনুমতিগুলি লুপ করে {0,1,2,3}, যাতে কৌশল এবং অনুরূপ কৌশলগুলি অনুমোদিত নয়))
  • স্ট্যান্ডার্ড লুফোলগুলি যথারীতি অনুমোদিত নয়।
  • স্কোরিং বাইটে রয়েছে। এই, সুতরাং স্বল্পতম এন্ট্রি জিতবে (সম্ভবত - বোনাস দেখুন)।
  • বোনাস: প্রতিটি পদক্ষেপে সর্বনিম্ন অনুমোদিত অঙ্ক বেছে নিন। যদি 1এবং 3এই অনুক্রমের পরবর্তী অঙ্কের জন্য সম্ভব পছন্দ হয়, চয়ন করুন 1। আপনার স্কোর থেকে 5 বাইট বিয়োগ করুন । তবে নীচের নোটটি নোট করুন।

বিঃদ্রঃ!

মৃত প্রান্তগুলি সম্ভব। আপনার প্রোগ্রাম বা ফাংশন এগুলি এড়াতে হবে। এখানে একটি উদাহরণ:

স্টাম্প: 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310213012030302020103030
স্টাম্প: 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231030302020303020
স্টাম্প: 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231030302020103030
স্টাম্প: 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310130302020303020

এই ক্রমগুলির প্রত্যেকটি আর বাড়ানো যাবে না (একটি ব্যবহার না করে 4)। তবে এটিও লক্ষ করুন যে প্রথম দুটি এবং দ্বিতীয় দুটির মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে। Xএই পরিষ্কার করার জন্য আমি ভাগ করে নেওয়া প্রাথমিক অনুচ্ছেদটি প্রতিস্থাপন করব ।

স্টাম্প: X2130120
স্টাম্প: X2130123
স্টাম্প: এক্স 320
স্টাম্প: X321301203102130

শেষ দুটি সংখ্যা Xহয় 10, তাই পরবর্তী অঙ্ক কেবল সম্ভব পছন্দ 2এবং 3। নির্বাচন 2করা এমন পরিস্থিতির দিকে নিয়ে যায় যেখানে ক্রমটি শেষ হতে হবে। লোভী অ্যালগরিদম এখানে কাজ করবে না(যাইহোক, ব্যাকট্র্যাকিং ছাড়াই নয়))


বাস্তবিক সময়ে কোনও আউটপুট দেবে না, এমন কি প্রতিটি সম্ভাব্য স্ট্রিং পরীক্ষার একটি নিষ্ঠুর শক্তি কৌশল ব্যবহার করতে পারে? আপনি কি জানেন যে এখানে সবার জন্য একটি সমাধান হতে পারে n? যদি কেউ একটি অর্থে-লোভী অ্যালগরিদম দেয়, তবে আপনি কীভাবে পরীক্ষা করবেন যে এটি খুব দীর্ঘ দৈর্ঘ্যের জন্য সমস্যার মধ্যে পড়ে না? সাধারণ সমস্যাটি একটি আকর্ষণীয় সমস্যা এবং আমি যেখানে প্যাটার্নের অংশের দৈর্ঘ্যকে সীমাবদ্ধ করি সেখানে প্যাটার্ন পরিহারের বিষয়ে আমি কিছুই খুঁজে পাচ্ছি না। যদি কেউ একটি সাধারণ রেসিপি উত্পাদন করতে পারে তবে আমি আশা করি এটি সর্বোত্তম পন্থা হবে।
xnor

আমি বিশ্বাস করি যে আমি নিয়মগুলিতে নিষ্ঠুর বলাকে অস্বীকার করি। আমার সম্ভবত এটি হাইলাইট করা উচিত। আমার কাছে এমন কোনও প্রমাণ নেই যা সবার জন্য একটি সমাধান রয়েছে n, তবে আমার প্রোগ্রামটি যে স্টাম্পগুলি খুঁজে পেয়েছে তাতে প্রতিবার গড়ে 10 অঙ্ক করে দীর্ঘতর হওয়ার ঝোঁক রয়েছে বলে আমি নিশ্চিত যে একটি অসীম অনুক্রম বিদ্যমান। আমি নিশ্চিত না যে কীভাবে একটি অর্ধ-লোভী অ্যালগরিদম নির্বিচারে বৃহত ক্রমগুলির জন্য পরীক্ষা করা যেতে পারে। আমি সীমিত পারে প্রয়োজন থেকে n= 1000 এবং প্রায় উচ্চতর চিন্তা না n
এল'েন্ডিয়া স্টারম্যান

4
আমি মনে করি AAসত্যই টাইপ ABAযেখানে Bখালি আছে। এটি সম্ভবত কিছু সমাধান প্রবাহিত করতে সহায়তা করতে পারে।
mathmandan

উত্তর:


6

রেটিনা , 86 বাইট - 5 = 81

$
_
(r`^(?<-2>.)+_((.)+)\b$
$1!
\b$
0
3#
#
0#
1
1#
2
2#
3
)r`\1(?<-2>.)*((.)+)$
$0#
!
<empty>

যেখানে <empty>একটি খালি ট্রেলিং লাইন উপস্থাপন করে। আপনি -sপতাকা সহ একটি ফাইল থেকে উপরের কোডটি চালাতে পারেন ।

ইনপুটটি আনারিতে দেওয়া উচিত , যেমন 111111। আমি হাজারের ক্রমতে এখনও আউটপুট জন্য এটি পরীক্ষা করে দেখিনি - দুটি রেইজেক্স কিছু সময়ের পরে কিছুটা ধীর হতে পারে - তবে এটি কয়েক সেকেন্ডের মধ্যে কয়েক শতাধিক সহজেই পরিচালনা করতে পারে।

ব্যাখ্যা

এটি একটি সাধারণ ব্যাকট্র্যাকিং সমাধান।

  1. সংযোজন ক 0
  2. বর্তমান সিকোয়েন্সটি অবৈধ থাকাকালীন, সমস্ত অনুসরণকারী 3s সরান এবং শেষটি অ-বৃদ্ধি করুন 3
  3. আমাদের পছন্দসই দৈর্ঘ্যের একটি বৈধ ক্রম না হওয়া পর্যন্ত পুনরাবৃত্তি করুন।

এই ব্যাকট্র্যাকিংটি রেগেক্স বিকল্পগুলির একটি লুপ দ্বারা প্রয়োগ করা হয় যা একবারে পুনরাবৃত্তির মাধ্যমে স্ট্রিং অপরিবর্তিত থাকার পরে বন্ধ হয়ে যায় ab

$
_

এটি ইনপুটটিতে একটি সংযোজন করে _, যা আমরা তৈরির ক্রম থেকে আনারি ইনপুট পৃথক করতে ব্যবহৃত হয়।

(r`^(?<-2>.)+_((.)+)\b$
$1!

এটি লুপের প্রথম প্রতিস্থাপন (শীর্ষস্থানীয় দ্বারা নির্দেশিত ()। রেজেক্সটি মেলে যদি ক) স্ট্রিংয়ের শেষে কোনও শব্দের অক্ষর (অর্থাত্ একটি অঙ্ক) থাকে (যার অর্থ স্ট্রিংটি বৈধ - আমরা নীচে দেখতে পাব যে অবৈধ অনুক্রমগুলি নীচে একটি চিহ্নযুক্ত #) এবং খ) কমপক্ষে রয়েছে ইনপুট হিসাবে ক্রম হিসাবে অনেক অক্ষর (এটি ভারসাম্য গ্রুপ ব্যবহার করে পরীক্ষা করা হয় )। যদি এটি হয় তবে আমরা ইনপুটটি সরিয়ে ফেলি এবং এ !। এটি !লুপের সমস্ত regexes ব্যর্থ করে তোলে, যেমন এটি সমাপ্ত হয়।

\b$
0

যদি শেষে কোনও শব্দের চরিত্র থাকে (যেমন ক্রমটি বৈধ, এবং লুপটি পূর্ববর্তী পদক্ষেপে শেষ করা হয়নি), সংযোজন ক 0

3#
#

যদি (পরিবর্তে) অনুক্রমটি অবৈধ হিসাবে চিহ্নিত হয়ে শেষ হয়ে গিয়েছিল 3, তবে আমরা তা সরিয়ে দিই 3(তবে অনুক্রমটিকে অবৈধ হিসাবে রেখে চলেছি, কারণ বর্তমান উপসর্গের জন্য কোনও সম্ভাব্য ধারাবাহিকতা নেই ... সুতরাং পরবর্তী চরিত্রটিও ব্যাকট্র্যাক করা দরকার)।

0#
1
1#
2
2#
3

যদি ক্রমটি অবৈধ হিসাবে চিহ্নিত হয় এবং অন্য কোনও অঙ্ক 3শেষে থাকে, আমরা অঙ্কটি বৃদ্ধি করি এবং চিহ্নিতকারীকে সরিয়ে ফেলি।

)r`\1(?<-2>.)*((.)+)$
$0#

লুপের সর্বশেষ প্রতিস্থাপন (যেমন নির্দেশিত ))। এটি স্ট্রিংটি শেষ হয় কিনা তা পরীক্ষা করে ABA(যেখানে এর Bচেয়ে বেশি দীর্ঘ নয় Aতবে সম্ভাব্য খালি)। এর তুলনামূলক দৈর্ঘ্য Aএবং Bআবার ভারসাম্য গোষ্ঠীগুলি ব্যবহার করে চেক করা হয় এবং এর পুনরাবৃত্তিটি Aএকটি সাধারণ ব্যাকরফারেন্স দিয়ে চেক করা হয়।

যদি এই রেজেক্সের সাথে মেলে, তবে আমরা ক্রমটি সংযোজন দ্বারা অবৈধ চিহ্নিত করব #

!
<empty>

লুপটি শেষ হয়ে গেলে, আমাদের যা করতে হবে তা হ'ল সরানো !এবং তারপরে কাঙ্ক্ষিত আউটপুটটি রেখে দেওয়া হবে।


2

পাইথন 2, 175 - 5 = 170 বাইট

n=input();s='';u=j=-1
while n>len(s):
 while u>2:u=int(s[0]);s=s[1:]
 u+=1;t=`u`+s;m=c=0
 while t[c:]*0**m:c+=1;i=t[c:].find(t[:c]);m=j<i<=c
 if c>=len(t):s=t;u=j
print s[::j]

এটি ব্যাকট্র্যাকিংয়ের সাথে লোভী অ্যালগরিদম। আমি চাই এটা কম ছিল। আমি আশা করি এটি সঠিক (নীচে দেখুন)।

এটি একবারে স্ট্রিংকে একটি ডিজিট তৈরি করে। dএটি ইতিমধ্যে খুঁজে পেয়েছে এমন একটি অঙ্কের স্ট্রিং দেওয়া , এটি একটি st সংখ্যা 0হিসাবে যুক্ত করার চেষ্টা করে (d+1)। যদি এটি কাজ না করে, তবে এটি একটি 1, তারপরে ক 2, তারপর ক চেষ্টা করে 3। যদি এর কোনওটিই কাজ না করে তবে এটি তৃতীয় অঙ্কে ফিরে যায় dএবং এটিকে বৃদ্ধি করে (যদি কম হয় 3) বা সরিয়ে দেয় (সমান হলে 3, এটি আগেরটির ক্ষেত্রে বৃদ্ধি করে ইত্যাদি etc.)।

বৈধতার জন্য চেক .findএটির সাথে লাইন line যদি কেউ আমার কোডটি পড়ার সিদ্ধান্ত নেয়, আমার বলা উচিত যে এই প্রোগ্রামটি আসলে স্ট্রিংটি পিছনের দিকে সংরক্ষণ করছে যার অর্থ এটি সামনে অঙ্কগুলি যুক্ত করছে । সুতরাং চেকটিতে সেই জায়গাগুলি সন্ধান করা জড়িত যেখানে প্রথম c অঙ্কগুলি পরে আবার স্ট্রিংয়ে প্রদর্শিত হবে (প্রথম cঅঙ্কগুলির পরে যে কোনও জায়গা ), এবং যদি এমন কোনও স্থান থাকে তবে মধ্যবর্তী দৈর্ঘ্য সর্বাধিক কিনা c

(অবশ্যই এটি মুদ্রণের আগে স্ট্রিংটিকে বিপরীত করে দেয়))

এটি সহজেই দ্রুত হতে পারে; দক্ষতার জন্য প্রাথমিকভাবে এটি আমার প্রথম দিকে বিভিন্ন লুপ থেকে বেরিয়ে এসেছিল তবে মূল্য ব্যয়বহুল। এটি এখনও সীমার মধ্যে ঠিক আছে n=1000

যাইহোক, প্রোগ্রামটি ছোট সংখ্যার জন্য অগ্রাধিকার দেখায় বলে মনে হচ্ছে, তবে এটি খুব শক্তিশালী পছন্দ নয়। উদাহরণস্বরূপ, সঙ্গে এটি চলমান n=2000আমার সাথে একটি স্ট্রিং দিয়েছেন 523শূন্য, 502বেশী, 497দুই দুই এবং 478তিনে, শেষ হওয়া 30210312013021। সুতরাং অন্য কেউ যদি লোভী অ্যালগরিদম নিয়ে কাজ করে থাকে তবে তারা এই ফলাফলটি নিশ্চিত করতে পারে। অথবা সাথে n=1000আমি [263, 251, 248, 238]অঙ্ক অনুসারে গণনা করেছি।

অবশেষে, আমি যে এই সংখ্যা প্রায় প্রতিসাম্য ইঙ্গিতপূর্ণ সাজানোর হয় (যদিও ঠিক) হিসাবে যদি আমরা একটি অভিন্ন ডিস্ট্রিবিউশনের সাথে শুরু করেছে এবং তারপর কিছু রূপান্তরিত উল্লেখ করবে 3'র জন্য 0' s এবং কয়েক 2'র জন্য 1' গুলি। তবে স্পষ্টতই এটি কাকতালীয় হতে পারে। আমার কোন ধারণা নাই!


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