ASCII art 3D StreetView


29

Входные данные:

  1. Вы получаете серию целых чисел (подается через стандартный ввод или приглашение).
  2. Каждая пара целых чисел в этой серии представляет ШИРИНУ здания [допустимый диапазон: 1..10] и ВЫСОТУ [допустимый диапазон: 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. Наш вид (ахум) ~ 3D, поэтому соседние здания могут скрывать части других. Здания «логически» отображаются слева направо.

  2. Первому зданию предшествуют два пробела слева.

  3. Вы визуализируете каждое здание, применяя ШИРИНУ и ВЫСОТУ к размерам базового куба (посмотрите на предоставленный пример вывода!). Для справки: количество символов слева от правой «стены» (для здания с W> 1): (W * 5) - (W-1).

  4. Здания с высотой> 0 имеют ОДНУЮ дверь (которая изображена персонажем oи расположена в двух символах от «левой» стены в «нижнем» ряду).

Дорога:

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

Победители:

Это код-гольф! Победителем становится участник конкурса с самым коротким решением (по количеству исходного кода). Источник должен состоять исключительно из печатных символов ASCII. Повеселись!

Воображаемые бонусные баллы для (случайных) окон, автомобилей или пешеходов.

Не стесняйтесь комментировать, если спецификации не ясны!


@ пользователь неизвестен: в правилах действительно была небольшая опечатка. Должно быть исправлено сейчас, спасибо!
ChristopheD

Конечный пробел разрешен? Кажется, у вас есть некоторые в примере, так что я предполагаю, что так.
Питер Тейлор

@ Питер Тейлор: разрешены пробелы в конце.
ChristopheD

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

Похоже, что допустимый диапазон высоты на самом деле [ 0 ..10]. И что вы подразумеваете под but you must not enforce this3)? ИМО, любое предположение доступно для использования, если оно увеличивает ваш счет. Поэтому я могу написать код, который работает , только если общая ширина меньше 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.