স্ট্যাকিন বোর্ড


11

আমার কাছে একগুচ্ছ বোর্ড রয়েছে যতটা সম্ভব ছোট একটি জায়গা আমার স্ট্যাক করা দরকার। দুর্ভাগ্যক্রমে, বোর্ডগুলি যদি আমি তাদের 10 টিরও বেশি উঁচু করে রাখি তবে তা পড়ে যায়। দশটি বেশি উঁচু বোর্ডকে স্ট্যাক না করে বা খালি জায়গাতেই বোর্ডগুলি ঝুলিয়ে না রেখে কীভাবে বোর্ডগুলিকে যথাসম্ভব কম অনুভূমিক স্থান নেওয়ার জন্য আমাকে একটি প্রোগ্রাম প্রয়োজন।

তোমার কাজ:

একটি প্রোগ্রাম বা ফাংশন লিখুন, যখন বোর্ডগুলির দৈর্ঘ্য সমেত একটি অ্যারে দেওয়া হয়, তখন ASCII হিসাবে আউটপুটগুলি বোর্ডগুলিকে 10 টিরও বেশি উঁচু করে স্ট্যাক না করে বা কোনও অংশ না রেখে, যতটা সম্ভব অনুভূমিক স্থান সংরক্ষণের জন্য বোর্ডগুলি স্ট্যাক করার উপায় art বোর্ড ফাঁকা জায়গায় ঝুলছে। আপনার এএসসিআইআই শিল্পের বোর্ডগুলির কনফিগারেশনটি প্রদর্শন করা উচিত, প্রত্যেকটি আলাদা অক্ষর ব্যবহার করে দেখানো হবে। সর্বোচ্চ 20 টি বোর্ড থাকবে। উদাহরণস্বরূপ, যদি ইনপুটটি [2,2,4,2,2,4,4,4] হয়, একটি সম্ভাব্য আউটপুট হ'ল:

dhh
dgg
dff
dee
abc
abc
abc
abc

যা একটি স্থিতিশীল কনফিগারেশন (যদিও এটি বাস্তব জীবনে seconds 0.1 সেকেন্ডের মধ্যে পড়ে যাবে)।

ইনপুট:

20 টি পূর্ণসংখ্যার সমন্বিত একটি অ্যারে, বোর্ডগুলির দৈর্ঘ্য দেখায়।

আউটপুট:

উপরে উল্লিখিত হিসাবে বোর্ডের কনফিগারেশনগুলি দেখায় ASCII আর্ট।

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

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

[12,2,2,2,3,4,4,8,8]        -> ffgghhiii
                               ddddeeeeeeee
                               bbbbbbbbcccc
                               aaaaaaaaaaaa

[4,4,4,4,4,4,4,4,4,4,4,4]   -> llll
                               aaaa
                               cfghk
                               cfghk
                               cfghk
                               cfghk
                               debij
                               debij
                               debij
                               debij

[4,4,4,4,4,4,3,3,3,2,2,2,1] -> jjml
                               iiil
                               hhhk
                               gggk
                               ffff
                               eeee
                               dddd
                               cccc
                               bbbb
                               aaaa

স্কোরিং:

এটি , বাইট জয়ের সর্বনিম্ন স্কোর

উত্তর:


3

পাইথন 3 , 513 512 511 509 499 497 485 465 459 458 444 বাইট

অবিশ্বাস্যভাবে খারাপ রানটাইম, কিছু সময়ে শেষ হবে

e,j,c=enumerate,len,range
def f(n,p=[],o=97):
    r,l,m=lambda x:min(b,f(n[:i]+n[i+1:],x,o+1),key=j),chr(o),j(p)
    b=[p,l*(sum(n)*2+m)][n>[]]
    for i,a in e(n):
        for h,d in e(p):
            if a<11-j(d):b=r([p[f]+l*a*(f==h)for f in c(m)])
            if(j(d)<10)*all(j(x)==j(d)for x in p[h:h+a])*(a<=m-h):b=r([p[f]+l*(h<=f<h+a)for f in c(m)])
        if a<11:b=r(p+[l*a])
        b=r(p+[l]*a)
    return["\n".join("".join(9-u<j(x)and x[9-u]or" "for x in b)for u in c(10)),b][o>97]

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

সম্পাদনা: - 2 -8 বাইট @ মিঃ কে ধন্যবাদ এক্সকোডার সম্পাদনা করুন: -8 বাইট @ নটজাগানকে ধন্যবাদ

ব্যাখ্যা

e,j,c=enumerate,len,range      
         # These built-ins are used a lot
def f(n,p=[],o=97):
         # n is the remaining blocks
         # p is the current stack
         # o is the ASCI code for the next letter to use
    r,l,m=lambda x:min(b,f(n[:i]+n[i+1:],x,o+1),key=j),chr(o),j(p)
         # r is the recursive call, that also selects the smallest stack found
         # l is the letter to use next
         # m is the length of the current stack
    b=[p,l*(sum(n)*2+m)][n>[]]
         # Sets the current best, if there are no remaining blocks, select the found stack, else we set it to be worse than the possible worst case
    for i,a in e(n):
         # Loop through all the remaining blocks
        for h,d in e(p):
         # Loop through all the columns in the current stack
            if a<11-j(d):b=r([p[f]+l*a*(f==h)for f in c(m)])
         # If we can place the current block vertically in the current column, try it
            if(j(d)<10)*all(j(x)==j(d)for x in p[h:h+a])*(a<=m-h):b=r([p[f]+l*(h<=f<h+a)for f in c(m)])
         # If we can place the current block horizontally starting in the current column, try it
        if a<11:b=r(p+[l*a])
         # If the current block is lower than 10, try place it vertically to the right of the current stack
        b=r(p+[l]*a)
         # Try to place the current horizontally to the right of the current stack
    return["\n".join("".join(9-u<j(x)and x[9-u]or" "for x in b)for u in c(10)),b][o>97]
         # Return the best choice if we aren't in the first call to the function, that is the next letter is a. Else return the found best option formatted as a string

পাইথন 3 , 587 বাইট

কিছু পরীক্ষার ক্ষেত্রে টিআইও-তে আসলে চলমান

e,j,c=enumerate,len,range
def f(n,p=[],o=97,b=[]):
    if(not n):return p
    if not b:b="a"*sum(n)*2
    r,q,s,l,m=lambda x:q(f(n[:i]+n[i+1:],x,o+1,b)),lambda x:[b,x][j(b)>j(x)],b,chr(o),j(p)
    if j(b)<=m:return b
    for i,a in e(n):
        for h,d in e(p):
            if a<11-j(d):b=r([p[f]+l*a*(f==h)for f in c(m)])
            if j(d)<10 and a<=m-h and all(map(lambda x:j(x)==j(d),p[h:h+a])):b=r([p[f]+l*(h<=f<h+a)for f in c(m)])
        if s==b:
            if a<11and m+1<j(b):b=r(p[:]+[l*a])
            if m+a<j(b):b=r(p[:]+[l for r in c(a)])
    return["\n".join("".join(map(lambda x:" "if u>=j(x)else x[u],b))for u in c(9,-1,-1)),b][o>97]

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

উভয় সমাধান সম্ভবত কিছুটা গল্ফ করা যেতে পারে।




মিঃ এক্সকোডার, দ্বিতীয়টি প্রায় 50 টি বাইট দ্বারা হ্রাস করা যেতে পারে, আমি প্রথমটির জন্য পরিবর্তনগুলি দ্বিতীয়টির ক্ষেত্রে প্রয়োগ করতে পারি নি
হল্ভার্ড হুমেল

আমি জানি দ্বিতীয়টি অনেকটা গল্ফ করা যেতে পারে তবে প্রথমটির পরিবর্তনগুলি সহায়ক হওয়া উচিত।
মিঃ এক্সকোডার

1
অসাধারণ ব্যাখ্যা সহ কিছু দুর্দান্ত কোডের জন্য আপনি আমার উপার্জনটি অর্জন করেছেন, এটি প্রচুর প্রচেষ্টা এবং চিন্তাভাবনা দেখায়। অভিনন্দন এবং পিপিসিজিতে স্বাগতম!
মিঃ এক্সকডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.