প্রথমত, কিছু পরিভাষা ( উত্স ):
- একটি নিতম্বের ছাদটি (উইকিপিডিয়াকে উদ্ধৃত করে) "এক ধরণের ছাদ যেখানে সমস্ত দিক দেয়ালের দিকে নীচে opeালু হয়, সাধারণত বেশ নরম gentleাল"
- একটি opeাল একটি পরিকল্পনাকারী পৃষ্ঠ যা ছাদের একটি অংশ
- একটি রিজ একটি প্রান্ত যেখানে দুটি বিপরীত ছাদ .ালু মিলিত হয়
- একটি নিতম্ব একটি উত্তল প্রান্ত যেখানে লম্ব প্রাচীরের দুটি opালু মিলিত হয়
- উপত্যকা একটি অবতল প্রান্ত যেখানে লম্ব প্রাচীরের দুটি opালু মিলিত হয়
- নিতম্ব এবং উপত্যকাগুলিকে সম্মিলিতভাবে তির্যক প্রান্ত হিসাবে উল্লেখ করা হবে।
সম্ভাব্য ইনপুট:
** * ***
********
** * **
সংশ্লিষ্ট আউটপুট:
+-------+ +---+ +-----------+
|\ /| |\ /| |\ /|
| \ / | | V | | \ ^---< |
| \ / | | | | | \ / \ \|
+---+ V +---+ | +---+ X +---+
|\ \ | / \|/ \ / \ |
| >---> | <-------X-------V > |
|/ / | \ /|\ /| |
+---+ ^ +---+ | +-------+ | +---+
| / \ | | | | | |/ /|
| / \ | | ^ | | /---< |
|/ \| |/ \| |/ \|
+-------+ +---+ +-------+
আরও কয়েকটি পরীক্ষার মামলা:
** *** * * * *
* *** *****
** ***** *****
* * * *** *** ***
* **** * * *
সংশ্লিষ্ট আউটপুট:
+-------+ +-----------+ +---+ +---+ +---+ +---+
|\ /| |\ /| |\ /| |\ /| |\ /| |\ /|
| \---< | | >-------< | | V | | V | | V | | X |
| |\ \| |/ \| | | | | | | | | | |/ \|
| | +---+ +-----------+ +---+ | +---+ | | +-----------+ | | +---+
| | | |\ \|/ /| | |/ \| |
| ^ | | \ V / | | < > |
|/ \| | \ / | | \ / |
+---+ +-------+ +---+ \ / +---+ | \-----------/ |
|\ /| |\ \ \ / / /| | |\ /| |
| >---/ | | >---> X <---< | | | \ / | |
|/ /| | |/ / / \ \ \| | | \ / | |
+---+ +---+ +---+ | | +---+ / \ +---+ +---+ ^ +---+ ^ +---+
|\ /| |\ /| | | | | / \ | |\ \ / \ | | / \ / /|
| V | | V | | | | | / ^ \ | | >---V > | | < V---< |
| | | | | | | | | |/ /|\ \| |/ /| | | |\ \|
| | | | | +-------+ | | +---+ | +---+ +-------+ | | | | +-------+
| | | | |/ \| | | | | | | | | | |
| ^ | | /-----------\ | | ^ | | ^ | | ^ |
|/ \| |/ \| |/ \| |/ \| |/ \|
+---+ +---------------+ +---+ +---+ +---+
আপনার ইনপুটটি বিটম্যাপ হবে - বর্গক্ষেত্রের পিক্সেলের 2D অ্যারে - যে ছাদটি coveredেকে রাখা উচিত। আপনি ধরে নিতে পারেন যে এই অঞ্চলের সীমানাটি জর্দানের বক্ররেখা হবে - যা অবিরত এবং স্ব-ছেদ না করা - অর্থাৎ, ছাদযুক্ত অঞ্চলটি অবিচ্ছিন্ন থাকবে, গর্ত ছাড়াই থাকবে এবং কোনও একক বিন্দুতে চারটি প্রাচীরের মিলন কখনও হবে না। বৈধ ইনপুট ফর্ম্যাটগুলিতে নিউলাইন বিভাজকগুলির সাথে একটি একক স্ট্রিং, স্ট্রিংগুলির একটি তালিকা এবং চর বা বুলিয়ানগুলির একটি 2D অ্যারে অন্তর্ভুক্ত।
ছাদ নির্মাণের নিয়মগুলি হ'ল :
- ছাদযুক্ত অঞ্চলের প্রতিটি সোজা অংশে (এখন থেকে দেয়াল হিসাবে উল্লেখ করা হয়) এর ঠিক একটি সংলগ্ন opeাল থাকবে। Opeালটি প্রাচীর থেকে দূরে উঠবে। প্রতিটি opeালের কমপক্ষে একটি সংলগ্ন প্রাচীর থাকতে হবে এবং একটি opeালের সংলগ্ন সমস্ত দেয়াল অবশ্যই প্রান্তিক হতে হবে।
- সমস্ত opালুতে অনুভূমিক পৃষ্ঠের বিপরীতে সমান (ননজারো) কোণ থাকবে। অর্থাৎ, তাদের অবশ্যই একই পিচ থাকতে হবে।
- Opালু এমন একটি পৃষ্ঠ গঠন করবে যার সীমানাটি ছাদযুক্ত ক্ষেত্রের সীমানা। অর্থাৎ theালু ছাড়া অন্য কোনও উপরিভাগ ব্যবহার করা যাবে না।
- এই স্পেসিফিকেশন দ্বারা একাধিক সমাধান (উল্লম্ব স্কেলিং পর্যন্ত) অনুমোদিত যে কোনও দৃশ্যকে স্পেসিফিকেশনটিতে একটি বাগ হিসাবে বিবেচনা করা হয়। কোনও সংশোধন পূর্ববর্তীভাবে প্রয়োগ করা হয়।
সমানভাবে, ছাদটি নিয়ম দ্বারা সংজ্ঞায়িত করা যেতে পারে যে ছাদের প্রতিটি বিন্দু উপরের নীচে দৃশ্যে চেবিশেভ দূরত্ব ব্যবহার করে যতটা সম্ভব ছাদটির সর্বোচ্চ .াল ছাড়িয়ে ছাড়াই যথাসম্ভব উঁচুতে স্থাপন করা হবে ।
আপনার আউটপুটটি ছাদের একটি ASCII শিল্প উপস্থাপনা হতে হবে - নিউ লাইনের অক্ষর যুক্ত স্ট্রিং বা স্ট্রিংগুলির একটি অ্যারে, প্রতিটি আউটপুটের একক লাইনকে বোঝায়। ছাদটি 4x স্কেলে উপরের নীচে দৃশ্যে রেন্ডার করা হবে - অর্থাত্ ফ্লোর-পরিকল্পনার প্রতিটি বর্গক্ষেত্রকে আউটপুটটির 5x5 অঞ্চলকে প্রভাবিত করা উচিত যেমন এই 5x5 অঞ্চলের কোণগুলি প্রতিবেশী স্কোয়ারের সাথে ভাগ করা হয় (যেমন প্রতিটি কোণার চরিত্রটি চারটি পৃথক ইনপুট স্কোয়ার দ্বারা প্রভাবিত হয়) যেমন উদাহরণ আউটপুট দ্বারা নির্দেশিত। যতক্ষণ আউটপুট আকৃতি সংরক্ষণ করা হয় ততক্ষণ অতিরিক্ত হোয়াইটস্পেসের অনুমতি দেওয়া হয়। আউটপুটে অক্ষরগুলি হ'ল:
- যদি আউটপুট একক স্ট্রিং আকারে থাকে তবে একটি পরিবেশ-সংজ্ঞায়িত নিউলাইন চিহ্নিতকারী ব্যবহার করা হবে (সাধারণত U + 000A, U + 000D বা উভয়ের একটি জুড়ি)
(U + 0020 স্পেস) একটি ছাদযুক্ত ক্ষেত্রের বাইরে একটি বিন্দু বা slালুতে অভ্যন্তরীণ বিন্দুর প্রতিনিধিত্ব করে+(U + 002B প্লাস সাইন) এর সাথে সংলগ্ন দুটি লম্ব প্রাচীরের সাথে একটি বিন্দু উপস্থাপন করে-(U + 002D হাইফেন-বিয়োগ) অনুভূমিকভাবে প্রাচীর বা একটি রিজকে কেন্দ্র করে (পূর্ব-পশ্চিম) উপস্থাপন করে/(U + 002F solidus) হিপ বা উপত্যকা কেন্দ্রিক উত্তর-পূর্ব থেকে দক্ষিণ-পূর্ব পর্যন্ত উপস্থাপন করে বা এর দুটিতে সংযুক্ত একটি বিন্দু উপস্থাপন করে<(U + 003C কম-সাইন চিহ্ন) পূর্বের সাথে সংযুক্ত দুটি তির্যক প্রান্তযুক্ত একটি বিন্দু উপস্থাপন করে>(U + 003E এর চেয়ে বড় চিহ্ন) পশ্চিমে এটির সাথে সংযুক্ত দুটি তির্যক প্রান্তযুক্ত একটি বিন্দু উপস্থাপন করে\(U + 005C বিপরীত কঠিন) হিপ বা উপত্যকামুখী উত্তর-পশ্চিম থেকে দক্ষিণ-পূর্ব পর্যন্ত উপস্থাপন করে বা এর দুটিতে সংযুক্ত একটি বিন্দু উপস্থাপন করে^(U + 005E সারফ্লেক্স অ্যাকসেন্ট) দক্ষিণে দুটি তির্যক প্রান্তযুক্ত একটি বিন্দু উপস্থাপন করেV(U + 0056 ল্যাটিন মূল বর্ণনাম v) উত্তরের সাথে সংযুক্ত দুটি তির্যক প্রান্তযুক্ত একটি বিন্দু উপস্থাপন করেX(U + 0058 ল্যাটিন মূল অক্ষর এক্স) চারটি পাশের সাথে এটির সাথে সংযুক্ত কোণের একটি বিন্দু উপস্থাপন করে|(U + 007C উল্লম্ব বার) একটি প্রাচীর বা উল্লম্বভাবে উল্টানো একটি পাতাকে উপস্থাপন করে (উত্তর-দক্ষিণ)
মনে রাখবেন যে বিজোড় সংখ্যার তির্যক কিনারা একই পয়েন্টে শেষ হওয়া সম্ভব (দেয়াল ব্যতীত) not আমরা প্রতিটি পয়েন্টের পার্শ্বটি উত্তর opeালুতে + দক্ষিণ opeালুতে এবং পূর্ব opeালুতে + পশ্চিমে .ালুতে ভাগ করে দেখতে পারি। উভয় পার্টিশনের মধ্যে সীমানাটি তির্যক প্রান্ত দিয়ে তৈরি করতে হবে।
যদি আপনার পরিবেশ ASCII এর সাথে সঙ্গতিপূর্ণ নয় এমন একটি অক্ষর এনকোডিং ব্যবহার করে তবে আপনি আপনার পরিবেশের ব্যবহারগুলি এনকোডিং করে অক্ষরটিতে সমতুল্য অক্ষর (একই গ্লাইফ বা নিকটতম উপলব্ধ) ব্যবহার করতে পারেন।
রুবিতে নিম্নলিখিত (কুরুচিপূর্ণ) রেফারেন্স বাস্তবায়ন অ-হোয়াইটস্পেস আউটপুট সম্পর্কিত সম্মত is বিশেষত renderপদ্ধতিটি নোট করুন :
def pad ary
row = ary.first.map{-1}
([row] + ary + [row]).map{|r| [-1] + r + [-1]}
end
def parse str
str.split("\n").map{|r| r.chars.map(&{" " => -1, "*" => Float::INFINITY})}
end
def squares ary, size
ary.each_cons(size).map do |rows|
rows.map{|row| row.each_cons(size).to_a}.transpose
end
end
def consmap2d ary, size
squares(ary, size).map{|sqrow| sqrow.map{|sq| yield sq}}
end
def relax ary
loop do
new = consmap2d(pad(ary), 3){|sq| sq[1][1] == -1 ? -1 : sq.flatten.min + 1}
return new if new == ary
ary = new
end
end
def semidouble ary, op
ary.zip(ary.each_cons(2).map{|r1,r2|r1.zip(r2).map(&op)}).flatten(1).compact.transpose
end
def heightmap str
relax(semidouble(semidouble(semidouble(semidouble(pad(parse str),:max),:max),:min),:min))
end
def render heightmap
puts consmap2d(heightmap, 3){|sq|
next " " if sq[1][1] == -1
hwall = sq[0][1] == -1 || sq[2][1] == -1
vwall = sq[1][0] == -1 || sq[1][2] == -1
next "+" if hwall && vwall
next "-" if hwall
next "|" if vwall
next "+" if sq.flatten.min == -1
nws = sq[0][1] == sq[1][0]
nes = sq[0][1] == sq[1][2]
sws = sq[2][1] == sq[1][0]
ses = sq[2][1] == sq[1][2]
next "X" if nws && nes && sws && ses
next "V" if nws && nes
next "^" if sws && ses
next ">" if nws && sws
next "<" if nes && ses
next "/" if nes && sws
next "\\" if nws && ses
next " " if sq[0][1] != sq[2][1] || sq[1][0] != sq[1][2]
next "|" if sq[0][1] == sq[1][1]
next "-" if sq[1][0] == sq[1][1]
??
}.map(&:join)
end
render heightmap $<.read if __FILE__ == $0
*। অন্যথায় সম্ভবত এটি যথেষ্ট।
[[0,1,1],[1,0,1],[1,1,1]]বৈধ ইনপুট? (ইনপুটটির কোনও "গর্ত" নেই, তবে আত্ম-চৌরাস্তার কাছাকাছি একটি উদ্বেগজনক কোণ রয়েছে))