Python 2, 14508 11700 11088 10164 9486 9746 7860 145 byte * 36 unique = 5220
Tôi đã nhìn thấy tiêu đề và nghĩ rằng đây là một thử thách thú vị cho Python khá dài dòng. Đây là những ghi chú của tôi khi tôi giải quyết vấn đề này.
Lần thử đầu tiên của tôi đã giảm số lượng xuống còn 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))
Tôi nghĩ rằng tôi có thể làm tốt hơn. Bằng cách sử dụng map
, cổ vật đã giảm xuống còn 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)))
Vào khoảng thời gian này, tôi nhận thấy trong văn bản câu hỏi rằng điểm số uniques * bytes
, không chỉ là sự kỳ lạ! Điều đó có nghĩa là điểm số của tôi ở trên là 14508 và 11700. Không cạnh tranh lắm. Vì vậy, bây giờ tôi giảm các byte bằng cách lưu trữ văn bản dưới dạng chuỗi hex:
# 308*36 = 11088
print''.join(chr(int('456c697a6162657468206f626e6f78696f75736c792071756f74656420286a75737420746f6f20726f77647920666f72206d79207065616365293a202254484520515549434b2042524f574e20464f58204a554d5053204f56455220544845204c415a5920444f472c2220676976696e67206d652061206c6f6f6b2e'[i*2:i*2+2],16)) for i in range(124))
Kích thước đã giảm nhưng nhân vật độc đáo hơn. Nhưng nếu tôi sử dụng chuỗi thập phân 2 chữ số được đóng gói với độ lệch 32:
# 308*33 = 10164
print''.join(chr(int('37767390656669847200796678798873798583768900818579846968000874858384008479790082798768890070798200778900806965676909260002524037004953413543003450475546003847560042534548510047543750005240370044335857003647391202007173867378710077690065007679797514'[i*2:i*2+2])+32) for i in range(124))
Điều này có cùng số byte nhưng tiết kiệm được 3 lần.
Tôi ấp ủ một kế hoạch mới. Nếu tôi đóng gói một số nguyên dài Python có 7 ký tự, tôi có thể trích xuất từng số bằng cách dịch chuyển:
# 306*31 = 9486
h=1073974643401006528619595312441225198653732186368270382545648881135648217524502741093886285232362673460172159947573049818819511630304840724474679255867143965214892747087773876949021986013520804726327302180335979259392708372721217579101211940864406962137554744750
w=''
while h:w=chr(h&127)+w;h>>=7
print w
Vâng, điều đó đã làm giảm điểm số xuống còn 9486. Một thử nghiệm thú vị, nhưng không nơi nào đủ tốt. Bây giờ nếu tôi thoát khỏi tên hàm và dựa vào định dạng chuỗi thì sao?
# 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)
Bây giờ tôi chỉ có 22 điểm duy nhất, nhưng điểm số không được cải thiện.
Ok, nếu tôi lấy theo cách rõ ràng và chỉ in chuỗi:
# 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.'
Điểm số 7860. Tôi nên làm điều này đầu tiên. Nhưng tôi sẽ không học được nhiều như vậy.
Tôi đoán rằng tôi có thể giảm số cổ phần xuống 26 nếu tôi tự động sản xuất các bộ phận chữ hoa, vì vậy:
# 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.'
Tôi nghĩ rằng Python sẽ không tốt hơn nhiều so với 5220. Nhiệm vụ tối thiểu hóa các ký tự duy nhất trong Python chắc chắn là mang tính hướng dẫn.
Cập nhật: mbomb007 có giải pháp Python tốt hơn đạt 5005. Công việc tuyệt vời.