ASCII涂鸦:盒子里的激光


31

有时候,当我涂鸦时,我会画一个矩形,从一个角开始以对角线开始,然后每当我碰到矩形的一侧时通过“反射”一条线来画出一条线。我继续进行此操作,直到碰到矩形的另一个角为止(并希望矩形的长宽比不是不合理的;)。这就像追踪激光照射到盒子中的路径一样。您将使用ASCII艺术产生这种效果。

例如,考虑一个width 5和height 的盒子3。我们将始终从左上角开始。该#标记框的边界。请注意,宽度和高度是指内部尺寸。

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

挑战

给定盒子的(正)宽度和高度,您应该得出跟踪激光的最终结果。您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行参数,函数自变量获取输入,并通过STDOUT(或最接近的替代方案)或函数返回值或参数输出结果。

您可以使用任何方便的列表,字符串或数字格式进行输入。输出必须是单个字符串(除非您将其打印到STDOUT(当然可以逐步进行))。这也意味着您可以先选择高度,然后再选择宽度-只需在答案中指定确切的输入格式即可。

输出的任何行上都不能有前导空格或尾随空格。您可以选择输出一个尾随换行符。

您必须使用space和/\#完全按照所示重现测试用例。

测试用例

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

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

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

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

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

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

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

1
一旦这个问题顺利完成,也许一个不错的后续问题就是使用任意形状的盒子和起点来应对这一挑战。
桑契斯,2015年

@sanchises我实际上已经考虑过(并且可能仍会发布),但是我决定使用矩形,希望有人可以提出一个明确的公式。我也在考虑多个起点X这对于过境是必要的。下次吧。;)
Martin Ender 2015年


这对于动画点来说是完美的。“ Animate 1爆发(一个斜杠)1个循环/无尽)”
Martijn

Answers:


20

Pyth,43 41 39字节

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

在线尝试:Pyth编译器/执行器。按以下顺序输入数字:第一行高,第二行宽。

感谢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

我的解决方案对每一行执行以下操作:它仅生成模式的一行,重复几次,最后将其剪切以使其适合盒子。

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\ *ds
isaacg 2015年

@isaacg好的电话。我考虑过使用*\ 而不是m\ 短期使用,但因为它具有相同的大小而将其丢弃。没想到变量d和不必要的s
雅库布2015年

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/gg 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计算器-不竞争以帮助进一步了解

在线尝试!

输入:

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)|
  • gcd(h,w)表示最大的公分母
  • 如Javascript中的A%B或如Fortran中的mod(A,B)表示区间[0,B)上的模运算

公式,缩写:

(|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艺术,因此我提交的信息不具有竞争力,以帮助他人完成挑战。请注意,为了使Desmos在c = 0或c = b时工作,引入了一个小的偏移因子0.01,因为Desmos似乎具有(0,B)的Mod(A,B)的边界,而不是[0,B] )

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.