Mảng chuỗi nén
CẬP NHẬT: Các công cụ được giới thiệu trong mẹo này đã được viết lại, cải tiến và tích hợp vào trình thông dịch Japt của tôi . Để có kết quả tốt nhất, bạn nên sử dụng máy nén đó hơn bất kỳ liên kết nào dưới đây. Tôi sẽ xem lại mẹo này khi tôi có thêm thời gian và viết lại nó với máy nén mới trong tâm trí.
Giới thiệu
Nếu bạn có một chuỗi các chuỗi trong mã của mình, cách rõ ràng nhất để nén nó là chạy từng chuỗi thông qua từng chuỗiOc
. Với mục đích của mẹo này, chúng tôi sẽ làm việc với mảng ["lollipop","marshmallow","nougat","oreo"]
, có trọng lượng 42 byte ban đầu. Chạy từng chuỗi thông qua Oc
cho chúng ta:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
Đó là 33 byte, một khoản tiết kiệm khá.
Bước 1
Nhưng , chúng ta có thể làm tốt hơn. Nếu chúng ta nối mảng thành một chuỗi phân tách dòng mới, chúng ta có thể thoát khỏi dấu ngoặc, dấu phẩy và backticks bên ngoài và phân chia trên dòng mới để lấy mảng của chúng ta. Áp dụng điều đó vào mảng ví dụ của chúng tôi cung cấp cho chúng tôi như sau:
`lo¥ipop
Ú\hÚaow
Í
eo`·
Xuống tới 26 byte bây giờ.
Bước 2
Nhưng , chúng ta vẫn có thể làm tốt hơn! Chúng ta có thể sử dụng một chữ cái viết thường để phân định các chuỗi thay vì một dòng mới, có thể được bao gồm trong nén. z
không được sử dụng trong bất kỳ chuỗi nào của chúng tôi, vì vậy hãy bỏ qua và xem cách chúng tôi tiếp tục.
`lo¥ipopzÚ\hÚaowzÍzeo`qz
Ah, các loại hạt - không có cải thiện ở đó; số byte của chúng tôi đã tăng lên một! Có thể có một chữ cái khác bạn có thể sử dụng, nhưng tùy thuộc vào chuỗi của bạn, có thể có một vài chữ để thử - trong ví dụ của chúng tôi có 11 : b,c,d,f,j,k,q,v,x,y,z
. Thử từng cái sẽ khá tẻ nhạt, đó là nơi mà công cụ tiện dụng này xuất hiện; cung cấp cho nó các chuỗi phân tách dòng mới của bạn và nó sẽ cố gắng phân định các chuỗi với mỗi chữ cái không có trong bất kỳ chuỗi nào và đầu ra:
- chuỗi nén ngắn nhất,
- dấu phân cách mà nó sử dụng và
- chiều dài của nó.
Chạy các chuỗi mẫu của chúng tôi thông qua nó cho thấy b
kết quả tốt nhất:
`lo¥ipáæqrÚaowbÍÞo`qb
Và ở đó bạn có nó, chúng tôi chỉ còn 24 byte.
Bước 3
Nhưng , chúng ta có thể làm thậm chí tốt hơn! Nếu thứ tự các chuỗi trong mảng của bạn không thành vấn đề, có thể có một hoán vị khác kết hợp với một dấu phân cách khác có thể làm việc thậm chí ngắn hơn. Mặc dù vậy, cố gắng từng khả năng sẽ trở nên tẻ nhạt hơn nhiều. Với 4 chuỗi của chúng tôi, có 24 hoán vị khác nhau để thử. Với mỗi trong số 11 chữ cái có thể trở thành 264! Đó là nơi công cụ này phát huy tác dụng. Một lần nữa, hãy cung cấp cho nó chuỗi phân tách dòng mới của bạn và nó sẽ thử mọi kết hợp của mọi hoán vị và mọi chữ cái phân định, xuất ra:
- thứ tự của các chuỗi trong chuỗi nén ngắn nhất,
- chuỗi nén,
- dấu phân cách mà nó sử dụng, và,
- chiều dài của nó.
Việc chạy các chuỗi mẫu của chúng tôi thông qua nó cho thấy rằng "nougat","oreo","lollipop","marshmallow"
với b
tư cách là một dấu phân cách cho kết quả tốt nhất, với số byte cuối cùng chỉ là 23:
`ÍÞo½o¥ipáæqrÚaow`qb
Tiền thưởng: Nén mảng Integer
Bạn có thể áp dụng nguyên tắc tương tự cho các mảng số nguyên bằng cách trước tiên chuyển đổi từng số sang cơ sở cao hơn. Sử dụng mẫu này, mảng 36 byte:
[588181,156859,595676,475330,680474]
Chúng ta có thể giảm xuống còn 29 byte bằng cách trước tiên chuyển đổi nó thành một chuỗi gồm 32 chuỗi cơ sở và sau đó chạy nó thông qua chương trình nén đầu tiên:
`huclt4p5r5ÛÊg62tkogq`qt mnH
Hoặc thấp tới 27 byte khi sử dụng chương trình thứ hai:
`4p5Ïcl5ÛÊg62tkogq`qt mnH
Bạn có thể lưu một byte hoặc 2 khác trên đó bằng cách di chuyển chuyển đổi số nguyên thành một phương thức bạn đang chạy trên mảng.
Ghi chú
- Đừng quên tính đến 1 hoặc 2 byte thêm
q<letter>(<space>)
chi phí ·
. Mặc dù, bạn có thể sử dụng một trong các phím tắt Unicode để lấy lại một byte, tùy thuộc vào dấu phân cách của bạn (chẳng hạn qÊ
như ql<space>
, chẳng hạn như).
- Một lời cảnh báo khi sử dụng công cụ cuối cùng: bạn càng có nhiều chuỗi, sẽ càng có nhiều hoán vị và chương trình sẽ chạy chậm hơn, cho đến khi cuối cùng nó thoát ra. Như đã nêu chi tiết ở trên, với 4 chuỗi mẫu của chúng tôi và 11 chữ cái có thể thử, có 264 kết hợp có thể, tăng số chuỗi chỉ bằng 1 với 11 chữ cái giống nhau và chúng tôi đã thử 1320 kết hợp. (Bạn có thể sử dụng công cụ này để đếm số lượng kết hợp, nếu bạn muốn).
Tín dụng
- Oliver cho cảm hứng để tạo ra các công cụ tìm thấy trong mẹo này.
- ETHproductions cho hiệu đính.