Latar Belakang
Ini adalah kelanjutan dari tantangan saya sebelumnya , di mana tugasnya adalah menghitung bentuk patung yang diperoleh dengan menjatuhkan magnet ke tumpukan besar.
Berita bagus: artis eksentrik menyukai karya Anda, dan memiliki proyek lain untuk Anda. Dia masih bekerja dengan pahatan magnetik, tetapi telah memutuskan untuk memperluas studio seninya - ke ruang angkasa ! Metodenya saat ini adalah meledakkan satu magnet berbentuk kubus ke dalam orbit, dan menembakkan magnet lain ke dalamnya untuk menciptakan satelit magnetik besar.
Memasukkan
Input Anda adalah daftar terbatas 0
s dan 1
s, diberikan dalam format daftar asli bahasa Anda, atau string. Ini ditafsirkan sebagai "cetak biru" dari sebuah karya seni, dan diproses secara berurutan dari kiri ke kanan sebagai berikut.
Anda mulai dengan magnet tunggal yang mengambang di beberapa koordinat bilangan bulat dari bidang 2D, dan terus menambahkan lebih banyak magnet sesuai arahan. Arahan 0
memutar seluruh patung 90 derajat ke arah berlawanan arah jarum jam. Dalam hal arahan 1
, artis menemukan kolom paling kiri dari patung, dan menembakkan magnet baru ke sana dari bawah. Magnet baru menempel pada magnet paling bawah yang ada di kolom, dan menjadi bagian dari patung. Perhatikan bahwa magnet tidak menempel pada magnet lain di kolom tetangga, tidak seperti pada tantangan sebelumnya; kecepatannya sekarang astronomi!
Keluaran
Artis ingin tahu apakah patung lengkap akan masuk ke garasinya (bagaimana ia akan turun dari orbit masih belum jelas). Dengan demikian, output Anda adalah lebar dan tinggi patung, dipesan dari yang lebih rendah ke yang lebih tinggi. Mereka dapat diberikan sebagai daftar dua elemen, sepasang, atau sebagai string yang dipisahkan oleh koma.
Contoh
Pertimbangkan urutan input
[1,0,1,1,0,1,0,0,1,1]
Untuk memprosesnya, kita mulai dengan satu magnet melayang di angkasa:
#
Arahan pertama adalah 1
, jadi kami menembakkan magnet baru dari bawah:
#
#
Arahan berikutnya adalah 0
, jadi kami memutar patung:
##
Dua arahan berikutnya adalah 1,1
, yang berarti kami akan menembakkan dua magnet ke kolom paling kiri:
##
#
#
Kemudian, kami memutar lagi dan menembak sekali, seperti yang diarahkan oleh 0,1
:
#
###
#
Akhirnya, kami memutar dua kali dan menembak dua kali:
#
###
# #
#
Patung yang dihasilkan memiliki lebar 3
dan tinggi 4
, jadi kami output [3,4]
.
Aturan
Anda dapat memberikan fungsi atau program lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Uji Kasus
[1,0,1] -> [2,2]
[1,0,1,1,0,1,0,0,1,1] -> [3,4]
[1,1,0,1,1,0,1,0,1,1] -> [4,5]
[1,1,0,1,1,0,1,0,1,1,0] -> [4,5]
[1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1] -> [3,3]
[0,1,0,1,1,1,1,0,0,1,0,1,0,0,1,1,0,1,0,1,0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,1,1] -> [5,7]
[1,0,1,1,1,1,0,1,0,0,0,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,0,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,0,0,0,0,1,1,0,0,1,1,0,1,0,0,1,1,0,1,1,0,0,1,0,1,0,0,1,0,1,1,1,0,1,1,0,0,1,0,1,1,0,0,0,1,0,1,1,0,0,1,0,1,1,0] -> [11,12]
[1,1,0,1,1,0,1,0,1,1,0]
kembali[5,4]
dan tidak[4,5]
? Patung itu diputar pada bagian akhir.Jawaban:
Pyth :
3433 byteInput adalah daftar satu dan nol, seperti dalam pertanyaan. Cobalah secara online: Pyth Compiler / Executor
Penjelasan:
Ini adalah terjemahan satu-satu dari kode Python 2 berikut ( 126 byte ).
Saya membuat daftar koordinat magnet tunggal. Ini diinisialisasi dengan magnet
[0,0]
. Kemudian untuk masing-masing bilangan cetak biru saya memanipulasi daftar dengan cara berikut. Jika integer berikutnya adalah0
, saya memutar patung dengan mengubah koordinat untuk setiap magnet[a,b]
untuk[-b,a]
(pada dasarnya mengalikan dengan matriks rotasi). Jika bilangan bulat berikutnya adalah a1
, saya mencari bagian minimal[a,b]
(yang secara otomatis adalah magnet terendah dari kolom paling kiri) dan menambahkan magnet[a,b-1]
ke daftar.Setelah semua input diproses, saya membuat 2 set (untuk menghapus duplikat), satu untuk nilai x dan satu untuk nilai y, dan mencetak ukurannya dalam urutan yang diurutkan.
Sebuah ide untuk perbaikan : Menggunakan bilangan kompleks sebagai coords untuk magnet. Rotasi hanyalah perkalian dengan
j
dan mengurangij
dari magnet terendah di kolom paling kiri. Sayangnya menemukan magnet paling kiri ini membutuhkan terlalu banyak karakter di Python, bahkan tidak berbicara tentang menemukan persegi panjang.sumber
CJam, 48 byte
Uji di sini.
Mengharapkan input sebagai larik gaya CJam (yaitu spasi alih-alih koma) dan akan menyajikan output yang sama. Jika Anda ingin menggunakan kasus uji dari pertanyaan secara langsung, salin langsung ke bidang input (sertakan
->
dan hasil) dan gunakan test harness ini, yang mengubah baris ke format input yang benar (dan membuang hasilnya):Penjelasan
Saya hanya menerapkan aturan secara harfiah. Saya menyimpan kisi-kisi dengan pahatan saat ini (sebagai larik string), dan kemudian untuk setiap instruksi saya memutar kisi-kisi, atau saya menambahkan blok baru. Trik utama untuk menyimpan byte adalah:
S
danN
saya memiliki akses ke string yang berisi karakter spasi dan baris baru (yaitu karakter yang dibungkus dalam array), daripada harus menggunakan, katakanlah,1a
dan0a
untuk mendapatkan array yang berisi angka.Mari kita lihat kodenya:
sumber
Matlab (92)
Input standar digunakan. Data harus dimasukkan dalam formulir
[1,0,1,1,0,1,0,0,1,1]
.Tidak Disatukan:
Contoh dijalankan:
sumber
Python - 211
sumber
[1]
.CJam, 47 byte
Ini membutuhkan input array bergaya CJam (dipisahkan dengan ruang alih-alih koma) dari STDIN dan mencetak hasilnya ke STDOUT.
Contoh:
memberi
keluaran.
Penjelasan yang harus diikuti setelah saya yakin bahwa ini tidak dapat dipukul lebih lanjut.
Cobalah online di sini
sumber