Python 3,5 - 262 236 220 байт:
-16 байт завдяки @CatsAreFluffy! Моя вся функція тепер може нарешті бути в одному рядку! :)
from collections import*
def a(v):o=OrderedDict;j=[chr(i+97)for i in range(26)];d=o((j[i],(' '+'_'*(i+1)+'\n'+j[i]+'|'+'_'*(i+1)+'|'))for i in range(26));f=lambda w:'a'[w:]or f(w-1)+j[w]+f(w-1);[print(d[g])for g in f(v)]
Це може бути трохи довгим, і він може друкувати нові рядки між будівлею, але виконувати все, що потрібно. Ви можете перевірити це самостійно, щоб підтвердити.
Редагувати:
Мій попередній код для гольфу не надрукував потрібного малюнка. Однак зараз показане вище, і це, на мій погляд, робить це добре. Ви також можете запустити це для себе, щоб підтвердити це.
Примітка: . Програма друкує всі малі літери позаду кожної "будівлі". Я сподіваюся, що це нормально.
Невикористана версія з поясненням:
from collections import*
def a(v):
o=OrderedDict # Assign the OrderedSict function to "o"
j=[chr(i+97)for i in range(26)] # Create a list with all 26 lowercase letters of the alphabet
d=o((j[i],(' '+'_'*(i+1)+'\n'+j[i]+'|'+'_'*(i+1)+'|'))for i in range(26)) # Create a dict assigning each letter it's corresponding building with its corresponding length
f=lambda w:'a'[w:]or f(w-1)+j[w]+f(w-1) # Return the ABACABA sequence based on the user input
[print(d[g])for g in f(v)] # Print out the building according to the sequence returned by the above lambda function (thanks to @CatsAreFluffy for this method to print it! :) )
В основному те, що я роблю, - це спочатку імпортувати впорядкований словник модуля колекції, а потім створити впорядкований словник, при цьому кожна літера з нижнього регістру у списку "j" присвоюється відповідній будівлі з відповідною довжиною в підкресленнях. Потім я обчислюю послідовність, спираючись на введення користувача, використовуючи f=lambda w:"a"[w:]or f(w-1)+j[w]+f(w-1)
функцію, а потім на основі послідовності, повернутої цим, будівлі з кожним відповідним буквою за ним роздруковуються.