Ketika siswa pertama kali diajarkan tentang teknik bukti induksi matematika , contoh umum adalah masalah ubin 2 N × 2 N kotak dengan tromino berbentuk L , meninggalkan satu ruang kotak yang telah ditentukan kosong. (N adalah bilangan bulat nonnegatif.)
Saya akan menyerahkannya kepada Anda untuk memeriksa buktinya jika Anda belum mengetahuinya. Ada banyak sumber yang membahasnya.
Tugas Anda di sini adalah untuk menulis program yang mengambil nilai untuk N, serta koordinat ruang kisi untuk dibiarkan kosong, dan mencetak representasi ASCII dari kisi tromino yang dihasilkan.
Karakter O
akan mengisi ruang kosong, dan 4 rotasi tromino kita akan terlihat seperti ini:
|
+-
|
-+
-+
|
+-
|
(Ya, bisa jadi ambigu mana yang +
sesuai dengan yang mana -
dan |
untuk pengaturan tertentu, tapi tidak apa-apa.)
Program Anda harus bekerja untuk N = 0 (untuk grid 1 × 1) hingga setidaknya N = 8 (untuk grid 256 × 256). Ini akan diberikan nilai x dan y yang merupakan koordinat untuk O
:
- x adalah sumbu horizontal. x = 1 adalah tepi grid kiri, x = 2 N adalah tepi grid kanan.
- y adalah sumbu vertikal. y = 1 adalah tepi grid atas, y = 2 N adalah tepi grid bawah.
Baik x dan y selalu dalam kisaran [1, 2 N ].
Jadi untuk N, x, dan y yang diberikan, program Anda harus mencetak kisi 2 N × 2 N , ubin sepenuhnya dengan tromino berbentuk L, kecuali untuk koordinat kisi x, y yang akan menjadiO
.
Contohnya
Jika N = 0, maka x dan y keduanya harus 1. Outputnya sederhana
O
Jika N = 1, x = 1, dan y = 2, hasilnya adalah
-+
O|
N = 2, x = 3, y = 2:
+--+
||O|
|+-|
+--+
N = 2, x = 4, y = 1:
+-|O
||+-
|+-|
+--+
N = 3, x = 3, y = 6 (mis. Gambar pada halaman ini ):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
Detail
- Anda dapat menulis fungsi yang mengambil 3 bilangan bulat alih-alih menulis seluruh program. Ini harus mencetak atau mengembalikan string grid.
- Ambil input dari stdin, baris perintah, (atau argumen fungsi jika Anda menulis fungsi).
- Output opsional dapat berisi baris pelatihan tunggal.
- Anda tidak diharuskan menggunakan metode ubin yang biasanya disarankan bukti. Hanya penting bahwa kotak diisi dengan tromino berbentuk L selain
O
. (Tromino tidak boleh dipotong atau keluar dari batas kotak.)
Kode terpendek dalam byte menang. Tiebreaker adalah posting sebelumnya. ( Penghitung byte berguna. )
if p!=i
; daftar di dalamnya.join()
tidak perlu[]
;(1-i%2)
dapat dilakukan sebagai~i%2
; Anda dapat menggunakan iterable unpacking untuk menulist,l,a=[],...
sebagai*t,l,a=...
;if n==0
dapat diperiksaif n<1
karenan
tidak bisa negatif; final"\n".join
mungkin dapat dilakukan dengan mencetak setiap elemen, karena aturan umum memungkinkan pencetakan sebagai pengganti;if p!=i
bisa jadiif p-i
karena nilai bukan nol adalah Truthy.f
fungsi rekursif. Saya benar-benar harus mengembalikan format outputsplit()
setelah setiap panggilan sendiri.A,B,C,D=t;return'\n'.join(map("".join,zip(A+C,B+D)))
,t+=[...]
pada baris kedua-terakhir dapat ditulis sebagait+=...,
(menambahkan tuple bukan daftar) dan saya tidak yakin apakah ini berfungsi tetapiA if B else C
dapat ditulis sebagaiB and A or C
(juga pada baris kedua-terakhir), tetapi hanya jika A tidak pernah salah (yang menurut saya tidak benar?)JavaScript (ES6) 317
414Banyak pekerjaan untuk golf, tetapi masih cukup lama.
Jalankan cuplikan untuk menguji (terlihat lebih baik menggunakan karakter blok Unicode - tetapi bahkan sedikit lebih lama)
Tampilkan cuplikan kode
sumber
IDL 8.3+, 293 byte
Ini terlalu lama, saya mencoba untuk memotongnya tetapi saya belum sampai di sana.
Output:
Dan, uh ... hanya untuk bersenang-senang ...
sumber
Ruby Rev 1, 288
Sebagai lambda anonim literal. Ditampilkan dalam program uji (lambda literal adalah
->(n,a,b){...}
)Ruby Rev 0, 330 ungolfed
Saat ini satu-satunya golf yang saya klaim adalah penghapusan komentar, baris baru dan indentasi yang tidak perlu.
Ini adalah algoritma pertama saya yang tepat yang dikodekan dalam Ruby dan ini merupakan kerja keras. Saya yakin setidaknya ada 50 karakter yang bisa dihilangkan, tetapi saya sudah melakukan cukup untuk saat ini. Ada beberapa kengerian nyata, misalnya input. Itu mungkin bisa diperbaiki oleh fungsi atau lambda bukan program, tetapi fungsi dalam
t
yang menarik tromino masih membutuhkan akses ke variabel global. Saya harus mencari tahu sintaks untuk itu.Fitur jawaban saya yang tidak ada pada yang lain, adalah saya menginisialisasi serangkaian string dengan
|
karakter. Itu berarti saya hanya perlu menggambar+-
atau-+
, yang bersebelahan di baris yang sama.sumber
Haskell, 170 byte
Jalankan online di Ideone
Contoh dijalankan:
sumber