ASCII Doodling:ボックス内のレーザー


31

時々、だらだらしているときは、長方形を描き、角の1つから対角線で始め、長方形の辺に当たるたびにそれを「反映」することで線をトレースします。長方形の別の角に当たるまでこれを続けます(そして、長方形のアスペクト比が無理ではないことを願っています;))。これは、箱に照らされたレーザーの経路を追跡するようなものです。その結果をASCIIアートで作成することになります。

例として、幅5と高さのボックスを考えます3。常に左上隅から開始します。#マークボックスの境界。幅と高さは内側の寸法を参照していることに注意してください。

#######    #######    #######    #######    #######    #######    #######
#\    #    #\    #    #\   \#    #\  /\#    #\  /\#    #\/ /\#    #\/\/\#
# \   #    # \  /#    # \  /#    # \/ /#    # \/ /#    #/\/ /#    #/\/\/#
#  \  #    #  \/ #    #  \/ #    # /\/ #    #\/\/ #    #\/\/ #    #\/\/\#
#######    #######    #######    #######    #######    #######    #######

チャレンジ

ボックスの(正の)幅と高さを考えると、レーザーをトレースする最終結果を生成する必要があります。プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数、関数引数を介して入力を取得し、STDOUT(または最も近い代替)、または関数の戻り値または引数を介して結果を出力できます。

入力には、便利なリスト、文字列、または数値形式を使用できます。出力は単一の文字列である必要があります(STDOUTに出力する場合を除き、もちろん徐々に出力してください)。これはまた、最初に高さを、次に幅をとることができることを意味します-答えに正確な入力形式を指定するだけです。

出力のどの行にも先頭または末尾の空白があってはなりません。オプションで、単一の末尾の改行を出力できます。

あなたは、スペースを使用しなければならない/\#しているとおりにテストケースを再現します。

テストケース

2 2
####
#\ #
# \#
####

3 2
#####
#\/\#
#/\/#
#####

6 3
########
#\    /#
# \  / #
#  \/  #
########

7 1
#########
#\/\/\/\#
#########

1 3
###
#\#
#/#
#\#
###

7 5
#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########

22 6
########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

1
おそらく、これがコースを実行した後の、いいフォローアップの質問は、任意の形のボックスと出発点でこの挑戦をすることです。
-Sanchises

@sanchises私は実際にそれを考えていました(そしてそれを投稿するかもしれません)が、誰かが明示的な公式を思いつくかもしれないことを期待して長方形で行くことにしました。またX、横断に必要な複数の出発点を検討していました。また今度。;)
マーティンエンダー


これは、アニメーションポイントに最適です。「アニメーション1バースト(1つのスラッシュ)1サイクル/エンドレス)」
Martijn

回答:


20

Pyth、43 41 39バイト

K*\#+2QKVvzp<*QXX*dyivzQN\\_hN\/Q\#\#)K

オンラインそれを試してみてください。Pythコンパイラ/エグゼキュータ。次の順序で数値を入力します:高さ1行目、幅2行目。

2バイトの節約を手伝ってくれたisaacgに感謝します。

説明:

私のソリューションはレーザーを追跡せず、gcdを含む単純なパターンを使用します。m, nが箱の寸法である場合、をしましょうd = gcd(m, n)。パターンのサイズは正確2*d x 2*dです。

例えば、繰り返しパターン 7 5

#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########

\/
/\

gcd(7, 5) = 1、パターンのサイズは2 x 2

そして、繰り返しパターン 22 6

########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

\  /
 \/ 
 /\
/  \

gcd(22, 6) = 2、パターンのサイズは4 x 4

私のソリューションは、各行に対して次のことを行います。パターンの1行を生成し、それを数回繰り返し、最後にカットして、ボックスに収まるようにします。

K*\#+2QK   implicit: Q is the second input number (=width)
K          K = 
 *\#+2Q        "#" * (2 + Q)
       K   print K (first line)

Vvzp<*QXX*dyivzQN\\_hN\/Q\#\#)K  implicit: vz is the first input number (=height)
VQ                               for N in [0, 1, ..., vz-1]:
           ivzQ                             gcd(vz,Q)
          y                               2*gcd(vz,Q)
        *d                           string with 2*gcd(vz,Q) space chars
       X       N\\                   replace the Nth char with \
      X           _hN\/              replace the -(N+1)th char with /
    *Q                               repeat Q times
   <                   Q           only use the first Q chars
  p                     \#\#       print "#" + ... + "#"
                            )    end for
                             K   print K

以来Xサポートは文字列に「割り当て」、あなたは変更することができますm\ *dして削除しますs
isaacg

@isaacgおはようございます。すぐに使用する*\ 代わりに使用することを考えましm\ たが、同じサイズであるため、破棄します。変数dと不必要なものを考えなかったs
ジャクベ

11

C、256バイト

f(w,h){int i,j,x=1,y=1,v=1,u=1;char b[h+2][w+3];for(i=0;i<w+3;i++)for(j=0;j<h+2;j++)b[j][i]=!i||!j||i>w||j>h?i>w+1?0:35:32;while((x||y)&&(x<=w||y<=h))v=x&&w+1-x?v:(x-=v,-v),u=y&&h+1-y?u:(y-=u,-u),b[y][x]=v/u<0?47:92,x+=v,y+=u;for(i=0;i<h+2;i++)puts(b[i]);}

私はおそらく200の下にこれを得ることができ、私は後で説明を追加しますが、私は可能性があるため、私が代わりにやるべきこと数時間で紙を持っています。


27
偽のインターネットポイントは学位以上の価値があると確信しています。
アダムデイビス


5

J、85バイト

させてくださいg = gcd(w,h)。この関数は、w/g by h/g行列の要素をg by gタイルで満たし、対角線と対角線に ' /\'を入れます。結果の4D配列は、2D配列(ボックスの内側)に解かれ、で囲まれ#ます。(0 1 2 3代わりに数字が使用され[space] / \ #、数字は末尾の文字に変更されます。)

内部座標の直接位置ベースの計算では、少し短いソリューションが得られる場合があります。

' \/#'echo@:{~3,.~3,.3,~3,,$[:,[:,"%.0 2 1 3|:((,:2*|.)@=@i.@+.){~[:(2&|@+/&:i.)/,%+.

使用法:

   6 (' \/#'echo@:{~3,.~3,.3,~3,,$[:,[:,"%.0 2 1 3|:((,:2*|.)@=@i.@+.){~[:(2&|@+/&:i.)/,%+.) 22
########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

こちらからオンラインでお試しください。


0

Desmos Calculator-競合しないため、さらに知識が得られます

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

入力:

h as height of box, with 0-indexing
w as width of box, with 0-indexing

中間体:

Let b = gcd(h,w),
Let c = |b-h%2b| Or |b-mod(h,2b)|

略式:

(|b-(x+y)%2b|-c)(|b-(x-y)%2b|-c)=0

出力:

x as x position, 0-indexed, where the ball will land when released
y as y position, 0-indexed, where the ball will land when released

使い方:

(|b-(x+y)%2b|-c)*(|b-(x-y)%2b|-c)=0
                ^ OR operation - |b-(x+y)%2b|-c=0 or |b-(x-y)%2b|-c=0
|b-(x+/-y)%2b|-c = 0
|b-(x+/-y)%2b| = c
|b-(x+/-y)%2b| = c means (b-(x+/-y))%2b = + or -c 
b-(x+/-y)%2b = +/- c -> b +/- c = (x+/-y)%2b -> (x+/-y) = n*2*b + b +/- c 
Where n is integer.  This will force patterns to repeat every 2b steps in x and y.  
Initial pattern n=0: (x +/- y) = b +/- c -> y = +/- x + b +/- c
In the x positive and y positive plane only, these correspond to lines of positive and 
negative slope, set at intercept b, offset by c on either side.

プログラムが最終的な基準を満たしていません-ボックスとラインのASCIIアートを生成するため、他の人がチャレンジを完了するのを支援するために、情報の非競合として提出しています。c = 0またはc = bのときにDesmosを動作させるには、Desmosが[0、Bではなく(0、B)のMod(A、B)の境界を持っているように見えるため、0.01の小さなオフセット係数が導入されていることに注意してください)

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