kata pengantar
Dalam situasi yang sangat panas Anda harus melangkah lebih jauh dengan bermain golf.
(mis. dalam tantangan di mana jawaban Anda adalah 100 karakter dan itu memalukan bahwa Anda tidak dapat membuatnya 99).
Dalam hal ini, mulai sekarang Anda menggunakan algoritma pemenang dari tantangan ini :)
tujuan
Anda harus menulis program yang menggunakan uint32 dan mengembalikan formulir yang paling padat.
$ mathpack 147456
9<<14
- Akan ada beberapa solusi untuk suatu nomor. Pilih yang terpendek
- Jika bentuk terkompresi lebih panjang atau sama dengan nomor aslinya, kembalikan nomor aslinya
aturan
- tulis dalam bahasa apa pun - output dalam bahasa apa pun
- Aku menyadari bahwa dalam C
'abc'
adalah6382179
dan Anda dapat mencapai hasil yang cukup baik dengan konversi ini. tetapi bahasa dipisahkan dalam tantangan ini jadi jangan berkecil hati - dilarang menggunakan variabel eksternal. hanya operator dan fungsi terkait literal dan matematika!
mencetak gol
di sini adalah kasus uji: pastebin.com/0bYPzUhX
skor Anda (persen) akan menjadi rasio byte_size_of_your_output / byte_size_of_the_list
tanpa jeda baris .
(Anda harus melakukan ini sendiri karena saya hanya akan memverifikasi kode terbaik untuk berjaga-jaga)
pemenang akan dipilih berdasarkan skor dan bahasa output !
contoh:
$ mathpack 147456 | mathpack 97787584 | mathpack 387420489
9<<14 | 9e7^9e6 | pow(9,9)
code-challenge
bebe
sumber
sumber
write in any language - output in any language
- dua bahasa bisa berbeda, bukan?Jawaban:
Kode: Mathematica, Output: C, ~ 62.1518% (12674/20392)
Saya pikir saya juga akan mencoba C karena literal karakter lucu itu. Saat ini, inilah satu-satunya jawaban yang coba dicoba, dan ini berfungsi dengan baik.
Saya harap saya tidak melewatkan apa pun, tetapi jawaban ini memastikan untuk lolos dari garis miring terbalik, tanda kutip tunggal dan juga trigraph. Ada beberapa kode yang dikomentari yang menggunakan sekuens oktal atau lainnya untuk karakter yang tidak dapat dicetak, tapi saya rasa itu tidak perlu, karena C harus bisa berurusan dengan byte dalam literal karakter, afaik (tolong perbaiki saya jika saya salah).
Seperti kiriman lainnya, uji ini dengan
sumber
\n
) dan 13 (\r
). Byte nol akan mengkompilasi OK, tetapi dengan pesan kesalahanwarning: null character(s) preserved in literal
.Kode: Mathematica, Output: Julia, ~ 98.9457% (20177/20392 byte)
Fungsi mengambil nomor dan mengembalikan string terpendek yang ditemukannya. Saat ini ia menerapkan empat optimisasi sederhana (saya mungkin menambahkan lebih banyak besok).
Anda dapat menerapkannya ke seluruh file (untuk mengukur nilainya) sebagai berikut:
Perhatikan bahwa beberapa optimisasi ini mengasumsikan bahwa Anda menggunakan Julia 64-bit, sehingga literal integer memberi Anda
int64
default. Jika tidak, Anda tetap akan kelebihan untuk bilangan bulat lebih besar dari 2 31 . Dengan menggunakan asumsi itu, kita dapat menerapkan beberapa optimasi yang langkah-langkah peralihannya sebenarnya bahkan lebih besar dari 32 .EDIT: Saya menambahkan optimasi yang disarankan dalam contoh OP untuk bitwise xor dua angka besar dalam notasi ilmiah (sebenarnya, untuk semua xor , atau dan dan ). Perhatikan bahwa memperluas
xormap
,ormap
danandmap
untuk menyertakan operan di luar 2 32 dapat membantu menemukan optimisasi tambahan, tetapi tidak berfungsi untuk kasus uji yang diberikan dan hanya menambah waktu berjalan dengan sesuatu seperti faktor 10.EDIT: Saya mencukur 16 byte lagi, dengan memeriksa semua
n-9, n-8, ..., n+8, n+9
apakah ada yang bisa dipersingkat, dalam hal ini saya mewakili angka berdasarkan itu, menambah atau mengurangi perbedaan. Ada beberapa kasus, di mana salah satu dari 18 angka dapat diwakili dengan 3 atau lebih karakter kurang darin
itu sendiri, dalam hal ini saya dapat melakukan penghematan tambahan. Dibutuhkan sekitar 30 detik sekarang untuk menjalankannya pada semua kasus uji, tetapi tentu saja, jika seseorang benar-benar "menggunakan" fungsi ini, ia hanya akan menjalankannya pada satu nomor, jadi masih di bawah satu detik.EDIT: Lain 4 byte luar biasa dengan melakukan hal yang sama untuk perkalian dan pembagian. 50 detik sekarang (yang dibagi tidak butuh waktu lama, karena saya hanya memeriksa ini jika jumlahnya benar-benar dapat dibagi oleh faktor yang menarik).
EDIT: Optimalisasi lain yang sebenarnya tidak membantu set tes yang diberikan. Yang ini bisa menghemat satu byte untuk hal-hal seperti 2 30 atau 2 31 . Jika kita memiliki uint64 saja, akan ada banyak angka di mana ini bisa menjadi penghematan besar (pada dasarnya, setiap kali representasi bit berakhir dengan banyak 1s).
EDIT: Menghapus xor , atau , dan optimisasi sama sekali. Saya hanya memperhatikan mereka bahkan tidak bekerja di Julia, karena (sangat jelas) notasi ilmiah memberi Anda pelampung di mana operator bit-bijaksana bahkan tidak didefinisikan. Yang menarik, satu atau lebih optimisasi yang lebih baru nampaknya menangkap semua kasus yang dipersingkat oleh optimisasi ini, karena skornya tidak berubah sama sekali.
sumber
J to C (belum diuji, tetapi berfungsi dalam kebanyakan kasus, semacam jawaban dasar.)
Menghasilkan string literal yang, jika dimasukkan dalam C, mewakili angka (sebagaimana disebutkan dalam OP). Ini bukan penyerahan yang serius, melainkan sesuatu untuk memperkuat keterampilan J saya, yang saya pikir saya akan bagikan.
Alternatif satu-liner:
Apa yang J coba lakukan ketika Anda memasukkannya:
Terima kasih banyak, J. Juga, bagi mereka yang 'tahu' tentang J, batu visio untuk membuat fungsi yang lebih kompleks:
sumber
\
,?
atau'
?m&u@:v
, gunakanm u v
untuk menyimpan karakter berharga dan untuk meningkatkan keterbacaan. Menerapkan ini ke kode Anda, kami mendapatkanf =: [: (,~ 0 $~ 8 - 8 | #) #:
dang =: [: ($~ 8 ,~ # % 8:) f
dan terakhirtoCString =: a. {~ [: #. g
. Semua gabungan kita dapatkana. {~ [: #. [: ($~ 8 ,~ # % 8:) [: (,~ 0 $~ 8 - 8 | #) #:
, yang sangat mudah dibaca.