এএসসিআইআই-তে হিপ ছাদের উপরের-নীচের দৃশ্যটি রেন্ডার করুন


23

প্রথমত, কিছু পরিভাষা ( উত্স ):

  • একটি নিতম্বের ছাদটি (উইকিপিডিয়াকে উদ্ধৃত করে) "এক ধরণের ছাদ যেখানে সমস্ত দিক দেয়ালের দিকে নীচে 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 

1
আপনার আরও পরীক্ষার কেস যুক্ত করা উচিত।
mbomb007

@ mbomb007 যোগ করা হয়েছে। তারা যে জায়গা নিয়েছে তা দিয়েছি - আমি কি আরও যুক্ত করব?
জন ডিভোরাক

@ জনডভোরাক সম্ভবত পরীক্ষার কেস যুক্ত করতে পারে *। অন্যথায় সম্ভবত এটি যথেষ্ট।
mbomb007

কি [[0,1,1],[1,0,1],[1,1,1]]বৈধ ইনপুট? (ইনপুটটির কোনও "গর্ত" নেই, তবে আত্ম-চৌরাস্তার কাছাকাছি একটি উদ্বেগজনক কোণ রয়েছে))
লিন

@ লিন আপনাকে সে ক্ষেত্রে উদ্বিগ্ন হওয়ার দরকার নেই, এটি বৈধ ইনপুট নয়। আপনি যে কোণটির উল্লেখ করেছেন তাতে স্ব-ছেদ করা সীমানা হিসাবে গণনা করা হয় (বা বরং, একটি বাঁক নয় যে একটি সীমানা)।
জন ডিভোরাক

উত্তর:


11

পাইথন 2, 500 বাইট

z=input()
W=4*len(z[0])+1
H=4*len(z)+1
R=range
s=[-~W*[0]for _ in R(-~H)]
for y in R(H/4):
 for x in R(W/4):
        for h in R(25):s[y*4+h%5][x*4+h/5]|=z[y][x]
F=[(x/3-1,x%3-1)for x in[1,7,3,5,0,6,8,2]]
exec'for y in R(H):\n for x in R(W):s[y][x]+=0<s[y][x]<=min(s[y+d][x+e]for(e,d)in F)\n'*H
for y in R(H):
 l=''
 for x in R(W):h=s[y][x];a=[s[y+d][x+e]for(e,d)in F[:4]];l+=r' XabcVde^f ||g>h\\+//+<<jk<l//+\\+>>m --^^oVVqrX'[h and int(''.join(`int(n==h)`for n in a),2)*3+((h==1)*2or max(a)==h)+1]
 print l

এটিকে গলফ করতে করতে ক্লান্ত হয়ে পড়েছিলাম এবং আমি একটি দুর্দান্ত গোল পেয়েছি, তাই এটি এখানে।

আট-স্পেস ইন্ডেন্টেশন একটি ট্যাব।

STDIN এর উপর বাইনারি ম্যাট্রিক্স পাস করুন, এর মতো:

python2.7 roof.py <<<"[[1,1,0,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0], [1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,0], [0,0,0,0,1,1,0,1,1,1,1,1,0,0,1,1,1,1,1,0], [1,0,1,0,0,1,0,0,1,1,1,0,0,1,1,1,0,1,1,1], [1,0,1,1,1,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0]]"

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