স্কোয়ারগুলিতে প্রতিসম সন্ধান করা


14

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা ইতিবাচক পূর্ণসংখ্যার একটি তালিকা নেয়। এই পূর্ণসংখ্যার প্রত্যেকটি 2 ডি প্লেনের বর্গক্ষেত্রের দৈর্ঘ্যের প্রতিনিধিত্ব করে। প্রতিটি বর্গক্ষেত্রকে বিমানের যে কোনও সংখ্যক স্থানাঙ্কে স্থানান্তরিত করা যায়, তবে এটি ঘুরতে পারে না এবং এটি অন্যান্য স্কোয়ারকে ওভারল্যাপ করতে পারে না।

প্রতিটি স্কোয়ারের জন্য আলাদা মুদ্রণযোগ্য এএসসিআইআই অক্ষর ব্যবহার করে (শূন্যতার জন্য ব্যবহৃত স্থান বাদে) আপনার প্রোগ্রাম / ফাংশনটির প্রতিফলনের প্রতিসাম্যের অনুভূমিক বা উল্লম্ব রেখার স্কোয়ারগুলির কোনও একক বিন্যাস মুদ্রণ করা দরকার। যদি এ জাতীয় কোনও ব্যবস্থা না থাকে তবে কিছুই মুদ্রিত হওয়া উচিত নয়।

স্কোয়ারগুলি বিভিন্ন চরিত্রের ঠিক তাই তাদের আলাদা করে বলা যায়। সমস্ত স্কোয়ারের ইউনিয়ন দ্বারা তৈরি আকৃতিটি প্রতিসম হওয়া দরকার। আপনি ধরে নিতে পারেন তালিকায় 94 টিরও বেশি উপাদান থাকবে না (যেমন 94 টি অক্ষর রয়েছে)।

উদাহরণস্বরূপ, যদি ইনপুটটি ছিল [2, 1, 2, 2, 2], একটি সম্ভাব্য আউটপুট হল:

DD--
DD--
Z
FFPP
FFPP

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

  55
  55
  %%
  %%
@
  HH
  HH
  ((
  ((
       G

     11 33
     11 33

    22   44
    22   44

প্রতিসারণের রেখাটি অক্ষরের মধ্যে সীমানাও হতে পারে যেমন [2, 4]:

!!!!
!!!!  ++
!!!!  ++
!!!!

কিছু স্কোয়ারের প্রতিসাম্য বিন্যাস করা অসম্ভব, যেমন [1, 2, 3]:

AAA BB C
AAA BB         (these can't be vertically or horizontally symmetric => no output)
AAA

এবং মনে রাখবেন যে বর্গ সীমানা না হলেও সামগ্রিক আকারটি প্রতিসম হতে পারে। যেমন একটি বৈধ আউটপুট [2, 1, 1, 1, 1, 4]:

AA----
AA----
BC----
DE----

একইভাবে, এর জন্য একটি বৈধ আউটপুট [1, 1, 2, 3, 5]:

44444
44444
44444
44444
44444
33301
33322
33322

মন্তব্য

  • ইনপুট তালিকার সর্বদা 1 থেকে 94 টি উপাদান থাকবে।
  • যে কোনও যুক্তিসঙ্গত উপায়ে ইনপুট নিন: স্টিডিন, কমান্ড লাইন, পাঠ্য ফাইল, ফাংশন আর্গ। আপনার প্রয়োজন অনুসারে এটি সামান্য ফর্ম্যাট করা যেতে পারে, যেমন {1, 2, 3, 4}বা [1 2 3 4]
  • Stdout বা অনুরূপ আউটপুট। যে কোনও পরিমাণে শীর্ষস্থানীয় / পিছনের স্থান বা নিউলাইনগুলি যতক্ষণ না ফলাফল আকৃতির প্রতিসাম্যের লাইন থাকে ততক্ষণ ঠিক থাকে।
  • প্রতিসাম্যের একটি তির্যক রেখা গণনা করে না (অন্যথায় এটি অত্যন্ত সহজ হবে)। এছাড়াও, এটি প্রতিবিম্বিত প্রতিসাম্য হতে হবে, ঘূর্ণন বা ট্রানজিশনাল নয়।
  • আমি এই কাজটি কতটা গণ্যিকভাবে কঠিন তা সত্যই আমি নিশ্চিত নই। আপনি আংশিক উত্তর পোস্ট করতে পারেন যা সমস্যার কিছু উপসীমা সমাধান করে (বিশেষত যদি আপনি একটি বিশেষত চৌকস অ্যালগরিদম দেখাতে চান)। এগুলি জয়ের যোগ্য নয়।
    • উদাহরণস্বরূপ, আপনি ধরে নিতে পারেন ইনপুটটিতে সর্বদা কমপক্ষে একটি প্রতিসম ব্যবস্থা থাকে (সুতরাং তালিকাগুলি [1, 2, 3]কখনই ইনপুট হয় না)।
    • বা উদাহরণস্বরূপ, আপনি কেবল এমন ব্যবস্থা বিবেচনা করতে পারেন যেখানে বর্গক্ষেত্রের সীমানা এবং সামগ্রিক আকার সমান্তরাল। এই ক্ষেত্রে, [1, 1, 2, 3, 5]কোন আউটপুট হবে।
    • আপনি যদি পাগল হয়ে যেতে চান তবে আপনি এই ধারণাটি আয়তক্ষেত্র বা এমনকি পলিওমিনোসগুলিতে প্রসারিত করতে পারেন ।

স্কোরিং

আপনার স্কোরটি বাইটে আপনার প্রোগ্রামের আকার । সর্বনিম্ন স্কোর জয়। টাইব্রেকার উত্তর পোস্ট আগে পোস্ট।


2
সমাধানের জন্য বোনাস পয়েন্ট [2, 4, 6, 7, 8, 9, 11, 15, 16, 17, 18, 19, 24, 25, 27, 29, 33, 35, 37, 42, 50, 112], যদিও যেহেতু প্রশ্নটি অনেক বেশি স্বাধীনতা দেয় তবে সম্ভবত অন্যান্য সমাধানও রয়েছে।
Sp3000

উত্তর:


4

পাইথন 2, 460 452 437 বাইট

exec"""def f(L):
 if[]==L:
  X{2}[map(" ".__lt__,q)for q in G]);Z{2}zip(*X));C=Z==Z[::-1]or X==X[::-1]
  if C:print"\\n".join(map("".join,G))
  return C
 x=L[-1];T=S-x+1;R=range(x)
 for n in range(T*T):
  i=n%T;j=n/T
  if all({1}=" "{0}):
{0}:{1}chr(32+len(L))
   r=f(L[:-1])
{0}:{1}" "
   if r:return r""".format("   for a,b in[(a,b)for a in R for b in R]","G[i+a][j+b]=","=filter(sum,")
L=input()
S=sum(L)
G=[S*[" "]for _ in[0]*S]
f(L)

আপাতত কেবল হালকাভাবে গল্ফ করেছেন, তবে জিনিস শুরু করার জন্য এখানে কিছু। আমি exec10 এবং 12 লাইন ব্যবহার করার চেষ্টা করেছি , তবে কোনও কারণে এটি আমাকে ছাড়েনি।

ইনপুট তালিকা Lstdin, যেমন মাধ্যমে [2, 1, 2, 2, 2]। প্রোগ্রামটি sum(L) x sum(L)গ্রিডে স্কোয়ার স্থাপনের প্রতিটি সম্ভাবনার চেষ্টা করে ।

নমুনা আউটপুট (কমপ্যাক্টনেস জন্য ফাঁকা লাইন সরানো):

[2, 1, 2, 2, 2]

%%       
%%       
$$       
$$       
"        
##       
##       
!!       
!!      

[2, 4]

""""  
""""  
""""  
""""  
 !!   
 !!   

[2, 1, 1, 1]

$!!  
#!!  
 "   

[1, 1, 2, 3, 5]

%%%%%       
%%%%%       
%%%%%       
%%%%%       
%%%%%       
$$$##       
$$$##       
$$$"!       

[1, 4, 1, 8]

$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
# """" !      
  """"        
  """"        
  """"        

[8, 1, 4, 1]

$   !!!!!!!!  
    !!!!!!!!  
####!!!!!!!!  
####!!!!!!!!  
####!!!!!!!!  
####!!!!!!!!  
    !!!!!!!!  
"   !!!!!!!!  

(The algorithm starts placing from the last square first, prioritising left then up)

সামান্য কম বিভ্রান্তিকর সংস্করণ (452 ​​বাইট):

def f(L):
 if[]==L:
  X=filter(sum,[map(" ".__lt__,q)for q in G]);Z=filter(sum,zip(*X));C=Z==Z[::-1]or X==X[::-1]
  if C:print"\n".join(map("".join,G))
  return C
 x=L[-1];T=S-x+1;R=range(x);V=[(a,b)for a in R for b in R]
 for n in range(T*T):
  i=n%T;j=n/T
  if all(G[i+a][j+b]<"!"for a,b in V):
   for a,b in V:G[i+a][j+b]=chr(32+len(L))
   r=f(L[:-1])
   for a,b in V:G[i+a][j+b]=" "
   if r:return r
L=input()
S=sum(L)
G=[S*[" "]for _ in[0]*S]
f(L)

@ ক্যালভিনের শখগুলি আমি ঠিক বুঝতে পেরেছিলাম যে আমি খালি সারি এবং কলামগুলি ফেলা ভুলে গিয়েছি (যার অর্থ এই ছিল যে বোর্ডের সাথেও কনফিগারেশনটি প্রতিসম হওয়া উচিত )। [1, 1, 2, 3, 5]এখন ঠিক আছে।
Sp3000

আহ। আমি ভেবেছিলাম নিষ্ঠুর শক্তি কেবল চিরকালের জন্য নিচ্ছে।
ক্যালভিনের

@ ক্যালভিনের শখগুলি এটি বৃহত্তর বোর্ডগুলির জন্য করে তবে অতিরিক্ত বাধা দেওয়া কেবল আরও খারাপ করে তোলে: পি
স্প 3000

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