Peringatan : Dinding teks mendekat. Banyak trik kecil yang saya kumpulkan dari waktu ke waktu.
Tulis solusi Anda sebagai blok anonim
Ini sudah disebutkan tetapi saya ingin mengulanginya. Di TIO, Anda bisa menulis my $f =ke header, blok ke kode yang tepat, dan memulai footer dengan a; . Ini tampaknya merupakan cara terpendek untuk menyelesaikan pekerjaan (karena Anda tidak perlu peduli membaca input apa pun, itu diberikan kepada Anda dalam argumen).
Cara lain yang bagus adalah menggunakan tombol -natau -p, tetapi saya tidak menemukan cara untuk membuatnya bekerja di TIO.
Gunakan sintaks titik dua untuk meneruskan argumen
Artinya, alih-alih thing.method(foo,bar), Anda dapat melakukan thing.method:foo,bardan menyimpan 1 karakter. Sayangnya, Anda tidak dapat memanggil metode lain pada hasil karena alasan yang jelas, jadi masuk akal untuk menggunakan hanya untuk metode terakhir dalam satu blok.
Gunakan $_sebanyak yang Anda bisa
Terkadang lebih baik mengambil argumen daftar tunggal daripada beberapa argumen terpisah karena ini. Saat mengakses $_, Anda dapat memanggil metode hanya dengan memulai dengan titik: misalnya .sortsama dengan$_.sort .
Namun, ingatlah bahwa setiap blok mendapatkan miliknya sendiri $_, sehingga parameter blok luar tidak akan merambat ke bagian dalam. Jika Anda perlu mengakses parameter fungsi utama dari blok dalam, ...
Gunakan ^variabel jika Anda tidak dapat menggunakan$_
Masukkan ^antara sigil dan nama variabel, seperti ini: $^a. Ini hanya berfungsi di dalam blok. Kompiler pertama menghitung berapa banyak yang Anda miliki di blok ini, mengurutkannya secara leksikografis, dan kemudian memberikan argumen pertama ke yang pertama, yang kedua ke yang kedua dan seterusnya. The ^kebutuhan untuk digunakan hanya dalam kejadian pertama dari variabel. Jadi, {$^a - $^b}ambil 2 skalar dan kurangi. Satu-satunya hal yang penting adalah urutan abjad, demikian {-$^b + $^a}juga hal yang sama.
Jika Anda pernah merasa ingin menggunakan sintaks blok runcing (seperti ->$a,$b {$a.map:{$_+$b}}), Anda jauh lebih baik menulis pernyataan palsu di awal blok menggunakan ^untuk setiap argumen yang tidak akan Anda gunakan di blok utama (seperti {$^b;$^a.map:{$_+$b}}) (Catatan cara yang lebih baik untuk bermain golf ini adalah {$^a.map(*+$^b)}. Saya hanya ingin memamerkan konsepnya.)
Operator sangat kuat dan seringkali mereka adalah cara terpendek untuk menyelesaikan sesuatu. Terutama meta-operator (operator yang menganggap operator sebagai argumen)[] , [\], X, <</ >>dan Zlayak perhatian Anda. Jangan lupa bahwa meta-op dapat menggunakan meta-op lain sebagai argumen (seperti XZ%%saya berhasil menggunakan di sini ). Anda dapat menggunakan >>untuk pemanggilan metode juga, yang bisa menjadi jauh lebih murah daripada peta ( @list>>.methodbukannya @list.map(*.method), tapi hati-hati, mereka tidak sama! ). Dan, akhirnya, sebelum Anda menggunakan biner << >>, ingatlah bahwa Zakan sering melakukan hal yang sama dalam karakter yang jauh lebih sedikit.
Jika Anda menumpuk banyak meta-op satu sama lain, Anda dapat menentukan prioritas menggunakan tanda kurung siku []. Itu akan menyelamatkan Anda ketika Anda menumpuk begitu banyak operator sehingga membingungkan kompiler. (Itu tidak sering terjadi.)
Akhirnya, jika Anda perlu memaksa sesuatu ke Bool, Int atau Str, jangan gunakan metode .Bool, .Intdan .Str, melainkan operator ?, +dan ~. Atau bahkan lebih baik, cukup masukkan mereka ke dalam ekspresi aritmatika untuk memaksa mereka ke Int dan seterusnya. Cara terpendek untuk mendapatkan panjang daftar adalah +@list. Jika Anda ingin menghitung 2 pangkat dari panjang daftar, katakan saja 2**@listdan itu akan melakukan The Right Thing.
Gunakan variabel status bebas $, @dan%
Di setiap blok, setiap kemunculan $(atau @atau %) merujuk ke variabel status skalar (atau array, atau hash) baru yang mengkilap (variabel yang nilainya tetap ada di seluruh panggilan ke blok). Jika Anda memerlukan variabel status yang perlu direferensikan hanya sekali dalam kode sumber, ketiganya adalah teman besar Anda. (Paling sering $.) Misalnya, dalam tantangan Reverse Math Cycles , itu dapat digunakan untuk memilih operator secara siklikal dari sebuah array, yang diindeks oleh $++%6.
Gunakan sub bentuk map, grepet al.
Itu berarti: lakukan map {my block},listdaripada list.map({my block}). Bahkan jika Anda berhasil menggunakan list.map:{my block}, kedua pendekatan ini keluar pada jumlah byte yang sama. Dan sering kali, Anda perlu mengurung daftar saat memanggil metode, tetapi tidak saat memanggil sub. Jadi sub pendekatan yang keluar selalu lebih baik atau setidaknya sama dengan metode yang satu.
Satu-satunya pengecualian di sini adalah ketika objek yang akan dibuat map ped, grepped dan sebagainya, berada di $_. Maka .map:{}jelas berdetak map {},$_.
Gunakan persimpangan ( &dan |) alih-alih &&dan ||.
Jelas, mereka 1 byte lebih pendek. Di sisi lain, mereka harus dihancurkan dengan dipaksa ke dalam konteks boolean. Ini selalu dapat dilakukan dengan a ?. Di sini Anda harus mengetahui meta-op!op yang memaksa konteks bool, menggunakan opdan meniadakan hasilnya.
Jika Anda memiliki daftar dan ingin mengubahnya menjadi persimpangan, jangan gunakan [&]dan [|]. Alih-alih menggunakan .anydan .all. Ada juga .noneyang tidak dapat dengan mudah ditiru oleh ops persimpangan.
say (3² + 4², 2²⁰, 5⁻²)==>(25 1048576 0.04). Daftar lengkap Unicode yang dapat Anda penyalahgunaan seperti ini ada di sini: docs.perl6.org/language/unicode_texas .