画一些山峰


33

编写一个程序或函数来绘制山脉,在该山脉中,每个随后的较大山峰都在前面的“后面”,并交替显示哪一侧。

这是山脉的大小 1

/\

这是山脉的大小 2

 /\
/\ \

这是山脉的大小 3

  /\
 / /\
/ /\ \

这是山脉的大小 4

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

这是山脉的大小 5

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

等等。

输入项

任何方便格式的一个正整数,n > 0

输出量

遵循上述规则,以ASCII艺术形式表示山脉。前导/尾随的换行符或其他空格是可选的,前提是这些峰正确排列。

规则

  • 完整的程序或功能都是可以接受的。如果是函数,则可以返回输出而不是打印输出。
  • 禁止出现标准漏洞
  • 这是因此所有常用的高尔夫规则都适用,并且最短的代码(以字节为单位)获胜。

Answers:


14

木炭,16字节

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

在线尝试!

怎么样?

Nλ将最大山的大小输入到中λFλ«ιfrom 0至的值运行循环λ-1。(该关闭»暗示在程序结束时。)

在循环内部,无需向后移动光标,即可P↘⁻λι计算λ-ι并绘制一条向东南方向延伸的直线。根据其方向,此行将由\字符组成。向西移动一步,并向西南↙¹绘制一条长度为1的线(由制成/)。最后,‖T→水平地反映图形,并适当地转换字符:\变为//变为\

在循环的开始处添加转储指令(试试看)可以使我们看到进度:

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

2
我想这是挑战的理想语言:-)
ETHproductions'Nov

@ETHproductions此语言是专为ASCII艺术而创建的。它还具有自己的代码页。
暴民埃里克

@EriktheGolfer我有自己的(未实现的)ASCII艺术语言,称为Crayon。这些文档目前有点丢失,因为我正在移动它们,但是您可以在此处看到大多数文档。我不知道蜡笔计划与木炭相比有多短……
ETHproductions 2016年

@ETHproductions您何时打算实施它?是否有一个聊天室,或者我可以做一个(称为“蜡笔实现”)?
暴民埃里克

@EriktheGolfer不幸的是,我不知道何时有时间实现它。但是,如果您愿意的话,您可以创建一个聊天室;-)
ETHproductions'Nov

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
    /\
   / /\
  / /\ \
 / / /\ \
/ / /\ \ \

逐行打印,通过基于当前n的奇偶校验在左边或右边交替添加斜杠来累积字符串s。带有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

Ruby,61个字节

ETHproductions的JavaScript答案相当简单。

->n{s="/\\"
(puts" "*n+s
s=n%2>0?s+" \\":"/ "+s)until 0>n-=1}

在repl.it上看到它: https

不打高尔夫球

->n{
  s = "/\\"
  ( puts " "*n+s
    s = n%2 > 0 ? s+" \\" : "/ "+s
  ) until 0 > n -= 1
}

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)

递归方法。for的形状n是通过在n-1形状的每行前面添加一个空格并取最后一行n-1"/ "在if n为奇数或if 为偶数" \"之后添加n...左右而生成的。当最终结果n为奇数时的所有递归步骤。因此,b传递一个标志,该标志交替每个递归调用,并确定是向左还是向右添加下一个山峰部分。


1
不能只bodd n每次比较而不是在开始时传递一个标志并在每次递归调用时翻转它吗?像f n = unlines(p 0 n)let m = p (1-b) (n-1)
尼尔

翻转到-b另一个字符。
xnor

@xnor感谢您的提示,但我发现了另一种打高尔夫球的方法,该方法需要b01
Laikoni '16

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。不过,您可以2个字节打高尔夫球:n%2n--%2和都--nn。编辑:还有1个通过添加,x=s+"\n"和更改两个都s+"\n"为1 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()在不同的编译器中可能具有不同的原型名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.