Перейти в противоположный угол прямоугольника во всех направлениях - сложнее

17

По сути, это то же самое, что и этот вопрос, за исключением более сложного. Вам снова нужно написать программу, которая попадает из левого нижнего угла прямоугольника в правый верхний угол. Однако на этот раз диагональные ходы разрешены.

Программа примет упорядоченную пару (width, height)и использует их в качестве размеров для прямоугольника. Затем ваша программа создаст ASCII-арт решения (используйте .для пустого квадрата, #для части решения и Xдля начального квадрата) и посчитайте количество ходов, необходимых для достижения конечной точки.

пример

Входные данные: (5, 6)

Выход:

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

Кратчайший ответ в байтах побеждает!

ericw31415
источник
7
Это не так, решения потребуют МНОГО редактирования
Blue
4
Эта задача, как и предлагаемый дубликат, является тривиально простой задачей, которая нетривиальна для гольфа, что является отличной комбинацией. Несмотря на сходство, эта задача требует другого подхода, и хорошо отлаженные решения предыдущей задачи не могут быть тривиально изменены, чтобы быть здесь конкурентоспособными.
Трихоплакс
Это могло бы быть с более отличительным названием, хотя ...
trichoplax
да, есть идеи?
ericw31415
1
@LuisMendo Минимум - это наименьшая возможная сетка; 1 на 1.
ericw31415

Ответы:

1

MATL , 38 байт

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

Попробуйте онлайн!

объяснение

Позвольте mи nбыть отсортированные входы, такие, что mбольше или равно n. Код изначально строит матрицу mx nследующим образом:

  • Значение 2 вдоль главной диагонали и в нижней части последнего столбца. Это соответствует характеру #. Количество этих записей минус 1 - количество ходов.
  • Значение 3 в записи (1,1), соответствующее X.
  • Остальные записи содержат 1, соответствующий символу .

При необходимости матрица теперь транспонируется так, чтобы она имела желаемую форму. Обратите внимание, что первое измерение матрицы - это ее высота, а не ширина, поэтому оно соответствует второму входу.

Затем матрица переворачивается вверх дном, так что она Xпоявляется в нижней части первого столбца, и ее записи используются в качестве индексов в строке '.#X'для получения желаемого массива двумерных символов.

'.#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
@ ericw31415 Извините. Решено сейчас
Луис Мендо
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 байт сохраненного ТНХ @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>

edc65
источник
Сохраните 2 байта, перемещая w--,R=... в 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 байта при публикации

РЕДАКТИРОВАТЬ: я вижу, что другие ответы не помещают «Счетчик ходов» в их вывод, но мой есть. Если это не является обязательным требованием, это сбивает кучу байтов ...

введите описание изображения здесь

applejacks01
источник
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

TheBikingViking
источник