Tantangan ini dibawa kepada Anda dengan inspirasi nyata (dan tragis). Baru-baru ini, baris angka pada keyboard saya agak sporadis. Kunci-kunci itu 1-9
bekerja kadang-kadang - tetapi kadang-kadang tidak ada hasilnya. Sebagai programmer yang rajin, ini mengerikan! (Lihat tanda seru itu? Begitulah cara Anda tahu mereka sedang bekerja saat ini.) Tidak hanya saya sering membutuhkan nomornya sendiri, tetapi juga simbolnya.!@#$%^&*(
sama sekali tidak efektif setengah waktu juga! Sebagai seorang programmer C, daripada mengambil cuti dari jadwal sibuk saya mencoret-coret dengan kode untuk memperbaiki laptop saya, saya lebih tertarik untuk mengatasi masalah tersebut. Selama beberapa minggu terakhir, perlahan, semua literal angka dalam kode saya telah diganti dengan heksadesimal sehingga saya tidak perlu mencari-cari angka untuk menyalin dan menempel. Namun, beberapa angka tidak mudah diketik tanpa kunci 1-9
. Sebagai contoh, nomor 1
tersebut tidak dapat ditulis begitu sederhana dalam heksadesimal, dan saya terpaksa mengganti 1
s dalam kode saya dengan 0xF - 0xE
. Satu-satunya kunci yang terpengaruh adalah 1-9
, jadi saya menjaga penuh penggunaan simbol-simbol seperti +
, -
, dan /
. Namun, saya tidak bisa menggunakan perkalian atau tanda kurung, seperti*
dan (
sering rusak. Ini mengarah pada tantangan Anda.
Memasukkan
Integer, n
ke stdin atau bahasa Anda setara. Jika diinginkan, integer dapat didahului atau diikuti oleh baris baru atau karakter spasi putih lainnya. Atau, Anda dapat menerima input melalui argumen baris perintah.
Program Anda harus merespons input negatif dengan benar, dan dapat menangani setidaknya bilangan bulat bertanda 32-bit.
Keluaran
Program Anda harus menampilkan, dalam beberapa bentuk yang dapat diamati, cara terpendek (dalam karakter non-spasi putih) untuk menulis angka n
sebagai jumlah, perbedaan, atau pembagian satu atau lebih nilai heksadesimal. Ada lebih dari satu cara untuk mengatasi masalah ini, dan tidak ada persyaratan yang Anda sukai untuk setiap output dengan panjang yang sama.
Outputnya harus dalam bentuk di A % A % A...
mana A
nilai heksadesimal berikut 0x
hanya berisi digit A-F a-f
, dan %
merupakan salah satu simbol -+/
. Mari /
gambarkan pembagian integer, bukan floating-point.
(Perhatikan bahwa hasil Anda harus menghasilkan n
ketika mengevaluasi divisi pertama, kiri ke kanan, dan kemudian penambahan dan pengurangan, dari kiri ke kanan, seperti konvensi.)
Uji Kasus
Input output
1
0xF - 0xE
(atau0xF-0xE
atau0xB-0xA
atau0xd - 0xc
atau0xF/0xF
)15
0xF
255
0xFF
30
0xF + 0xF
Penilaian dan Aturan
Ini adalah kode-golf. Skor awal Anda adalah jumlah byte dalam file sumber Anda.
Anda TIDAK boleh menggunakan salah satu digit 1-9
di sumber Anda.
Anda DAPAT menggunakan simbol !@#$%^&*(
di sumber Anda, tetapi masing-masing dikenakan penalti +20 untuk skor Anda.
Program Anda dapat digantikan oleh fungsi yang mengambil n
sebagai argumen selama fungsi itu menghasilkan beberapa bentuk output yang dapat dibaca manusia. Nilai pengembalian fungsi Anda TIDAK dihitung sebagai output.
Menang skor terendah! Semoga berhasil!
Apakah saya melakukan kesalahan format / tanya / kejelasan? Biarkan aku tahu! Ini adalah pengiriman pertama saya ke situs ini!
sumber
Jawaban:
JavaScript 287 (187 + 20 * 5)
295 (195 + 20 * 5) 338 (198 + 20 * 7)Fungsi yang memeriksa setiap kemungkinan kombinasi dari 6 digit heksa yang diizinkan (0xA hingga 0xF) dan 3 operator yang diizinkan. Output melalui popup dan tidak mengembalikan nilai, seperti yang diminta.
Saya menggunakan [] untuk kelompok dipisahkan koma ekspresi tapi tidak bisa menghindari 5
7kurung terbuka untuk loop dan fungsi panggilan.Untuk menghindari digit ada variabel A, B, C untuk 1,2,3 (ini membuat kode lebih jelas)
Edit kode yang direvisi dengan fokus menghindari '('. Dihapus
if
dan pembuatan RegExp eksplisitHati-hati: fungsi ini sangat lambat, itu akan melebihi batas waktu untuk skrip di FireFox, bahkan untuk input kecil seperti 90.
Untuk menghitung semua ekspresi yang mungkin, saya menggunakan angka mulai dari 3 dan naik selamanya. Pengkodean digit:
0,1,2 adalah operator +, -, /
4 hingga 9 adalah angka hex A..F
3 tidak diperbolehkan
Setiap angka diperiksa dengan regexp
/3|[0-2]{2}/
untuk menghindari angka 3 dan memiliki 2 operator berturut-turut ( periksa juga hindari traling dan operator terkemuka - lihat kode)String yang dihasilkan adalah sesuatu seperti
0xA + 0xA - 0xD
itu adalah javascript yang valid, jadi saya menggunakan eval untuk mengevaluasinya. Unfortunatley operator '/' adalah floating point dan tidak integer dalam JavaScript, jadi saya tidak 100% yakin bahwa hasilnya adalah casting acara yang benar untuk integer hasil akhir (tapi saya cukup percaya diri, mengingat bahwa kesalahan pembulatan kecil tidak bisa diperbesar dengan '*')Sesuatu yang lain
Sekarang, sesuatu yang lebih lucu. Saya menggunakan pengurai expressione yang disederhanakan untuk menghindari panggilan eval dan, yang mengejutkan, ternyata jauh lebih cepat.
Parser benar-benar disederhanakan, dalam pengurai nyata V dan O haruslah array yang berisi stack nilai pending dan stack operator pending. Di sini V adalah nilai pending tunggal (dan juga nilai balik) dan O adalah string dengan paling banyak 2 karakter. P berisi tabel prioritas operator, untuk '- + /' => '112'
Ini skor 275 + 4 * 20 => 355
Tes Di Firefox / konsol FireBug, ubah lansiran dengan kembali (lebih bermanfaat)
Hanya sedikit kurang jelas (tapi bersabarlah)
sumber
Python 2: 185 byte + 2 * 20 = 225
Terlalu lama untuk jawaban yang serius. Tetapi karena belum ada jawaban, saya akan mempostingnya.
product
membuat semua pengaturan berbeda dari karakter yang diizinkan.exec
mencoba memecahkan kode itu. Sedih ini mengembalikan pengecualian, makatry - catch
blok panjang . Jika hasilnya baik, cetak dan ada.2 kali penalti, karena kawat gigi tersebut selama pemanggilan fungsi.
sumber
0
bukan heksadesimal; (2) Divisi yang melibatkan angka negatif dalam Python memberikan hasil yang berbeda dari pada C.