Zにマーカーが付いたバウンスエッジのXYボックス


10

久しぶりのポスターはこちら。

X、Y、Zの3つの入力を受け取るプログラムを記述します。

  • X =横(列)
  • Y =ダウン(行)
  • Z =ロケーションマーカー

プログラムは、XとYを下にして視覚グリッドを印刷します。このグリッドは、「+」以外の任意の文字で作成できます。各「場所」からカウントアップ、インデックス番号が付与されている1、次いでダウン端まで横切る1,1を調整しました。

XとYは常に少なくとも3であり、Zは決して大きくならないX * Y

Zは、「+」として印刷される位置を表し、その位置と1文字の左、右、上、下を表します。例えば:

 +
+++
 +

最後に、+文字がエッジ(最上位、左端、右端、および/または最下端)をインターセプトする場合、+は同じ軸に沿って跳ね返り、反対側をオーバーフローします。

例:入力= 5、5、13

-----
--+--
-+++-
--+--
-----

入力= 10、10、10

-------+++
---------+
---------+
----------
----------
----------
----------
----------
----------
----------

入力= 10、10、21

----------
+---------
+++-------
+---------
----------
----------
----------
----------
----------
----------

編集:非正方形​​の例16,3,32

---------------+
-------------+++
---------------+

私はすべてをカバーしたと思います。入力に制限はありませんが、プログラムで必要な場合は、64 * 64で制限します。

ボーナスポイント(私はそれを行うことができますか?):入力Zは> X * Yであってはなりませんが、それがY * Zより大きい場合、中心の+をグリッドの中央に出力します。 編集:入力ZはX * Yより大きくすることはできません

編集2 :. わかりやすくするためにXとYにいくつかの変更を加えました

これはコードゴルフで、最短のコードが勝ちます。


プログラミングパズルとコードゴルフへようこそ!これは素晴らしい課題ですが、メインのサイトに投稿される前にフィードバックを得ることができるサンドボックスに今後の課題を投稿することをお勧めします。
betseg

「ボーナスポイント」とは何ですか?その正確な機能を実装すると、バイト数に利点がありますか?ある場合は、ボーナスの大きさを明示する必要があります。(補足として、コードゴルフでのボーナスは通常推奨されません
James

@betseg-おっと。申し訳ありませんが、うまくいけば、その重要なステップを逃したことで、興味を引くことができます。
ジェイクハリー

@DrMcMoylex-注意、ありがとう、ボーナスを削除しました。
ジェイクハリー

2
投稿の最初の日に回答を受け入れるべきではありません。MATL/ Jelly / 05AB1Eゴルファーがこれを見て、Pythonよりもはるかに少ないバイト数でそれを解決すると確信しています。ほとんどの人は少なくとも一週間待つ傾向があると思います。
Kade

回答:


1

パイソン2、172の 171バイト

def f(x,y,z):A=[['-']*x for _ in' '*y];z-=1;X,Y=z%x,z/x;a=[2,-1];A[Y][X]=A[Y+a[Y>0]][X]=A[Y-a[Y<y-1]][X]=A[Y][X+a[X>0]]=A[Y][X-a[X<x-1]]='+';print'\n'.join(map(''.join,A))

編集:関数に変換することで1バイトを節約しました。

前(読みやすい):

x,y,z=inputtt
A=[['-']*x for _ in' '*y]
z-=1
X,Y=z%x,z/x
a=[2,-1]
A[Y][X]=A[Y+a[Y>0]][X]=A[Y-a[Y<y-1]][X]=A[Y][X+a[X>0]]=A[Y][X-a[X<x-1]]='+'
print'\n'.join(map(''.join,A))

いい仕事ですが、10,100,300で破ったと思います。一番右の境界で動作していないようですか?
ジェイクハリー

@JakeHarry Works for me:ideone.com/G2fwV1
TFeld

ああ、私はバカです。私が使用したideは幅が固定されていなかったので、技術的には正しく、目ではありませんでした。
ジェイクハリー

1

JavaScript(ES6)、165バイト

(x,y,z,a=[...Array(y)].map(_=>Array(x).fill`-`))=>a.map(a=>a.join``,a[b=--z/x|0][c=z%x]=a[b?b-1:2][c]=a[b][c?c-1:2]=a[y+~b?b+1:y-3][c]=a[b][++c<x?c:x-3]=`+`).join`\n`

1

Befunge、175バイト

>&:10p60p&:00p&1-:10g%:20p\10g/:30p::1+00g-!-\!+2-50p::1+1v
vg02g01*`\4\`0:-g05\!-g03:g00p01-1<g06+p00-1<p04-2+!\-!-g0<
>-!*\10g40g-:0`\4\`**+!2*"+"+10g:#^_$5500g:#^_$$$>:#,_@

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

最初の行(および2番目の行への短い継続)は、パラメーターが読み込まれ、いくつかの定数が計算される場所です-場所の座標(lxly)、および跳ね返りを説明する調整された座標エッジ:

ax = lx - (lx+1==w) + (lx==0) - 2 
ay = ly - (ly+1==h) + (ly==0) - 2

2行目と3行目には、グリッドの高さと幅にわたるメインループが含まれています。実行のパスは、最初に右から左に進み、3行目に左から右に戻ります。グリッド内の各座標(gxgy)について、次の条件を計算します。

(gx==lx && gy>ay && gy<ay+4) || (gy==ly && gx>ax && gx<ax+4)

その条件がtrueの場合はa "+"をスタックにプッシュし、falseの場合はをプッシュし"-"ます。ここでの分岐を回避するために、実際には単にプッシュしています43 + 2 * !condition(43はASCII値のプラスで、45はマイナスです)。

ループが終了すると、コードの最後のビットは、スタック上のすべてを出力する標準出力ルーチンにすぎません。


0

JavaScript(ES6)、170

まだゴルフできる

(w,h,z,t=--z%w,u=z/w|0,r='-'.repeat(w),S=(f,j)=>(r+f+r).substr(w-j,w))=>[...Array(h)].map((q=u-!!u-!(u+1-h),y)=>y-u?y>=q&y<q+3?S('+',t):r:S('+++',t-!!t-!(t+1-w))).join`
`

ゴルフが少ない

(w, h, z
, t=--z%w
, u=z/w|0
, r='-'.repeat(w)
, S=(f,j)=>(r+f+r).substr(w-j,w)
) => [...Array(h)].map(
    (q = u-!!u-!(u+1-h), 
     y) => y-u?y>=q&y<q+3?S('+',t):r:S('+++',t-!!t-!(t+1-w))
).join`\n`

テスト

F=
(w,h,z,t=--z%w,u=z/w|0,r='-'.repeat(w),S=(f,j)=>(r+f+r).substr(w-j,w))=>[...Array(h)].map((q=u-!!u-!(u+1-h),y)=>y-u?y>=q&y<q+3?S('+',t):r:S('+++',t-!!t-!(t+1-w))).join`
`

function update() {
  var [x,y,z] = I.value.match(/\d+/g)
  O.textContent = F(+x,+y,+z)
}

update()
<input value='5 6 10' oninput='update()' id=I>
<pre id=O>

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