Cảnh báo : Bức tường của văn bản tiếp cận. Đó là rất nhiều mánh khóe nhỏ tôi đã thu thập theo thời gian.
Viết giải pháp của bạn dưới dạng khối ẩn danh
Điều này đã được đề cập nhưng tôi muốn nhắc lại. Trong TIO, bạn có thể viết my $f =
vào tiêu đề, khối vào mã phù hợp và bắt đầu chân trang bằng a ;
. Đây dường như là cách ngắn nhất để hoàn thành công việc (vì bạn không cần quan tâm đến việc đọc bất kỳ đầu vào nào, nó được trao cho bạn trong các đối số).
Một cách hay khác là sử dụng -n
hoặc công -p
tắc, nhưng tôi không tìm ra cách nào để nó hoạt động trong TIO.
Sử dụng cú pháp dấu hai chấm để truyền đối số
Đó là, thay vì thing.method(foo,bar)
, bạn có thể làm thing.method:foo,bar
và lưu 1 ký tự. Thật không may, bạn không thể gọi một phương thức khác trên kết quả vì những lý do rõ ràng, do đó, chỉ nên sử dụng cho phương pháp cuối cùng trong một khối.
Sử dụng $_
càng nhiều càng tốt
Đôi khi, tốt hơn là lấy một đối số danh sách hơn là một số đối số riêng biệt vì điều này. Khi truy cập $_
, bạn có thể gọi các phương thức trên đó chỉ bằng cách bắt đầu bằng dấu chấm: eg .sort
bằng $_.sort
.
Tuy nhiên, hãy nhớ rằng mỗi khối sẽ có một khối riêng $_
, vì vậy các tham số của khối bên ngoài sẽ không truyền vào bên trong. Nếu bạn cần truy cập các tham số của chức năng chính từ một khối bên trong, ...
Sử dụng các ^
biến nếu bạn không thể sử dụng$_
Chèn một ^
giữa sigil và tên biến, như thế này : $^a
. Những công việc này chỉ trong một khối. Trình biên dịch trước tiên sẽ đếm xem bạn có bao nhiêu trong số này trong khối, sắp xếp chúng theo từ vựng và sau đó gán đối số đầu tiên cho đối số thứ nhất, thứ hai cho thứ hai, v.v. Các ^
nhu cầu chỉ được sử dụng trong lần xuất hiện đầu tiên của biến. Vì vậy, {$^a - $^b}
mất 2 vô hướng và trừ chúng. Điều duy nhất quan trọng là thứ tự chữ cái, {-$^b + $^a}
cũng làm điều tương tự.
Nếu bạn từng cảm thấy muốn sử dụng cú pháp khối nhọn (như ->$a,$b {$a.map:{$_+$b}}
), thì tốt hơn hết bạn nên viết câu lệnh không có thật khi bắt đầu khối bằng cách sử dụng ^
cho mỗi đối số bạn sẽ không sử dụng trong khối chính (như {$^b;$^a.map:{$_+$b}}
) đó là cách tốt hơn để chơi gôn {$^a.map(*+$^b)}
. Tôi chỉ muốn thể hiện khái niệm này.)
Các nhà khai thác rất mạnh mẽ và thường là cách ngắn nhất để hoàn thành công việc. Đặc biệt là meta-nhà khai thác (nhà khai thác mà phải mất nhà khai thác như một cuộc tranh cãi) []
, [\]
, X
, <<
/ >>
và Z
có giá trị của sự chú ý của bạn. Đừng quên rằng một meta-op có thể lấy một meta-op khác làm đối số (như XZ%%
tôi đã quản lý để sử dụng ở đây ). Bạn cũng có thể sử dụng >>
cho một cuộc gọi phương thức, có thể rẻ hơn rất nhiều so với bản đồ ( @list>>.method
thay vì @list.map(*.method)
, nhưng hãy cẩn thận, chúng không giống nhau! ). Và cuối cùng, trước khi bạn sử dụng nhị phân << >>
, hãy nhớ rằng Z
thường sẽ làm điều tương tự với ít ký tự hơn nhiều.
Nếu bạn chồng nhiều meta vào nhau, bạn có thể chỉ định mức độ ưu tiên bằng dấu ngoặc vuông []
. Điều đó sẽ giúp bạn tiết kiệm khi bạn chồng quá nhiều toán tử đến nỗi nó làm cho trình biên dịch bối rối. (Điều đó không xảy ra rất thường xuyên.)
Cuối cùng, nếu bạn cần ép buộc mọi thứ vào Bool, Int hoặc Str, đừng sử dụng các phương thức .Bool
, .Int
và .Str
, thay vào đó là các toán tử ?
, +
và ~
. Hoặc thậm chí tốt hơn, chỉ cần đặt chúng vào một biểu thức số học để buộc chúng vào Int và cứ thế. Cách ngắn nhất để có được độ dài của danh sách là +@list
. Nếu bạn muốn tính 2 với sức mạnh của độ dài của một danh sách, chỉ cần nói 2**@list
và nó sẽ thực hiện Điều đúng.
Sử dụng các biến trạng thái tự do $
, @
và%
Trong mỗi khối, mỗi sự xuất hiện của $
(hay @
hay %
) đề cập đến một biến trạng thái sáng bóng vô hướng mới (hoặc mảng, hoặc băm) (một biến mà vẫn tồn tại giá trị trên cuộc gọi đến các khối). Nếu bạn cần một biến trạng thái chỉ cần được tham chiếu một lần trong mã nguồn, thì ba người này là những người bạn lớn của bạn. (Thường xuyên nhất là $
.) Ví dụ, trong thử thách Reverse Math C chu kỳ , nó có thể được sử dụng để chọn các toán tử theo chu kỳ từ một mảng, được lập chỉ mục bởi $++%6
.
Sử dụng các hình thức phụ của map
, grep
et al.
Điều đó có nghĩa là: làm hơn map {my block},list
là list.map({my block})
. Ngay cả khi bạn quản lý để sử dụng list.map:{my block}
, hai cách tiếp cận này xuất hiện ở cùng một số byte. Và thông thường, bạn sẽ cần phải ngoặc đơn danh sách khi gọi một phương thức, nhưng không phải khi gọi một phụ. Vì vậy, cách tiếp cận phụ xuất hiện luôn tốt hơn hoặc ít nhất giống như phương pháp một.
Ngoại lệ duy nhất ở đây là khi đối tượng là map
ped, grep
ped và vân vân $_
. Sau đó .map:{}
rõ ràng là nhịp đập map {},$_
.
Sử dụng các mối nối ( &
và |
) thay vì &&
và ||
.
Rõ ràng, chúng ngắn hơn 1 byte. Mặt khác, chúng phải được thu gọn bằng cách bị buộc vào một bối cảnh boolean. Điều này có thể luôn luôn được thực hiện với a ?
. Ở đây bạn nên biết về một meta-op !
op
buộc bối cảnh bool, sử dụng op
và phủ nhận kết quả.
Nếu bạn có một danh sách và bạn muốn biến nó thành một ngã ba, đừng sử dụng [&]
và [|]
. Thay vào đó sử dụng .any
và .all
. Cũng có .none
những thứ không thể dễ dàng bắt chước bởi các ngã ba.
say (3² + 4², 2²⁰, 5⁻²)
==>(25 1048576 0.04)
. Danh sách đầy đủ về Unicode mà bạn có thể lạm dụng như thế này có ở đây: docs.perl6.org/lingu/unicode_texas .