Вдохновленная тайлингом Фибоначчи , эта проблема заключается в создании искусства ASCII, представляющего другую известную комбинаторную последовательность.
Горы диаграмма п шагов является рисунком горного массива, используя именно п «/» и п «\» символов, таким образом, что символы набросать непрерывные кривые , которая никогда не опускается ниже своей первоначальной «высоты». Например,
/\/\
/\/ \
и
/\
/\/ \/\
обе 4-ступенчатые горные диаграммы, но
/\ /\/\
\/
не является.
вход
Программа должна принимать целое число n из стандартного ввода или в качестве параметра функции.
Выход
Распечатайте все n- ступенчатые горные диаграммы на стандартный вывод. Диаграммы могут быть в любом порядке, но должны быть разделены пробелами. Вы можете решить, будут ли разные диаграммы выводиться по горизонтали, вертикали и т. Д.
Как и в случае с мозаикой домино, вы можете использовать любой пробел по своему усмотрению. Это включает в себя дополнительные переводы строки до или после вывода на печать.
пример
Некоторые примеры действительных выходов для n = 3:
Допустимый выход A:
/\
/\ /\ / \ /\/\
/\/\/\ / \/\ /\/ \ / \ / \
Допустимый выход B:
/\
/\/ \
/\/\
/ \
/\/\/\
/\
/ \
/ \
/\
/ \/\
Допустимый выход C:
/\
/ \ /\
/ \ /\/ \
/\/\
/\ / \
/ \/\ /\/\/\
Это код гольф; самая короткая программа (в байтах) побеждает.
источник
Ответы:
Python 2: 151 символ
Вау, это беспорядок.
Первая идея состоит в том, чтобы использовать числа
0 to 2**N-1
для кодирования всех последовательностейN
восходящих и нисходящих движений в своих битах. Мы читаем эти биты один за другим, повторяя%2
и/2
вexec
цикле.Мы храним бегущий горный хребет сбоку в транспонированном списке строк
L
. Каждый раз, мы генерируем новую строку пробелов, заменяем одну пробел в новой строке/
или в\
зависимости от того, произошло ли движение вверх или вниз.Индекс этого пространства -
c
пробелы с конца, гдеc
- высота бега. Если сделать это спереди, горы перевернутся с ног на голову. Далее мы сдвигаем его,b
чтобы выровнять движения вверх и вниз, получая[b-c]
. Начинаяc
с 1, а не с 0, исправляется ошибка «один за другим».Чтобы исключить случаи, когда
c
провалы ниже начального значения1
, когда это происходит, мы устанавливаемi
значение0
, которое заставляет все дальнейшие движения быть нисходящими, делая ихc
более отрицательными. Затем, когда мы проверяем,c
закончился ли он при1
, мы также проверяем,c
опустился ли когда-либо ниже этого уровня. Мы толькоprint
горный хребет, еслиc
есть1
.Для печати мы делаем
zip(*L)
чтобы транспонировать диапазон от вертикального до горизонтального, и печатать каждую объединенную строку. В этом ответе много трудностей, связанных с тем, что Python рассматривает строки как неизменяемые, поэтому мы работали с ними как со списками символов и только объединяли их в строки для печати.Спасибо @flornquake за помощь и улучшения.
источник
' '
вместо," "
если вы хотите использовать циклexec
. :) Кстати, вам не нужно избегать обратной косой черты.' '
и попытался заменить строку на кавычки переменной для нее. Это все еще давало индекс вне диапазона:for _ in[0]*N:exec("b=i%2;c+=2*b-1;L+=[[" "]*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
exec("b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
, то есть внутренние кавычки должны отличаться от внешних.APL (88)
Выход для
n=3
:Объяснение:
(N/2)⊤⍳2*N←2×⍵
: получить битовое поле для каждого числа от0
до2^⍵
.Z←↓⍉¯1+2×
: умножить на 2 и вычесть 1, отдавая1
вверх и-1
вниз. Сохраните вектор векторов, каждый из которых содержит представление для одного числа, вZ
.{
...}¨Z
: для каждого элементаZ
:∧/0≤+\⍵
: проверьте, что текущая сумма никогда не падает ниже0
(не уровня земли),(0=+/⍵)
: и что общая сумма равна0
(заканчивается на уровне земли).{
...}¨Z/⍨
: выберите те элементы,Z
для которых это верно. Для каждого из них:K←(⍵≠1)++\⍵
: найдите высоту для каждого символа и сохраните вK
. Поднимите каждую\
из них так, чтобы они соответствовали букве/
s. Это делает высоту земли1
.¯1+2×K=⊂⌽⍳⌈/K
: для каждого столбца составьте список[1..max(K)]
и отметьте положение символа в этом столбце,1
а остальные как-1
. (Репликация -1 заполняет эту позицию пробелом.)'\/'[1+⍵=1]/⍨¨
: найдите правильный символ для каждого столбца и скопируйте его по списку для этого столбца.⍉↑
: превратить результат в матрицу и поместить его правой стороной вверхисточник
Python,
261241236 символовЭто начинает занимать время для
n=5
и ...источник
JavaScript (ES6) 159
163Так же, как и мой ответ на Tiling Fibonacci Domino, я проверяю все последовательности из n + n битов, где 1 обозначает «/», а 0 - «\» (только для вывода, «2» позже добавляется для обозначения новой строки) , При построении шаблона ascii я проверяю баланс - те же числа 0 и 1 и никогда не опускаюсь ниже начальной базовой линии - и выводю то, что подчиняется правилам.
Вывод осуществляется с помощью 'alert', это стандартно для JS codegolf, но довольно раздражает и, возможно, противоречит правилам. При использовании console.log количество символов увеличивается до 165.
Меньше гольфа
Тест в консоли FireFox / FireBug.
Выход
источник
-b-b
а-n-n
не-2*b
?2*b+1
->b-~b
)CJam, 84 байта
Обратите внимание, что эта программа печатает горы в бесконечном цикле, поэтому онлайн-переводчик вам не поможет; вызывать из командной строки, используя
или попробовать онлайн использование
и просто несколько раз подряд нажмите кнопку запуска и представьте, что результат объединен.
Основная идея состоит в том, что мы знаем, что горный массив размером Q имеет Q каждого восходящего и нисходящего переходов.
Затем, если он действителен, мы печатаем его, если нет - извлекаем его из стека, чтобы он не переполнялся.
Маршрутизация печати в основном строит каждый столбец как пробел Q - высота, затем символ, затем достаточно места, чтобы набрать всего Q + 1 символов, и затем мы транспонируем и печатаем строки с новой строкой между ними.
источник
С, 179
исключая ненужные пробелы.
Стратегия, аналогичная edc65. Я пробегаю все
n*2
двоичные значения -бит, учитывая/
= 1 и\
= 0.Я форматирую одну строку, содержащую
n
разрывы строк для каждогоn*3
символа. Как написано, строка содержит 1000 символов, поэтому после горы обычно печатается много пробелов. (Это можно исправить, добавивs[n*n*3]=0
передputs
.) В любом случае, это позволяет мне выводить целую гору сингломputs
после проверки соответствия правилам.Я постараюсь преобразовать его в функцию и
for
позже свести к одному циклу.Вывод (обратите внимание на огромное количество пробелов справа)
источник
Haskell, 140 байт
После того, как несколько попыток оказались не очень удачными, я закончил с реализацией на Haskell. Я счастлив просто быть в 2 раза от решения APL!
Гольф решение:
Развернулся и прокомментировал:
Программа рекурсивно строит множество n- ступенчатых диаграмм гор. Каждая диаграмма представлена списком бесконечно длинных струн, представляющих гору, нарисованную вбок, за которой следуют пробелы, простирающиеся до бесконечности. Это гарантирует, что все диаграммы имеют одинаковую высоту, что облегчает рекурсию. Горный принтер принимает параметр, который ограничивает высоту до конечного значения.
Пример использования:
источник
GolfScript 103 ( демо )
Программа принимает целочисленный параметр и пытается отобразить как горы все двоичные представления чисел от 0 до 2 ^ (n-1). Он не отображает недопустимые комбинации (например, те, которые идут ниже уровня 0).
источник