Вот 3-й город АБАКАБА:
_
A|_|
B|__|
A|_|_
C|___|
A|_|
B|__|
A|_|
Он состоит из последовательности ABACABA , которая в основном:
- A (1-я итерация)
- место B - AB
- повторить A - ABA (2-я итерация)
- Место C - ABAC
- Повторите ABA - ABACABA (3-я итерация)
и вы поняли идею
Здания имеют высоту (соответствует номеру подчеркивания), равную буквам, преобразованным в числа как A = 1, B = 2 и т. Д.
вход
Итерация номер 1 <= n <= 26.
Выход
ABACABA город порядка n , включая буквы в начале строк.
Ответы:
Python 2, 82 байта
Я заметил, что никто не опубликовал метод бинарной рекурсии и решил попробовать его ... и теперь с помощью трюка, заимствованного у Sherlock9, это самый короткий ответ на языке Python! (Кроме того, спасибо xnor за еще одно сокращение.) (А затем Деннис, который побрил еще немного ...)
Ungolfed:
источник
s
, и делая вторую строку анон-функцией:f=lambda n:n*"?"and f(n-1)+"_"*(n-2)+"\n%c|%s|"%(64+n,"_"*n)+f(n-1);lambda n:" _"+f(n)
f=lambda n,s=1:n*"_"and" _"*s+f(n-1,0)+"_"*(n-2)+"\n%c|%s|"%(64+n,"_"*n)+f(n-1,0)
должен работать.Python 2, 99 байт
Чтобы найти
i
номер последовательности ABACABA, запишитеi
в двоичном виде, посчитайте количество конечных нулей и добавьте один. Мы используем классический битовый трюк,i&-i
чтобы найти наибольшую степень2
этого деленияi
, а затем вычисляем битовую длину. На самом деле, мы отсчитываемi
от2**n-1
до0
, что нормально, потому что последовательность ABACABA симметрична.Мы отслеживаем как текущий, так и последний номер последовательности с помощью «предыдущей» переменной
b
. Это говорит нам, сколько подчеркиваний нужно напечатать как «свес». Окончательное здание рисуется правильно, без навеса, так0
как оно имеет длину в битах1
.Формат строки для печати взят из Sp3000 , так же как и уловка
input
для печати первой строки.источник
MATL , 59 байт
Используется текущий выпуск (15.0.0) языка.
Попробуйте онлайн!
(Если буквы не нужно было включать в вывод: сработало бы следующее, 48 байт):
объяснение
источник
CJam,
3735 байтЭто итеративная реализация рекурсивного алгоритма из ответа @ quintopia .
Попробуйте онлайн!
Как это устроено
источник
JavaScript (ES6), 162 байта
Где
\n
буквальный символ новой строки.источник
\n
в конце, если кому-то было интересно.Python 2,
123121 байтссылка идеона (-2 байта благодаря @xsot)
f
генерирует последовательность ABACABA в виде списка чисел, напримерf(3) = [1, 2, 1, 3, 1, 2, 1]
. Смещение входного значения на 1 по сравнению с проблемой последовательности ABACABA позволяет нам сыграть в байтеf
.Первая строка печатается отдельно, после чего все остальные строки печатаются с использованием выражения, которое учитывает текущий номер и следующий номер. Просто для удовольствия, первая строка печатается с использованием
input()
.источник
[0]
наL
.Pyth -
6462 байтаВероятно, можно было бы играть в гольф больше, но пока достаточно.
Попробуй это здесь!
Объяснение:
источник
Python 3,5 -
262236220 байт:-16 байт благодаря @CatsAreFluffy! Вся моя функция теперь, наконец, может быть в одной строке! :)
Он может быть немного длинным, и он может печатать новые строки между строками, но делает то, что ему нужно. Вы можете проверить это самостоятельно, чтобы подтвердить это.РЕДАКТИРОВАТЬ:
Мой предыдущий гольф-код не печатал правильный образец вообще. Тем не менее, теперь показанный выше, и это хорошо, на мой взгляд. Вы также можете запустить его для себя, чтобы подтвердить это.
Примечание . Программа печатает все строчные буквы за каждым «зданием». Я надеюсь, что все в порядке.
Ungolfed версия с объяснением:
По сути, я сначала импортирую функцию упорядоченного словаря модуля коллекций, а затем создаю упорядоченный словарь, в котором каждой строчной букве в списке «j» назначается соответствующее здание с соответствующей длиной в подчеркиваниях. Затем я вычисляю последовательность, основываясь на вводе пользователем, используя
f=lambda w:"a"[w:]or f(w-1)+j[w]+f(w-1)
функцию, а затем на основе последовательности, возвращаемой этим, здания, с соответствующей буквой за ними, распечатываются.источник
OrderedDict
какo
вместо? И измененияop
вp
иitem
вj
тоже работает.if
(все входы 1≤v≤26), изменитьrange(26)
наrange(v)
и использоватьreturn"\n".join(f(v))
вместоfor
.from collections import*
иo=OrderedDict
вместоfrom collections import OrderedDict as o
range(26)
кrange(v)
результатам вIndex Error
. Кроме того, выполнениеreturn"\n".join(f(v))
вернет ТОЛЬКО последовательность, но не сами здания. В остальном ваши советы были довольно хорошими. Благодарность! :)Рубин, 129 байт
Анонимная функция, возвращает многострочную строку.
источник
JavaScript (ES6), 143
Есть 2 символа новой строки внутри обратных кавычек, которые являются значительными и учитываются.
... или 138, если буквы могут быть строчными.
Меньше гольфа
Тестовое задание
источник
Powershell, 67 байт
источник