庭の建築-ASCIIスタイル


18

家の外に10x10メートルの正方形の庭があります。草を植えてテラスを作りたいです。我々は決定しているどのように庭を分割するために、私たちは、テラスVS草の量との比率を決めていません。

それを視覚化するのに助けが必要であり、ASCIIアートは明らかにそれを行うための最良の方法です。


チャレンジ:

庭の何パーセントがテラスになるべきかを表す包括的範囲[ 0、100 ](またはオプションで10進数[0、1])の整数を取ります。

1平方メートルのテラスはダッシュ-またはバーで表示されます|。1平方メートルの草はハッシュマークで表され#ます。

  • テラスの量が50%以下の場合、庭は左下隅からバーで覆われ、垂直方向、次に水平方向に埋められます。
  • テラスの量が50%を超える場合は、デッキを別の方法(バーではなくダッシュ)にして、左下隅から開始し、水平に、次に垂直に塗りつぶします。

例:

N = 25%
||########
||########
||########
||########
||########
|||#######
|||#######
|||#######
|||#######
|||#######

N = 75%
##########
##########
-----#####
----------
----------
----------
----------
----------
----------
----------

N = 47%
||||######
||||######
||||######
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####

N = 50%
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####

N = 51%
##########
##########
##########
##########
-#########
----------
----------
----------
----------
----------

N = 0%
##########
##########
##########
##########
##########
##########
##########
##########
##########
##########

N = 100%
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------

これはので、バイト単位の最短コードが勝ちます。I / Oに関する標準ルール。これはASCIIアートであるため、出力は上記の例のようになります。すなわち、出力["|", "|" ...]はOKではありません。

説明はいつものように奨励されます:)


2
私の最初の印象は、2つのケースは2つの別々のゴルフ課題を解決することを意味するだけでしたが、それらの間でコードを共有する価値がある共通の構造が見つかっています。
-xnor

回答:


7

APL(Dyalog)、34バイト

範囲0〜100の整数を予期する匿名プレフィックス関数。想定している⎕IOI NDEX OであることをRIGIN)0多くのシステムではデフォルトです。

{'#-|'[⊖⍉⍣s10 10100↑⍵⍴1+s50≥⍵]}

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

{} ラムダ; 引数です:

'#-|[] 次の配列で文字列のインデックスを作成します。

50≥⍵ 50が引数以上の場合は1、それ以外の場合は0

s← Sの店舗(Sモール用)

1+ インクリメント

⍵⍴ 周期的にrの引数の長さにeshapeを

100↑ 最初の100個をゼロで埋めます

10 10⍴Rの 10行と10列にeshape

 その結果(sから分離10 10

⍉⍣s 小さければ転置

 ひっくり返す


1
{'#-|' [⊖(⍉+⍨)⍣(⍵≤50)⊢⍵>⍎¨∘。、⍨⎕d]}
ngn

1
私のアプローチに非常に近い:{⊖⍉⍣c⊢10 10⍴(⍵/'-|'⊃⍨c←⍵≤50),100/'#'}
エリックアウトゴルファー

@EriktheOutgolferあなただけが必要です99/'#'
-ngn


1
@ngnそれはまったく違います。投稿してみませんか?
アダム

5

J39、38の 37バイト

[:|.>&50|:'#-|'"0{~_10]\100{.]$1+51>]

使い方:

                     _10]\100{.]$1+51>] - prepares a 10x10 array of 0, 1 or 2
                                 1+51>] - 1 if N<=50 otherwise 2
                               ]$       - list of N copies of the above (1 or 2)
                          100{.         - the above list filled to 100 items with 0
                     _10]\              - reshape the list to a 10x10 array
           '#-|'"0                      - constant array of chars
                   {~                   - replaces each digit 0, 1 or 2 with #, - or |     
     >&50                               - is N>50 ? 
         |:                             - if not, transpose the array
                                          (in fact |: here is rearrange axes
                                           0 - transpose
                                           1 - leave it intact)        
 |.@                                    - reverse the order ot the rows

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


{.over the bounds引数を使用するのは良いトリックです。
ジョナ

2
31バイト:(]|.@|:_10{&'#|-'\100{.1+$)>&50
FrownyFrog

@ FrownyFrog-すばらしいコード!
ガレンイワノフ

@ジョナ-はい、それは時々非常に便利です。_100{. 塗りつぶしを最初に配置することも試みまし たが、その後、各行を反転する必要があったため、それをあきらめました。
ガレンイワノフ

5

JavaScript(ES6)、84バイト

入力を[0 ... 100]の整数として受け取ります。

n=>(y=9,g=x=>~y?'|-#'[[x,y][k=n/51|0]*9+x+y<n?k:2]+[`
`[x-9]]+g(x++-9?x:!y--):'')(0)

テストケース

書式設定およびコメント化

n => (                          // given the terrace percentage n
  y = 9,                        // and starting with y = 9
  g = x =>                      // g = recursive function taking x:
    ~y ?                        //   if y is greater than or equal to 0:
      '|-#'[                    //     pick the relevant character:
        [x, y][k = n / 51 | 0]  //       using k = 1 if n > 50, 0 otherwise
        * 9 + x + y             //       and comparing either 10 * x + y or 10 * y + x
        < n ?                   //       with n; if we're located over the terrace area:
          k                     //         append either '|' or '-'
        :                       //       else:
          2                     //         append '#'
      ] +                       //     end of character insertion
      [`\n`[x - 9]] +           //     append a linefeed if x == 9
      g(x++ - 9 ? x : !y--)     //     update (x, y) and do a recursive call
    :                           //   else:
      ''                        //     stop recursion
)(0)                            // initial call to g with x = 0


4

ゼリー、23バイト

<©51ị⁾|-ẋḷ"”#ẋ³¤s⁵Z®¡ṚY

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

Ç入力を変更するには、フッターの前の番号を変更します。コマンドライン引数のないプログラムでモナドリンクとして機能します。これは許可されています。


とてもいい答え+1。モナȷ2³
ドリンク

私も24バイトを取得することができましたが、ここでもインスピレーションの源になると思いました。
ミスターXcoder

@ Mr.Xcoder私はそれについて考えましたが、私はそのようなことを仮定できるかどうか本当にわかりません(ニラディックプログラムでのみ動作しますか?うーん...)
エリックアウトゴルファー

このデニスとの議論をご覧ください。
ミスターXcoder

3

SWIプロローグ、249バイト

p(X):-write(X).
r(X,Y,G):-G=<50,10*X-Y+1=<G,p('|').
r(_,_,G):-G=<50,p('#').
r(X,Y,G):-(10-Y)*10+X>G,p('#').
r(_,_,_):-p('-').
l(_,11,_):-nl.
l(X,Y,G):-r(Y,X,G),Z is Y+1,l(X,Z,G).
a(10,G):-l(10,1,G).
a(Y,G):-l(Y,1,G),Z is Y+1,a(Z,G).
s(G):-a(1,G),!.

解決策は非常に簡単です。プロシージャaは行を作成し、行の列にl文字を書き込み、rどの文字を印刷するかを決定します。


2
G<51の代わりに動作するはずですG<=50
ライコニ

3

MATL、26バイト

'|-#'100:i>~o10eG50>?!E]P)

オンラインでお試しください!または、すべてのテストケースを確認します

説明

'|-#'     % Push this string
100:      % Push array [1 2 ... 100]
i         % Input a number and push it
>~        % Less than or equal (element-wise)? This transforms the
          % array into [true ... true false ... false]
o         % Convert to double. True becomes 1, false becomes 0
10e       % Rehaspe into 10-row matrix, in column-major order
G         % Push input
50>       % Greater than 50?
?         % If so
  !       %   Transpose
  E       %   Multiply by 2 (element-wise). So 0 remains as 0, and
          %   1 becomes 2
]         % End
P         % Flip vertically
)         % Index into string, modularly. So 1 corresponds to '|',
          % 2 to '-', and 0 to '#'
          % Implicitly display

3

Python 2、85バイト

T=j=10
n=input()+T
while j:print([(n-j)/T*'|',min(n-T*j,T)*'-'][n>60]+'#'*T)[:T];j-=1

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

どちらの場合も、各行の右側#に長さ10 が埋め込まれているため、2つのケース間でそのコードを共有できます。エイリアシングT=10が適切なバイト数を節約するのに十分な数の10が頻繁に使用されました。


無効!入力51以降、行が欠落します。
エリックアウトゴルファー

@EriktheOutgolferこれらのエッジケース。
-xnor

@EriktheOutgolferありがとう、これで修正されると思う?
-xnor

修正されたようです。
エリック・ザ・アウトゴルファー

2

ルビー92 82バイト

->n{puts (r=0..9).map{|y|r.map{|x|n>(n>50?100-y*10+x:x*10+9-y)?"|-"[n/51]:?#}*''}}

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

使い方:

グリッド内の各セルには、左下隅から始まり、nの値に応じて水平または垂直に進む累進番号があります。

の場合n>50、番号は100-y*10+xそれ以外の場合x*10+9-y


2

、25バイト

NθGTχ#↶F÷θχ⟦χ⟧﹪θχ¿›θ⁵⁰‖T↖

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Nθ                          Input integer into q
  G                         Draw filled polygon
   T                        Directions Right, Down, Left
    χ                       Size 10
     #                      Filled with `#`
      ↶                     Rotate cursor left (now points up)
       F÷θχ                 Repeat q/10 times (integer divide)
           ⟦χ⟧              Print 10 `|`s and move to the next column
              ﹪θχ           Print (q mod 10) `|`s
                 ¿›θ⁵⁰      If q > 50
                      ‖T↖   Reflect diagonally

1
@StewieGriffinおっと、間違った対角線。チェックしないでごめんね。
ニール

これは実際には25 文字ですが、61 バイトですよね?
ゼロワン

@ZeroOne Charcoalは独自のコードページを使用します
ニール

ああなるほど!説明してくれてありがとう。:)
ZeroOne

2

、24バイト

↔?T†▼'-≤50⁰S↑C10+R⁰'|∞'#

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

説明

↔?T†▼'-≤50⁰S↑C10+R⁰'|∞'#  Input is a number, say n=12
                     ∞'#  Infinite string of #s: "#######...
                +         Prepend to it
                   '|     the character |
                 R⁰       repeated n times: "||||||||||||####...
             C10          Cut to pieces of length 10: ["||||||||||","||##########","##..
           S↑             Take first 10 pieces.
 ?     ≤50⁰               If n is at most 50,
  T                       then transpose,
   †▼'-                   else take minimum with '-' for each character.
↔                         Reverse, implicitly print separated by newlines.

1

SOGL V0.12、21のバイト

┐* #M*+Mm√H.M»>?H§┐┌ŗ

ここで試してみてください!

説明:

┐*                     push a vertical bar repeated input times
   #M*                 push "#" repeated 100 times
      +                add the two together
       Mm              mold to a length of 100
         √             convert to a square
          H            rotate clockwise
           .M»>?       if the input is greater than 50
                H        rotate the array clockwise again
                 §       reverse it horizontally
                  ┐┌ŗ    replace "|" with "-"


1

APL(Dyalog Classic)、33バイト

f←{'#-|'[⊖(⍉+⍨)⍣(⍵≤50)⊢⍵>⍎¨∘.,⍨⎕d]}

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

アダムの答えに基づいて

⎕d 文字列です '0123456789'

∘., デカルト積

それ自体で

⍎¨ それぞれを評価する-0..99の10x10マトリックスを取得する

⍵>引数が大きい場合のブール行列

セパレータとして機能します

(⍉+⍨)⍣(⍵≤50)⍵≤50の場合、行列を(+それ自体で)2倍にし、転置(

垂直反転

'#-|'[ ]'#-|'行列の各要素で文字列にインデックスを付けます


この説明は素晴らしいです、私見。
アダム

1

q、51バイト

{-1@'reverse$[i;::;flip]10 10#@[100#"#";til x;:;"|-"i:x>50];}

1

網膜72 62バイト

.+
$*|
T`|`-`.{51,}
$
100$*#
M!10`.{10}
O$s`(?<!-.*)\S
$.%`
O`

オンラインでお試しください!リンクにはテストケースが含まれます。編集:@MartinEnderの助けを借りて10バイトを保存しました。説明:

.+
$*|

|指定された回数だけ繰り返す

T`|`-`.{51,}

ただし、入力が少なくとも51だった場合は、-s に変更します。

$
100$*#

100 #秒追加します。

M!10`.{10}

10の10のグループに分割し、残ったものをすべて破棄します。

O$s`(?<!-.*)\S
$.%`

入力が少なくとも51だった場合、結果を転置します。

O`

結果を並べ替えます。

代替ソリューション、また62バイト:

.+
$*|
T`|`-`.{51,}
$
100$*#
M!10`.{10}
O`
O$^s`\S(?!.*-)
$.%`

転置の前にソートすると、転置の条件でバイトを節約できますが、正しい順序で結果を取得するには1バイトかかります。


あなたは必要ありません#最初にOするので、段階$.%`ほとんどになります9。また、このように、最後に別のソート段階のコストでループを回避することにより、いくつかのバイトを保存することができます:tio.run/##K0otycxL/...はおそらく、その結果再配置するより短い方法はありM最終形状に段階を。
マーティンエンダー

ああ、たとえば、単純なOステージをステージの直後に移動して、後M読みの代わりに先読みを使用し続けることができます。
マーティンエンダー

@MartinEnderヒントをありがとう。あと数バイトゴルフをすることができました。
ニール



0

ゼリー、24バイト

³<51
ȷ2Ḷ<s⁵ZḤ$Ç¡Ṛị“-|#”Y

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

使い方

上付き文字が多すぎます...

³<51 ~ Helper link.

³    ~ The input.
 <   ~ Is smaller than
  51 ~ 51?
     ~ Yields 1 for truthy, 0 for falsy.

ȷ2Ḷ<s⁵ZḤ$Ç¡Ṛị“-|#”Y ~ Main link.

ȷ2                  ~ 1e2 (i.e compressed 100).
  Ḷ                 ~ Lowered range. Yields [0, 100) ∩ ℤ.
   <                ~ Is smaller than the input? (element-wise).
    s⁵              ~ Split into sublists of length 10.
         Ç¡         ~ Repeat <last link as a monad> times (either 1 or 0 times).
      ZḤ$           ~ Zip (transpose) and unhalve element-wise.
           Ṛ        ~ Reverse.
            ị       ~ Modular, 1-based indexing into...
             “-|#”  ~ The literal string "-|#".
                  Y ~ Join by newlines.

0

R、102バイト

n=scan();m=matrix("#",y<-10,y);m[0:n]="if"(n<51,"|","-");write("if"(n>50,m[,y:1],t(m[y:1,])),"",y,,"")

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

nstdinから読み取り、庭をstdoutに出力します。

説明:

n=scan()               # read from stdin
m=matrix("#",10,10)               # create 10x10 matrix of "#"
m[0:n]="if"(n<51,"|","-")         # set the first n entries in m to the appropriate character
m="if"(n>50,                      # prepare for printing using write
       m[,10:1],                  # reverse m left to right
       t(m[10:1,]))               # flip m top to bottom and transpose
write(m,"",10,,"")                # write m to stdout in 10 columns with no separator

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