Bantu saya menunda-nunda perbaikan komputer saya!

23

Tantangan ini dibawa kepada Anda dengan inspirasi nyata (dan tragis). Baru-baru ini, baris angka pada keyboard saya agak sporadis. Kunci-kunci itu 1-9bekerja 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 1tersebut tidak dapat ditulis begitu sederhana dalam heksadesimal, dan saya terpaksa mengganti 1s 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, nke 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 nsebagai 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 Anilai heksadesimal berikut 0xhanya berisi digit A-F a-f, dan %merupakan salah satu simbol -+/. Mari /gambarkan pembagian integer, bukan floating-point.

(Perhatikan bahwa hasil Anda harus menghasilkan nketika mengevaluasi divisi pertama, kiri ke kanan, dan kemudian penambahan dan pengurangan, dari kiri ke kanan, seperti konvensi.)

Uji Kasus

Input output

  1. 1

    0xF - 0xE(atau 0xF-0xEatau 0xB-0xAatau 0xd - 0xcatau 0xF/0xF)

  2. 15

    0xF

  3. 255

    0xFF

  4. 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-9di 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 nsebagai argumen selama fungsi itu menghasilkan beberapa bentuk output yang dapat dibaca manusia. Nilai pengembalian fungsi Anda TIDAK dihitung sebagai output.

Tidak ada celah standar .

Menang skor terendah! Semoga berhasil!

Apakah saya melakukan kesalahan format / tanya / kejelasan? Biarkan aku tahu! Ini adalah pengiriman pertama saya ke situs ini!

BrainSteel
sumber
Apakah ada batas atas ukuran bilangan bulat? Juga, akankah angka negatif diwakili ke beberapa presisi sewenang-wenang (yaitu 32 bit)?
FryAmTheEggman
@FryAmTheEggman Mengedit posting asli untuk mengklarifikasi. Input mungkin negatif, dan program Anda harus merespons dengan benar setidaknya 32 bit input. Terima kasih!
BrainSteel
Ini terlihat seperti spesifikasi yang cukup solid bagi saya, tetapi jika Anda ingin umpan balik, saya sarankan mempostingnya di kotak pasir (untuk tantangan di masa mendatang) sehingga Anda bisa mendapatkan umpan balik sebelum mempostingnya di main dan orang-orang mulai mengerjakannya .
Martin Ender
1
Divisi integer atau floating point?
edc65

Jawaban:

5

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 7 kurung 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 ifdan pembuatan RegExp eksplisit

Hati-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 - 0xDitu 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 '*')

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,j=0;j?x-~~eval(L):A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',L='',w='0x')?j='':j)
      c>C?w+=' ABCDEF'[c-C]:[L+=w,w=' '+'+-/'[c]+' 0x']
  }
  alert(L)
}

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

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,D=A+C,j=0,P=''+A+A+B;j?x-V:A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',v=V=O=L='',w='0x')?j='':j)
      c>C?
        w+='ABCDEF'[v<<=D,v+=D+A-~c,c-D]
      :[
          P[O[0]]>=P[c]?[v=O>A?V/v|0:O>0?V+v:V-v,O=c]:O=c+O,
          L+=w,w=' '+'-+/'[c]+' 0x',V=v,v=0
      ]
  }
  alert(L)
}

Tes Di Firefox / konsol FireBug, ubah lansiran dengan kembali (lebih bermanfaat)

;[0, 1, 15, 255, 30].forEach(x=>console.log(x,F(x)))

0 0xA - 0xA
1 0xA / 0xA
15 0xF
255 0xFF
30 0xF + ​​0xF

Hanya sedikit kurang jelas (tapi bersabarlah)

;[16,40, 51, 62, 73, 84, 95].forEach(x=>console.log(x,F(x)))

16 0xBA / 0xB
40 0xA + 0xF + ​​0xF
51 0xDD - 0xAA
62 0xEA - 0xAC
73 0xA + 0xEA - 0xAB
84 0xFE - 0xAA
95 0xA + 0xFF - 0xAA

edc65
sumber
3

Python 2: 185 byte + 2 * 20 = 225

Terlalu lama untuk jawaban yang serius. Tetapi karena belum ada jawaban, saya akan mempostingnya.

from itertools import product as p
n=input()
l=t=0
while~l:
 l=-~l
 for i in p("0xABCDEF+-/",repeat=l):
  j=""
  for k in i:j+=k
  try:exec"t="+j
  except:0
  if t==n:print j;l=~0;break

productmembuat semua pengaturan berbeda dari karakter yang diizinkan. execmencoba memecahkan kode itu. Sedih ini mengembalikan pengecualian, maka try - catchblok panjang . Jika hasilnya baik, cetak dan ada.

2 kali penalti, karena kawat gigi tersebut selama pemanggilan fungsi.

Jakube
sumber
2
Jawaban ini dapat memiliki beberapa masalah: (1) 0bukan heksadesimal; (2) Divisi yang melibatkan angka negatif dalam Python memberikan hasil yang berbeda dari pada C.
feersum