বিভাজন একটি তালিকা!


10

এই চ্যালেঞ্জে আপনাকে একটি তালিকা বিভাজন করতে হবে যেখানে পার্টিশনের সর্বাধিক আকার, একটি ন্যূনতম আকার এবং পছন্দসই আকার থাকে। আমি (min,pref,max) এই চ্যালেঞ্জের আকারগুলি চিহ্নিত করতে স্বরলিপিটি ব্যবহার করব ।

বিভাজন সম্পর্কে অপরিচিতদের জন্য, নিম্নলিখিত তালিকাটি 3 টি ভাগে বিভক্ত করা হয়েছে:
[0..9] -> [[0,1,2],[3,4,5],[6,7,8]]

যখন তালিকার সমানভাবে বিভাজ্য না হয় তবে আপনি প্রয়োজন পার্টিশন সম্ভব পছন্দের আকার পাসে হতে হবে: [0..10], (2,4,5) -> [[0,1,2,3],[4,5,6],[7,8,9]]। এই পার্টিশনটি পছন্দনীয় [[0,1,2,3],[4,5,6,7],[8,9]], যদিও পরবর্তীগুলির পছন্দসই দৈর্ঘ্যের বেশি রয়েছে। সাধারণত, আমাদের (partitionLength-preferredSize)^2প্রতিটি বিভাজনের জন্য যোগফল কমিয়ে আনা দরকার ।

পার্টিশনের দৈর্ঘ্যের ক্রমটি বিবেচনা করে না: [0..5], (2,3,3)হয় [[0,1,2],[3,4]]বা হয় [[0,1],[2,3,4]]কাজ করে। কোন পার্টিশন সম্ভব হয়, তাহলে একটি খালি অ্যারে ফিরে [0..7], (4,4,5) -> []

আপনি এটি ধরে নিতে পারেন 1<=min<=pref<=maxএবং আপনার কাছে যে অ্যারেটি দেওয়া হয়েছে তা হল পূর্ণসংখ্যার একটি খালি খালি অ্যারে। অ্যারে সর্বদা প্রথম যুক্তি হবে। আপনি কোনও ক্রমে ন্যূনতম, সর্বাধিক এবং প্রেফকে গ্রহণ করতে পারেন বা টিপল হিসাবে বা পৃথক যুক্তি হিসাবে।

আপনার প্রোগ্রামটি কয়েক সেকেন্ডের মধ্যে চলতে হবে। মূলত, সীমানার মধ্যে প্রতিটি সম্ভাব্য পার্টিশন আকারের মাধ্যমে পুনরাবৃত্তি করার অনুমতি নেই।

পরীক্ষার কেস:

[1], (1,3,4)         -> [[1]]
[100], (1,2,3)       -> [[100]]
[1,2], (1,1,2)       -> [[1],[2]]
[1,2], (1,2,2)       -> [[1,2]]
[1,2], (1,3,3)       -> [[1,2]]
[1,2,3], (1,2,3)     -> [[1,2],[3]] or [[1,2,3]]
[1,2,3,4], (1,3,4)   -> [[1,2,3,4]]
[1,2,3,4,5], (3,3,4) -> []
[1,2,3,4,5], (2,2,2) -> []
[1,2,3,4,5], (3,3,5) -> [[1,2,3,4,5]]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49], (2,6,6) -> [[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29],[30,31,32,33,34],[35,36,37,38,39],[40,41,42,43,44],[45,46,47,48,49]]

এটি একটি , সুতরাং আপনার প্রিয় ভাষায় যতটা সম্ভব কম বাইটের লক্ষ্য রাখুন!


আপনি যে স্বরলিপিটি ব্যবহার করছেন তা [a..b]অন্তর্ভুক্ত করে aএবং বাদ দেয় b, তাই না?
অ্যালেক্স এ।

একটি সমেত, বি এক্সক্লুসিভ।
নাথান মেরিল

মনে রাখবেন যে আপনার
কোনওটির

কিন্তু এটা হয় কার্যকরভাবে পূর্ণসংখ্যা পার্টিশন সমতুল্য।
নাথান মেরিল

সমাধান না হলে কী হবে?
ফেয়ারসাম

উত্তর:


2

হাস্কেল, 152

_%0=[]
s%k|(a,b)<-splitAt(div(z s)k)s=a:b%(k-1)
z=length
f s n p x=snd$minimum$(z s*p^2,[]):[(sum[(z x-p)^2|x<-s%k],s%k)|k<-[-div(-z s)x..div(z s)n]]

যে কোনও বিভাজনে, যদি দুটি তালিকা থাকে যার দৈর্ঘ্য দুটি বা তার বেশি হয় তবে বড় তালিকাটি সঙ্কুচিত করা এবং আরও ছোট তালিকাটি বাড়ানো সর্বদা উপকারী। সুতরাং, আমাদের কেবলমাত্র দুটি তালিকা আকারের পার্টিশন বিবেচনা করা দরকার, যা গণনা সহজতর করে।

প্রোগ্রামটি পার্টিশনের সমস্ত সম্ভাব্য পরিমাণের তালিকাগুলিতে চালিত হয়। পার্টিশনের তালিকাগুলির পরিমাণ অনুসারে স্কোরটি স্বতন্ত্রভাবে নির্ধারণ করা হয়। প্রোগ্রামটি একটি উপযুক্ত পার্টিশন এবং এর স্কোর গণনা করে।

তারপরে এটি সামগ্রিক সর্বনিম্ন সন্ধান করে এবং এটি ফেরত দেয়।

ব্যবহার: ইনপুট মত f [1,2,3,4,5] 1 3 4( fচ্যালেঞ্জ সমাধান করে এমন ফাংশন)

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

_%0=[]
s%k|(a,b)<-splitAt(div(length s)k)s=a:b%(k-1)
f s n p x|l<-length s=(s%)$snd$minimum$(l*p^2,0):[(k*j^2+mod l k*(1-2*j),k)|k<-[1..div l n],k*x>=l,j<-[p-div l k]]

1

সিজেম, 70

q~:S;_,[0L]a{_S2=e<),S0=>f{[__S1=-_*\]@@-j.+}[esL]a+:e<}j1={/(\e_}/;]p

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

কোডটি তালিকা আকারের উপর ভিত্তি করে পার্টিশন মাপের সর্বোত্তম ক্রম সন্ধান করে, ডায়নামিক প্রোগ্রামিং (মেমোজাইজড রিকার্সনের মাধ্যমে) ব্যবহার করে, তারপরে এগিয়ে যায় এবং তালিকাকে পার্টিশন করে।

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