모든 방향에서 사각형의 반대쪽 모서리로 이동-더 세게


17

이것은 본질적 으로이 질문과 동일하지만 단단합니다. 직사각형의 왼쪽 하단에서 오른쪽 상단으로가는 프로그램을 다시 작성해야합니다. 그러나 이번에는 대각선 이동이 허용됩니다.

프로그램은 순서 쌍을 받아들이고이를 (width, height)직사각형의 치수로 사용합니다. 그러면 프로그램은 ASCII 아트 솔루션 ( .빈 사각형, #솔루션의 일부 및 X시작 사각형에 사용)을 작성하고 엔드 포인트에 도달하는 데 걸리는 이동 수를 계산합니다.

입력: (5, 6)

산출:

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

바이트 단위의 최단 답변이 승리합니다!


7
그렇지 않다면, 솔루션은 편집의 LOTS가 필요합니다
Blue

4
제안 된 복제본과 같은이 도전은 골프에 사소한 사소한 간단한 문제이며, 이는 훌륭한 조합입니다. 유사성에도 불구하고,이 도전은 다른 접근법을 필요로하며 이전 도전에 대한 골프 솔루션은 사소하게 수정 될 수 없습니다.
trichoplax

그래도 좀 더 구별되는 제목과 관련이있을 수 있습니다 ...
trichoplax

그래, 어떤 아이디어?
ericw31415

1
@LuisMendo 최소는 가능한 가장 작은 그리드입니다. 1 x 1
ericw31415

답변:


1

MATL , 38 바이트

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

온라인으로 사용해보십시오!

설명

허락하다 mn같은 분류 입력, 수 m와 같거나보다 더 크다 n. 코드는 처음에 다음과 같이 mx n행렬을 만듭니다 .

  • 주 대각선과 마지막 열의 아래쪽에있는 값 2 이것은 character에 해당합니다 #. 이 항목 수에서 1을 뺀 숫자는 이동 횟수입니다.
  • 에 해당하는 항목 (1,1)의 값 3 X입니다.
  • 나머지 항목은 문자에 해당하는 1을 포함합니다. .

필요한 경우, 이제 원하는 모양을 갖도록 매트릭스가 바뀝니다. 행렬의 첫 번째 차원은 너비가 아니라 높이이므로 두 번째 입력에 해당합니다.

그런 다음 행렬을 거꾸로 뒤집어 X첫 번째 열의 맨 아래에 나타나고 해당 항목을 문자열의 인덱스로 사용 '.#X'하여 원하는 2D 문자 배열을 만듭니다.

'.#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

죄송합니다. 지금 해결
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

자바 스크립트 (ES6), 132

thx @Neil으로 저장된 2 바이트 편집

(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().
Neil

0

자바 스크립트 (외부 라이브러리 사용) (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 개수에 대해 (y-1)에서 세로로 내림차순 범위를 만듭니다. 수직 범위의 각 요소에 대해 복합 술어에 따라 현재 요소의 행을 작성하십시오. 이 술어는 x의 계수에 대해 0에서 정수의 오름차순 범위를 작성합니다. 해당 범위의 각 요소에 대해 복합 술어에 따라 1 개의 문자열로 연결하십시오. 이 술어는 왼쪽 하단에 있는지 확인하고, 대각선에 있는지 확인하고, 그렇지 않으면 X 또는 Y 경계에 있는지 확인합니다. 마지막으로 모든 것이 변수에 저장되었습니다. 그런 다음 이동 수를 얻으려면 기본적으로 #을 계산합니다. 그런 다음 저장된 변수에 연결하고 결과를 반환하십시오.

한입 가득했습니다. 이것을 게시하는 동안 4 바이트를 저장하는 방법을 찾았 기 때문에 스크린 샷의 바이트 수가 잘못되었습니다

편집 : 다른 답변이 출력에 "이동 횟수 :"를 넣지 않는 것을 보았지만 내 것이 었습니다. 그것이 요구 사항이 아니라면 많은 바이트를 면도합니다 ...

여기에 이미지 설명을 입력하십시오


0

파이썬 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)

인수를 통해 입력을 가져 와서 아스키 아트를 인쇄 한 다음 이동 횟수를 STDOUT에 인쇄하는 함수입니다.

작동 원리

프로그램은 먼저 목록의 목록을 작성합니다. 여기서 각 목록은 그리드의 한 행을 나타내고 구성 요소 목록의 각 요소는 .입니다. #출력 그리드가 정사각형 인 경우 해당 위치를 나타내는 좌표는 동일 해야하는 속성 이 있어야합니다 . 따라서 일부 인덱스를 반복 하고 위치에 i삽입 하면 원하는 출력을 얻을 수 있습니다. 그러나 그리드가 항상 정사각형이 아니므로 인덱스 및 인덱스의 최소값 (제로 인덱싱으로 인해 줄어든)을 필요에 따라 인덱스가 그리드에 고정됩니다. 인덱스가 0이면 현재 위치는 왼쪽 아래 항목이어야하므로#(i, i)X대신에 삽입됩니다. 다음으로, 각 라인의 요소가 연결되고 각 라인이 STDOUT에 인쇄됩니다. 이동 횟수는 감소 된 최대 너비 / 높이입니다. 이것도 인쇄됩니다.

Ideone에서 사용해보십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.