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


17

Це по суті те саме, що і це питання, крім більш важкого. Ви знову повинні написати програму, яка потрапляє від лівого нижнього кута прямокутника до правого верхнього кута. Однак цього разу діагональні переміщення дозволені.

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

Приклад

Вхід: (5, 6)

Вихід:

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

Найкоротша відповідь у байтах виграє!


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'для отримання потрібного 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

@ 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 байти, збережені 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>


Збережіть 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/Eumerable

Пояснення коду: Створіть функцію з 2 змінних. Зберігайте x-1 та y-1 у змінних. Зберігайте максимум та мінімум цих змінних. Створіть вертикально низхідний діапазон чисел від (y-1) для рахунку y. Для кожного елемента у вертикальному діапазоні запишіть рядок для поточного елемента відповідно до складного предиката. Цей предикат створює висхідний діапазон цілих чисел від 0, для числа x. Для кожного елемента в цьому діапазоні об'єднайте в 1 рядок відповідно до складного предиката. Це предикат чеків, якщо внизу зліва, інакше перевіряє, якщо по діагоналі, інакше перевіряє, що ми на межі X або Y. Нарешті, все це було збережено у змінній. Тоді для отримання підрахунку ходу ми в основному просто підраховуємо #. Потім з'єднайте це зі збереженою змінною та поверніть результат

Це був ротовий ха-ха. На екрані екрана неправильний порядок обліку, тому що я знайшов спосіб зберегти 4 байти під час публікації

EDIT: Я бачу, що інші відповіді не містять "Move count:" у їх результатах, але моя є. Якщо це не вимога, це голить купу байтів ...

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


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)

Функція, яка приймає введення через аргумент і друкує ascii-art з подальшим підрахунком руху в STDOUT.

Як це працює

Програма спочатку створює список списків, де кожен список представляє один рядок сітки, а кожен елемент списків компонентів є .. Кожен елемент, який має бути, #має властивість, що якби сітка виводу була квадратною, ординати, що представляють її розташування, були б рівними; отже, перегляд певного індексу iта вставка #в місці (i, i)дасть бажаний вихід. Однак сітка не завжди є квадратною, і, таким чином, індекси затискаються до сітки, приймаючи мінімум індексу та ширину / висоту (зменшену через нульову індексацію), як потрібно. Якщо індекс дорівнює нулю, поточне положення повинно бути внизу зліва та таким чиномXзамість цього вставляється Далі елементи в кожному рядку об'єднуються, і кожен рядок друкується до STDOUT. Кількість рухів - максимальна зменшена ширина / висота; це також надруковано.

Спробуйте це на Ideone

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.