Đi đến góc đối diện của hình chữ nhật theo mọi hướng - Khó hơn


17

Đây thực chất là điều tương tự như câu hỏi này , ngoại trừ khó hơn. Bạn lại viết một chương trình từ góc dưới bên trái của hình chữ nhật sang góc trên bên phải. Tuy nhiên, lần này di chuyển chéo được cho phép.

Chương trình sẽ chấp nhận một cặp theo thứ tự (width, height)và sử dụng chúng làm kích thước cho hình chữ nhật. Chương trình của bạn sau đó sẽ tạo ra một nghệ thuật giải pháp ASCII (sử dụng .cho một hình vuông trống, #cho một phần của giải pháp và Xđể bắt đầu hình vuông) và đếm số lần di chuyển cần thiết để đạt đến điểm cuối.

Thí dụ

Đầu vào: (5, 6)

Đầu ra:

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

Câu trả lời ngắn nhất trong byte chiến thắng!


7
Không, các giải pháp sẽ yêu cầu RẤT NHIỀU chỉnh sửa
Blue

4
Thách thức này, giống như bản sao được đề xuất, là một vấn đề đơn giản không quan trọng đối với golf, đó là một sự kết hợp tuyệt vời. Mặc dù có sự tương đồng, nhưng thách thức này đòi hỏi một cách tiếp cận khác và các giải pháp được chơi tốt cho thử thách trước đó không thể được sửa đổi một cách tầm thường để cạnh tranh ở đây.
trichoplax

Nó có thể làm với một tiêu đề khác biệt hơn mặc dù ...
trichoplax

Vâng, có ý tưởng nào không?
ericw31415

1
@LuisMendo Tối thiểu là lưới nhỏ nhất có thể; 1 bằng 1.
ericw31415

Câu trả lời:


1

MATL , 38 byte

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

Hãy thử trực tuyến!

Giải trình

Đặt mnlà các đầu vào được sắp xếp, như vậy mlớn hơn hoặc bằng n. Mã ban đầu xây dựng một ma trận mx nnhư sau:

  • Giá trị 2 dọc theo đường chéo chính và ở phần dưới của cột cuối cùng. Điều này tương ứng với nhân vật #. Số lượng các mục này trừ 1 là số lần di chuyển.
  • Giá trị 3 tại mục (1,1), tương ứng với X.
  • Các mục còn lại chứa 1, tương ứng với ký tự .

Nếu cần, ma trận bây giờ được hoán vị để nó có hình dạng mong muốn. Lưu ý rằng kích thước đầu tiên của ma trận là chiều cao của nó, không phải chiều rộng, do đó, nó tương ứng với đầu vào thứ hai.

Ma trận sau đó được lật ngược lại để Xxuất hiện ở dưới cùng của cột đầu tiên và các mục nhập của nó được sử dụng như các chỉ mục vào chuỗi '.#X'để tạo ra mảng char 2D mong muốn.

'.#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
Nó không nói số lần di chuyển ...?
ericw31415

@ ericw31415 Xin lỗi. Đã giải quyết ngay bây giờ
Luis Mendo

5

Pyth, 46 45 44 byte

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

Hãy thử nó ở đây.

Giải trình:

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

Chỉnh sửa 2 byte đã lưu 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)

Kiểm tra

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>


Lưu 2 byte bằng cách di chuyển w--,R=... vào map().
Neil

0

Javascript (sử dụng thư viện bên ngoài) (235 byte)

Jeez này thật khó! Chà ... thư viện của tôi không thực sự là nhiệm vụ đúng đắn cho haha ​​này. Nhưng tôi thích thử thách

(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)}

Liên kết đến lib: https://github.com/mvegh1/Enumerable

Giải thích mã: Tạo chức năng của 2 biến. Lưu trữ x-1 và y-1 vào các biến. Lưu trữ tối đa và tối thiểu của những người đó vào các biến. Tạo một dãy số giảm dần theo chiều dọc từ (y-1) cho số lượng y. Đối với mỗi phần tử trên phạm vi dọc, hãy viết một dòng cho phần tử hiện tại, theo vị từ phức. Vị từ đó tạo ra một phạm vi số nguyên tăng dần từ 0, với số lượng x. Đối với mỗi phần tử trong phạm vi đó, nối thành 1 chuỗi theo một vị từ phức. Vị từ đó kiểm tra nếu ở dưới cùng bên trái, người khác kiểm tra nếu trên đường chéo, người khác kiểm tra chúng tôi ở biên X hoặc Y. Cuối cùng, tất cả những thứ đó đã được lưu trữ trong một biến. Sau đó, để có được số lần di chuyển, về cơ bản chúng ta chỉ cần đếm số của. Sau đó nối nó với biến được lưu trữ và trả về kết quả

Đó là một câu nói vui miệng haha. Ảnh chụp màn hình có mã byte sai vì tôi đã tìm được cách lưu 4 byte trong khi đăng bài này

EDIT: Tôi thấy các câu trả lời khác không đưa "Move Count:" vào đầu ra của chúng, nhưng là của tôi. Nếu đó không phải là một yêu cầu, thì nó sẽ che đi một loạt byte ...

nhập mô tả hình ảnh ở đây


0

Python 3, 161 156 byte

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)

Một hàm lấy đầu vào thông qua đối số và in ascii-art, theo sau là số lần di chuyển, sang STDOUT.

Làm thế nào nó hoạt động

Chương trình trước tiên tạo một danh sách các danh sách, trong đó mỗi danh sách đại diện cho một hàng của lưới và mỗi thành phần của danh sách thành phần là .. Mỗi phần tử cần #có thuộc tính mà nếu lưới đầu ra là hình vuông, các tọa độ đại diện cho vị trí của nó sẽ bằng nhau; do đó, lặp qua một số chỉ mục ivà chèn# tại vị trí (i, i)sẽ cho đầu ra mong muốn. Tuy nhiên, lưới không phải luôn luôn vuông và do đó, các chỉ số được kẹp vào lưới bằng cách lấy tối thiểu của chỉ số và chiều rộng / chiều cao (giảm do chỉ số 0) theo yêu cầu. Nếu chỉ số bằng 0, vị trí hiện tại phải là mục dưới cùng bên trái, và do đóXthay vào đó được chèn vào. Tiếp theo, các phần tử trong mỗi dòng được nối và mỗi dòng được in thành STDOUT. Số lần di chuyển là tối đa của chiều rộng / chiều cao giảm dần; cái này cũng được in

Hãy thử nó trên Ideone

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.