山脈の範囲を描く


16

フィボナッチドミノタイルに触発され、この問題は、別の有名な組み合わせシーケンスを表すASCIIアートの生成に関するものです。

N段山図は正確に使用して、山脈の図であるN「/」とN「\」文字は、その最初の「高度」の下ディップ決して連続曲線をスケッチするように文字、。例えば、

   /\/\
/\/    \

そして

   /\
/\/  \/\

どちらも4段階の山の図ですが、

/\  /\/\
  \/

ではありません。

入力

プログラムは、stdinからの整数nを受け入れるか、関数のパラメーターとして受け入れる必要があります。

出力

すべてのnステップ山図を標準出力に出力します。図の順序は任意ですが、何らかの種類の空白で区切る必要があります。異なる図を水平、垂直などに出力するかどうかを決定できます。

ドミノタイルの問題と同様に、任意の空白を使用できます。これには、印刷出力の前後の余分な改行が含まれます。

n = 3の有効な出力のサンプル:

有効な出力A:

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

有効な出力B:

   /\
/\/  \

 /\/\
/    \

/\/\/\   

  /\
 /  \
/    \

 /\
/  \/\

有効な出力C:

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

これはコードゴルフです。最短プログラム(バイト単位)が勝ちます。


「異なる図を水平、垂直などに出力するかどうかを決めることができます」と言うとき、山脈自体は横向きですか?
xnor 14

山脈自体は横向きであってはなりません。ピーク間の空の空が課題に加わると思います。
マットヌーナン14

一部の範囲は複数回表示できますか?
誇りに思ってhaskeller 14

@MattNoonanそうですね、山の範囲を水平に印刷するのは間違いなくトリッキーでした。
xnor 14

@ proud-haskellerこれはそれぞれ1回でなければなりません。
マットヌーナン14

回答:


10

Python 2:151文字

N=2*input()
for i in range(2**N):
 L=[];c=1;exec"b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\/'[b];i=i/2*(c>0);"*N
 for x in(c==1)*zip(*L):print"".join(x)

#Output for n=3:




  /\  
 /  \ 
/    \




 /\/\ 
/    \




   /\ 
/\/  \




 /\   
/  \/\





/\/\/\

うわー、これは混乱です。

最初のアイデアは、数字を使用して、ビット内の0 to 2**N-1すべてのN上昇および下降のシーケンスをエンコードすることです。我々は、これらのビットを繰り返すことにより、一枚ずつ読み取る%2/2、に反復execループ。

実行中の山脈を横に並べた文字列のリストに保存しますL。毎回、新しい行を生成し、新しい行の1つのスペースを、上移動または下移動が発生したかどうかに応じて、/またはそれに\応じて置き換えます。

そのスペースのインデックスはc、最後からのスペースですc。ここで、ランニングの高さです。正面からそれを行うと、山が逆さまになります。さらにb上下の動きを揃えることでそれをシフトしていき[b-c]ます。c0ではなく1 から開始すると、off-by-oneエラーが修正されます。

c開始値より下に下がるケースを排除するため1に、これが発生した場合、に設定iします0。これにより、それ以降のすべての動きが下向きになりc、よりマイナスになります。次に、でc終了したかどうかを確認するときに、その値を下回った1かどうかも確認cします。のprint場合、山岳地帯のみcです1

印刷するにはzip(*L)、範囲を垂直から水平に転置し、結合された各文字列を印刷します。この答えの多くの問題は、Pythonが文字列を不変として扱うために発生したため、それらを文字のリストとして扱い、それらを文字列に結合して印刷するだけでした。

@flornquakeに感謝します。


を使用してループする場合' '" "、代わりにを使用する必要がありますexec。:)ところで、バックスラッシュをエスケープする必要はありません。
flornquake 14

@flornquake私は書くのを忘れてい' 'ました。文字列を引用符で置き換えて、変数を使用してみました。これはまだ範囲外のインデックスを与えた:for _ in[0]*N:exec("b=i%2;c+=2*b-1;L+=[[" "]*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
XNOR

私はあなたが書く必要があることを意味しexec("b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")、すなわち内側の引用符は、外側のものとは異なることがあります。
flornquake 14

@flornquakeなんてばかげているのか、引用符のペアを変更しましたが、他の引用符は変更しませんでした。ありがとう!
xnor 14

7

APL(88)

{{⍉↑'\/'[1+⍵=1]/⍨¨¯1+2×K=⊂⌽⍳⌈/K←(⍵≠1)++\⍵}¨Z/⍨{(0=+/⍵)∧∧/0≤+\⍵}¨Z←↓⍉¯1+2×(N/2)⊤⍳2*N←2×⍵}

の出力n=3

      {{⍉↑'\/'[1+⍵=1]/⍨¨¯1+2×K=⊂⌽⍳⌈/K←(⍵≠1)++\⍵}¨Z/⍨{(0=+/⍵)∧∧/0≤+\⍵}¨Z←↓⍉¯1+2×(N/2)⊤⍳2*N←2×⍵}3
 /\/\/\     /\    /\      /\/\     /\   
         /\/  \  /  \/\  /    \   /  \  
                                 /    \ 

説明:

  • (N/2)⊤⍳2*N←2×⍵:から0までの各数値のビットフィールドを取得し2^⍵ます。
  • Z←↓⍉¯1+2×:2を掛けて1を引く1-1、上向きと下向きになります。ベクトルのベクトルを保存します。各ベクトルには、1つの数値の表現が含まれZます。
  • {... }¨Z:の各要素に対してZ
    • ∧/0≤+\⍵:実行中の合計が決して下回らないことを確認します0(地上レベルを下回らない)。
    • (0=+/⍵):合計が0(地上レベルに戻って)であること。
  • {... }¨Z/⍨Z該当する要素を選択します。それらのそれぞれについて:
    • K←(⍵≠1)++\⍵:各文字の高さを見つけて、に保存しKます。\それらを/適切に整列させるように、それぞれを上げます。これは地面の高さになり1ます。
    • ¯1+2×K=⊂⌽⍳⌈/K:列ごとにリストを作成し、[1..max(K)]その列の文字の位置をでマークし1、残りをとしてマークします-1。(-1で複製すると、その位置がスペースで埋められます。)
    • '\/'[1+⍵=1]/⍨¨:各列の正しい文字を見つけ、その列のリストでそれを複製します。
    • ⍉↑:結果を行列に変換し、右側を上にする

よし、水平方向!
マットヌーナン14

2

Pythonの、261の 241 236文字

import itertools as I
n=input()
S={}
for q in I.permutations((-1,1)*n):
 s=0;B=[[' ']*n*2 for _ in range(n+2)];o=0
 for i in q:
    B[n-s+(i==-1)][o]=' /\\'[i];s+=i;o+=1
    if s<0:break
 else:
    for l in (B,[])[q in S]:print''.join(l)
 S[q]=1

しばらく時間がかかりn=5ます...

$ echo 1 | py mountrange.py

/\



Laxori@Laxori-PC /cygdrive/c/Programmin
$ echo 2 | py mountrange.py


/\/\



 /\
/  \



Laxori@Laxori-PC /cygdrive/c/Programmin
$ echo 3 | py mountrange.py



/\/\/\




   /\
/\/  \




 /\
/  \/\




 /\/\
/    \



  /\
 /  \
/    \



Laxori@Laxori-PC /cygdrive/c/Programmin
$ echo 4 | py mountrange.py




/\/\/\/\





     /\
/\/\/  \





   /\
/\/  \/\





   /\/\
/\/    \




    /\
   /  \
/\/    \





 /\
/  \/\/\





 /\  /\
/  \/  \





 /\/\
/    \/\





 /\/\/\
/      \




    /\
 /\/  \
/      \




  /\
 /  \
/    \/\




  /\
 /  \/\
/      \




  /\/\
 /    \
/      \



   /\
  /  \
 /    \
/      \

2

JavaScript(ES6)159 163

フィボナッチドミノタイルの答えと同じように、n + nビットのすべてのシーケンスを調べます。1は「/」をマークし、0は「\」をマークします(出力の場合、後で改行をマークするために「2」が追加されます) 。asciiパターンを構築する間、バランスをチェックします-0と1の同じ数で、開始ベースラインを決して下回らない-ルールに従うものを出力します。

「alert」で行われた出力は、JS codegolfの標準ですが、かなり面倒で、ルールに反する可能性があります。console.logを使用すると、文字数は165になります。

F=n=>{
  for(i=0;++i<1<<n+n;l||alert((o+'').replace(/,\d?/g,r=>'\\/\n '[r[1]||3])))
    for(p=l=o=[],j=i;l+1&&p++-n-n;j/=2)
      b=j&1,
      l-=1-b-b,
      (o[k=b+n-l]=o[k]||[2])[p]=b;
}

少ないゴルフ

F=n=>{
  m = n+n
  outer:
  for (i=1; i < 1<<m; i+=2)
  {
    o=[]
    l=0;
    p=1;
    for (j = 1; j <1<<m; j+=j,p++)
    {
      if (i&j)
      {
        q=o[n-l]||[]
        q[p]=1;
        o[n-l]=q
        ++l;
      }
      else
      {
        --l;
        if (l<0) continue outer;
        q=o[n-l]||[]
        q[p]=0;
        o[n-l]=q
      }
    }
    if (l==0) console.log(o.join('\n').replace(/,\d?/g,r=>'\\/'[r[1]]||' '));
  }
}

FireFox / FireBugコンソールでテストします。

F(4)

出力

   /\
  /  \
 /    \
/      \ 

  /\/\
 /    \
/      \ 

    /\
 /\/  \
/      \ 

    /\
   /  \
/\/    \ 

  /\
 /  \/\
/      \ 

 /\/\/\
/      \ 

   /\/\
/\/    \ 

 /\  /\
/  \/  \ 

     /\
/\/\/  \ 

  /\
 /  \
/    \/\ 

 /\/\
/    \/\ 

   /\
/\/  \/\ 

 /\
/  \/\/\ 

/\/\/\/\ 

あなたが書いた特定の理由があるかどう好奇心が強い-b-b-n-nの代わりには-2*b
スティーブベネット

@SteveBennett理由はない。時々、このパターンは短くなりますが、今回はそうではありません(例:2*b+1-> b-~b
edc65

1

CJam、84バイト

q~:Q{Q[XW]*mr1\{\_@+}%_{*}*{(\{_Q\-)S*@2$m0<" /""\\"?+QS*+Q)<\}%);z{N\++}*o}{;}?1}g

このプログラムは山を無限ループで印刷するため、オンラインインタープリターはあなたを助けません。コマンドラインで呼び出します

java -jar cjam-0.6.2.jar mountain.cjam <<< 5

またはオンラインで使用してみてください

q~:Q{Q[XW]*mr1\{\_@+}%_{*}*{(\{_Q\-)S*@2$m0<" /""\\"?+QS*+Q)<\}%);z{N\++}*o}{;}?}fZ

連続して何回も実行ボタンを押して、出力が連結されることを想像してください。

基本的な考え方は、サイズQの山岳地帯には、それぞれの上下遷移のQがあることがわかっているということです。

 Q[XW]*mr                                   #shuffled list of Q 1s and -1s
1        {\_@+}%                            #height map after each transition
                _{*}*                       #if it passes through 0 it's invalid

それが有効であれば、それを印刷し、そうでなければスタックからポップしてオーバーフローしないようにします。

印刷ルーティングは、基本的に各列をQ-高さのスペース、次に記号、Q + 1の合計文字をヒットするのに十分なスペースとして構築し、次に改行を間に入れて行を転置して印刷します。

z{N\++}*o                                   #transpose, insert newlines, print

私がこれに取り組んでいる間、質問は山がそれぞれ一度印刷されることを要求するために明確になりました。それにはいくつかの再考とおそらくより多くのキャラクターが必要になります:/
paradigmsort 14

0

C、179

不要な空白を除外します。

edc65と同様の戦略。= 1および= 0をn*2考慮して、すべての-bitバイナリ値を実行します。/\

nすべての文字を改行する単一の文字列をフォーマットしますn*3。書かれているように、文字列には1000文字が含まれているため、通常、山の後に多くの空白が印刷されます。(これはs[n*n*3]=0puts。の前に追加することで修正できます。)とにかく、これによりputs、ルールに準拠していることを確認した後、山全体を1つで出力できます。

それを関数に変換し、for後で単一ループに還元してみます。

i,n,x,y,q,r;
main(){
  scanf("%d",&n);
  for(i=1<<n*2;i--;){                              //run though all n*2-digit binary numbers
    char s[]={[0 ...999]=32};                      //fill an array with spaces. This syntax is allowed by GCC
    y=n;                                           //start y one square below the grid (note: r is initialised to 0 by default.)
    for(x=n*2;x--;)                                //for each digit of i
      q=i>>x&1,
      y+=q+r-1,                                    //move up if the current and last digit are 0, down if they are 1, and stay on the same line if they are different.
      y<n?s[y*n*3]=10,s[y*n*3+x+1]=92-45*q:(x=0),  //if y is within the grid, put a newline (ASCII 10)at the beginning of the row and write \ or / (ASCII 92 or 47) to the correct square. Otherwise abort the x loop.
      r=q;                                         //store the current bit of i to r as it will be needed on the next iteration 
    n-1-y||puts(s);                                //if y is on the bottom row of the grid, output the mountain 
  }
}

出力(右側に大量の空白があることに注意してください)

$ ./a
4

 /\
/  \/\/\                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

   /\
/\/  \/\                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

 /\/\
/    \/\                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

  /\
 /  \
/    \/\                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

     /\
/\/\/  \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

 /\  /\
/  \/  \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

   /\/\
/\/    \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

 /\/\/\
/      \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

  /\
 /  \/\
/      \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

    /\
   /  \
/\/    \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

    /\
 /\/  \
/      \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

  /\/\
 /    \
/      \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

   /\
  /  \
 /    \
/      \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

0

Haskell、140バイト

いくつかの試みが非常にゴルフに適さないようになった後、私はこのHaskell実装で終わりました。APLソリューションの2倍以内に満足しているだけです!

ゴルフソリューション:

e=' ':e
m=[[]]:[[('/':e):map(' ':)x++('\\':e):y|k<-[0..n],x<-m!!(n-k),y<-m!!k]|n<-[0..]]
f n=putStr$unlines[map(!!(n-k))a|a<-m!!n,k<-[1..n]]

非ゴルフとコメント:

このプログラムは、nステップの山形図のセットを再帰的に作成します。各図は、無限に長い文字列のリストで表され、横に描かれた山とそれに続く無限に広がるスペースを表します。これにより、すべての図の高さが同じになり、再帰が簡単になります。Mountainプリンターは、高さを有限値にクリップするパラメーターを受け入れます。

import Data.List (transpose)

-- Elementary picture slices, extending to infinity.
empty = ' ' : empty
up    = '/' : empty
down  = '\\': empty

-- A function which draws a mountain picture to stdout, clipping
-- its height to n.
printMtn n = putStr . unlines . reverse . take n . transpose 

{-- Combine mountain pictures x and y by

              x
 x # y  ==   / \y

--}
x # y = up : raised x ++ down : y
    where raised = map (' ':)

-- Given two sets X,Y of mountain pictures, compute the set X <> Y of all
-- combined pictures x#y for x in X, y in Y.
xs <> ys = [ x # y | x <- xs, y <- ys ]

-- Compute the (++,<>)-convolution of a list with itself, e.g.:
--   autoConvolve [x0,x1,x2] == (x2 <> x0) ++ (x1 <> x1) ++ (x0 <> x2)
autoConvolve xs = concat $ zipWith (<>) (reverse xs) xs

{--
    mtns is a list whose nth entry is the list of all n-step mountain diagrams.
    It is defined recursively by:
        --  The only 0-step mountain diagram is empty.
        --  Each (n+1)-step diagram can be uniquely drawn as x#y for
            some k-step diagram x and (n-k)-step diagram y.
--}
mtns = [[]] : [autoConvolve (prefix n) | n <- [1..]]
    where prefix n = take n mtns

-- The driver function: apply the height n mountain printer to each
-- n-step mountain diagram.  Whitespace is guaranteed by the order
-- in which the diagrams appear.
test n = mapM_ (printMtn n) $ mtns!!n

サンプル使用法:

$ ghci mtn3.hs
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( mtn3.hs, interpreted )
Ok, modules loaded: Main.
λ> f 3
  /\  
 /  \ 
/    \

 /\/\ 
/    \

 /\   
/  \/\

   /\ 
/\/  \


/\/\/\
λ> 

0

GolfScript 103(デモ

2*:§2\?,{2base.,§\-[0]*\+:a 1\{.2*@(.@+@@+}%:l$)\;),-1%{a,,{.l=2$=\a=1$+*' \\/'= }%\;n+}%\1=*l$(\;0>*}/

このプログラムは、0から2 ^(n-1)までの数値のすべてのバイナリ表現を山としてレンダリングしようとする整数パラメーターを取ります。無効な組み合わせ(たとえば、レベル0を下回る組み合わせ)はレンダリングしません。

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