中的反射
你们可能都知道反射定律,在这个挑战中,你会看到一个盒子里的球的轨迹。
相关:盒子动画中的ASCII球和ASCII涂鸦:盒子里的激光
给你三个整数对W,H,x,y和dx,dy -第一个代表盒子的大小,第二个代表开始的位置,第三个是球开始移动的方向。
任务是想象球的运动,直到它停止滚动,这发生在球在一个以前的位置,或它击中一个角落。
字符*将显示球的轨迹,+标记其最终位置,盒子的其余部分必须由(空格)组成。
为了更清楚地说明这一点,在这些示例中,_将表示一个空格。此外,中间阶段只是为了澄清,您只需要输出最后一个阶段,这些示例是1-indexed。
给定W = 3, H = 5、x = 3, y = 2和dx = -1, dy = 1:
___ ___ ___ ___
__* __* __* __*
___ -> _*_ -> _*_ -> _+_
___ *__ *__ *_*
___ ___ _*_ _*_(3,2)点开始,然后(-1,1)方向移动,撞上(1,4)的墙壁(1,1)。它又在(2,5)撞到墙上了(1,-1),它直接撞上了(3,4)的墙壁,(-1,-1)方向。它现在将通过点(2,3),(1,2),反射等,但由于它已经访问了位置(2,3),它停在那里。这个例子演示了,如果一个球击中一个角会发生什么。为此,让W = 7, H = 3、x = 1, y = 3和dx = 1, dy = -1:
_______ __*____ __*____ __*___+
_______ -> _*_____ -> _*_*___ -> _*_*_*_
*______ *______ *___*__ *___*__(1,3),(1,-1)方向移动,直到它撞到(3,1)的墙壁。(1,1)。(5,3),它会被反射并进入新的方向,(1,-1)。在(7,1)突然停了下来,因为那是个拐角。给定W = 10, H = 6、x = 6, y = 6和dx = 1, dy = 1:
__________ __________ ________*_ ________*_ ________*_ __*_____*_ __*_____*_
__________ _________* _________* _______*_* _______*_* _*_____*_* _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________ _______*__ _______*__ _____*_*__ _*___*_*__ _*___*_*__ _*___+_*__
__________ ______*___ ______*___ ____*_*___ __*_*_*___ __*_*_*___ __*_*_*___
_____*____ _____*____ _____*____ ___*_*____ ___*_*____ ___*_*____ ___*_*____输入由三个整数对( W,H、x,y和dx,dy )组成,您可以以对编程语言最有意义的任何格式接受输入,顺序并不重要。但是,接受的输入不能编码比这些对包含的更多的信息(示例请参见这答案)。
W,H >= 1x,y要么是1-indexed (1 <= x <= W和1 <= y <= H),要么是0-indexed (0 <= x < W和0 <= y < H),请指定您选择的索引。dx,dy总是-1或1无效的输入可以忽略。
让我们举第一个例子:
(good by 2)
__*
_+ (good by 2)
*_*_ (bad by 3)
(bad by 4)
_*_
(good by 4)假设输入的格式为(W,H,x,y,dx,dy)和1-indexing,下面是一些测试用例(同样,_是用来表示白空间的!):
投入:1,1,1,1,1
输出:
+投入: 3,3,3,3,1,1
输出:
___
___
__+投入: 3,3,3,3,-1,-1
输出:
+__
_*_
__*投入: 7,3,1,3,1,-1
输出:
__*___+
_*_*_*_
*___*__投入: 10,6,6,6,1,1
输出:
__*_____*_
_*_*___*_*
*___*_*_*_
_*___+_*__
__*_*_*___
___*_*____投入: 21,7,6,4,-1,-1
输出:
__*_______*_______*__
_*_*_____*_*_____*_*_
*___*___*___*___*___*
_*___*_*_____*_*___*_
__*___*_______+___*__
___*_*_________*_*___
____*___________*____这是密码-高尔夫,所以最短的程序/函数获胜,但是任何努力都是值得赞赏的。
发布于 2017-07-14 18:26:10
UONN JNN↷NW⁼ KK«*¿¬KK«↷²¶*¿¬KK«↷²¶↷²*¿¬KK«↷²¶»»»»+在网上试试!链接是详细的代码版本。接受五个输入:w、h、x、y、a。x和y是零索引的.a根据以下编码表示dx和dy:
a mod 8 == 1 => dx = 1, dy = 1
a mod 8 == 3 => dx = -1, dy = 1
a mod 8 == 5 => dx = -1, dy = -1
a mod 8 == 7 => dx = 1, dy = -1解释:
UONN (注意后面的空格)将背景填充到输入的宽度和高度。(通常背景的每个方格都是一个空字符串,然后在输出时转换为空格。)
JNN将光标移动到初始坐标。
↷N旋转到初始角度。
W⁼ KK«只要当前方格是一个空格,就会重复。
*打印星号并朝当前方向前进。
¿¬KK«如果光标移出原来的长方形,
↷²¶*旋转方向,然后打印换行符(这方便地带我们回到前一个正方形)和星号,它移动到新的方向。
¿¬KK«如果光标移回原来的长方形外,
↷²¶↷²*将光标移回前一个正方形,然后再次旋转,从而在另一个方向打印星号。
¿¬KK«如果光标还在长方形的外面,我们必须在拐角处。
↷²¶所以回到前一个广场,放弃吧。
»»»»+当我们不能再移动时,打印一个"+“标志并停止。
发布于 2017-07-20 19:52:10
X as X position to Start
Y as Y position to Start
s as slope -> -1 for dX/dY = -1, +1 for dX/dY = +1
h as height of box, with 0-indexing
w as width of box, with 0-indexingLet b = gcd(h,w),
Let c = |b-(X-sY)%2b| Or |b-mod(X-sY,2b)|(|b-(x+y)%2b|-c)(|b-(x-y)%2b|-c)=0x 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.程序无法满足最终标准--在交叉点停止并用a +标记,因此被提交为非竞争性信息,以帮助其他人完成挑战。请注意,为了使Desmos在c=0或c=b时工作,引入了一个小偏移因子0.01,因为Desmos似乎有模(A,B)的(0,B)的界,而不是[0,B]的界。
https://codegolf.stackexchange.com/questions/132423
复制相似问题