Tugasnya adalah menemukan cara untuk menggambar garis horizontal dalam array bilangan bulat 16-bit.
Kami mengasumsikan array 256x192 piksel dengan 16 piksel per kata. Baris adalah proses yang berdekatan dari set (1) bit. Baris dapat dimulai di tengah kata apa pun, tumpang tindih dengan kata lain, dan diakhiri dengan kata apa pun; mereka juga dapat memulai dan mengakhiri kata yang sama. Mereka mungkin tidak melanjutkan ke baris berikutnya. Petunjuk: kata-kata tengahnya mudah - cukup tulis 0xffff, tetapi tepinya akan rumit, karena akan menangani kasing untuk awal dan akhir dalam kata yang sama. Fungsi / prosedur / rutin harus mengambil koordinat x0 dan x1 yang menunjukkan titik awal dan berhenti horizontal, serta koordinat.
Saya mengecualikan diri dari ini karena saya mendesain sendiri algoritma yang hampir identik untuk prosesor tertanam tapi saya ingin tahu bagaimana orang lain akan melakukannya. Poin bonus untuk menggunakan operasi yang relatif cepat (misalnya, operasi 64 bit atau operasi titik mengambang tidak akan cepat pada mesin yang disematkan tetapi pergeseran bit sederhana akan menjadi.)
sumber
Jawaban:
Kode ini mengasumsikan bahwa kedua x0 dan x1 adalah titik akhir inklusif, dan bahwa kata-kata adalah sedikit endian (yaitu, (0,0) pixel dapat diatur dengan
array[0][0]|=1
).sumber
Python
Trik utama di sini adalah menggunakan tabel pencarian untuk menyimpan bitmask dari piksel. Ini menghemat beberapa operasi. Tabel 1kB tidak terlalu besar bahkan untuk platform tertanam saat ini
Jika ruang sangat ketat, untuk harga beberapa & 0xf tabel pencarian dapat dikurangi menjadi hanya 64B
Kode ini dalam Python, tetapi akan mudah untuk port ke bahasa apa pun yang mendukung operasi bit.
Jika menggunakan C, Anda bisa mempertimbangkan untuk melepas loop menggunakan
switch
dari perangkat Duff . Karena garis maksimum 16 kata lebar, saya akan memperpanjangswitch
hingga 14 baris dan membuangwhile
semuanya.sumber
Berikut ini adalah versi C dari jawaban Python saya menggunakan pernyataan switch alih-alih loop sementara dan mengurangi pengindeksan dengan menambahkan pointer bukan indeks array
Ukuran tabel pencarian dapat dikurangi secara substansial dengan menggunakan T [x1 & 0xf] dan U [x2 & 0xf] untuk beberapa instruksi tambahan
sumber
Scala,
7s / 1M lines4.1s / 1M linesimplementasi pertama:
Setelah menghilangkan panggilan metode dalam, dan mengganti for-dengan loop-sementara, pada Core 2Ghz Tunggal saya dengan Scala 2.8 itu membebaskan 1 Mio. Baris dalam 4,1 detik. bukannya 7s awal.
Kode tes dan doa:
Pengujian kinerja:
Diuji dengan waktu alat unix, membandingkan waktu pengguna, termasuk waktu startup, kode yang dikompilasi, tanpa fase memulai JVM.
Meningkatkan jumlah baris menunjukkan, bahwa untuk setiap juta baru, perlu 3.3s tambahan.
sumber