Nếu một bức tranh trị giá 1000 từ, bạn có thể ghép được bao nhiêu hình ảnh trong 140 ký tự?
Lưu ý : Đó là folks! Hạn chót của Bounty là ở đây, và sau khi cân nhắc kỹ lưỡng, tôi đã quyết định rằng mục nhập của Boojum chỉ vừa đủ để vượt qua Sam Hocevar . Tôi sẽ đăng ghi chú chi tiết hơn một khi tôi có cơ hội viết chúng lên. Tất nhiên, mọi người nên thoải mái tiếp tục gửi giải pháp và cải thiện giải pháp để mọi người bỏ phiếu. Cảm ơn tất cả những người đã gửi và nhập cảnh; Tôi rất thích tất cả chúng. Điều này đã mang lại rất nhiều niềm vui cho tôi khi chạy và tôi hy vọng nó sẽ thú vị cho cả những người tham gia và khán giả.
Tôi đã xem qua bài đăng thú vị này về việc cố gắng nén hình ảnh vào một bình luận trên Twitter và rất nhiều người trong chủ đề đó (và một chủ đề trên Reddit ) đã có đề xuất về các cách khác nhau mà bạn có thể làm. Vì vậy, tôi cho rằng nó sẽ tạo ra một thách thức mã hóa tốt; hãy để mọi người đặt tiền của họ ở nơi miệng của họ và cho thấy ý tưởng của họ về mã hóa có thể dẫn đến chi tiết hơn trong không gian hạn chế mà bạn có sẵn như thế nào.
Tôi thách bạn đưa ra một hệ thống mục đích chung để mã hóa hình ảnh thành tin nhắn Twitter 140 ký tự và giải mã chúng thành hình ảnh một lần nữa. Bạn có thể sử dụng các ký tự Unicode, do đó bạn nhận được nhiều hơn 8 bit cho mỗi ký tự. Tuy nhiên, ngay cả khi cho phép các ký tự Unicode, bạn sẽ cần phải nén hình ảnh vào một khoảng trống rất nhỏ; đây chắc chắn sẽ là một sự nén mất mát, và do đó sẽ phải có những đánh giá chủ quan về việc mỗi kết quả trông như thế nào.
Đây là kết quả mà tác giả ban đầu, Quasimondo , đã nhận được từ mã hóa của mình (hình ảnh được cấp phép theo giấy phép Creative Commons Attribution-NoncommIAL ):
Bạn có thể làm tốt hơn không?
Quy tắc
- Chương trình của bạn phải có hai chế độ: mã hóa và giải mã .
- Khi mã hóa :
- Chương trình của bạn phải lấy làm đầu vào một đồ họa ở bất kỳ định dạng đồ họa raster hợp lý nào bạn chọn. Chúng tôi sẽ nói rằng bất kỳ định dạng raster nào được ImageMagick hỗ trợ đều có giá trị hợp lý.
- Chương trình của bạn phải xuất ra một thông báo có thể được biểu thị bằng 140 hoặc ít hơn các điểm mã Unicode; 140 điểm mã trong phạm vi
U+0000
-U+10FFFF
, trừ phi nhân vật (U+FFFE
,U+FFFF
,U+
nFFFE
,U+
nFFFF
nơi n là1
-10
thập lục phân, và phạm viU+FDD0
-U+FDEF
) và điểm mã thay thế (U+D800
-U+DFFF
). Nó có thể là đầu ra trong bất kỳ mã hóa hợp lý nào của sự lựa chọn của bạn; mọi mã hóa được GNUiconv
hỗ trợ sẽ được coi là hợp lý và mã hóa gốc hoặc mã hóa ngôn ngữ nền tảng của bạn có thể là một lựa chọn tốt. Xem ghi chú Unicode bên dưới để biết thêm chi tiết.
- Khi giải mã :
- Chương trình của bạn sẽ lấy đầu vào là đầu ra của chế độ mã hóa .
- Chương trình của bạn phải xuất hình ảnh ở bất kỳ định dạng hợp lý nào bạn chọn, như được xác định ở trên, mặc dù đối với các định dạng vectơ đầu ra cũng ổn.
- Đầu ra hình ảnh phải là một xấp xỉ của hình ảnh đầu vào; bạn càng có thể đến gần hình ảnh đầu vào thì càng tốt.
- Quá trình giải mã có thể không có quyền truy cập vào bất kỳ đầu ra nào khác của quá trình mã hóa ngoài đầu ra được chỉ định ở trên; nghĩa là, bạn không thể tải lên hình ảnh ở đâu đó và xuất URL cho quá trình giải mã để tải xuống hoặc bất cứ điều gì ngớ ngẩn như thế.
Để đảm bảo tính nhất quán trong giao diện người dùng, chương trình của bạn phải hoạt động như sau:
- Chương trình của bạn phải là một tập lệnh có thể được đặt thành có thể thực thi được trên một nền tảng với trình thông dịch phù hợp hoặc chương trình có thể được biên dịch thành tệp thực thi.
- Chương trình của bạn phải lấy làm đối số đầu tiên
encode
hoặcdecode
để đặt chế độ. Chương trình của bạn phải nhận đầu vào theo một hoặc nhiều cách sau (nếu bạn triển khai tên lấy tên tệp, bạn cũng có thể đọc và ghi từ stdin và stdout nếu tên tệp bị thiếu):
Lấy đầu vào từ tiêu chuẩn trong và sản xuất đầu ra trên tiêu chuẩn ra.
my-program encode <input.png >output.txt my-program decode <output.txt >output.png
Lấy đầu vào từ một tệp có tên trong đối số thứ hai và tạo đầu ra trong tệp có tên trong đối số thứ ba.
my-program encode input.png output.txt my-program decode output.txt output.png
- Đối với giải pháp của bạn, xin vui lòng gửi:
- Mã của bạn, đầy đủ và / hoặc một liên kết đến nó được lưu trữ ở nơi khác (nếu nó rất dài hoặc yêu cầu nhiều tệp để biên dịch, hoặc một cái gì đó).
- Một lời giải thích về cách thức hoạt động của nó, nếu nó không rõ ràng ngay lập tức từ mã hoặc nếu mã dài và mọi người sẽ quan tâm đến một bản tóm tắt.
- Một hình ảnh ví dụ, với hình ảnh gốc, văn bản mà nó nén xuống và hình ảnh được giải mã.
- Nếu bạn đang xây dựng một ý tưởng mà người khác có, xin hãy ghi nhận chúng. Bạn có thể cố gắng hoàn thiện ý tưởng của người khác, nhưng bạn phải quy kết chúng.
Hướng dẫn
Về cơ bản, đây là các quy tắc có thể bị phá vỡ, đề xuất hoặc tiêu chí chấm điểm:
- Thẩm mỹ là quan trọng. Tôi sẽ phán xét và đề nghị người khác phán xét, dựa trên:
- Hình ảnh đầu ra trông tốt như thế nào, và nó trông giống như bản gốc bao nhiêu.
- Văn bản trông đẹp như thế nào. Gobbledigook hoàn toàn ngẫu nhiên là ổn nếu bạn có một sơ đồ nén thực sự thông minh, nhưng tôi cũng muốn xem câu trả lời biến hình ảnh thành những bài thơ đa ngôn ngữ, hoặc một cái gì đó thông minh như thế. Lưu ý rằng tác giả của giải pháp ban đầu đã quyết định chỉ sử dụng các ký tự Trung Quốc, vì nó trông đẹp hơn theo cách đó.
- Mã thú vị và thuật toán thông minh luôn luôn tốt. Tôi thích ngắn, đến mức, và mã rõ ràng, nhưng các thuật toán phức tạp thực sự thông minh là OK miễn là chúng tạo ra kết quả tốt.
- Tốc độ cũng rất quan trọng, mặc dù không quan trọng bằng việc công việc nén hình ảnh bạn làm tốt đến mức nào. Tôi muốn có một chương trình có thể chuyển đổi một hình ảnh trong một phần mười giây so với một chương trình sẽ chạy các thuật toán di truyền trong nhiều ngày.
- Tôi sẽ thích các giải pháp ngắn hơn cho các giải pháp dài hơn, miễn là chúng tương đối hợp lý về chất lượng; sự đồng tình là một đức tính
- Chương trình của bạn nên được triển khai bằng ngôn ngữ có triển khai miễn phí trên Mac OS X, Linux hoặc Windows. Tôi muốn có thể chạy các chương trình, nhưng nếu bạn có một giải pháp tuyệt vời chỉ chạy theo MATLAB hoặc một cái gì đó, thì tốt thôi.
- Chương trình của bạn nên càng chung chung càng tốt; nó nên hoạt động với càng nhiều hình ảnh khác nhau càng tốt, mặc dù một số có thể tạo ra kết quả tốt hơn những hình ảnh khác. Đặc biệt:
- Có một vài hình ảnh được tích hợp vào chương trình phù hợp và viết tham chiếu đến, sau đó tạo ra hình ảnh phù hợp khi giải mã, khá khập khiễng và sẽ chỉ bao gồm một vài hình ảnh.
- Một chương trình có thể lấy hình ảnh của các hình dạng đơn giản, phẳng, hình học và phân tách chúng thành một số nguyên thủy véc tơ là khá tiện lợi, nhưng nếu nó thất bại trên các hình ảnh vượt quá độ phức tạp nhất định thì có lẽ không đủ chung chung.
- Một chương trình chỉ có thể chụp ảnh với tỷ lệ khung hình cố định cụ thể nhưng thực hiện tốt công việc với chúng cũng sẽ ổn, nhưng không lý tưởng.
- Bạn có thể thấy rằng một hình ảnh đen trắng có thể thu được nhiều thông tin vào một không gian nhỏ hơn một hình ảnh màu. Mặt khác, điều đó có thể giới hạn các loại hình ảnh mà nó áp dụng; khuôn mặt trở nên đẹp với màu đen và trắng, nhưng thiết kế trừu tượng có thể không phù hợp lắm.
- Hoàn toàn ổn nếu hình ảnh đầu ra nhỏ hơn đầu vào, trong khi có cùng tỷ lệ. Sẽ ổn nếu bạn phải phóng to hình ảnh lên để so sánh nó với bản gốc; Điều quan trọng là nó trông như thế nào.
- Chương trình của bạn sẽ tạo ra đầu ra thực sự có thể đi qua Twitter và đi ra ngoài vô tư. Đây chỉ là một hướng dẫn chứ không phải là một quy tắc, vì tôi không thể tìm thấy bất kỳ tài liệu nào về bộ ký tự chính xác được hỗ trợ, nhưng có lẽ bạn nên tránh các ký tự điều khiển, các ký tự kết hợp vô hình thú vị, các ký tự sử dụng riêng tư và tương tự.
Chấm điểm
Là một hướng dẫn chung về cách tôi sẽ xếp hạng các giải pháp khi chọn giải pháp được chấp nhận của mình, giả sử rằng tôi có thể sẽ đánh giá các giải pháp theo thang điểm 25 (điều này rất khó hiểu và tôi sẽ không được chấm điểm trực tiếp, chỉ cần sử dụng đây là một hướng dẫn cơ bản):
- 15 điểm cho sơ đồ mã hóa tái tạo một loạt các hình ảnh đầu vào tốt như thế nào. Đây là một đánh giá chủ quan, thẩm mỹ
- 0 có nghĩa là nó hoàn toàn không hoạt động, nó trả lại hình ảnh giống nhau mỗi lần hoặc một cái gì đó
- 5 có nghĩa là nó có thể mã hóa một vài hình ảnh, mặc dù phiên bản được giải mã trông xấu và nó có thể không hoạt động trên các hình ảnh phức tạp hơn
- 10 có nghĩa là nó hoạt động trên một loạt các hình ảnh và tạo ra những hình ảnh dễ chịu mà đôi khi có thể phân biệt được
- 15 có nghĩa là nó tạo ra các bản sao hoàn hảo của một số hình ảnh, và thậm chí đối với các hình ảnh lớn hơn và phức tạp hơn, mang lại một cái gì đó dễ nhận biết. Hoặc, có lẽ nó không tạo ra những hình ảnh khá dễ nhận biết, nhưng tạo ra những hình ảnh đẹp có nguồn gốc rõ ràng từ bản gốc.
- 3 điểm để sử dụng thông minh bộ ký tự Unicode
- 0 điểm chỉ đơn giản là sử dụng toàn bộ bộ ký tự được phép
- 1 điểm cho việc sử dụng một bộ ký tự giới hạn an toàn để chuyển qua Twitter hoặc trong nhiều tình huống khác nhau
- 2 điểm cho việc sử dụng tập hợp con các ký tự theo chủ đề, chẳng hạn như chỉ các chữ tượng hình chữ Hán hoặc chỉ các ký tự từ phải sang trái
- 3 điểm để làm một cái gì đó thực sự gọn gàng, như tạo văn bản có thể đọc hoặc sử dụng các ký tự trông giống như hình ảnh trong câu hỏi
- 3 điểm cho cách tiếp cận thuật toán thông minh và kiểu mã
- 0 điểm cho thứ gì đó là 1000 dòng mã chỉ để thu nhỏ hình ảnh xuống, coi nó là 1 bit trên mỗi pixel và mã hóa base64
- 1 điểm cho một cái gì đó sử dụng một kỹ thuật mã hóa tiêu chuẩn và được viết tốt và ngắn gọn
- 2 điểm cho một cái gì đó giới thiệu một kỹ thuật mã hóa tương đối mới, hoặc đó là ngắn và đáng ngạc nhiên
- 3 điểm cho một lớp lót thực sự tạo ra kết quả tốt hoặc thứ gì đó phá vỡ nền tảng mới trong mã hóa đồ họa (nếu điều này có vẻ như là một số điểm thấp để phá vỡ nền tảng mới, hãy nhớ rằng kết quả tốt này sẽ có điểm cao về tính thẩm mỹ cũng)
- 2 điểm cho tốc độ. Tất cả những thứ khác đều bằng nhau, nhanh hơn là tốt hơn, nhưng các tiêu chí trên đều quan trọng hơn tốc độ
- 1 điểm để chạy trên phần mềm miễn phí (nguồn mở), vì tôi thích phần mềm miễn phí (lưu ý rằng C # vẫn sẽ đủ điều kiện cho điểm này miễn là nó chạy trên Mono, tương tự mã MATLAB sẽ đủ điều kiện nếu chạy trên GNU Octave)
- 1 điểm cho việc thực sự tuân theo tất cả các quy tắc. Các quy tắc này đã trở nên hơi lớn và phức tạp, vì vậy tôi có thể chấp nhận các câu trả lời tốt có sai một chi tiết nhỏ, nhưng tôi sẽ đưa ra một điểm bổ sung cho bất kỳ giải pháp nào thực sự tuân theo tất cả các quy tắc
Hình ảnh tham khảo
Một số người đã yêu cầu một số hình ảnh tham khảo. Dưới đây là một vài hình ảnh tham khảo mà bạn có thể thử; các phiên bản nhỏ hơn được nhúng ở đây, tất cả đều liên kết đến các phiên bản lớn hơn của hình ảnh nếu bạn cần:
Giải thưởng
Tôi đang cung cấp một khoản tiền thưởng 500 rep (cộng với 50 mà StackOverflow khởi động) cho giải pháp mà tôi thích nhất, dựa trên các tiêu chí trên. Tất nhiên, tôi khuyến khích mọi người khác bỏ phiếu cho các giải pháp yêu thích của họ ở đây là tốt.
Lưu ý về thời hạn
Cuộc thi này sẽ diễn ra cho đến khi hết tiền thưởng, khoảng 6 giờ tối ngày thứ bảy, 30 tháng 5. Tôi không thể nói thời gian chính xác sẽ kết thúc; nó có thể là bất cứ nơi nào từ 5 đến 7 giờ tối. Tôi sẽ đảm bảo rằng tôi sẽ xem xét tất cả các mục được gửi trước 2 giờ chiều và tôi sẽ cố gắng hết sức để xem tất cả các mục được gửi trước 4 giờ chiều; nếu các giải pháp được gửi sau đó, tôi có thể không có cơ hội để cung cấp cho họ một cái nhìn công bằng trước khi tôi phải đưa ra quyết định của mình. Ngoài ra, bạn gửi càng sớm, bạn càng có nhiều cơ hội bỏ phiếu để có thể giúp tôi chọn giải pháp tốt nhất, vì vậy hãy thử và gửi sớm hơn thay vì đúng thời hạn.
Ghi chú Unicode
Cũng có một số nhầm lẫn về chính xác những gì các ký tự Unicode được cho phép. Phạm vi của các điểm mã Unicode có thể là U+0000
để U+10FFFF
. Có một số điểm mã không bao giờ hợp lệ để sử dụng làm ký tự Unicode trong bất kỳ trao đổi dữ liệu mở nào; đây là các ký tự không thay thế và các điểm mã thay thế . Noncharacters được định nghĩa trong Unidode Chuẩn 5.1.0 phần 16,7 như các giá trị U+FFFE
, U+FFFF
, U+
nFFFE
, U+
nFFFF
nơi n là 1
- 10
thập lục phân, và phạm vi U+FDD0
-U+FDEF
. Các giá trị này được dự định sẽ được sử dụng cho mục đích sử dụng nội bộ dành riêng cho ứng dụng và các ứng dụng tuân thủ có thể loại bỏ các ký tự này khỏi văn bản được xử lý bởi chúng. Các điểm mã thay thế, được xác định trong phần Tiêu chuẩn Unicode 5.1.0 như U+D800
- U+DFFF
, được sử dụng để mã hóa các ký tự ngoài Mặt phẳng đa ngôn ngữ cơ bản trong UTF-16; do đó, không thể biểu diễn trực tiếp các điểm mã này trong mã hóa UTF-16 và không hợp lệ để mã hóa chúng trong bất kỳ mã hóa nào khác. Do đó, với mục đích của cuộc thi này, tôi sẽ cho phép bất kỳ chương trình nào mã hóa hình ảnh thành một chuỗi không quá 140 điểm mã Unicode trong phạm vi U+0000
- U+10FFFF
, ngoại trừ tất cả các cặp không ký tự và thay thế như được định nghĩa ở trên.
Tôi sẽ thích các giải pháp chỉ sử dụng các ký tự được gán và thậm chí các giải pháp tốt hơn sử dụng các tập hợp con thông minh của các ký tự được gán hoặc làm điều gì đó thú vị với bộ ký tự mà chúng sử dụng. Để biết danh sách các ký tự được gán, hãy xem Cơ sở dữ liệu Ký tự Unicode ; lưu ý rằng một số ký tự được liệt kê trực tiếp, trong khi một số ký tự chỉ được liệt kê dưới dạng bắt đầu và kết thúc của một phạm vi. Cũng lưu ý rằng các điểm mã thay thế được liệt kê trong cơ sở dữ liệu, nhưng bị cấm như đã đề cập ở trên. Nếu bạn muốn tận dụng các thuộc tính nhất định của các ký tự để làm cho văn bản bạn xuất ra thú vị hơn, có nhiều cơ sở dữ liệu thông tin ký tự có sẵn, chẳng hạn như danh sách các khối mã được đặt tên và các thuộc tính ký tự khác nhau.
Vì Twitter không chỉ định chính xác bộ ký tự mà họ hỗ trợ, tôi sẽ khoan dung về các giải pháp không thực sự hoạt động với Twitter vì một số ký tự nhất định đếm thêm hoặc một số ký tự nhất định bị tước. Nó được ưa chuộng nhưng không bắt buộc rằng tất cả các kết quả đầu ra được mã hóa sẽ có thể được chuyển giao không hề hấn gì qua Twitter hoặc dịch vụ tiểu blog khác như identi.ca . Tôi đã thấy một số tài liệu nói rằng mã hóa thực thể Twitter <,> và &, và do đó tính các ký tự tương ứng là 4, 4 và 5 ký tự, nhưng tôi đã không tự mình kiểm tra và bộ đếm ký tự JavaScript của chúng dường như không để đếm chúng theo cách đó.
Mẹo & Liên kết
- Định nghĩa của các ký tự Unicode hợp lệ trong các quy tắc là một chút phức tạp. Chọn một khối ký tự duy nhất, chẳng hạn như Ideograph Thống nhất của CJK (U + 4E00, U + 9FCF) có thể dễ dàng hơn.
- Bạn có thể sử dụng các thư viện hình ảnh hiện có, như Thư viện hình ảnh ImageMagick hoặc Python , để thao tác hình ảnh của bạn.
- Nếu bạn cần một số trợ giúp để hiểu bộ ký tự Unicode và các bảng mã khác nhau, hãy xem hướng dẫn nhanh này hoặc Câu hỏi thường gặp chi tiết này về UTF-8 trong Linux và Unix .
- Bạn càng sớm nhận được giải pháp của mình, tôi (và những người khác sẽ bỏ phiếu càng nhiều thời gian). Bạn có thể chỉnh sửa giải pháp của mình nếu bạn cải thiện nó; Tôi sẽ dựa vào tiền thưởng của mình trên phiên bản mới nhất khi tôi xem qua các giải pháp.
- Nếu bạn muốn một định dạng hình ảnh dễ dàng phân tích và viết (và không muốn chỉ sử dụng một định dạng hiện có), tôi khuyên bạn nên sử dụng định dạng PPM . Đây là định dạng dựa trên văn bản rất dễ làm việc và bạn có thể sử dụng ImageMagick để chuyển đổi sang và từ đó.