Pergi ke sudut berlawanan dari persegi panjang di semua arah - Lebih keras

17

Ini pada dasarnya sama dengan pertanyaan ini , kecuali lebih keras. Anda lagi menulis program yang mendapat dari sudut kiri bawah dari persegi panjang ke sudut kanan atas. Namun, kali ini gerakan diagonal diperbolehkan.

Program akan menerima pasangan yang dipesan (width, height), dan menggunakannya sebagai dimensi untuk persegi panjang. Program Anda kemudian akan membuat ASCII-art dari solusi (gunakan .untuk kotak kosong, #untuk bagian dari solusi, dan Xuntuk memulai kuadrat) dan menghitung jumlah gerakan yang diperlukan untuk mencapai titik akhir.

Contoh

Memasukkan: (5, 6)

Keluaran:

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

Jawaban terpendek dalam byte menang!

ericw31415
sumber
7
Bukan, solusinya akan membutuhkan BANYAK pengeditan
Biru
4
Tantangan ini, seperti duplikat yang disarankan, adalah masalah sepele yang sederhana yang tidak sepele untuk golf, yang merupakan kombinasi yang hebat. Terlepas dari kesamaannya, tantangan ini membutuhkan pendekatan yang berbeda dan solusi yang cocok untuk tantangan sebelumnya tidak dapat diubah secara sepele untuk menjadi kompetitif di sini.
trichoplax
Itu bisa dilakukan dengan judul yang lebih menonjol ...
trichoplax
ya, ada ide?
ericw31415
1
@LuisMendo Minimum adalah kisi sekecil mungkin; 1 oleh 1.
ericw31415

Jawaban:

1

MATL , 38 byte

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

Cobalah online!

Penjelasan

Biarkan mdan njadikan input yang diurutkan, sedemikian rupa sehingga mlebih besar atau sama dengan n. Kode awalnya membangun mx nmatriks sebagai berikut:

  • Nilai 2 sepanjang diagonal utama, dan di bagian bawah kolom terakhir. Ini sesuai dengan karakter #. Jumlah entri ini minus 1 adalah jumlah langkah.
  • Nilai 3 pada entri (1,1), sesuai dengan X.
  • Entri yang tersisa berisi 1, sesuai dengan karakter .

Jika diperlukan, matriks sekarang ditransformasikan sehingga memiliki bentuk yang diinginkan. Perhatikan bahwa dimensi pertama dari matriks adalah tinggi, bukan lebar, sehingga sesuai dengan input kedua.

Matriks tersebut kemudian dibalik terbalik sehingga Xmuncul di bagian bawah kolom pertama, dan entri-entrinya digunakan sebagai indeks ke dalam string '.#X'untuk menghasilkan array char 2D yang diinginkan.

'.#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
Luis Mendo
sumber
1
Tidak dikatakan pindah hitungan ...?
ericw31415
@ ericw31415 Maaf. Dipecahkan sekarang
Luis Mendo
5

Pyth, 46 45 44 byte

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

Coba di sini.

Penjelasan:

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
Gagang pintu
sumber
2

JavaScript (ES6), 132

Edit 2 byte yang disimpan 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)

Uji

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
sumber
Simpan 2 byte dengan memindahkan w--,R=... ke map().
Neil
0

Javascript (menggunakan perpustakaan eksternal) (235 byte)

Astaga ini sulit! Yah ... perpustakaan saya sebenarnya bukan tugas yang tepat untuk haha ​​ini. Tapi saya suka tantangannya

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

Tautan ke lib: https://github.com/mvegh1/Enumerable

Penjelasan kode: Membuat fungsi 2 variabel. Simpan x-1 dan y-1 ke dalam variabel. Simpan maks dan min dari itu ke dalam variabel. Buat rentang angka yang turun secara vertikal dari (y-1) untuk hitungan y. Untuk setiap elemen pada rentang vertikal, tulis garis untuk elemen saat ini, sesuai dengan predikat kompleks. Predikat itu menciptakan rentang naik bilangan bulat dari 0, untuk hitungan x. Untuk setiap elemen dalam rentang itu, gabungkan menjadi 1 string sesuai dengan predikat kompleks. Predikat itu memeriksa jika di kiri bawah, yang lain memeriksa jika diagonal, atau memeriksa kita berada di perbatasan X atau Y. Akhirnya, semua itu disimpan dalam variabel. Kemudian untuk mendapatkan jumlah langkah, pada dasarnya kita hanya menghitung #. Kemudian gabungkan itu ke variabel yang disimpan, dan kembalikan hasilnya

Itu adalah haha ​​seteguk. Tangkapan layar memiliki bytecount yang salah karena saya menemukan cara untuk menyimpan 4 byte saat memposting ini

EDIT: Saya melihat jawaban lain tidak memasukkan "Pindahkan hitungan:" di output mereka, tetapi milik saya. Jika itu bukan keharusan, itu mencukur banyak byte ...

masukkan deskripsi gambar di sini

applejacks01
sumber
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)

Sebuah fungsi yang mengambil input melalui argumen dan mencetak ascii-art, diikuti oleh jumlah langkah, ke STDOUT.

Bagaimana itu bekerja

Program pertama-tama membuat daftar daftar, di mana setiap daftar mewakili satu baris dari kisi dan setiap elemen dari daftar komponen .. Setiap elemen yang harus #memiliki properti bahwa jika grid output adalah kuadrat, ordinat yang mewakili lokasinya akan sama; karenanya, pengulangan beberapa indeks idan memasukkan #di lokasi (i, i)akan memberikan output yang diinginkan. Namun, kisi tidak selalu kuadrat, dan dengan demikian indeks dijepit ke kisi dengan mengambil minimum indeks dan lebar / tinggi (dikurangi karena pengindeksan nol) sesuai kebutuhan. Jika indeksnya nol, posisi saat ini haruslah entri kiri bawah, dan karenanyaXmalah dimasukkan. Selanjutnya, elemen-elemen di setiap baris digabungkan, dan setiap baris dicetak ke STDOUT. Jumlah gerakan adalah maksimum dari lebar / tinggi yang dikurangi; ini juga dicetak.

Cobalah di Ideone

TheBikingViking
sumber