একটি টেবিল দেওয়া, চেয়ারে রাখুন


41

চ্যালেঞ্জ

আপনাকে ইনপুট হিসাবে একটি সারণী দেওয়া হবে, এটি ASCII |এবং এর সাথে আঁকা _। আপনার কাজটি এর চারপাশে চেয়ারগুলি সেট করা।

উদাহরণ

ইনপুট:

 ____
|    |
|    |
|    |
|    |
|____|

আউটপুট:

 _^_^_
<     >
|     |
<     >
|     |
<_ _ _>
  v v

যে চেয়ারগুলি তৈরি <>এবং v^

আরেকটি উদাহরণ:

লাইনে যতটা সম্ভব চেয়ার থাকা উচিত।

  _____
 |     |_____
 |           |
 |           |
 |           |
 |      _____|
 |_____|


  _^_^_
 <     |_^_^_
 |           >
 <           |
 |           |
 <      _ _ _>
 |_ _ _| v v
   v v

প্রতিটি চেয়ারের মধ্যে অবশ্যই জায়গা থাকতে হবে। এবং >_^_^_<অবৈধ, এটি হওয়া উচিত |_^_^_|

  _____       _____
 |     |_____|     |
 |                 |
 |                 |
 |                 |
 |      ___________|
 |_____|


  _^_^_       _^_^_
 <     |_^_^_|     >
 |                 |
 <                 >
 |                 |
 <      _ _ _ _ _ _>
 |_ _ _| v v v v v
   v v

কোনও ডোনোটের অভ্যন্তরে কোনও চেয়ার থাকতে পারে না।

  _________________
 |      _____      |
 |     |     |     |
 |     |     |     |
 |     |_____|     |
 |_________________|


  _^_^_^_^_^_^_^_^_
 <      _____      >
 |     |     |     |
 <     |     |     >
 |     |_____|     |
 <_ _ _ _ _ _ _ _ _>
   v v v v v v v v

^এবং vঅগ্রাধিকার <এবং >। নিজস্ব কোনও চেয়ার নেই (এর কমপক্ষে একটি |বা _সারিতে থাকতে হবে)।

  _________________
 |      _____      |
 |     |     |     |
 |     |     |_____|
 |     |_____
 |___________|


  _^_^_^_^_^_^_^_^_
 <      _ _ _      >
 |     | v v |     |
 <     >     <_ _ _>
 |     |_^_^_  v v
 <_ _ _ _ _ _|
   v v v v v

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম কোড জয়ী।


2
আমি বিভ্রান্ত, কেন চেয়ারগুলি পাশ থেকে টেবিলে এম্বেড করা হচ্ছে?
অপ্টিমাইজার

যদি আমি সঠিকভাবে স্মরণ করি তবে আপনার মূল স্যান্ডবক্স পোস্টটি উল্লম্ব টেবিল লাইন এবং চেয়ার লাইনের মধ্যে একটি জায়গা ছিল। অনুভূমিক টেবিল লাইন এবং চেয়ারগুলির মধ্যে যেমন একটি সামান্য জায়গা রয়েছে।
অপ্টিমাইজার

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

1
এছাড়াও আমি মনে করি তৃতীয় নমুনায় সমস্যা আছে - দ্বিতীয় এবং তৃতীয় "শীর্ষ" চেয়ারগুলির মধ্যে একটি অতিরিক্ত জায়গা রয়েছে - এবং শেষ উদাহরণে নীচের ডানদিকে

1
প্রথম পরীক্ষার কেসটি ভেঙে গেছে বলে মনে হচ্ছে। ইনপুট মাত্র 4 চওড়া এবং আউটপুট 5.
গমের উইজার্ড

উত্তর:


34

পাইথন 2, 1033 1007 924 879 829 787 713 699 692 691 688 687 672 670 664 659 654 648 643 642 630 625 623 620 570 560 554 545 518 514 513 510 505 492 476 454 451 443 বাইট

6 বাইট ধন্যবাদ সংরক্ষিত রিলে

আদনানকে ধন্যবাদ 6 বাইট সংরক্ষণ করা

যেহেতু এই প্রশ্নটি এক বছরের বেশি পুরানো এবং এখনও কোনও উত্তর নেই আমি ভেবেছিলাম এটি ব্যবহার করে দেখি।

n,i,o,u="\nI _";R=lambda x:range(1,x-1)
b=open(i).read()
s=b.split(n)
z=max(map(len,s))+3
a=[list(i+x.ljust(z,i))for x in[i]+s+[i]]
for x in R(len(a))*len(b):
 A=a[x];B=a[x+1];C=a[x-1]
 for y in R(z):
    D=A[y-1:y+2];k=B[y];j=A[y+1]
    if(i in[C[y],k]+D+(k==u)*B[y-1:y+2]or"V"==j)&(A[y]==o):A[y]=i
    if"|"==A[y]==C[y]:A[y]={i:"|",j:">",A[y-1]:"<"}[i]
    if[u]*3==D:A[y],B[y]={i:u+k,C[y]:"^"+k,k:" V"}[i]
print n.join(`y`[2::5]for y in a).replace(i,o)

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

প্রোগ্রামটি একটি টেবিল নামের একটি ফাইল পড়ে Iএবং তার চেয়ারগুলি টেবিলটি মুদ্রণ করে std::out। আমি বেশ কয়েকটি প্রান্তের মামলার বিষয়ে নিশ্চিত ছিলাম না তাই আমি আমার সেরা রায় নিয়েছি (যাই হোক না কেন সর্বনিম্ন প্রচেষ্টা নিল) তবে মনে হয় এটি সমস্ত পরীক্ষার কেস কেটে গেছে। কিছু আউটপুট ঠিক মেলে না তবে তাদের সবার চেয়ারের সংখ্যা একই।

ব্যাখ্যা

প্রথম লাইনটি খুব সহজেই কিছু সংজ্ঞা সেট আপ করে যা ভবিষ্যতে আমাদের বাইটগুলি সংরক্ষণ করবে:

(আমি ভবিষ্যতের লাইনে পাঠ্যতার জন্য এই ম্যাক্রোগুলি আনপ্যাক করব)

n,i,o="\nI ";R=lambda x:range(1,x-1)

তারপরে আমরা নামের একটি ফাইল খুলব Iকারণ আমাদের ইতিমধ্যে একটি পরিবর্তনশীল রয়েছে যা এর জন্য সংক্ষিপ্ত রয়েছে যাতে এটি কয়েকটি বাইট সংরক্ষণ করে।

b=open("I").read().split("\n")

স্ট্রিংগুলির একটি তালিকা তৈরি করতে আমরা নিউলাইনগুলিতে বিভক্ত হয়েছি (চিত্রটির সারিগুলি)

s=b.split(n)

আমি তারপরে দীর্ঘতম লাইনের দৈর্ঘ্যটি সন্ধান করি যাতে আমি সমস্ত লাইনকে এই দৈর্ঘ্যে প্যাড করতে পারি। (আমি আরও 3 যোগ করি কারণ আমাদের কিছুটা অতিরিক্ত প্যাডিং দরকার)

 z=max(map(len,s))+3

তারপরে আমরা আসল প্যাডিংটি করি এবং Iপ্রান্তের চারপাশে অক্ষরের একটি সীমানা তৈরি করি । এটি কারণ এর পরে এবং আকারের বাইরের মধ্যে পার্থক্যটি আমাদের জানাতে হবে। আমরা স্ট্রিংয়ের তালিকা থেকে ডেটা টাইপকে অক্ষরের তালিকার একটি তালিকা (দৈর্ঘ্য 1 স্ট্রিং) এ পরিবর্তন করব।

a=[list("I"+x.ljust(z,"I"))for x in["I"]+s+["I"]]

পরের লাইনটি অন্য একটি বাইট সাভিং সংজ্ঞা।

(আমি এটিও আনপ্যাক করব)

B=R(len(a))

এখন আমরা Iআকারের বাইরে সর্বত্র অক্ষর ছড়িয়ে দিতে চাই । আমরা এটি ছদ্ম-সেলুলার অটোমেটনের সাহায্যে করতে পারি। প্রত্যেকে Iযে কোনও সংলগ্ন অক্ষরগুলিতে ছড়িয়ে পড়বে । অটোমেটন স্থিতিশীল না হওয়া পর্যন্ত আমরা লুপ করতে পারি তবে অক্ষর থাকার চেয়ে এটি আরও পুনরাবৃত্তি নিতে পারে না সুতরাং প্রতিটি অক্ষর b(মূল ইনপুট) এর মধ্য দিয়ে আমরা কেবল লুপ করব

for _ in b:

প্রতিটি পুনরাবৃত্তির জন্য আমরা 2D তালিকার প্রতিটি অক্ষরের উপর দিয়ে যেতে চাই (বহিরাগত প্যাডিং বাদ দিয়ে)

 for x in range(1,len(a)-1):
    A=a[x]  #<--Another definition I will fill in for clarity
    for y in range(1,z-1):

প্রতিটি অবস্থানের জন্য আমরা নিম্নলিখিত কোডটি চালাই:

if("I" in[a[x+1][y],a[x-1][y]]+a[x][y-1:y+2])&(a[x][y]==" "):a[x][y]=" "

এটিকে ভেঙে ফেলা যাক।

দুটি শর্তের সাথে একটি &(বিটওয়াইজ and) দ্বারা পৃথক আমাদের একটি রয়েছে

প্রথমটি খুব সহজেই পরীক্ষা করে তোলে যে Iকোনও সংলগ্ন কোষের মধ্যে একটি রয়েছে এবং দ্বিতীয়টি কেবলমাত্র বর্তমান কক্ষটি একটি কিনা পরীক্ষা করে " "। যদি আমরা এই শর্তগুলি পাস করি তবে আমরা বর্তমান সেলটিকে একটি হিসাবে সেট করব I


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

আবার আমরা সমস্ত কক্ষের মধ্য দিয়ে লুপ করলাম (এবং আরও কিছু সংক্ষিপ্তসার সেট করেছি)

for x in range(1,len(a)-1):
 A=a[x]
 for y in range(1,z-1):
        k=a[x+1][y]

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

অজগর একটি সামান্য পটভূমি:

পাইথনে আপনি যদি কোনও অভিধান কী দু'বার নির্ধারণের চেষ্টা করেন তবে এটি পরেরটিটিকে স্বাক্ষর করে। উদাহরণ স্বরূপ

>>> {1:"a",1:"b"}[1]
'b'

বর্তমান ঘরটি একটি নির্দিষ্ট চরিত্রে নির্ধারিত করার জন্য আমরা এই সম্পত্তিটিকে অপব্যবহার করব।

প্রথম শর্তটি

if["_"]*3==a[x][y-1:y+2]:a[x][y],a[x+1][y]={"I":"_"+a[x+1][y],a[x-1][y]:"^ ",a[x+1][y]:" V"}["I"]

যদি ঘরটি 3 টি _অক্ষরের এক প্রান্তের মাঝখানে থাকে তবে আমরা বর্তমান ঘর এবং তার নীচে ঘরটি পুনরায় স্বাক্ষর করব। আমরা এটির দ্বারা একটি ওভারলোড হওয়া অভিধানকে সূচীকরণের ফলাফলের জন্য নির্ধারিত করব I। জোড়ার সাথে আমরা প্রথমে আমাদের ডিফল্ট সেট করি "I":"_"+a[x+1][y]যার অর্থ যদি কোনও পরিবর্তন না হয় আমরা দুটি কক্ষকে তাদের মূল মানগুলিতে ফিরিয়ে দেব। এরপরে আমরা জুটি যুক্ত করব a[x-1][y]:"^ "। বর্তমান (1 a[x-1][y]) এর উপরের ঘরটি একটি দ্বারা পূর্ণ না হলে এটি কোনও কিছু (গুরুত্বপূর্ণ) করবে না I। যদি একটি হয়েছে Iএটা বর্তমান ঘরের একটি চেয়ার স্থাপন করতে আমাদের বলার ডিফল্ট ওভাররাইড করবে তাতে। এরপরে আমরা বর্তমান কক্ষের নীচের কক্ষে এগিয়ে যাই যদি সেই ঘরটি Iআবার আমরা বর্তমান স্পটের নীচে উপরের দিকে মুখ রাখার জন্য ওভাররাইড করি।

পরবর্তী শর্তটি একটি বাচ্চা সহজ

if"|"==a[x][y]==a[x-1][y]:a[x][y]={"I":"|",A[y+1]:">",A[y-1]:"<"}["I"]   

বর্তমানের ঘর এবং এটির উপরের ঘরটি উভয় কিনা তা আমরা পরীক্ষা করি |। যদি তাই হয় তবে আমরা একটি অভিধান স্থাপন করি।

অভিধানের প্রথম জুটি "I":"|"ডিফল্ট সেট করে। যেহেতু আমরা কীটি অ্যাক্সেস করতে যাচ্ছি Iযদি Iপুনরায় নিয়োগ না দেওয়া হয় তবে এটি ডিফল্ট হয়ে যাবে |(এটি ইতিমধ্যে যে চরিত্রটিতে রয়েছে) এবং কিছুই করবে না।

আমরা দুটি কী যুক্ত করব A[y+1]:">",A[y-1]:"<"যদি বাম এবং ডানদিকে দুটি ঘরগুলির একটি হয় Iতবে এটি বর্তমান কক্ষটি বাইরের দিকে নির্দেশ করে একটি চেয়ারে পুনর্নির্দিষ্ট করবে।


এখন আমাদের কেবল আউটপুট করতে হবে। তবে আমরা কেবল মুদ্রণ করতে পারি না, প্রথমে আমাদের কয়েকটি গৃহকর্ম সংরক্ষণের কাজ করতে হয়। আমাদের একটি স্ট্রিংয়ে ফিরে রূপান্তর করতে হবে এবং Iআমরা তৈরি করা সমস্ত গুলি সরিয়ে ফেলতে হবে । এটি এক লাইনে করা হয়।

print "\n".join(`y`[2::5]for y in a).replace("I"," ")

আপনি প্রথম স্তরের ইনডেন্টের জন্য একটি স্থান, দুটিটির জন্য ট্যাব, একটি ট্যাব এবং তিনটির জন্য একটি স্থান ব্যবহার করতে পারবেন না? এটি কয়েকটি বাইট সংরক্ষণ করবে।
রিলে

3
এটি সর্বাধিক পুনরায় গল্ফ উত্তর হতে পারে।
ম্যাজিক অক্টোপাস উরন

2
কি i,o="I "পরিবর্তে i="I";o=" "কাজ করে?
আদনান

1
@ এরিক গল্ফার リ リ ッ ク ゴ ル フ ァ ーn4 বাইট বানাতে এবং আমাকে সাশ্রয় করে 6.. যদিও আমি এটি প্রায়শই ব্যবহার করি না এটি 2 বাইট বাঁচায়।
গম উইজার্ড

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