山頂を描く


33

山の範囲を描くプログラムまたは関数を作成します。後続の大きな山のピークはそれぞれ、前の山の「背後」にあり、どちらの側が見えるかを交互に切り替えます。

これは山岳地帯の大きさです 1

/\

これは山岳地帯の大きさです 2

 /\
/\ \

これは山岳地帯の大きさです 3

  /\
 / /\
/ /\ \

これは山岳地帯の大きさです 4

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

これは山岳地帯の大きさです 5

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

等々。

入力

単一の正の整数、任意の便利な形式でn > 0

出力

上記の規則に従う、山脈のASCIIアート表現。ピークが適切に並んでいる場合、先頭または末尾の改行またはその他の空白はオプションです。

ルール

  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

回答:


14

、16バイト

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

オンラインでお試しください!

どうやって?

Nλ最大の山のサイズをに入力しλます。Fλ«値をループで実行さιから0スルーをλ-1。(»プログラムの終了時に終了が暗示されます。)

ループ内で、後でカーソルを移動せずに、南東に向かってその長さの線をP↘⁻λι計算λ-ιして描画します。その方向に基づいて、この行は\文字で構成されます。1段西に移動し、↙¹南西に向かう長さ1の線を描画します(で作られています/)。最後に、‖T→水平方向に適切な文字を変換し、描画を反映:\なる//なります\

ループの先頭にダンプ命令を追加(try it)すると、進行状況を確認できます。

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

2
これはチャレンジに理想的な言語だと思います:
ETHproductions

@ETHproductionsこの言語は、ASCIIアート専用に作成されています。また、独自のコードページがあります。
エリックアウトゴルファー16年

@EriktheGolfer Crayonと呼ばれる独自の(実装されていない)ASCIIアート言語があります。現時点では、ドキュメントは移動中のため失われていますが、ほとんどはここで確認できます。私は...このためクレヨンプログラムは炭に比べてだろうか短いかな
ETHproductions

@ETHproductionsいつ実装するのですか?チャットルームはありますか、それとも作成できますか(「クレヨン実装」と呼ばれます)。
エリックアウトゴルファー16年

@EriktheGolfer残念ながら、いつそれを実装する時間があるかわかりません。ただし、必要に応じてチャットルームを作成できます
;

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

Haskell、117 107105 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。ただし、2バイトずつゴルフできます:n%2to n--%2、両方とも--nto nです。編集:,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()は、異なるコンパイラ間で異なるプロトタイプ名を持つ場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.