একটি অ্যারে প্রসারিত করুন


13

এর আগে আমি একটি অ্যারে ক্রাশ করার প্রক্রিয়াটি সংজ্ঞায়িত করেছি

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

উদাহরণস্বরূপ, এখানে নিম্নলিখিত অ্যারে ক্রাশ করার প্রক্রিয়াটি রয়েছে

[5,2,2,4]
 ^
[5,2,2,4]
   ^
[5,2,2,4]
     ^
[5,4,4]
   ^
[5,4,4]
     ^
[5,8]
   ^

নোট করুন যে একই উপাদানটি একাধিকবার ভেঙে যেতে পারে। উদাহরণস্বরূপ একটি একক পাস মধ্যে 2,2,4ধসে ছিল 8

এখন অ্যারেগুলিকে পিষ্ট করা সহজ, কী তাদের শক্তিশালী করছে। আপনার কাজটি হ'ল ধনাত্মক পূর্ণসংখ্যার একটি অ্যারে ইনপুট হিসাবে নেওয়া এবং বারবার ক্রাশ হওয়ার পরে ইনপুটটি তৈরি করতে পারে এমন বৃহত্তম অ্যারের আউটপুট। উদাহরণস্বরূপ অ্যারে [4]নিষ্পেষণ দ্বারা গঠিত হয় [2,2]যা ঘূর্ণন দ্বারা গঠিত হয় [1,1,1,1]। যেহেতু আমরা [1,1,1,1]সংখ্যাসূচক মানগুলি রাখতে পারি না, সেগুলি আর ছাড়ানো যায় না এবং তাই আমাদের উত্তর।

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

এটি তাই কম বাইট ভাল হওয়ার সাথে বাইটগুলিতে তাদের উত্সের আকারের সাথে উত্তরগুলি স্কোর করা হবে।

আপনি নিজের উত্তর দেওয়া শুরু করার আগে আমি কেবল বলতে চাই যে এই চ্যালেঞ্জটি মনে হয় তার চেয়ে উল্লেখযোগ্য পরিমাণে আরও কঠিন। আপনি যখন যাবেন তখন আপনার স্বজ্ঞাততা পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনার উত্তরটি সমস্ত পরীক্ষার ক্ষেত্রে পাস করেছে passes

পরীক্ষার কেস

[] -> []
[5] -> [5]
[6] -> [3,3]
[8] -> [1,1,1,1,1,1,1,1]
[4,8] -> [1,1,1,1,1,1,1,1,1,1,2]
[2,8] -> [1, 1, 1, 1, 2, 1, 1, 1, 1]
[4,4] -> [1,1,1,1,1,1,1,1]

1
দুঃখিত তবে আমি এখনও নিয়মটি বুঝতে পারি না। কেন পরিবর্তে [1,1,1,1,1,1,1,1,1,1,2]উত্পাদন ? এই হওয়া উচিত , , , , , , , , , ? [4, 8][8, 4][1,>1,1,1,1,1,1,1,1,1,2][2,1,>1,1,1,1,1,1,1,2][2,>2,1,1,1,1,1,1,2][4,1,>1,1,1,1,1,2][4,2,1,>1,1,1,2][4,2,>2,1,1,2][4,>4,1,1,2][8,1,>1,2][8,2,>2][8,4]
tsh

2
@ আমার মনে হয় ক্রাশিং যেভাবে কাজ করে তাতে আপনার একটি ভুল ধারণা রয়েছে। এখানে পাথ এটা প্রথম পাস লাগে: [1,>1,1,1,1,1,1,1,1,1,2], [2,>1,1,1,1,1,1,1,1,2], [2,1,>1,1,1,1,1,1,1,2], [2,2,>1,1,1,1,1,1,2], [2,2,1,>1,1,1,1,1,2], [2,2,2,>1,1,1,1,2], [2,2,2,1,>1,1,1,2], [2,2,2,2,>1,1,2], [2,2,2,2,1,>1,2], [2,2,2,2,2,>2], [2,2,2,2,4>], দ্বিতীয় পাস: [2,>2,2,2,4], [4,>2,2,4], [4,2,>2,4], [4,4,>4], [4,8>]। আশা করি এটি পরিষ্কার হয়ে যায়। আপনি যদি আগের কোডটিতে কিছু কোড দেখতে চান তবে এমন উত্তর রয়েছে যা একটি ক্রাশিং ফাংশন বাস্তবায়িত করে।
অ্যাডহক গার্ফ হান্টার

আমি আউটপুট সংখ্যাগুলি, প্রতিটি একটি নতুন লাইনের দ্বারা পৃথক করে রাখলে কী ঠিক আছে?
স্কটনেট

@ স্কটনেট এটি কোনও তালিকা আউটপুট করার যুক্তিসঙ্গত উপায়। এগিয়ে যান.
অ্যাডহক গার্ফ হান্টার

পরীক্ষার [4, 4][8]
কেসটি

উত্তর:


2

জাভাস্ক্রিপ্ট (নোড.জেএস) , 237 221 213 186 বাইট

f=a=>a.map(b=>{for(i=1;~b%2;b/=2)i*=2;return Array(i).fill(b)}).reduce((t,c,i,s)=>{b=c.slice();if(i)r=2*s[--i].length,b.length>=r&&b[0]==s[i][0]?b[r-2]+=b.pop():b;return t.concat(b)},[])

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

এই অ্যালগরিদম সর্বোত্তম প্রসারিত অ্যারেগুলি গণনা করে প্রতিটি সংখ্যা সর্বাধিক পর্যন্ত প্রসারিত করে এবং তারপরে, প্রয়োজনে এটি সঠিক জায়গায় একটি সংখ্যার পিছনে পিছনে চাপ দেয়, কার্যকরভাবে একটি "ক্রাশ ব্লকার" তৈরি করে, পূর্ববর্তী সংখ্যার ক্রাশ ক্রমকে বাধাগ্রস্ত করে।

এই ক্ষেত্রে:

[1, 1, 1, 1, 1, 1][4,2]একবার চূর্ণ, কিন্তু [1, 1, 1, 1, 2]ফলাফল দেয়[2, 4]

চ্যালেঞ্জ হ'ল ঠিক কোথায় ক্রাশ ব্লকার স্থাপন করা উচিত তা নির্ধারণ করা যাতে ফলস্বরূপ অ্যারে ক্রাশিং সঠিক ফলাফল দেয়:

  • পূর্বের প্রসারিত সংখ্যাটি বর্তমান সংখ্যার সমান হলে এবং বর্তমান প্রসারিত ক্রমটি পূর্বেরটির চেয়ে আরও বড় হলে কোনও ক্রাশ ব্লকার স্থাপন করতে হবে। উদাহরণস্বরূপ, [2, 4]একটি ক্রাশ ব্লকার প্রয়োজন (প্রসারিত সংখ্যাটি 1পুনরাবৃত্তি হয়, এবং এর [1, 1]চেয়ে কম হয় [1,1,1,1]), [4, 2]এবং এটির প্রয়োজন হয় [2, 6]না
  • যদি আমরা nপূর্বের প্রসারিত অনুক্রমটিকে কল করি এবং যদি উপরের শর্তটি যাচাই করা হয়, তবে বর্তমান ক্রমটি ক্রমটির পুনরাবৃত্তি n। পূর্ববর্তী সংখ্যার ক্রাশ ক্রম বাধাগ্রস্ত করতে, আমাদের nবর্তমান সংখ্যার দ্বিতীয় ক্রমের প্রসারিত করতে ক্রাশ ব্লকার স্থাপন করতে হবে । উদাহরণ:, [2, 8] => [(1, 1)=n, (1, 1) + (2) + (1, 1) + ...]বা[4, 8] => [(1, 1, 1, 1)=n, (1, 1, 1, 1) + (1, 1, 2) + ...]


1

পাইথন 2 , 230 228 226 বাইট

সমস্ত সম্ভাব্য তালিকাগুলি পুনরুক্ত করে ইনপুট হিসাবে একই সমষ্টি দিয়ে কাজ করে। দীর্ঘায়িত একটিকে নির্বাচিত করে কোনও কোনও ক্রাশ অবস্থায় ইনপুট অ্যারের সমান নয় এমনগুলি সরানো।

সম্পাদনা করুন: -2 বাইটগুলি ifমুখ্য ফাংশনটিতে সরিয়ে দিয়ে

সম্পাদনা করুন: দুটি অপ্রয়োজনীয় স্কোয়ার বন্ধনী অপসারণ করে -2 বাইট

lambda x:max((c(z[:],x),len(z),z)for z in b(sum(x)))[2]
def c(x,y):
 i=e=1
 while x[i:]:
	if x[~-i]==x[i]:del x[i];i-=1;x[i]*=2;e=2
	i+=1
 return x==y or~-e and c(x,y)
b=lambda s:[z+[-~i]for i in range(s)for z in b(s+~i)]+[[]]

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

ব্যাখ্যা

মূল ফাংশন, সমস্ত সম্ভাব্য সমাধানগুলি সন্ধান করার জন্য এবং দীর্ঘতমটি নির্বাচন করার জন্য দায়ী

lambda x:max((c(z[:],x),len(z),z)for z in b(sum(x)))[2]

ক্রাশ ফাংশন, এটি ক্রাশগুলির মধ্যে একের সমান কিনা তা পরীক্ষা করে।

def c(x,y):
 i=e=1
 while x[i:]:
	if x[~-i]==x[i]:del x[i];i-=1;x[i]*=2;e=2
	i+=1
 return x==y or~-e and c(x,y)

প্রদত্ত অঙ্কের সাথে সমস্ত সম্ভাব্য ক্রম নির্ধারণ করুন

b=lambda s:[z+[-~i]for i in range(s)for z in b(s+~i)]+[[]]

0

05AB1E , 41 37 বাইট tes

vy[DÉ#2÷]DYQX©NoDU‹&sDV¸X∍sić·®·Íǝ}»,

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

আমার জাভাস্ক্রিপ্ট সমাধান বন্দরের।

ব্যাখ্যা:

vy                   for each member of the list
[DÉ#2÷]              divide by 2 until odd: stack = stretched value, N = iterations
DYQ                  stetched value equal to the previous one?
X©NoDU‹              previous size < current one? (+store the new size in X)
&                    AND on the 2 previous tests
sDV¸X∍s              build a list of the new stretched value repeated X times
                      (+store the new stetched value in Y)
ić·®·Íǝ}             if the previous tests are true:
                       reduce the result list size by 1
                       multiply by 2 the number at the crush block position
»,                   join by newline + print the list
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.