Mẹo chơi gôn trong 05AB1E


28

Bạn có bất cứ lời khuyên nào cho việc trong 05AB1E , một ngôn ngữ chơi gôn được tạo bởi Adnan không?

Lời khuyên của bạn nên ít nhất là phần nào cụ thể đối với 05AB1E.

Xin vui lòng gửi một lời khuyên cho mỗi câu trả lời.


2
Từ đánh giá: Câu hỏi mẹo là về chủ đề.
mbomb007

Câu trả lời:


20

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ó.

Làm thế nào để sử dụng từ điể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#] '“,

Hãy thử trực tuyến.

Chương trình này sẽ:

  1. Lấy đầu vào là chữ thường, loại bỏ bất kỳ ký tự không phải chữ cái nào (ngoại trừ khoảng trắng), sau đó chia các từ theo dấu cách ( lAð«Ã#) hoặc ngắt các từ trong danh sách nếu chỉ một từ duy nhất được nhập ( ¸˜)
  2. Vòng lặp trên mỗi từ ( vyU)
  3. Sau đó, có một vòng lặp bên trong trên mỗi từ được nén từ từ điển ( "€...ï"Dâvy), từ này sẽ cố gắng chạy dưới dạng chương trình 05AB1E ( "“ÿ“".V)
  4. Và nếu nó bằng từ hiện tại, nó sẽ in nó và phá vỡ vòng lặp bên trong 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).

Làm thế nào để nén chuỗi không phải là một phần của từ điển?

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 ".•ÿ•"

Hãy thử trực tuyến. .

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ố 0
  • 27β: Chuyển đổi các chỉ số này từ cơ sở 27 thành một số duy nhất
  • 255B: 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ày

Dưới đây là một câu trả lời ví dụ trong đó @Kaldo sử dụng .•zíΘ•để nén từ "ngỗng".

Làm thế nào để nén số nguyên lớn?

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 18238098189071058293vì 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 13562sẽ dẫn đến •rl•, nhưng vì nó chỉ sử dụng hai ký tự, nên nó có thể được Žrlthay 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₁Ò'Θpcrltạ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 "Žÿ" ë "•ÿ•"

Hãy thử trực tuyến.

Dưới đây là một câu trả lời ví dụ trong đó @Emigna sử dụng •3Èñ•cho số nguyên 246060.

Làm thế nào để nén danh sách số nguyên?

Đô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"•ÿ•ÿв"

Hãy thử trực tuyến.

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+1sang một số duy nhất
  • 255B: 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
  • Nhưng trong trường hợp này, „,;Ç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
  • Nhưng trong trường hợp này, Ž9¦Svớ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)
  • Nhưng trong trường hợp này •1∊}•bvớ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ì , 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 ):


12

Nhập liệu ngầm

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.

Kiểm tra nó ở đây


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.

Kiểm tra nó ở đây


Đ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.

Kiểm tra nó ở đây


8

Chất nền

£là lệnh lấy các bký tự đầu tiên của chuỗi a.
ví dụ: "hello_world"5£ -> "hello"

Nhưng nếu blà 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']


8

Các biến được xác định trước

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 0nếu counter_variable không bị thay đổi trước lệnh này.
  • X, đẩy 1nếu biến X không thay đổi trước lệnh này với U.
  • Y, đẩy 2nếu biến Y không bị thay đổi trước lệnh này với V.
  • ®, đẩy -1nế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.)

24
¾đẩy 0 => đó là về tính không thường xuyên như vậy
Fatalize

6
@Firthize: 0 đẩy 0 là tốt. ¾đẩ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¾7thì ngắn hơn 2 byte 5 0 7.
Emigna

7
Trở lại thời của tôi, ¾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ớ ...
ETHproductions

31
Không biết tất cả những gì bạn đang nói về: p. print(3 / 4)trong Python 2 cho tôi 0.
Ad Nam

2
Nếu lúc đầu, Mđẩy -Inf.
mbomb007

7

Sử dụng Canvas ( Λ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:

  • a Chiều dài: Kích thước của (các) dòng. Đây có thể là một số nguyên đơn hoặc danh sách các số nguyên
  • b Chuỗi: Ký tự chúng tôi muốn hiển thị. Đây có thể là một ký tự đơn, một chuỗi, một danh sách các ký tự hoặc một danh sách các chuỗi (trong ba trường hợp cuối cùng, nó sẽ sử dụng từng ký tự một, bao gồm cả bao quanh)
  • c Hướng: Hướng các dòng ký tự nên được vẽ. Nói chung, chúng ta có các chữ số[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:

  • một :[3,3,5,5,7,7,9,9]
  • b :!@#
  • c :[0,2,4,6]

Điều này sẽ cho đầu ra sau:

  !@#!@#!
  #     @
  @ #!@ #
  ! @ # !
  # ! ! @
  @   @ #
  !#@!# !
        @
@!#@!#@!#

Hãy thử trực tuyến.

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:

  1. Vẽ 3ký tự ( !@#) lên trên (hướng 0)
  2. Vẽ các 3-1ký tự ( !@) về phía bên phải (hướng 2)
  3. Vẽ các 5-1ký tự ( #!@#) xuống dưới (hướng 4)
  4. Vẽ các 5-1ký tự ( !@#!) về phía bên trái (hướng 6)
  5. Vẽ 7-1ký tự ( @#!@#!) lên trên (hướng 0)
  6. Vẽ các 7-1ký tự ( @#!@#!) về phía bên phải (hướng 2)
  7. Vẽ các 9-1ký tự ( @#!@#!@#) xuống dưới (hướng 4)
  8. Vẽ các 9-1ký tự ( !@#!@#!@) về phía bên trái (hướng 6)

-1vì các dòng trùng nhau. Vì vậy, hai bước đầu tiên là:

#
@
!

 !@

Mà kết hợp là:

#!@
@
!

Một số lưu ý nhỏ:


1
Tôi thậm chí còn không biết rằng 05AB1E có một bức vẽ!
MilkyWay90

Làm thế nào ... làm thế nào bạn tìm ra điều này? Mã nguồn?
Bạch tuộc ma thuật Urn

1
@MagicOctopusUrn Hầu hết từ câu trả lời này của @Adnan (PS: câu trả lời mới nhất của anh ấy cũng được giải thích khá rõ ). Đối với +×8tôi thực sự đã tìm trong mã nguồn.
Kevin Cruijssen

5

Pop hoặc nhậ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à headhà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 .


@NeilA. Cảm ơn! Liên kết được cập nhật
Luis Mendo

3

Điều kiện và vòng lặp

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 nsố 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ˆ¼]¯¥


3

Mẹo chơi gôn nhỏ 05AB1E

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 ).
  • .Bngầ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.
  • (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ụ: 1053sẽ 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ự 1thật trong 05AB1E và mọi thứ khác là falsey. SÖPdo đó 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ó.
  • Sau khi nhìn thấy û(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).
  • Khi bạn muốn lọc một danh sách theo nhiều thứ, thường sẽ rẻ hơn khi có nhiều bộ lọc lỏng lẻo hơn là tất cả được kết hợp trong một. Bởi vì khi bạn có hai bộ lọc, bạn sẽ cần một cái gì đó dọc theo dò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 0và 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.)
  • Khi bạn muốn nén với số nguyên 0dưới dạng phụ, bạn có thể sử dụng . Tuy nhiên, một vấn đề với điều này là filler 0sẽ 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ố 0vớ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 .
  • Nếu bạn muốn tính tổng các chữ số của nhiều số trong một danh sách, bạn có thể sử dụng €SO. Tuy nhiên, ngắn hơn là sử dụng , 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 ).
  • Nếu bạn chỉ xử lý các số nguyên không âm và bạn muốn kiểm tra bên trong bộ lọc cho dù đó là 0 hay 1, tất nhiên bạn có thể sử dụng số rõ ràng 2‹. Tuy nhiên, việc sử dụng !(giai thừa) cũng sẽ chỉ dẫn đến 1 (trung thực) cho 01, 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ự 1thật trong 05AB1E). Mẹo này được cung cấp bởi @Grimy để lưu một byte ở đây .

2

Tự động hóa vector

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 đó Stoá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 ).


Làm thế nào để bạn gán cho phần tử thứ n trong một mảng?
Andrew Savinykh

@AndrewSavinykh Ngay bây giờ, không có nội dung nào cho điều đó, nhưng đó là điều mà tôi muốn thực hiện.
Ad Nam

@Ad Nam Tôi tìm được cách làm. Tạo một danh sách khác có giá trị để gán cũng ở chỉ mục thứ n. Sau đó, hợp nhất các danh sách bằng cách sử dụng ñtrước giá trị của n(chỉ mục). tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
mbomb007

@ mbomb007 Điều đó là có thể, vấn đề duy nhất là bạn không thể sửa đổi mảng sau đó, vì lệnh hợp nhất chỉ lấy các chuỗi làm đối số (và chuyển đổi danh sách thành một chuỗi).
Ad Nam

2

Đặt hàng đầu vào

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.


2

05AB1E ASCII-Nghệ thuật chơi gôn

Đ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"

Hãy thử trực tuyến.

Điều này được thực hiện bằng cách:

  1. Liệt kê các ký tự duy nhất trong bản vẽ ASCII.
  2. Sắp xếp chúng theo số lần chúng xảy ra trong chuỗi theo thứ tự giảm dần (hầu hết xảy ra với các ký tự ít xảy ra nhất).
  3. Đảo ngược hai mục đầu tiên nếu bản vẽ ASCII bắt đầu bằng ký tự xuất hiện nhiều nhất (để ngăn các số 0 đứng đầu trong số nguyên được nén).
  4. Ánh 0-9A-Za-zxạ 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ế.
  5. Cơ sở nén nó, sử dụng cơ sở cao nhất bạn cần để thay thế (dựa trên số lượng ký tự duy nhất).
  6. Base chuyển đổi nó một lần nữa thành base-255 (để nén 05AB1E).
  7. Định dạng mọi thứ trong định dạng : •<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à Jsẽ 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à:

05AB1E , 106 byte

•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ

Hãy thử trực tuyến.

(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).


Mã giải thích:

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)

1
Nhân tiện, vì 05AB1E đã thay đổi trang mã, cơ sở tối đa được thay đổi từ 214 thành 255 .
Ad Nam

1
Có lẽ một cái gì đó để thêm vào câu trả lời của bạn (hoặc sửa đổi trình tạo bằng), nhưng nếu ít hơn 10 ký tự riêng biệt đang được sử dụng trong nghệ thuật ASCII, bạn có thể đánh golf nó bằng hai byte. Tức là trình tạo của bạn cung cấp 22-byter này , nhưng nó có thể là 20 -terter thay thế .
Kevin Cruijssen

@KevinCruijssen ý tưởng là những gì tôi đang cố gắng truyền đạt, không thực sự tuyên bố rằng máy phát điện là bất cứ điều gì tốt: P. Tôi thực sự nghi ngờ nó thậm chí vẫn chạy trên osabie. Tôi đã viết rằng một thời gian ngắn trước đây!
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Không chắc chắn nếu nó chạy trong Elixir viết lại, nhưng nó chắc chắn vẫn hoạt động trong phiên bản cũ. Tôi đã chỉnh sửa Base-214 thành Base-255 khoảng một nửa năm trước như đã đề cập trong nhận xét của Adnan ở trên. Ngoài ra, nó hoạt động rất tốt và tôi đã sử dụng nó một vài lần (mặc dù chơi golf mỗi lần hơn nữa.)). Các thế hệ của cả chuỗi và số làm việc tuyệt vời!
Kevin Cruijssen

Đây là một phiên bản cải tiến. (Rất xấu và viết nhanh, nhưng nó hoạt động). Nó sẽ làm cho ví dụ của bạn 108 byte thay vì 113. Những cải tiến tôi đã làm là: sắp xếp các ký tự riêng biệt ở lần xuất hiện cao nhất trước tiên (trừ khi lần xuất hiện cao nhất là ký tự đầu tiên, trong trường hợp đó, nó sẽ hoán đổi hai ký tự trên cùng) để nén số nguyên càng nhỏ càng tốt; sử dụng <str><compr_int><int>вèJthay 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.
Kevin Cruijssen

1

Chuỗi và int là các loại bằng nhau

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 .


0

Các vòng lặp và vòng lặp ẩn

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 :

  • Thay vì gF, bạn có thể sử dụng vcũng có một N-index có thể được sử dụng.
  • Việc vy -> ʒthay thế là một chút khó khăn hơn:
    • Bạn cần in ngay kết quả. Điều này thay thế bản in tự động từ in phần trên cùng của ngăn xếp.
    • Đoạn mã được chạy trên một ngăn xếp tạm thời mới . Điều này có nghĩa là các đoạn phụ thuộc vào ngăn xếp không thể được sử dụng.
    • Gọi ylà không thể trong các loại vòng.

Tôi biết điều này đã được đăng một năm trước, nhưng không [, µεcũng là một phần của các vòng lặp / lặp bình thường?
Kevin Cruijssen

Ngoài ra, gọi ylà có thể với một số trong số này bây giờ.
Bạch tuộc ma thuật Urn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.