Câu trả lời:
Vì nó không phải là một phần của Wiki trên các trang GitHub của 05AB1E (tôi nghĩ nó nên như vậy), nên bây giờ tôi sẽ thêm nó vào đây để tôi hiểu rõ hơn về nó.
05AB1E có tệp từ điển words.ex sau đây chứa tất cả các từ mà nó biết. Nhưng làm thế nào để chúng ta truy cập các từ trong từ điển này? Hãy lấy từ này "testing"
làm ví dụ:
"testing"
có thể được tìm thấy trên hàng 1453 của tệp từ điển. Vì hai dòng đầu tiên không có từ và chúng tôi cần từ có chỉ số 0, chúng tôi trừ 3.
Vì vậy, bây giờ chúng tôi có chỉ mục ( 1450
), nhưng làm thế nào để sử dụng nó?
Chúng tôi mở ra và bắt đầu một chuỗi nén với “
† . Sau đó chúng tôi xem xét cột thứ hai của tệp info.txt . (Vậy €
là 00; ‚
là 01; v.v.)
Trong trường hợp "testing"
này có nghĩa là î
(14) và »
(50).
"testing"
Do đó, chuỗi nén cho : “
Hãy thử trực tuyến. Như với hầu hết tất cả các đoạn mã 05AB1E, việc theo dõi “
là tùy chọn nếu bạn không truy cập chuỗi, do đó không hoạt động tốt trong trường hợp này .
Một số điều cần lưu ý:
Tất cả các ký tự không có bất kỳ chỉ mục nào trong tệp info.txt đều có thể được sử dụng. Điều này có thể hữu ích cho việc thêm một s
để xuất ra số nhiều thay vì từ số ít hoặc sử dụng dấu câu như ,.?!
ví dụ.
ÿ
(nội suy chuỗi) cũng có thể được sử dụng khi bạn muốn chèn giá trị từ ngăn xếp trong chuỗi.
LƯU Ý: Mỗi ký tự lỏng lẻo không có bất kỳ chỉ mục nào trong tệp info.txt được tính là một từ cho các loại nén bên dưới.
† Có nhiều loại khác nhau của chuỗi nén bạn có thể sử dụng:
'
: Lấy một từ được nén như hiện tại (không '
cần theo dõi ) - 'î»
: "thử nghiệm"„
: Có hai từ được nén bằng dấu phân cách dấu cách (không „
yêu cầu dấu ) - „î»î»
: "thử nghiệm thử nghiệm"…
: Có ba từ được nén bằng dấu phân cách dấu cách (không …
yêu cầu dấu ) - …î»î»î»
: "kiểm thử kiểm thử"“
: Lấy chuỗi nén với dấu phân cách không gian - “î»î»“
: "thử nghiệm thử nghiệm"’
: Lấy chuỗi đã nén như không có khoảng trắng ẩn - ’î»î»’
: "teststesting"”
: Lấy chuỗi nén trong trường hợp tiêu đề với dấu phân cách không gian - ”î»î»”
: "Kiểm tra thử nghiệm"‘
: Lấy chuỗi nén bằng chữ hoa đầy đủ với dấu phân cách không gian - ‘î»î»‘
: "KIỂM TRA KIỂM TRA"Đây là một chương trình hữu ích để có được chuỗi nén dựa trên đầu vào của các từ được phân tách bằng dấu cách:
'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,
Chương trình này sẽ:
lAð«Ã#
) hoặc ngắt các từ trong danh sách nếu chỉ một từ duy nhất được nhập ( ¸˜
)vyU
)"€...ï"Dâvy
), từ này sẽ cố gắng chạy dưới dạng chương trình 05AB1E ( "“ÿ“".V
)XlQiy?1#
Với một đầu vào good bye world
, đầu ra do đó sẽ được “‚¿Þ¡‚ï“
. Hãy thử trực tuyến.
LƯU Ý: Bạn vẫn phải xem liệu từ đó có tồn tại trong từ điển để trình tạo này hoạt động hay không và nó sẽ bỏ qua mọi ký tự đặc biệt hoặc các từ số nhiều. Chỉ những từ giống hệt nhau trong từ điển sẽ được tìm thấy.
Dưới đây là một ví dụ nơi tôi sử dụng …Ÿ™‚ï!
cho chuỗi "xin chào thế giới!" và ’‚¿Þ¡ ÿ ‚ï!’
cho chuỗi "tạm biệt thế giới!". Lưu ý cách sử dụng dấu cách và dấu chấm than, vì chúng không có chỉ mục trong tệp info.txt. Ngoài ra, nó sử dụng ÿ
để chèn "tàn ác" ở đầu ngăn xếp, điều không may không phải là một phần của từ điển (nhưng vẫn được nén bằng phương pháp ở phần bên dưới).
Mặc dù tệp từ điển words.ex khá lớn (chính xác là 10.000 từ), có thể xảy ra rằng bạn cần một từ không phải là một phần của nó, hoặc một chuỗi chỉ đơn giản là vô nghĩa. Vì vậy, có cách nào để nén những cái đó là tốt?
Chắc chắn, bằng cách sử dụng .•
, đó là một chuỗi dựa trên bảng chữ cái cơ sở 255. LƯU Ý: Phương pháp này chỉ có thể được sử dụng cho các ký tự trong bảng chữ cái chữ thường và dấu cách.
Đây là một chương trình hữu ích để chuyển đổi một từ / chuỗi thành chuỗi dựa trên bảng chữ cái cơ sở-nén 255:
vAyk})> 27β 255B ".•ÿ•"
Những gì chương trình này ở trên là:
vAyk})>
: Lấy các chỉ mục bảng chữ cái 1 chỉ mục của các chữ cái riêng lẻ của đầu vào, với khoảng trắng trở thành chỉ số 027β
: Chuyển đổi các chỉ số này từ cơ sở 27 thành một số duy nhất255B
: Chuyển đổi số này thành Base-255 bằng trang mã riêng của 05AB1E".•ÿ•"
: Đặt hàng đầu .•
và dấu •
trước chuỗi nén nàyDưới đây là một câu trả lời ví dụ trong đó @Kaldo sử dụng .•zíΘ•
để nén từ "ngỗng".
Giả sử chúng ta muốn sử dụng một số lượng rất lớn cho một cái gì đó, nhưng nó thực sự không thể được lấy bằng tính toán pow. Ví dụ: giả sử chúng tôi muốn truy cập số nguyên lớn 18238098189071058293
vì bất kỳ lý do gì.
Trong trường hợp này, chúng ta có thể sử dụng cả hàng đầu và dấu •
để nén một số ở định dạng [1-9][0-9]+
.
Số ví dụ ở trên sẽ trở thành •15Y₁Ò'Θpc•
. Hãy thử trực tuyến. Một lần nữa, giống như với chuỗi từ điển nén, các dấu •
có thể tùy chọn được loại bỏ .
Tùy chọn, khi số nguyên đủ nhỏ để chỉ sử dụng 2 ký tự nén, chúng ta có thể sử dụng Ž
thay vào đó, trong trường hợp đó chúng ta sẽ không cần một byte theo dõi để đóng nó và số nguyên được nén trong 3 byte thay vì 4. Đối với ví dụ, số nguyên 13562
sẽ dẫn đến •rl•
, nhưng vì nó chỉ sử dụng hai ký tự, nên nó có thể được Žrl
thay thế.
Ngoài ra, các số trong phạm vi [101, 355]
có thể được nén thành 2 byte bằng cách sử dụng Ƶ
cộng thêm một ký tự từ bảng mã của 05AB1E. Vì vậy, ví dụ, Ƶ–
có thể được sử dụng cho số nguyên 250
. Dưới đây là một cái nhìn tổng quan về tất cả các số có sẵn. Các ký tự này được chuyển đổi từ Base-255 sang Base-10, sau đó 101 được thêm vào (vì các số trong phạm vi [0,100]
đã là 1 hoặc 2 byte).
Làm thế nào được những 15Y₁Ò'Θpc
và rl
tạo ra? Rất đơn giản, số được chuyển đổi thành Base-255 bằng cách sử dụng bảng mã riêng của 05AB1E. Vì vậy, bạn có thể sử dụng các chương trình sau đây để có được một số nén, mà nó sau đó sẽ sử dụng Ƶ.
, Ž..
hoặc •...•
tùy thuộc vào kích thước của các số nguyên nén:
101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"
Dưới đây là một câu trả lời ví dụ trong đó @Emigna sử dụng •3Èñ•
cho số nguyên 246060
.
Đôi khi bạn muốn nén toàn bộ danh sách các số nguyên thay vì một số duy nhất. Ví dụ: giả sử chúng tôi muốn danh sách [5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]
vì bất kỳ lý do gì. Trong trường hợp này, chúng ta có thể sử dụng như sau: •4βŸ{©£MG]q‡dZΘp•94в
Thử trực tuyến.
Đây là một chương trình hữu ích để tạo cả số nén này và Cơ sở mà chúng tôi muốn chuyển đổi thành:
Z>© β 255B ®s"•ÿ•ÿв"
Những gì chương trình này ở trên là:
Z>
: Lấy số tối đa + 1 của danh sách đầu vào ( ©
: và lưu nó vào sổ đăng ký)β
: Chuyển đổi danh sách đầu vào từ cơ sở max+1
sang một số duy nhất255B
: Nén số này (như chúng tôi đã làm ở phần trên)®s"•ÿ•ÿв"
: Trả về kết quả theo định dạng: hàng đầu •
, số nén •
, tối đa + 1, theo dõiв
Dưới đây là một câu trả lời ví dụ nơi tôi sử dụng •4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
để nén danh sách [85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
.
PS: Trong câu trả lời •6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ô
này là một thay thế bằng byte (57), vì tất cả các số có chính xác hai chữ số. Trong một số trường hợp (đặc biệt là danh sách nhỏ), đây có thể là một sự thay thế ngắn hơn.
Nén số nguyên so với nén danh sách Integer:
Với hai cái này nó có thể đi một trong hai cách. Đôi khi một danh sách nén ngắn hơn, đôi khi là một số nguyên nén, đôi khi một sự thay thế hoàn toàn khác lại ngắn hơn. Vì vậy, luôn luôn sử dụng khả năng phán đoán và kỹ năng chơi gôn của riêng bạn để có thể chơi những thứ khác xa hơn, thay vì hoàn toàn dựa vào các máy phát điện ở trên. Dưới đây là một số ví dụ:
[44, 59]
( được sử dụng trong câu trả lời này của @Emigna ):
•A–•60в
là 7 byte (được tạo bởi trình tạo danh sách số nguyên nén)•H|•2ô
hoặc •H|•2ä
mã hóa cứng 44 59‚
là tất cả 6 byteŽH|2ô
hoặc ŽH|2ä
là cả 5 byte„,;Ç
với 4 byte sẽ là lựa chọn tốt nhất (điểm mã của các ký tự ',' và ';')[2,4,6,0]
( được sử dụng trong câu trả lời này của @Emigna ):
•3ā•7в
là 6 byte (được tạo bởi trình tạo danh sách số nguyên nén)Ž3ā7в
là 5 byteŽ9¦S
với 4 byte sẽ là lựa chọn tốt nhất (số nguyên được nén 2460 cho một danh sách các chữ số)10101001100101001
( được sử dụng trong câu trả lời này của tôi ):
•a½₄Ƶ6®í•
là 9 byte (được tạo bởi bộ tạo số nguyên lớn đã nén)•1∊}•2вJ
là 8 byte (được tạo bởi trình tạo danh sách số nguyên nén có thêm phép nối)•1∊}•b
với 6 byte sẽ là tùy chọn tốt nhất (danh sách số nguyên được nén, với một nhị phân thay vì 2в
, tham gia ngầm)[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
( được sử dụng trong câu trả lời này của tôi ):
•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
là 57 byte (được tạo bởi trình tạo danh sách số nguyên nén)•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø
JδŠ₂ + ôî®À8 6 / ðÎ6ùøΓ ° ÓĆ; ˆ © Ā • 2ô` cũng là 57 byte (số nguyên được nén, chia thành các phần có kích thước 2)•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
,λ₂ϦP(Ì•65в₂+
tuy nhiên ngắn hơn 2 byte, bằng cách nén danh sách với mỗi giá trị thấp hơn 26, và sau đó thêm nó vào sau với `₂ + ` . Thủ thuật thêm giá trị một byte sau này có thể được sử dụng khá thường xuyên để lưu byte trong danh sách nén.Quay trở lại những ngày khi 05AB1E được phát hành, đầu vào ngầm khá mới và lạ mắt. Ngày nay dường như là cần thiết để theo dõi các ngôn ngữ cạnh tranh khác (như Jelly, MATL, Pyth, v.v.).
Ví dụ: khi bạn muốn thêm hai số, bạn có thể làm II+
:
I # Input_1.
I # Input_2.
+ # Add them up.
Tuy nhiên, bằng cách sử dụng đầu vào ẩn , chúng ta có thể rút ngắn chỉ còn 1 byte, cụ thể là +
:
+ # Take two numbers implicitly and add them up.
Điều này chỉ xảy ra khi chiều dài của ngăn xếp nhỏ hơn độ tự nhiên của toán tử. Một ví dụ cuối cùng là 3+
. Arity của +
toán tử là 2 trong khi chỉ có 1 phần tử trong ngăn xếp:
3 # Push the number 3 on top of the stack.
+ # Request implicit input and add to the 3.
£
là lệnh lấy các b
ký tự đầu tiên của chuỗi a
.
ví dụ: "hello_world"5£
->
"hello"
Nhưng nếu b
là một danh sách các chỉ mục, thay vào đó nó sẽ chia chuỗi thành các phần của (tối đa) các kích thước đó.
ví dụ: "hello_world"5L£
->
['h', 'el', 'lo_', 'worl', 'd']
Chúng là một chút ẩn trong 05AB1E. Dưới đây là danh sách tất cả các biến được xác định trước:
¾
, đẩy 0
nếu counter_variable không bị thay đổi trước lệnh này.X
, đẩy 1
nếu biến X không thay đổi trước lệnh này với U
.Y
, đẩy 2
nếu biến Y không bị thay đổi trước lệnh này với V
.®
, đẩy -1
nếu thanh ghi không được thay đổi trước lệnh này với ©
.¯
, đẩy []
(mảng trống) nếu không có gì được thêm vào global_array trước lệnh này.¸
, đẩy [""]
vào một ngăn xếp trống nếu không có đầu vào. (Cảm ơn bạn @Emigna vì đã tìm thấy cái này.)¾
đẩy 0 => đó là về tính không thường xuyên như vậy
¾
đẩy một biến đếm được khởi tạo là 0. Nếu bạn chỉ muốn đẩy 0, 0 tất nhiên là tự nhiên hơn, nhưng nếu bạn muốn đẩy 5,0,7
, 5¾7
thì ngắn hơn 2 byte 5 0 7
.
¾
có nghĩa là .75
, và tôi đã từng đánh bại Pyth với thực tế đó . Những ngôn ngữ chơi gôn mới lạ này không có manh mối về việc ghi nhớ ...
print(3 / 4)
trong Python 2 cho tôi 0
.
M
đẩy -Inf
.
Λ
hoặc .Λ
)Vì nó không phải là một phần của tài liệu và @Adnan hiện đang quá bận rộn để viết nó, tôi đã xin phép thêm nó dưới dạng một mẹo ở đây.
Hàm Canvas ( Λ
hoặc .Λ
) có thể được sử dụng để vẽ các đường ASCII trên màn hình. Nó có ba tham số bắt buộc:
[0,7]
cho các hướng, mà chúng ta có thể sử dụng một hoặc nhiều. Ngoài ra còn có một số tùy chọn đặc biệt yêu cầu một nhân vật nhất định (sẽ nói thêm về điều đó sau).Ánh [0,7]
xạ chữ số hướng đến các hướng sau:
7 0 1
↖ ↑ ↗
6 ← X → 2
↙ ↓ ↘
5 4 3
Một số ví dụ 05AB1E trả lời trong đó Canvas được sử dụng:
Chúng ta hãy làm một cái gì đó tương tự như cái cuối cùng, vì vậy giả sử chúng ta sử dụng Λ
hàm Canvas với ba tham số sau:
[3,3,5,5,7,7,9,9]
!@#
[0,2,4,6]
Điều này sẽ cho đầu ra sau:
!@#!@#!
# @
@ #!@ #
! @ # !
# ! ! @
@ @ #
!#@!# !
@
@!#@!#@!#
Vì vậy, làm thế nào nó hoạt động? Vâng, đây là các bước với các đầu vào trên:
3
ký tự ( !@#
) lên trên (hướng 0
)3-1
ký tự ( !@
) về phía bên phải (hướng 2
)5-1
ký tự ( #!@#
) xuống dưới (hướng 4
)5-1
ký tự ( !@#!
) về phía bên trái (hướng 6
)7-1
ký tự ( @#!@#!
) lên trên (hướng 0
)7-1
ký tự ( @#!@#!
) về phía bên phải (hướng 2
)9-1
ký tự ( @#!@#!@#
) xuống dưới (hướng 4
)9-1
ký tự ( !@#!@#!@
) về phía bên trái (hướng 6
)Có -1
vì các dòng trùng nhau. Vì vậy, hai bước đầu tiên là:
#
@
!
Và
!@
Mà kết hợp là:
#!@
@
!
Một số lưu ý nhỏ:
[0,7]
có một vài tùy chọn cụ thể có sẵn, về cơ bản chuyển thành một chuỗi hướng nhất định.
+
( '+
nội tuyến) chuyển thành mẫu 04402662
, tạo ra một giao diện +
với các nhánh có độ dài cho trước. Xem nó trong hành động.×
( '×
nội tuyến) chuyển thành mẫu 15513773
, tạo ra một giao diện X
với các nhánh có độ dài cho trước. Xem nó trong hành động.8
trở về nguồn gốc của nơi chúng tôi bắt đầu vẽ từ đó. Xem nó trong hành động và thấy sự khác biệt mà không có8
.Λ
ý đầu ra ngay lập tức, và .Λ
kết quả là một chuỗi mà được đẩy vào stack, mà chúng tôi vẫn có thể tái sử dụng, sửa đổi và làm gì với điều đó chúng tôi muốn. Vài ví dụ:
+×8
tôi thực sự đã tìm trong mã nguồn.
Giống như trong các ngôn ngữ dựa trên ngăn xếp khác, các chức năng của 05AB1E thường bật (tiêu thụ) đầu vào của chúng từ ngăn xếp và đẩy đầu ra của chúng lên ngăn xếp.
Tuy nhiên, một số chức năng có được đầu vào của chúng từ ngăn xếp mà không tiêu thụ chúng. Một ví dụ là head
hàm, ¬
tạo ra phần tử đầu tiên từ danh sách đầu vào. Xem một chương trình ví dụ ở đây : ¬+
. Điều này thêm số đầu tiên của danh sách đầu vào vào mỗi số của danh sách đó.
Để biết chức năng nào bật và chức năng nào nhận được, hãy xem cột tương ứng trong tệp thông tin chức năng .
Vòng lặp và điều kiện tự động nhận dấu ngoặc đóng ở cuối chương trình, vì vậy bạn chỉ cần thêm chúng vào mã nếu bạn cần một cái gì đó bên ngoài vòng lặp / điều kiện.
Ví dụ, chương trình (không được phép) này tạo ra một danh sách các n
số nguyên tố đầu tiên không cần dấu ngoặc đóng.
[¹¾Q#NpiNˆ¼
Nhưng nếu chúng tôi muốn thực hiện một số thao tác trong danh sách kết quả, ví dụ như lấy delta, chúng tôi cần đóng vòng lặp trước.
[¹¾Q#NpiNˆ¼]¯¥
Sẽ mở rộng điều này với những mẹo chơi golf nhỏ mà tôi đã học trên đường đi. (Chỉ mới bắt đầu 05AB1E cá nhân.)
D
(bản sao) và Ð
(ba lần) kết hợp với s
(swap) và Š
(triple-swap a,b,c
để c,a,b
) thường ngắn hơn so với sử dụng ©
(tiết kiệm trong global_variable ) và ®
(push global_variable ) bên trong vòng lặp. Điều này đã lưu một byte trong câu trả lời này của tôi , cũng như hai trong câu trả lời này của tôi .½
(nếu 1, sau đó tăng counter_variable lên 1) không cần thiết ở cuối a µ
(trong khi counter_variable ! = a, do ...), vì nó được thực hiện hoàn toàn ( đã lưu một byte trong câu trả lời này của tôi )..B
ngầm chia tách trên các dòng mới. Điều này rất hữu ích trong câu trả lời này của tôi khi chúng tôi đang tìm kiếm một giải pháp thay thế cho ¡
(tách) trong khi vẫn giữ các mục trống (LƯU Ý: Giải pháp trong câu trả lời được liên kết không hoạt động khi các phần tử chứa dấu cách sau khi tách.) - Hy vọng rằng một phần tử dựng sẵn sẽ được thêm vào để phân chia nhưng giữ các dòng trống trong tương lai.SÖ
(những chữ số nào của số nguyên đầu vào có thể chia đều số nguyên đầu vào) sẽ chứa chính số đó cho các chữ số 0
(thay vì các lỗi chia cho 0). Ví dụ: 1053
sẽ dẫn đến[1,1053,0,1]
(1053 chia hết cho 1 và 3; không chia hết cho 5; và đưa ra lỗi chia cho 0 cho 0). Điều này khá hữu ích trong câu trả lời này của tôi bằng cách nắm lấy sức mạnh của danh sách, vì chỉ có sự 1
thật trong 05AB1E và mọi thứ khác là falsey. SÖP
do đó dẫn đến truey ( 1
) có nghĩa là một số nguyên đầu vào chia hết cho mỗi chữ số của nó.û
(palindromize một chuỗi nhất định), tôi đã ngạc nhiên khi không có phần dựng sẵn is_palindrom . Nhưng sau này tôi nhận ra chỉ cần 2 byte để thực hiện điều đó, đó là ÂQ
(nơi Â
là bifurcate, viết tắt của DR
: Sao chép & Sao chép ngược; và Q
để kiểm tra xem hai giá trị trên cùng của ngăn xếp có bằng nhau không).Ds*
(trùng lặp, hoán đổi, nhân lên để hoạt động như logic-AND) so với }ʒ
(đóng bộ lọc đầu tiên, lọc lại) khi bạn sử dụng hai bộ lọc. Ví dụ: trong thử thách này, chúng tôi phải liệt kê tất cả các số có bốn chữ số dài, chứa ít nhất một 0
và với tổng một chữ số bằng 9
. Sử dụng một phạm vi [1000,10000]
bao gồm số lượng bốn chữ số dài, nhưng sau đó bạn còn lại hai bộ lọc nữa. Ban đầu tôi đã sử dụng ₄4°ŸʒD0åsSO9Q*
(14 byte), nhưng bằng cách sử dụng hai bộ lọc, một byte có thể được lưu: ₄4°Ÿʒ0å}ʒSO9Q
(13 byte). (Mà sau đó đã được đánh gôn tới ₄4°ŸεW°ö9Q
(10 byte) bởi @Grimy.)0
dưới dạng phụ, bạn có thể sử dụng 0ζ
. Tuy nhiên, một vấn đề với điều này là filler 0
sẽ trở thành một chuỗi "0"
, vì vậy nếu sau này bạn cố gắng sắp xếp với các chuỗi và số nguyên hỗn hợp, điều này rất có thể sẽ không mang lại kết quả mà bạn muốn. Dưới đây là một ví dụ về cách nó sẽ sắp xếp các danh sách bên trong được nén : 0ζ€{
. Điều này có thể được khắc phục bằng cách thêm một biểu mẫu rõ ràng vào int ( ï
) sau zip và chỉ sau đó sắp xếp : 0ζï€{
. Tuy nhiên, sử dụng ¾
hằng số 0
với bộ đệm zip, sẽ khiến nó vẫn là số nguyên thay vì chuỗi trong quá trình nén. Vì vậy, ¾ζ€{
sẽ tiết kiệm một byte ở đây. Mẹo này được cung cấp bởi @ Mr.Xcoder để lưu một byte trong câu trả lời này của tôi .€SO
. Tuy nhiên, ngắn hơn là sử dụng 1ö
, mà tự động vector hóa. Mẹo này được @Grimy cung cấp để lưu một byte ở đây (và 2 byte ở đây ).2‹
. Tuy nhiên, việc sử dụng !
(giai thừa) cũng sẽ chỉ dẫn đến 1 (trung thực) cho 0
và 1
, và mọi giá trị khác sẽ dẫn đến một cái gì đó cao hơn (và do đó là falsey, vì chỉ có sự 1
thật trong 05AB1E). Mẹo này được cung cấp bởi @Grimy để lưu một byte ở đây .Lưu ý rằng một số toán tử trong 05AB1E tự động hóa vector trên mảng. Ví dụ: mã 5L3+
, phân tách mã giả sau đây:
[1, 2, 3, 4, 5] + 3
sẽ trở thành:
[4, 5, 6, 7, 8]
Nếu nó không tự động vector hóa, bạn cũng có thể sử dụng €
toán tử. Nó nhận một lệnh ký tự đơn và thực hiện toán tử (đơn âm) đó trên mỗi phần tử. Một ví dụ để phân tách từng phần tử là đoạn mã sau ( thử tại đây ):
€S
Trong khi đó S
toán tử bình thường sẽ phân tách từng phần tử trong mảng và làm phẳng nó thành một mảng duy nhất ( thử tại đây ).
ñ
trước giá trị của n
(chỉ mục). tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
Thứ tự mà bạn nhận đầu vào có thể có tác động mạnh mẽ đến mã của bạn và đôi khi, nếu bạn đang sử dụng s
để trao đổi đỉnh của ngăn xếp với thứ cao nhất tiếp theo trên ngăn xếp, bạn không nghĩ chính xác về vấn đề. Hãy thử sắp xếp lại các đầu vào và xem liệu bạn có thể thoát khỏi nhu cầu hoán đổi bằng cách hoán đổi các đầu vào trước thời hạn, thêm nó vào ngăn xếp trước đó hoặc sao chép nó ở đâu đó. I & O rõ ràng nhất có thể là câu trả lời 05AB1E ít thành công nhất.
Đoạn mã dưới đây giúp biến ASCII-art thành 05AB1E bằng cách sử dụng chuyển đổi cơ sở tùy chỉnh.
|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"
Điều này được thực hiện bằng cách:
0-9A-Za-z
xạ các ký tự của đầu vào theo thứ tự đó, mỗi ký tự riêng biệt nhận ký tự ánh xạ của riêng nó, cho đến khi mỗi ký tự được thay thế.•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ
.Việc “
cho phép bạn cũng nén các trích dẫn chuỗi "
; những Åв
sẽ sử dụng chuỗi này để cơ sở-chuyển đổi các số nguyên được tạo ra bằng cách sử dụng chuỗi như cơ sở tùy chỉnh; và J
sẽ nối tất cả các ký tự này lại với nhau thành một chuỗi, được xuất ra hoàn toàn.
Chấp nhận các mẫu có tối đa và bao gồm 62 ký tự duy nhất, phù hợp với nghệ thuật ASCII.
Càng ít ký tự duy nhất, nén càng tốt.
Ví dụ đầu ra cho Vẽ sơ đồ thời gian kỹ thuật số XNOR (214 byte, 9 ký tự duy nhất):
┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──
┌───┐ ┌───┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐
B ┘ └─┘ └─┘ └─┘ └───┘ └─┘ └
┌─────┐ ┌─┐ ┌─┐ ┌───┐
X ──┘ └───┘ └───┘ └───┘ └────
Sẽ là:
•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ
(106/214) * 100 = 49,53% kích thước của chuỗi nghệ thuật ASCII ban đầu.
Đó là số byte tương tự như đệ trình thực tế của tôi cho thử thách đó trong 05AB1E (di sản).
LƯU Ý: Mã hoàn toàn không được đánh gôn. Nó nhanh chóng được viết để chuyển đổi nghệ thuật ASCII sang nén hiệu quả nhất, vì vậy nó khá xấu và dài ..
|» # Take multi-line input
© # Store it in the register to reuse later
ÐÙS # Only leave unique characters (as list)
DŠ¢ø # Map it with the count for each of those characters
Σθ}R # Sort it based on that count (highest to lowest)
€н # Remove the count again, so the sorted characters remain
¬®sÅ?i # If the input starts with the most occurring character:
D2£RDŠKsì} # Swap the first two characters in the list
J© # Join everything together, and store it in the register to reuse later
žLR‡ # Map each character to [0-9A-Za-z]
®gö # Get the amount of unique characters, and convert it to that Base
₅B # And then convert that to Base-255
®s # Push the string and swap so the compressed integer is at the top again
"•ÿ•“ÿ“ÅвJ" # Insert it in the correct output format
# `•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ`
"•ÿ•" # (after which the result is output implicitly with trailing newline)
<str><compr_int><int>вèJ
thay vì của bạn <compr_int><int>BžLR<str>‡
; và sử dụng “
thay vì "
như dấu ngoặc kép, vì vậy "
có thể là một phần của đầu vào.
Không phải cái gì mà mọi người đồng ý, nhưng nó hoạt động.
Hãy xem xét hai chương trình sau:
4 5+
"4""5"+
Cả hai kết quả thành 9 . Đó là bởi vì mọi giá trị được đánh giá đầu tiên (với ast.literal_eval
). Do đó, chúng ta có thể thực hiện tất cả các toán tử thao tác chuỗi trên ints và tất cả các toán tử thao tác int trên chuỗi.
Ví dụ, 12345û
palindromizes số 12345
, dẫn đến 123454321
. Sau đó, chúng ta có thể làm toán thông thường về số này.
12345û50000-
Điều này sẽ dẫn đến: 123404321 .
05AB1E có các vòng lặp và vòng lặp bình thường sau:
F
, lặp đi lặp lại qua 0 .. n-1 .G
, lặp đi lặp lại qua 1 .. n-1 .ƒ
, lặp đi lặp lại qua 0 .. n .v
, lặp lại qua từng phần tử s [0], s [1], .., s [n] .ʒ
, đó không chính xác là một vòng lặp, mà là một lệnh lọc theo . Chúng tôi lạm dụng lệnh này cho hành vi vô ý của việc lặp qua từng phần tử.Sử dụng các vòng lặp này, chúng ta có thể rút ra các vòng lặp ẩn sau :
gF
, bạn có thể sử dụng v
cũng có một N
-index có thể được sử dụng.vy -> ʒ
thay thế là một chút khó khăn hơn:
y
là không thể trong các loại vòng.[
, µ
và ε
cũng là một phần của các vòng lặp / lặp bình thường?
y
là có thể với một số trong số này bây giờ.