Tips untuk bermain golf di Reda


12

Röda adalah bahasa scripting berbasis aliran yang dibuat oleh fergusq .

Kiat umum apa yang Anda miliki untuk bermain golf di Raeda? Saya mencari ide yang dapat diterapkan pada masalah kode-golf dan yang juga setidaknya agak spesifik untuk Rda (mis. "Hapus komentar" bukan jawaban).

Silakan kirim satu tip per jawaban.


Apakah Anda mencoba mendapatkan kiat untuk mengalahkan saya di golf? : P (saya mungkin harus melihat tips untuk halaman Python)
HyperNeutrino

Wow, pertanyaan dari PCG.SE yang masuk ke Pertanyaan Jaringan Panas dan bukan teka-teki pemrograman / tantangan! :)
Pedro A

1
@HyperNeutrino Shhh .... :)
user41805

Jawaban:


7

Gunakan garis bawah

Ini mungkin tip yang paling penting. Hampir setiap program golf Rio menggunakan garis bawah.

Sintaks garis bawah adalah gula sintaksis untuk forloop. Baris kode berikut ini setara:

ls""|fileLength x for x|sort|pull
ls""|fileLength _|sort|pull

Setiap garis bawah menambahkan variabel baru ke forloop tak terlihat yang ada di sekitar pernyataan. Loop menarik satu nilai dari aliran untuk setiap variabel / garis bawah dan kemudian diulang, sampai tidak ada nilai yang tersisa.

Garis bawah dapat digunakan di mana saja dalam pernyataan:

a[x:y+1]=[1]*(1+y-x) /* Sets range x..y (inclusive) */
seq x,y|a[_]=1       /* 6 bytes less */

Jika Anda harus merujuk pada nilai garis bawah yang sama lebih dari sekali, atau menggunakan nilai dalam urutan terbalik, Anda dapat memasukkan nomor setelah garis bawah:

a|[_^_1]  /* maps x to x^x */
a|[_2-_1] /* maps each pair (x,y) to y-x, eg. [1,2,4,8] -> [1, 4] */

3

Beberapa titik koma / baris baru adalah opsional

Saat menulis kode Rda, umumnya disarankan untuk menggunakan baris baru atau titik koma untuk memisahkan semua pernyataan. Namun, saat bermain golf, perlu diketahui bahwa tidak semua titik koma benar-benar diperlukan.

Berikut adalah daftar tempat yang tidak lengkap di mana titik koma / baris baru adalah opsional . Kebanyakan dari mereka tidak berlaku bila pernyataan berikut dimulai dengan operator ( (, [, +, dll).

  • Setelah tugas
  • Setelah panggilan fungsi, ketika setidaknya ada satu argumen (mis. f x) Atau ketika tanda kurung digunakan (mis. f())
  • Di mana-mana, jika baris / pernyataan berikutnya akan dimulai dengan |, ), ]atau}

Jika pernyataan berikutnya dimulai dengan operator, titik koma / baris baru adalah opsional jika

  • Pernyataan ini adalah panggilan fungsi dan tanda kurung digunakan, misalnya {f(x)[y]}sama dengan {f(x);[y]}. Ini hanya berfungsi dalam konteks pernyataan, bukan ketika pemanggilan fungsi adalah ekspresi.
  • Pernyataan adalah tugas dan tanda kurung digunakan, misalnya x=(y)[z]sama dengan x=(y);[z](yang tidak sama dengan x=((y)[z])).

Dan di sini ada beberapa tempat di mana baris baru sayangnya diperlukan :

  • Setelah ++dan --.
  • Setelah [...].

Seringkali dimungkinkan untuk menyimpan byte dengan mengatur ulang penugasan. Sebagai contoh:

a=0;b=""c=[""]
b=""c=[b]a=0

x=f()y=i;z=a[0]
x=f()z=a[0]y=i

1

Gunakan struktur kontrol suffix

Hampir tidak pernah optimal untuk tidak menggunakan pernyataan suffix, karena Anda dapat menggunakannya {...}sebagai ganti do...end.

Beberapa contoh:

x|unless[not(_ in y)]do[0]else[1]done
x|[0]unless[not(_ in y)]else[1]

if[p<0]do c+=p;a-=p done
{c+=p;a-=p}if[p<0]

Bisakah Anda melakukannya if[_ in y]?
user41805

@KritixiLithos Tidak, karena saya ingin kondisinya OR, bukan AND. Saat ini memeriksa apakah ada setidaknya satu nilai di dalamnya xjuga dalam y, tetapi kondisi Anda akan memeriksa apakah semua nilai di xjuga masuk y. (Contoh disalin dari sini ).
fergusq

1

Gunakan aliran untuk input

Dalam kasus di mana input adalah daftar elemen, akan bermanfaat untuk menarik nilai dari aliran alih-alih mendapatkannya sebagai array.

Dalam sebagian besar kasus, elemen-elemen array diulang dengan mendorongnya ke aliran dan kemudian iterasi menggunakan forloop (atau garis bawah). Karena elemen-elemen tersebut iterated dari stream, mengapa tidak mendefinisikan bahwa mereka harus ada sejak awal?

Misalnya, untuk menghitung jumlah kuadrat angka dalam input:

{|a|a|[_^2]|sum} /* Removing a redundant argument */
{[_^2]|sum}      /* saves 5 bytes */

1

Tanda kurung adalah opsional dalam konteks pernyataan. Ini berlaku bahkan jika argumen dimulai dengan operator. Misalnya, [a()|sqrt-_]lebih pendek dari [a()|sqrt(-_)]. Tanda kurung setelahnya aadalah wajib, seperti adalam konteks ekspresi, bukan dalam konteks pernyataan.

Namun, menulis [a()|sqrt(_+1)*2]tidak mungkin, dan tanda kurung tambahan yang diperlukan untuk membantu parser: [a()|sqrt((_+1)*2)]. Seringkali dimungkinkan untuk menulis ulang ekspresi seperti itu sehingga tidak dimulai dengan tanda kurung:[a()|sqrt 2*(_+1)]


Apakah mungkin untuk meneruskan beberapa parameter ke fungsi tanpa memerlukan tanda kurung?
user41805

@ KritixiLithos Ya. Misalnya. [a()|atan2 _,_]akan diizinkan.
fergusq

1

Gunakan ,alih-alih ..di []/ pushpernyataan

Terkait: Gunakan ,sebagai gantiand

The pushfunction (serta printfungsi) dapat mengambil sejumlah argumen, dan output masing-masing dari mereka tanpa pembatas.

Jadi itu berarti sesuatu seperti ini

["a"..b]        /*8 bytes (string "a" concatenated with variable b)*/

dapat disingkat menjadi adil

["a",b]         /*7 bytes*/

menghemat 1 byte.


1

[]/ push>print

Jangan pernah gunakan printpernyataan. []pernyataan push selalu golfier. Perbedaan antara printdan pushadalah bahwa yang pertama menghasilkan baris tambahan sementara yang terakhir tidak. Namun, ini bisa dielakkan.

print"a"              /* 8 bytes */
["a                   /* 6 bytes; uses a literal newline */
"]

print"a",b            /* 10 bytes */
[`a$b                 /* 8 bytes; uses a literal newline and `` strings */
`]

1

Menggunakan ``string

Dalam ""string, Anda harus melarikan diri karakter tertentu untuk menggunakannya. Misalnya, untuk mencetak garis miring terbalik, Anda harus memiliki string seperti "\\". Ada satu byte tambahan untuk keluar dari backslash. Namun, jika Anda menggunakan ``, Anda tidak harus keluar dari karakter ini dan dapat menyimpan satu byte.

print"\\"     /* 9 bytes */
print`\`      /* 8 bytes */

Tidak hanya itu, Anda dapat menyandikan variabel dan ekspresi di dalam ``string menggunakan $variableNameatau ${expression}, fitur yang tidak ada dalam ""string.

Kami mengeluarkan string yang "a"dirangkai dengan nilai variabel bdengan baris baru yang tertinggal dalam contoh ini.

["a",b,"      /* 11
"]               bytes   */
[`a$b         /* 8
`]               bytes; encodes b in the string using $b */

1

Gunakan ,sebagai gantiand

Kondisi di Röda adalah stream, dan dapat terdiri dari beberapa nilai. Nilai-nilai ini dikurangi menjadi satu nilai boolean dengan and.

Ini berarti bahwa Anda dapat mengganti anddengan ,dalam kondisi untuk mendorong beberapa nilai ke aliran:

x if[a and b]
x if[a,b]

Kondisi kosong itu benar

Dimungkinkan juga untuk memiliki kondisi yang tidak mengandung nilai, yang sebenarnya.

x while true
x while[]

1

Tulis daftar pengganti dalam formulir *"...;..."/";"

The replacefungsi mengambil normal daftar string sebagai argumen. Namun, jika daftarnya sangat panjang, sebaiknya simpan saja regex / penggantian pasangan dalam string dan kemudian pisahkan string dan gunakan operator bintang:

replace"a","b","c","d"
replace*"a;b;c;d"/";"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.