Python 2, 14508 11700 11088 10164 9486 9746 7860 145 byte * 36 unique = 5220
Saya melihat judul dan berpikir ini adalah tantangan yang menarik untuk Python yang agak bertele-tele. Ini adalah catatan saya ketika saya menangani masalah ini.
Percobaan pertama saya mengurangi uniques menjadi 31:
print''.join(chr([69,108,105,122,97,98,101,116,104,32,111,98,110,111,120,105,111,117,115,108,121,32,113,117,111,116,101,100,32,40,106,117,115,116,32,116,111,111,32,114,111,119,100,121,32,102,111,114,32,109,121,32,112,101,97,99,101,41,58,32,34,84,72,69,32,81,85,73,67,75,32,66,82,79,87,78,32,70,79,88,32,74,85,77,80,83,32,79,86,69,82,32,84,72,69,32,76,65,90,89,32,68,79,71,44,34,32,103,105,118,105,110,103,32,109,101,32,97,32,108,111,111,107,46][r])for r in range(124))
Saya pikir saya bisa melakukan yang lebih baik. Dengan menggunakan map
, unik turun menjadi 26:
print''.join(map(chr,(69,108,105,122,97,98,101,116,104,32,111,98,110,111,120,105,111,117,115,108,121,32,113,117,111,116,101,100,32,40,106,117,115,116,32,116,111,111,32,114,111,119,100,121,32,102,111,114,32,109,121,32,112,101,97,99,101,41,58,32,34,84,72,69,32,81,85,73,67,75,32,66,82,79,87,78,32,70,79,88,32,74,85,77,80,83,32,79,86,69,82,32,84,72,69,32,76,65,90,89,32,68,79,71,44,34,32,103,105,118,105,110,103,32,109,101,32,97,32,108,111,111,107,46)))
Pada sekitar waktu ini, saya perhatikan dalam teks pertanyaan bahwa nilainya adalah uniques * bytes
, bukan hanya unik! Itu berarti skor saya untuk yang di atas adalah 14508 dan 11700. Tidak terlalu kompetitif. Jadi saya sekarang mengurangi byte dengan menyimpan teks sebagai string hex:
# 308*36 = 11088
print''.join(chr(int('456c697a6162657468206f626e6f78696f75736c792071756f74656420286a75737420746f6f20726f77647920666f72206d79207065616365293a202254484520515549434b2042524f574e20464f58204a554d5053204f56455220544845204c415a5920444f472c2220676976696e67206d652061206c6f6f6b2e'[i*2:i*2+2],16)) for i in range(124))
Ukuran berkurang tetapi karakter lebih unik. Tetapi jika saya menggunakan string desimal 2 digit yang dikemas dengan offset 32:
# 308*33 = 10164
print''.join(chr(int('37767390656669847200796678798873798583768900818579846968000874858384008479790082798768890070798200778900806965676909260002524037004953413543003450475546003847560042534548510047543750005240370044335857003647391202007173867378710077690065007679797514'[i*2:i*2+2])+32) for i in range(124))
Ini memiliki jumlah byte yang sama tetapi menyimpan 3 unik.
Saya menetas rencana baru. Jika saya mengemas integer panjang Python dengan 7 bit karakter, saya bisa mengekstraksi masing-masing dengan menggeser:
# 306*31 = 9486
h=1073974643401006528619595312441225198653732186368270382545648881135648217524502741093886285232362673460172159947573049818819511630304840724474679255867143965214892747087773876949021986013520804726327302180335979259392708372721217579101211940864406962137554744750
w=''
while h:w=chr(h&127)+w;h>>=7
print w
Nah itu mengurangi skor menjadi 9486. Eksperimen yang menarik, tetapi tidak cukup dekat baik. Sekarang bagaimana jika saya menyingkirkan nama fungsi dan mengandalkan pemformatan string?
# 443 * 22 = 9746
print('%c'*124)%(69,108,105,122,97,98,101,116,104,32,111,98,110,111,120,105,111,117,115,108,121,32,113,117,111,116,101,100,32,40,106,117,115,116,32,116,111,111,32,114,111,119,100,121,32,102,111,114,32,109,121,32,112,101,97,99,101,41,58,32,34,84,72,69,32,81,85,73,67,75,32,66,82,79,87,78,32,70,79,88,32,74,85,77,80,83,32,79,86,69,82,32,84,72,69,32,76,65,90,89,32,68,79,71,44,34,32,103,105,118,105,110,103,32,109,101,32,97,32,108,111,111,107,46)
Saya sekarang hanya memiliki 22 uniques, tetapi skornya tidak membaik.
Ok, Bagaimana jika saya mengambil cara yang jelas dan hanya mencetak string:
# 131*60 = 7860
print'Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look.'
Nilai 7860. Saya harus melakukan ini dulu. Tetapi saya tidak akan belajar banyak.
Saya kira saya bisa mengurangi jumlah uniques sebesar 26 jika saya secara dinamis menghasilkan bagian huruf besar, jadi:
# 145*36 = 5220
print'Elizabeth obnoxiously quoted (just too rowdy for my peace): '+'"the quick brown fox jumps over the lazy dog,"'.upper()+' giving me a look.'
Saya pikir Python tidak akan jauh lebih baik daripada 5220. Tugas meminimalkan karakter unik di Python tentu saja instruktif.
Pembaruan: mbomb007 memiliki solusi Python yang lebih baik dengan skor 5005. Kerja bagus.