Намалюйте кілька гірських вершин


33

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

Це гірський масив розмірів 1

/\

Це гірський масив розмірів 2

 /\
/\ \

Це гірський масив розмірів 3

  /\
 / /\
/ /\ \

Це гірський масив розмірів 4

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

Це гірський масив розмірів 5

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

І так далі.

Вхідні дані

Один натуральне число в будь-якому зручному форматі , n > 0.

Вихідні дані

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

Правила

  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Стандартні лазівки заборонені.
  • Це тому діють усі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Відповіді:


14

Вугілля деревне , 16 байт

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

Спробуйте в Інтернеті!

Як?

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

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

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

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

2
Я думаю, це ідеальна мова для виклику :-)
ETHproductions

@ETHproductions Ця мова створена спеціально для мистецтва ASCII. У нього також є своя кодова сторінка.
Erik the Outgolfer

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

@ETHproductions Коли ви збираєтесь його реалізувати? Чи є для нього балачка чи я можу зробити її (називається "Реалізація олівця")?
Ерік Аутгольфер

@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.
Лайконі

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;}

Безумовно

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. Ви можете n%2грати в гольф на 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.