カードの家(バージョン2)


8

この2番目のバージョンのアイデアを提供してくれたFryAmTheEggmanに感謝します。
バージョン1はこちら

それほど単純ではない課題:次の構築順序に従って、いくつかのカードが与えられた場合、その数のカードで可能な最大のカードの家を構築します。

                          /\       /\         /\         /\/\
                 --       --       --         ----       ----
/\  →  /\/\  →  /\/\  →  /\/\  →  /\/\/\  →  /\/\/\  →  /\/\/\  →

                /\         /\
     --         --         --
    /\/\       /\/\       /\/\
    ----       ----       ----
→  /\/\/\  →  /\/\/\  →  /\/\/\/\  →  ...

したがって、1階建ての家から始めて、隣接するグループを構築し、次にブリッジカードを配置し、2階にグループを構築し、1階から3階に到達するように1階からグループと橋を構築します。オン。

シングルカードはで表現される/\または--。できるだけ多くのカードを使用した後、1枚のカードが残っている場合は、これまでに達成したことを出力します(3枚のカードの例を参照してください。結果は2枚のカードと同じです)。唯一の例外は1枚のカードの場合で、フラットカードを出力する必要があります。

例:

Input: 1
Output: 

--   <a card lying on the floor>

Input: 2
Output:

/\

Input: 3
Output:

/\

Input: 5
Output:

 --
/\/\

Input: 10
Output:

 /\
 ----
/\/\/\

Input: 20
Output:

  /\
  --
 /\/\/\
 ------
/\/\/\/\

Input: 39
Output:

    --
   /\/\
   ----
  /\/\/\
  ------
 /\/\/\/\
 --------
/\/\/\/\/\

Input: 40
Output:

    /\
    --
   /\/\
   ----
  /\/\/\
  ------
 /\/\/\/\
 --------
/\/\/\/\/\

入力は数値または文字列で、常に正の整数になります。出力は、先頭と末尾のスペース、および改行を許可して、示されているとおりにする必要があります。

これはので、各言語の最短のプログラム/機能が勝つ可能性があります!


これはサンドボックスから来ています。
チャーリー

6
興味深い課題ですが、個人的には投稿するまでにもう少し、おそらく1日待つべきだったと思います。
caird coinheringaahing 2017

@cairdcoinheringaahing私は両方の投稿の間にどれだけの時間待つべきかわからなかったことを認めます。バージョン1の最後の回答から久しぶりなので、今(24時間後)に投稿できると思いました。アドバイスありがとうございます。次回はそのことを覚えておきます。
チャーリー

2
ブリッジカードの幅がゼロ以外の場合、1枚のカードの出力はフラットカードではありませんか?
Peter Taylor

2
テストケースの半分は、底に平らな層を配置する可能性を考慮していないため、今は間違っていると思います。サンドボックスは、数日間質問を残して、人々がコメントする時間がない限り、実際には機能しません。(そして「パート2」については、それがパート2であることを明確にして、人々がそれをパート1だとは思わず、すでに見たことがあることが重要です)。
Peter Taylor

回答:


4

チャコール、67バイト

Nθ⁼θ¹A²ηW¬‹θη«←÷η³↓→/…\/÷η³↙A⁻θηθA⁺³ηη»‖MM÷η³→Fθ≡﹪鳦¹«↗←\/»²«↑P²»«

オンラインでお試しください!注:Charcoalの最新バージョンでは»«、-2バイトは必要ありません。説明:

Nθ

入力を整数としてに読み込みますθ

⁼θ¹

特殊なケース:入力が1の場合、aを出力し-ます。

A²ηW¬‹θη«

η 次のレイヤーを作成するために必要なカードの数を表します。最初は2です。レイヤーに十分なカードがある限り、whileループが繰り返されます。

←÷η³↓→/…\/÷η³↙

次のレイヤーの左半分を印刷します。(右半分を印刷したかったのですが、なんらかの理由で正しく反映させることができませんでした。)-sの数は、レイヤー内のカードの数の3分の1であり、切り捨てられます。(パート1に対する私の回答も参照してください。)

A⁻θηθA⁺³ηη»

入力数からカードの数を引き、次のレイヤーに必要な数に3枚のカードを追加します。

‖M

これまでの家をミラーリングします。(これはまた、オン---1枚のカードの場合のために)。

M÷η³→

家の右側にカーソルを移動します。

Fθ

残りの各カード(ある場合)について繰り返します。

≡﹪鳦

3を法とするカードが次の場合:

¹«↗←\/»

1、次にカードのペアを印刷します。

²«↑P²»

2、次に横型カードを印刷します。

«

それ以外の場合は、カードをスキップします(この時点でペアが必要になるため)。


とてもいい答えです!カード1枚入れ替える前から書き始めましたか?その場合は出力--する必要があります(フラットカード)。ただし、要件を変更する前にプログラムを開始した場合は、スキップします...
チャーリー

@CarlosAlejoいいえ、その件については忘れていました。申し訳ありません。今修正されました。
Neil

1
@ニール、炭を作ってないの?なぜなら、私はあなたを信じ始めていないからです。
マジックタコの壷07

@MagicOctopusUrn D:ねえ(でも、ニールのチャコールスキルは素晴らしいです。おそらく私のものよりも優れています)
ASCIIのみ

申し訳ありませんが、次のコミットで修正されます
ASCIIのみ

2

Python 2、167 182バイト

167バイト

f=lambda x,y=0:y<x<2and"--"or~-x>y*3and f(x-2-y*3,y+1)or d(y,x)
d=lambda h,r,v=0:h and d(~-h,max(r-3,1),-~v)+" "*-~v+"--"*(h-(r<3))+"\n"+" "*v+"/\\"*(h+(r>1))+"\n"or""

182バイト

f=lambda x,y=0:[x>1+y*3and f(x-2-y*3,y+1)or d(y,x),"--"][2>x>y]
d=lambda h,r,v=0:d(h-1,r-3*(r>2)-2*(r==2),v+1)+" "*(v+1)+"--"*(h-1+(r>2))+"\n"+" "*v+"/\\"*(h+(r>1))+"\n"if h+r else""

説明(167バイト版)

f=lambda x,y=0:
    "--" if y<x<2         # handle case where x is 1 on step 0 (only one card) 
    else f(x-2-y*3,y+1)   # recursive call with one full triangular level accounted for
    if x>= 2+y*3          # one full level requires 2+3y cards (2, 7, 15...)
    else d(y,x)           # if no more full levels can be constructed, draw
d=lambda h,r,v=0:         # (h)eight to draw, (r)emaining cards, (v)ertical height already drawn (to determine leading white space)
    d(h-1,          ,v+1) # recursive call to draw upper lines
          max(r-3,1)      # subtract remainder cards used in this iteration
    +" "*(v+1)            # leading whitespace for -- row
    +"--"*(       )+"\n"  # -- line. 
           h-(r<3)        # horizontal card count is equal to the remaining count of levels to draw, minus 1, 
                          # ...plus 1 if there are at least three remaining cards to add to the right
    +" "*v                # leading whitespace for /\ row
    +"/\\"*(       )+"\n" # /\ line
            h+(r>1)       # vertical card pair count equals remaining level count
                          # ...plus 1 if there are at least two extra cards
    if h                  # return above is there are levels to draw (h) 
    else ""               # else return nothing (ends recursion)

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

  • これは不必要に長く感じますが、現時点で削除するものは何もありません...提案については自由にコメントしてください

回答いただきありがとうございます。ただし、例がテストケースと一致しない場合は、自分の家にあるカードよりも多くのカードを家に置きます。たとえば、7枚のカードの場合、1階に4枚のカード、2階にブリッジカード、さらに2枚のカードで家を建てることができます。しかし、あなたは10枚のカード(最初のフローに6枚のカードと2枚のブリッジカード)がある家を見せます。例と家の建て方を確認してください。
チャーリー


互いに直接続くコードのセクションを分離したい場合は、<pre><code>... </code></pre>4つのスペースをインデントするのではなく、コードの個々のブロックの周りにタグを使用することでそれを行うことができます
Taylor Scott

1
何が起こったのかわかります。何らかの理由で、<pre><code>タグを使用しているときに<3))+"\n"+" "*v+"/\\"*(h+(r>、別のタグとしてキャプチャし、ソリューションのその領域を表示していません。多分これを少しよく理解しているコミュニティの誰かがそれを回避する方法として私たちに知らせることができます...しかし、あなたの現在のフォーマットは完全に読みやすく、したがってこのタイプのフォーマットの必要性をすべて否定します
Taylor Scott

2
@TaylorScott A少し遅れていますが、HTMLエンティティとそれらを置き換えることによって、それを修正することができます&lt;のために<&gt;のために>
ビジネス猫

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