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 X
untuk 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!
Jawaban:
MATL , 38 byte
Cobalah online!
Penjelasan
Biarkan
m
dann
jadikan input yang diurutkan, sedemikian rupa sehinggam
lebih besar atau sama dengann
. Kode awalnya membangunm
xn
matriks sebagai berikut:#
. Jumlah entri ini minus 1 adalah jumlah langkah.X
..
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
X
muncul di bagian bawah kolom pertama, dan entri-entrinya digunakan sebagai indeks ke dalam string'.#X'
untuk menghasilkan array char 2D yang diinginkan.sumber
Pyth,
464544 byteCoba di sini.
Penjelasan:
sumber
JavaScript (ES6), 132
Edit 2 byte yang disimpan thx @Neil
Uji
sumber
w--,R=
... kemap()
.Javascript (menggunakan perpustakaan eksternal) (235 byte)
Astaga ini sulit! Yah ... perpustakaan saya sebenarnya bukan tugas yang tepat untuk haha ini. Tapi saya suka tantangannya
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 ...
sumber
Python 3,
161156 byteSebuah 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 indeksi
dan 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 karenanyaX
malah 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
sumber