ASCII мистецтво 3D StreetView


29

Вхід:

  1. Ви отримуєте серію цілих чисел (подається за допомогою stdin або prompt).
  2. Кожна пара цілих чисел у цій серії представляє WIDTH будівлі [дійсний діапазон: 1..10] та HEIGHT [дійсний діапазон: 0..10]
  3. Припустимо, що вклад буде добре сформований.

Зразок введення (другий рядок призначений лише для демонстрації):

1 2 1 1 1 0 2 4 1 3 1 2 2 1
WHWHWHWHWHWHWH

Відповідний вихідний зразок:

                 ______
               / ______ / |
              | | | __
              | | / __ / |
     __ | | | | __
   / __ / | | | | / __ / |  
  | | | __ | | | | | ______
  | | / __ / | | | | | / ______ / |
  | | | | _ | | | | | |
  | _o_ | _o_ | / __ | _o _____ | _o_ | _o_ | _o _____ | /
  -------------------------------------  
 - - - - - - - - - - - - - 
-------------------------------------

Правила:

Будинки

  1. Базовий будівельний блок виглядає приблизно так (1 Вт, 1 год)
   __
 / __ / | (базовий куб запозичений із запитання в цьому питанні:
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. Ми вважаємо, що (ahum) ~ 3D, тому сусідні будівлі можуть приховувати частини інших. Будинки "логічно" відображаються зліва направо.

  2. Першій будівлі передують два пробіли зліва.

  3. Ви візуалізуєте кожну будівлю, застосувавши ШІРНУ І ВИСОКУ до розмірів базового куба (подивіться на представлений зразок!). Для довідки: кількість символів зліва направо 'стіна' (для будівлі з W> 1): (W * 5) - (W-1).

  4. Будинки з висотою> 0 мають ОДНУ двері (яка зображена символом oі розташована на двох символах від "лівої" стіни на "нижньому" ряду).

Дорога:

  1. Дорога складається з трьох частин, які ми будемо називати "вгорі", "середини" та "знизу".
  2. "Верхня" частина та "нижня" частина однакові, крім того, що "верхній" частині передують два пробіли.
  3. Середній частині передує один пробіл і складається з повторення наступного шаблону:
    '-'
  4. Довжина визначається загальною шириною об'єднаних будівель: найправіша частина дороги відповідає положенню «правої» стіни «останньої» будівлі.

Переможці:

Це код-гольф! Переможець - учасник відбору, який має найкоротше рішення (за кількістю вихідних кодів). Джерело має складатися виключно з друкованих символів ASCII. Веселіться!

Уявні бонусні бали за (випадкові) вікна, машини чи пішоходів.

Не соромтеся коментувати, якщо технічні характеристики не зрозумілі!


@user невідомо: в правилах справді була невелика помилка друку. Слід виправити зараз, дякую!
ChristopheD

Дозвільний пробіл дозволений? У вас, здається, є щось у прикладі, тому я так припускаю.
Пітер Тейлор

@ Peter Taylor: пробіл пробілів дозволений.
ChristopheD

Дорога частина 3, це має бути '-  '(з двома пробілами)? Редагувати : Ах, два пробіли не відображаються: P. Ви можете відобразити кілька пробілів, використовуючи ASCII 255 (нерозривний пробіл, ALT + 255 на numpad) або скопіювавши та вставивши з мого коментаря тут. Орр ... замість цього ви можете просто сказати, що це повторення ' - ':)
mellamokb

Схоже, дійсний діапазон висоти насправді [ 0 ..10]. Також що ви маєте на увазі під but you must not enforce this3)? IMO, будь-яке припущення може бути використане, якщо воно збільшує ваш результат. Тож я можу написати код, який працює лише в тому випадку, якщо загальна ширина менше 80, якщо я можу витіснити нижчу кількість символів. Наприклад, виведення запису в масив буфера дисплея шириною 80, тому він вийде з ладу на будь-яку більшу загальну ширину. Якщо ви хочете, щоб будь-яка ширина підтримувалась, тоді не давайте припущення - ви не можете мати обох: P
mellamokb

Відповіді:


10

Хаскелл, 396 символів

w&h=take h((3," /|"++(w-3)#'_'++"o_|"):c[(3,"| |"++(w-1)#s++"|")])++[(2,"|/ "++(w-2)#'_'++"/"),(0,"  "++(w-2)#'_')]++c[(0,w#s)]
p(w,h)=r.z take[sum w+k|k<-[1..]]$([c"-",s:c"-  ","  "++c"-"]++).map r.foldl(z(%))((2+maximum h)#(5#s))$z(&)w h
main=interact$unlines.p.q.map read.words;y%(d,x)=x++drop d y;q(x:y:z)=(4*x:a,2*y:b)where(a,b)=q z
q x=(x,x);(#)=replicate;c=cycle;r=reverse;z=zipWith;s=' '

Приклад виводу:

$ runghc Streetview.hs <<< "1 1 1 3 1 2 1 0 2 4 2 2 1 3 3 1"
                     ______                          
                   /______ /|                        
         __       |       | |        __              
       /__ /|     |       | |      /__ /|            
      |   | |__   |       | |_____|   | |            
      |   |/__ /| |       |/______|   | |            
     _|   |   | | |       |       |   | |__________  
   /__|   |   | | |       |       |   |/__________ /|
  |   |   |   | |_|       |       |   |           | |
  |_o_|_o_|_o_|/__|_o_____|_o_____|_o_|_o_________|/
  -------------------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------------------

5
+1 Ваші нещодавні публікації про haskell на codegolf.se викликали інтерес у мене, щоб дізнатися більше про haskell. Короткі, наскільки рішення можуть бути, вони все ще залишаються досить "читабельними".
ChristopheD

8

Пітон, 415 символів

I=eval(raw_input().replace(' ',','))
X=I[::2]
Y=I[1::2]
W=4*sum(X)+6
H=2*max(Y)+2
A=W*H*[' ']
p=W*H-W+2
for w,h in zip(X,Y):i=2*h;j=4*w;q=p-i*W;r=p+j;s=q+j;A[p+1:q+1:-W]=A[p+2:q+2:-W]=i*' ';A[p:q:-W]=A[r:s:-W]=A[r+2-W:s+2-W:-W]=i*'|';A[p+1:r]='_'*(j-1);A[q+2:s]=A[q+3-W:s+1-W]='_'*(j-2);A[q+1]=A[s+1]=A[r+1]='/';A[p+2]='_o'[h>0]; p+=j
A[W-1::W]='\n'*H
D=(W-5)*'-'
print''.join(A)+'  '+D+'\n'+(' - '*W)[:W-4]+'\n'+D

Використовують скибочки, щоб намалювати всі частини будівлі.

$ echo "1 2 1 1 1 0 2 4 1 3 1 5 2 1" | ./streetview.py 
                             __          
                           /__ /|        
                 ______   |   | |        
               /______ /| |   | |        
              |       | |_|   | |        
              |       |/__|   | |        
     __       |       |   |   | |        
   /__ /|     |       |   |   | |        
  |   | |__   |       |   |   | |______  
  |   |/__ /| |       |   |   |/______ /|
  |   |   | |_|       |   |   |       | |
  |_o_|_o_|/__|_o_____|_o_|_o_|_o_____|/ 
  -------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------

+1 Дуже приємно. Рішення виглядає вже досить гольф ;-)
ChristopheD

2
На `p + = j` є один втрачений пробіл (@ кінець довгого рядка). Не впевнений, чи порахували ви це ;-)
ChristopheD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.