Dinding bata adalah persegi panjang yang terbuat dari bata 1-by-n horisontal yang ditumpuk menjadi baris. Inilah dinding dengan tinggi 4 dan lebar 8, dengan ukuran batu bata ditampilkan di sebelah kanan.
[______][______] 4 4
[__][____][__][] 2 3 2 1
[][______][____] 1 4 3
[____][______][] 3 4 1
Dinding ini tidak stabil karena memiliki kesalahan , tempat di mana dua celah vertikal di antara batu bata berbaris, ditunjukkan di bawah ini dengan parens di batu bata sekitarnya.
[______][______]
[__][____)(__][]
[][______)(____]
[____][______][]
Tapi, retakan yang berbatasan dengan batu bata ukuran-1 di sebelah kanan tidak membentuk kesalahan karena dipisahkan oleh satu baris.
Tulis kode yang menemukan dan menampilkan dinding kokoh yang dibangun dari batu bata dengan ukuran yang ditentukan. Bytes paling sedikit menang.
Memasukkan
Daftar ukuran bata yang tidak kosong (angka positif) dan tinggi minimal 2. Daftar ini dapat diurutkan jika diinginkan. Anda dapat juga menghitung jumlah batu bata dari setiap ukuran.
Keluaran
Gambar dinding persegi panjang yang mantap dari ketinggian yang diperlukan yang menggunakan semua batu bata yang diberikan. Cetak atau kembalikan sebagai string dengan baris baru.
Gambarlah bata berukuran n sebagai karakter 2n, garis bawah dikelilingi oleh tanda kurung.
1: []
2: [__]
3: [____]
4: [______]
...
Input dijamin memiliki setidaknya satu solusi. Jika ada banyak, Anda harus tetap hanya menggambar satu dinding.
Tidak ada batasan waktu; gunakan sebanyak mungkin kekerasan yang Anda inginkan. Algoritme Anda secara teori seharusnya bekerja pada input dengan ukuran berapa pun.
Kasus uji:
Ada beberapa solusi, jadi output Anda mungkin berbeda.
>> [1, 1, 2, 2], 2
[][__]
[__][]
>> [1, 1, 1, 2, 2, 2, 2, 3], 2
[__][____][__]
[][__][][__][]
>> [1, 1, 2, 2, 3, 3, 3, 3], 3
[][__][____]
[__][____][]
[____][____]
>> [1, 2, 3, 4, 5, 6, 7, 8, 9], 5
[][______________]
[__][____________]
[________________]
[____][__________]
[______][________]
>> [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5
[][__][__]
[__][__][]
[][__][__]
[__][__][]
[][__][__]
n>1
dan tidak suka bagaimana itu membatasi kasus uji. Juga, tampaknya ada preseden .Jawaban:
Perl, 166
170 194Tugas yang sempurna untuk bahasa yang dibuat oleh Larry Wall.
Brute force, tetapi cukup cepat pada test case (<1s). Pemakaian:
Ujilah aku .
sumber
CJam,
94 9282 byteIni adalah versi 92 byte. Versi 82 byte berikut.
Ini mem-partisi bata menjadi segala cara yang mungkin dan hanya mengambil satu yang valid. Kekuatan yang cukup kasar untuk saat ini tetapi masih menjalankan test case terakhir dalam waktu sekitar 10 detik pada Java Interpreter di komputer saya.
Penjelasan :
Kode ini dibagi menjadi 5 bagian:
1) Diberikan array panjang
L
, bagaimana kita semua dapat mempartisi menjadiH
beberapa bagian.Setelah ini, kami memiliki semua cara yang mungkin untuk memecah array input kami menjadi lapisan H bata.
2) Dapatkan semua permutasi dari array input dan kemudian lanjutkan semua partisi untuk semua permutasi
Setelah ini, kita memiliki semua tata letak yang mungkin dari batu bata input ke
H
dinding bata berlapis.3) Saring hanya tata letak yang memiliki panjang bata yang sama
Setelah akhir filter ini, semua tata letak yang tersisa akan menjadi persegi panjang sempurna.
4) Keluarkan tata letak bata pertama yang cocok dengan kriteria stabilitas
Setelah langkah ini, kita cukup mencetak tata letaknya
5) Cetak tata letaknya
Cobalah online di sini
82 byte
Ini hampir mirip dengan versi 92 byte, kecuali bahwa ia memiliki sentuhan keacakan. Jika Anda telah membaca penjelasan untuk versi 92 byte, maka dalam versi 82 byte, bagian 3, 4 dan 5 persis sama, sedangkan alih-alih mengulangi semua permutasi dari bagian 1 dan 2, versi ini secara acak menghasilkan salah satu dari permutasi pada suatu waktu, mengujinya menggunakan bagian 3 dan 4, dan kemudian memulai kembali proses jika pengujian bagian 3 dan 4 gagal.
Ini mencetak hasilnya dengan sangat cepat untuk 3 kasus uji pertama. Ketinggian = 5 test case belum memberikan output di komputer saya.
Penjelasan perbedaannya
Ide untuk versi ini diberikan oleh randomra (Get it?)
Coba yang ini online
sumber
Python 2,
680670660 byteSaya tidak tahu mengapa saya bersikeras untuk memiliki "golf" yang sangat panjang ini ... tapi bagaimanapun, ini dia.
Ini membutuhkan output dalam urutan menaik, dan dipanggil via
b(brick_sizes, height)
.Kasus uji:
Cara kerjanya adalah:
sumber
continue
dari dekat akhir. Jugareturn(N,N)
tidak perlu tanda kurung.continue
adalah peninggalan dari versi sebelumnya.W
danT
dilewati argumen tambahan.Haskell, 262 byte
Contoh penggunaan:
Cara kerjanya: fungsi utama
#
mengambil daftarl
(daftar batu bata) dan angkah
(tinggi) dan membagi semua permutasil
menjadih
sublists di semua posisi yang mungkin (via fungsi%
, misalnya2%[1,2,3,4]
->[ [[1],[2,3]] , [[1,2],[3]] , [[1,2,3],[]] ]
). Itu membuat mereka di mana dua elemen berturut-turut memiliki jumlah yang sama (yaitu panjang yang sama dalam batu bata) dan daftar subtotal tidak memiliki elemen umum (yaitu retak tidak berbaris, berfungsiv
). Ambil daftar pertama yang cocok dan buatlah serangkaian batu bata.sumber
Python 2,
528,417,393, 381Solusi bruteforce yang sangat panjang. Ini bekerja tetapi itu saja, alam semesta mungkin berakhir sebelum mendapatkan hasil untuk kasus uji terakhir.
a adalah fungsi utama:
sumber
from itertools import*
dan menghapusitertools.
daripermutations
panggilan. Juga, hurufif
s pada akhirnya dapat diubah menjadiif all(x==w[0] for x in w)and~-f(o):return
... untuk menghemat 13 byte.f
selalu kembali pada iterasi pertama? Itu terlihat aneh. Baik itu bug atau peluang golf yang sangat besar.t=0
dua kalir()
; Anda dapat menjadikan fungsi itumap(sum,[x[:i] for i in range(len(x))])
sebagai satu-liner (cocok untuk lambda-ing jika Anda mau). Menggunakan isdisjoint dan set inf()
akan menguranginya secara signifikan (jugaf()
saat ini kembali setelah hanya satu tes, apakah itu menemukan kesalahan atau tidak). Secara pribadi saya akan menulis ulangf()
sebagaireturn not all(map(isdisjoint,map(set,map(r,w[:-1])),map(set,map(r,w[1:]))))
atau sesuatu yang serupa.JavaScript (ES6) 222
232 265 279 319Masih harus bermain golf.Yang ini menemukan semua solusi, output yang terakhir ditemukan, dan ini cukup cepat.Jalankan cuplikan di Firefox untuk menguji
Tidak Diikat Dan dijelaskan
sumber
Python 2, metode grid (290 karakter)
Metode di sini adalah Anda mentransposisikan grid dan mencari
[[
atau]]
di mana saja di kolom. Anda juga menguji bahwa semua batu bata di sisi kiri dan kanan berbaris: yang lucu di sini adalah untuk menguji bahwa semua elemen string adalah sama:'[[[[[['.strip('[')==''
versi mini di atas:
Ini mungkin bisa dilakukan dengan lebih mudah dalam bahasa manipulasi-matriks.
... atau penyalahgunaan regex, yang memungkinkan kami menggabungkan kondisi "blok sejajar" dengan kondisi "tidak ada celah":
Katakanlah lebar dinding itu w = 6. Lokasi substring "[..... [", dan "] .....]" harus persis set {0, w-1, w, 2w-1,2w, 3w-1 ,. ..}. Tidak adanya pada titik-titik itu berarti batu bata 'linewrap' seperti:
Keberadaan BUKAN pada titik-titik itu berarti ada 'celah' yang tidak stabil di dinding:
Oleh karena itu kami mengurangi masalah untuk menetapkan kesetaraan, di mana set dalam pertanyaan adalah indeks dari kecocokan ekspresi reguler.
Python, metode regexp (304 karakter):
sumber
x,h=input()
.Matlab (359)
Memasukkan
vektor bilangan bulat, contoh: p ([1 1 2 2 3])
Keluaran
contoh skema dinding:
sumber