在所有方向上转到矩形的对角-更硬


17

这与这个问题本质上是一样的,只是难度更大。您将再次编写一个从矩形的左下角到右上角的程序。但是,这次允许对角线移动。

该程序将接受一个有序对(width, height),并将其用作矩形的尺寸。然后,您的程序将创建该解决方案的ASCII艺术形式(.用于一个空的正方形,#该解决方案的一部分以及X用于开始的正方形),并计算到达终点所需的移动次数。

输入: (5, 6)

输出:

....#
....#
...#.
..#..
.#...
X....
Move count: 5

以字节为单位的最短答案胜出!


7
并非如此,解决方案需要进行大量编辑
蓝色

4
像建议的重复一样,这个挑战是一个简单的问题,对于高尔夫来说是不平凡的,这是一个很好的组合。尽管有相似之处,但此挑战需要采用不同的方法,并且不能轻易修改先前挑战的完善解决方案以在这里具有竞争力。
trichoplax

不过,它可以使用更独特的标题...
trichoplax

是的,有什么想法吗?
ericw31415 '16

1
@LuisMendo最小值是最小的网格;1比1
ericw31415 '16

Answers:


1

MATL,38字节

'.#X'!iSPXytf0)Jh1w(tzqDQI1()Gd0<?!]XP

在线尝试!

说明

mn为已排序的输入,从而m大于或等于n。该代码最初构建一个mx n矩阵,如下所示:

  • 沿主对角线以及最后一列的下部的值2。这对应于性格#。这些条目的数量减去1即为移动计数。
  • 条目(1,1)的值3,对应于X
  • 其余条目包含1,对应于字符 .

如果需要,现在可以对矩阵进行转置,使其具有所需的形状。请注意,矩阵的第一个维度是它的高度,而不是宽度,因此它对应于第二个输入。

然后将矩阵上下颠倒,使其X出现在第一列的底部,并且其条目用作字符串的索引'.#X'以生成所需的2D char数组。

'.#X'    % push this string
!        % transpose into a column
i        % input array
SP       % sort it in non-increasing order
Xy       % identity matrix with that size: fill diagonal with 1, rest entries are 0
tf0)     % linear index of last 1
Jh       % append 1j (imaginary unit): linear index of lowest part of last column
1w(      % fill those entries with 1
tzq      % duplicate. Number of nonzero entries minus 1: this is the move count
D        % display move count (and remove it from the stack)
Q        % add 1. Matrix now contains values 1 and 2
I1(      % set first entry (in linear order) to value 3
)        % use matrix as index into the initial string. Gives 2D char array
Gd0<     % push input array again. Is it decreasing?
?        % if so
  !      %   transpose char array
]        % end
XP       % flip upside down. Implicitly display

1
并没有说动招数...?
ericw31415 '16

@ ericw31415对不起。立即解决
Luis Mendo

5

Pyth,46 45 44字节

eSKtMQjsM_mm?sJ,kd?q#J.umtWbbNeSKK\#\.\XhQeQ

在这里尝试。

说明:

move-count-printing:

  K     assign K to...
     Q  the input, a 2-length array...
   tM   with each element decremented
eS      take the max and output it (this is the number of moves)


main path-finding logic:

    mm                     hQeQ  map over x-values and y-values...
        J,kd                     assign J to [x,y]
      ?s                         if both x and y are NOT zero (sum is truthy)...
            ?q#J[...]              if [x,y] is present in [...] (see below)...
                     \#            ... put a # at this position in the output
                       \.          ... else, put a . at this position
                         \X      ... else, put the X here (at [0,0])
jsM_                             reverse and output in the proper format


the [...] part in the code above, which finds positions where #s go:

.u      eSKK  cumulative reduce on <number of moves> elements, starting at K,
                which is [max_x, max_y] as assigned at the beginning
  m    N      map over x and y...
   tWbb       decrement, only if the value is > 0

2

JavaScript(ES6),132

编辑保存的2个字节thx @Neil

(w,h)=>[...Array(--h)].map((_,i)=>R(w-i)+'#'+R(i),--w,R=(n,c='.')=>c.repeat(n>w?w:n>0&&n)).join`
`+`
x${R(w-h,'#')+R(h)}
`+(h>w?h:w)

测试

f=(w,h)=>[...Array(--h)].map((_,i)=>R(w-i)+'#'+R(i),--w,R=(n,c='.')=>c.repeat(n>w?w:n>0&&n)).join`
`+`
x${R(w-h,'#')+R(h)}
`+(h>w?h:w)

function test() {
  var w,h
  [w,h]=I.value.match(/\d+/g)
  O.textContent=f(w,h)
}  

test()
Test <input id=I value="4 5"><button onclick="test()">-></button>
<pre id=O></pre>


w--,R=...移至,可节省2个字节map()
尼尔

0

Javascript(使用外部库)(235字节)

哎呀,这很难!好吧...我的图书馆并不是真的适合这个哈哈。但我喜欢挑战

(x,y)=>{r=x-1;s=y-1;m=Math.max(r,s);n=Math.min(r,s);l=_.RangeDown(s,y).WriteLine(z=>_.Range(0,x).Write("",w=>z==0&&w==0?"X":(z==w||(z==s&&w>=n)||(w==r&&z>=n))?"#":"."));return l+"\r\nMove count: "+(l.length-l.split("#").join("").length)}

链接到lib:https : //github.com/mvegh1/Enumerable

代码说明:创建2个变量的函数。将x-1和y-1存储到变量中。将它们的最大值和最小值存储到变量中。创建一个从(y-1)到y的垂直下降的数字范围。对于垂直范围内的每个元素,根据复杂谓词为当前元素写一行。该谓词创建一个从0开始的整数递增范围,计数为x。对于该范围内的每个元素,根据一个复杂谓词将其连接为1个字符串。该谓词检查是否在左下角,否则检查对角线,否则检查我们在X或Y边界。最后,所有这些都存储在变量中。然后,要获得移动计数,我们基本上只计算#。然后将其连接到存储的变量,并返回结果

那是一口哈哈。屏幕截图的字节数错误,因为我发现了在发布时保存4个字节的方法

编辑:我看到其他答案不在他们的输出中放置“移动计数:”,但我的。如果这不是必需的,那可以节省很多字节...

在此处输入图片说明


0

Python 3中,161个 156字节

def f(w,h):
 x=[['.']*w for i in[0]*h];i=0
 while i<w or i<h:x[~min(i,h-1)][min(i,w-1)]=['#','X'][i<1];i+=1
 for i in x:print(''.join(i))
 print(max(w,h)-1)

该函数通过自变量获取输入,并将ascii-art和移动计数打印到STDOUT。

怎么运行的

该程序首先创建一个列表列表,其中每个列表代表网格的一行,而组件列表的每个元素为.。每个应有的元素都#具有以下属性:如果输出网格为正方形,则表示其位置的纵坐标将相等。因此,循环一些索引i#在位置插入(i, i)将提供所需的输出。但是,网格并不总是正方形的,因此通过将索引和宽度/高度的最小值(归因于零索引而减少)取为最小值,从而将索引固定到网格上。如果索引为零,则当前位置必须是左下角的条目,因此X而是插入。接下来,连接每行中的元素,并将每行打印到STDOUT。移动数量是宽度/高度减小的最大值;这也是打印的。

在Ideone上尝试

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.