首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方框中的ASCII反射

方框中的ASCII反射
EN

Code Golf用户
提问于 2017-07-14 15:19:19
回答 2查看 321关注 0票数 8

ASCII在盒

中的反射

你们可能都知道反射定律,在这个挑战中,你会看到一个盒子里的球的轨迹。

相关:盒子动画中的ASCII球ASCII涂鸦:盒子里的激光

任务

给你三个整数对W,Hx,ydx,dy -第一个代表盒子的大小,第二个代表开始的位置,第三个是球开始移动的方向。

任务是想象球的运动,直到它停止滚动,这发生在球在一个以前的位置,或它击中一个角落。

字符*将显示球的轨迹,+标记其最终位置,盒子的其余部分必须由(空格)组成。

示例

为了更清楚地说明这一点,在这些示例中,_将表示一个空格。此外,中间阶段只是为了澄清,您只需要输出最后一个阶段,这些示例是1-indexed。

给定W = 3, H = 5x = 3, y = 2dx = -1, dy = 1

代码语言:javascript
复制
___    ___    ___    ___
__*    __*    __*    __*
___ -> _*_ -> _*_ -> _+_
___    *__    *__    *_*
___    ___    _*_    _*_
  • 球从(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 = 3x = 1, y = 3dx = 1, dy = -1

代码语言:javascript
复制
_______    __*____    __*____    __*___+
_______ -> _*_____ -> _*_*___ -> _*_*_*_
*______    *______    *___*__    *___*__
  • 开始位置是(1,3)
  • 球现在向(1,-1)方向移动,直到它撞到(3,1)的墙壁。
  • 在那里它被反射到新的方向,(1,1)
  • (5,3),它会被反射并进入新的方向,(1,-1)。在(7,1)突然停了下来,因为那是个拐角。

给定W = 10, H = 6x = 6, y = 6dx = 1, dy = 1

代码语言:javascript
复制
__________    __________    ________*_    ________*_    ________*_    __*_____*_    __*_____*_
__________    _________*    _________*    _______*_*    _______*_*    _*_____*_*    _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________    _______*__    _______*__    _____*_*__    _*___*_*__    _*___*_*__    _*___+_*__
__________    ______*___    ______*___    ____*_*___    __*_*_*___    __*_*_*___    __*_*_*___
_____*____    _____*____    _____*____    ___*_*____    ___*_*____    ___*_*____    ___*_*____

输入规范

输入由三个整数对( W,Hx,ydx,dy )组成,您可以以对编程语言最有意义的任何格式接受输入,顺序并不重要。但是,接受的输入不能编码比这些对包含的更多的信息(示例请参见答案)。

  • W,H >= 1
  • x,y要么是1-indexed (1 <= x <= W1 <= y <= H),要么是0-indexed (0 <= x < W0 <= y < H),请指定您选择的索引。
  • dx,dy总是-11

无效的输入可以忽略。

输出规范

  1. 不允许使用领先的空白
  2. 尾随空格可以省略
  3. 如果尾随空格不适合方框,则不允许使用。
  4. 允许尾随换行符(在所有与输出相关的行之后)

让我们举第一个例子:

代码语言:javascript
复制
       (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

输出:

代码语言:javascript
复制
+

投入: 3,3,3,3,1,1

输出:

代码语言:javascript
复制
___
___
__+

投入: 3,3,3,3,-1,-1

输出:

代码语言:javascript
复制
+__
_*_
__*

投入: 7,3,1,3,1,-1

输出:

代码语言:javascript
复制
__*___+
_*_*_*_
*___*__

投入: 10,6,6,6,1,1

输出:

代码语言:javascript
复制
__*_____*_
_*_*___*_*
*___*_*_*_
_*___+_*__
__*_*_*___
___*_*____

投入: 21,7,6,4,-1,-1

输出:

代码语言:javascript
复制
__*_______*_______*__
_*_*_____*_*_____*_*_
*___*___*___*___*___*
_*___*_*_____*_*___*_
__*___*_______+___*__
___*_*_________*_*___
____*___________*____

这是密码-高尔夫,所以最短的程序/函数获胜,但是任何努力都是值得赞赏的。

EN

回答 2

Code Golf用户

发布于 2017-07-14 18:26:10

木炭,50字节

代码语言:javascript
复制
UONN JNN↷NW⁼ KK«*¿¬KK«↷²¶*¿¬KK«↷²¶↷²*¿¬KK«↷²¶»»»»+

在网上试试!链接是详细的代码版本。接受五个输入:whxyaxy是零索引的.a根据以下编码表示dxdy

代码语言:javascript
复制
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

解释:

代码语言:javascript
复制
UONN 

(注意后面的空格)将背景填充到输入的宽度和高度。(通常背景的每个方格都是一个空字符串,然后在输出时转换为空格。)

代码语言:javascript
复制
JNN

将光标移动到初始坐标。

代码语言:javascript
复制
↷N

旋转到初始角度。

代码语言:javascript
复制
W⁼ KK«

只要当前方格是一个空格,就会重复。

代码语言:javascript
复制
    *

打印星号并朝当前方向前进。

代码语言:javascript
复制
    ¿¬KK«

如果光标移出原来的长方形,

代码语言:javascript
复制
        ↷²¶*

旋转方向,然后打印换行符(这方便地带我们回到前一个正方形)和星号,它移动到新的方向。

代码语言:javascript
复制
        ¿¬KK«

如果光标移回原来的长方形外,

代码语言:javascript
复制
            ↷²¶↷²*

将光标移回前一个正方形,然后再次旋转,从而在另一个方向打印星号。

代码语言:javascript
复制
            ¿¬KK«

如果光标还在长方形的外面,我们必须在拐角处。

代码语言:javascript
复制
                ↷²¶

所以回到前一个广场,放弃吧。

代码语言:javascript
复制
»»»»+

当我们不能再移动时,打印一个"+“标志并停止。

票数 8
EN

Code Golf用户

发布于 2017-07-20 19:52:10

Desmos计算器-非竞争以帮助进一步的知识

在网上试试!

输入:

代码语言:javascript
复制
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-indexing

Intermediates:

代码语言:javascript
复制
Let b = gcd(h,w),  
Let c = |b-(X-sY)%2b| Or |b-mod(X-sY,2b)|

公式,缩写:

代码语言:javascript
复制
(|b-(x+y)%2b|-c)(|b-(x-y)%2b|-c)=0

输出:

代码语言:javascript
复制
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

的工作方式:

代码语言:javascript
复制
(|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]的界。

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/132423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档