Нарисуйте несколько горных вершин


33

Напишите программу или функцию, которая рисует горный хребет, где каждая последующая большая горная вершина находится «позади» впереди, и чередует, какая сторона видна.

Это горный массив размера 1

/\

Это горный массив размера 2

 /\
/\ \

Это горный массив размера 3

  /\
 / /\
/ /\ \

Это горный массив размера 4

   /\
  /\ \
 / /\ \
/ /\ \ \

Это горный массив размера 5

    /\
   / /\
  / /\ \
 / / /\ \
/ / /\ \ \

И так далее.

вход

Один положительное целое число в любом удобном формате , n > 0.

Выход

ASCII-арт-представление горного хребта, следуя приведенным выше правилам. Начальные / конечные новые строки или другие пробелы являются необязательными, при условии, что пики выстраиваются соответствующим образом.

правила

  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Ответы:


14

Древесный уголь , 16 байт

NλFλ«P↘⁻λι←↙¹‖T→

Попробуйте онлайн!

Как?

Nλвводит размер самой большой горы в λ. Fλ«запускает цикл над значениями ιиз 0сквозного λ-1. (Закрытие »подразумевается в конце программы.)

Внутри цикла P↘⁻λιвычисляет λ-ιи рисует, не перемещая курсор впоследствии, линию этой длины, идущую на юго-восток. В зависимости от направления эта строка будет состоять из \символов. перемещается на один шаг к западу и ↙¹рисует линию длиной 1, идущую на юго-запад (сделанную из /). Наконец, ‖T→горизонтальное отражение чертежа, преобразование символов по мере необходимости: \становится /и /становится \.

Добавление инструкции dump в начале цикла ( попробуйте ) позволяет нам увидеть прогресс:

    /\
   /  
  /   
 /    
/     
    /\    
   /\ \   
  /    \  
 /      \ 
/        \
    /\    
   / /\   
  / /\ \  
 / /    \ 
/ /      \
    /\    
   /\ \   
  / /\ \  
 / /\ \ \ 
/ /    \ \
    /\    
   / /\   
  / /\ \  
 / / /\ \ 
/ / /\ \ \

2
Я думаю, что это идеальный язык для испытания :-)
ETHproductions

@ETHproductions Этот язык создан специально для ASCII-искусства. Он также имеет свою собственную кодовую страницу.
Эрик Outgolfer

@EriktheGolfer У меня есть свой собственный (не реализованный) язык ASCII, называемый Crayon . Документы сейчас немного потеряны, потому что я нахожусь в процессе их перемещения, но большинство из них вы можете увидеть здесь . Интересно, насколько короткой будет программа Crayon для этого по сравнению с
углем

@ETHproductions Когда вы собираетесь это реализовать? Существует ли для этого чат или я могу создать его (он называется «Реализация карандашом»)?
Эрик Outgolfer

@EriktheGolfer К сожалению, я не знаю, когда у меня будет время для его реализации. Но вы можете создать чат, если хотите ;-)
ETHproductions

7

JavaScript (ES6), 75 байт

for(n=prompt(s="/\\");n--;s=n%2?s+' \\':'/ '+s)console.log(" ".repeat(n)+s)

Полная программа в настоящее время немного короче рекурсивной функции:

f=n=>n?" ".repeat(--n)+`/\\
`+f(n).replace(/\S.+/g,x=>n%2?x+" \\":"/ "+x):""

6

Python 2, 67 байт

n=input()
s='/\\'
while n:n-=1;print' '*n+s;s=['/ '+s,s+' \\'][n%2]

Печатает построчно, накапливая строку s, поочередно добавляя косую черту влево или вправо в зависимости от текущей четности n. Префиксы с nпробелами.

Альтернативный способ обновления был такой же длины:

s=n%2*'/ '+s+~n%2*' \\'
s=['/ '+s,s+' \\'][n%2]

Рекурсивный метод был длиннее (70 байт).

f=lambda n,s='/\\':n*'_'and' '*~-n+s+'\n'+f(n-1,[s+' \\','/ '+s][n%2])

6

Haskell, 77 байт

0%_=""
n%s=(' '<$[2..n])++s++'\n':(n-1)%(cycle[s++" \\","/ "++s]!!n)
(%"/\\")

Использование:

putStrLn $ f 5
    /\
   / /\
  / /\ \
 / / /\ \
/ / /\ \ \

Печатает построчно, накапливая строку s, попеременно добавляя косую черту влево или вправо в зависимости от текущей четности n. Префиксы с n-1 пробелами.


5

Пакетный, 202 байта

@echo off
set/af=%1^&1
set m=/\
set s=
for /l %%i in (2,1,%1)do call set s= %%s%%
for /l %%i in (2,1,%1)do call:l
:l
echo %s%%m%
set s=%s:~1%
set/af^^=1
if %f%==1 (set m=%m% \)else set m=/ %m%

Принимает ввод в качестве параметра командной строки. Не удается выполнить последний цикл.


@TimmyD Извините, я опечатал во время игры в гольф. Исправлено сейчас.
Нил


5

Haskell, 117 107 105 97 90 байт

b!1=["/\\"]
b!n|m<-(1-b)!(n-1)=map(' ':)m++[[("/ "++),(++" \\")]!!b$last m]
(unlines.(1!))

Попробуйте это на Ideone. Изменить: Сохранено 8 байтов с идеей от Нила.

Безголовая версия:

p b 1 = ["/\\"]
p b n = let m = p (1-b) (n-1)
            k = last m
            r = map (' ':) m
        in if b == 1
           then r ++ [k ++ " \\"]
           else r ++ ["/ " ++ k]
f n = unlines(p 1 n)

Рекурсивный подход. Форма для nгенерируется путем добавления пробела перед каждой строкой n-1формы и взятия последней строки n-1и добавления "/ "перед, если nнечетное, или " \"после, если nчетное ... или так я думал, прежде чем заметить, что этот последний шаг обращен для все рекурсивные шаги, когда финал nнечетный. Поэтому bпередается флаг, который чередует каждый рекурсивный вызов и определяет, будет ли следующая горная часть добавлена ​​влево или вправо.


1
Вместо того, чтобы сравнивать bс odd nкаждым разом, вы не можете просто передать флаг в начале и перевернуть его при каждом рекурсивном вызове? Нечто подобное f n = unlines(p 0 n)и let m = p (1-b) (n-1).
Нил

Переключение на -bеще один символ выключен.
xnor

@xnor Спасибо за подсказку, но я нашел другой способ сыграть в гольф дальше, который должен bбыть 0или 1.
Laikoni

2

Java 7,130 байт

String f(int n,String s){String l="";for(int i=1;i++<n;l+=" ");return n>1?n%2<1?l+s+"\n"+f(--n,s+" \\"):l+s+"\n"+f(--n,"/ "+s):s;}

Ungolfed

class Mountain {
 public static void main(String[] args) {
    System.out.println(f( 5 , "/\\" ) );
  }
 static String f(int n,String s){
    String l = "";
    for (int i = 1; i++ < n; l += " ") ;
      return n > 1? n % 2 < 1?l + s + "\n" + f(--n , s + " \\")
                           :l + s + "\n" + f(--n , "/ " + s)
                            :s;
    }

}

Хороший ответ, +1. Вы можете играть в гольф его на 2 байта , хотя: n%2до n--%2и как --nк n. EDIT: А 1 больше , путем добавления ,x=s+"\n"и изменения как s+"\n"в x. (Итого: String f(int n,String s){String l="",x=s+"\n";for(int i=1;i++<n;l+=" ");return n>1?n--%2<1?l+x+f(n,s+" \\"):l+x+f(n,"/ "+s):s;} 127 байт )
Кевин Круйссен,

0

C ++ 138 (функция)

Функция: -

#define c(X) cout<<X;
#define L(X,Y) for(X=0;X<Y;X++)  

void M(int h){int l=1,r=1,j,H=h,i;L(i,h){for(j=H;j>0;j--)c(" ")L(j,l)c(" /")L(j, r)c("\\ ")c("\ n")(h%2)?(i%2)?r++:l++:(i%2)?l++:r++;H--;}  

Полная программа: -

#include<conio.h>
#include<iostream>

using namespace std;

#define c(X) cout<<X;
#define L(X,Y) for(X=0;X<Y;X++)

void M(int h)
{
    int l=1,r=1,j,H=h,i;

    L(i, h)
    {
        for (j = H;j > 0;j--)
            c(" ")
        L(j, l)
            c(" /")
        L(j, r)
            c("\\ ")
        c("\n")

        (h % 2) ? (i % 2) ? r++ : l++ :(i % 2) ? l++ : r++;
        H--;
    }
}

int main()
{
    int h;
    cin >> h;
    M(h);
    _getch();
    return 0;
}  

ПРИМЕЧАНИЕ: функция _getch()может иметь разные имена прототипов в разных компиляторах.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.