Tips untuk bermain golf di Japt

18

Sekarang saya benar-benar kecanduan Code Golf, mungkin sudah saatnya saya mencoba mengambil beberapa bahasa golf.

Mengingat bahwa saya bermain hampir secara eksklusif dalam JavaScript, Japt sepertinya merupakan bahasa logis untuk memulai. Saya akan menyelami dokumentasi pada kesempatan berikutnya yang saya dapatkan tetapi, sementara itu, silakan kirim tips yang Anda miliki untuk Japt dalam jawaban di bawah ini.

Karena saya seorang pemula dalam bahasa Japt dan bermain golf secara umum, jika Anda bisa "menerjemahkan" kiat-kiat Anda ke JavaScript, jika mungkin, itu akan sangat membantu dalam membantu saya memahami berbagai hal.

Shaggy
sumber
Heh, terima kasih sudah memposting ini. Saya telah menunda melakukan ini karena saya ingin mendesain ulang Japt di beberapa titik, tetapi itu tidak akan terjadi dalam waktu dekat, dan mungkin juga tidak akan mengacaukan banyak tips. Kiat untuk diri saya sendiri: tulis tutorial: P
ETHproduk
Jangan lupa untuk mengunjungi ruang obrolan Japt :)
Oliver

Jawaban:

11

Pindah dari JavaScript ke Japt

Seperti yang Anda ketahui, Japt hanyalah versi singkat dari JavaScript. Saya membuat Japt karena saya bosan dengan nama properti yang panjang, sepertiString.fromCharCode(x) dan Math.floor(x), dan kebosanan dalam melakukan hal-hal seperti membuat jangkauan. Inilah minimum yang perlu Anda ketahui saat beralih dari JavaScript ke Japt:

  • Japt adalah transpiled bahasa; Kode Japt adalah transpiled untuk JavaScript dan kemudian jalankan sebagai JS. (Saya kira Anda bisa mengatakan dikompilasi , tetapi suara yang diubah lebih hipster. Penafian: Saya sama sekali tidak tahu tentang menjadi hipster)
  • Semua entri adalah program lengkap secara default. Input secara implisit diurai, dan enam input pertama dimasukkan ke dalam variabel U, V, W, X,Y , dan Z; array lengkap disimpan di N. Hasil dari ekspresi terakhir secara otomatis dicetak.
  • Semua huruf besar adalah variabel, dan tetap sama ketika diubah. Sebagian besar memiliki nilai yang telah ditetapkan, yang dapat Anda temukan di bagian "Variabel" pada dokumen Japt (di bagian interpreter ).
  • Semua huruf kecil adalah fungsi prototipe, atau metode . Japt menambahkan metode a- z(dan à- ÿ) pada angka, string, dan array. Ketika Anda menggunakan salah satu dari surat-surat ini, Japt mengisi .dan (; Ucdi Japt setara dengan U.c(JavaScript, yang bisa berarti ceil, charCodeAt, atau concat, tergantung pada jenis U. Di sinilah sebagian besar kekuatan Japt berasal; Anda dapat menemukan daftar lengkap metode ini di bawah bagian "fungsi _____" dari dokumen Japt (di penerjemah ).
  • Sebuah ruang mewakili ), dan )mewakili )). Ini karena ketika saya pertama kali merancang Japt, saya ingin menyimpan byte sebanyak mungkin, dan itulah bagaimana saya pertama kali berpikir untuk melakukan ini. (Meskipun Us w nterlihat lebih baik daripada Us)w)n), IMHO.)
  • Suatu fungsi dilambangkan sebagai ABC{...}, di mana ABCdapat berupa string variabel apa pun. Fungsi berfungsi sebagian besar seperti yang mereka lakukan di JS, perbedaan utama adalah ekspresi terakhir secara otomatis dikembalikan (daripada harus menggunakan returnatau suka tanda kurung ES6).
  • 'menunjukkan string char tunggal (yaitu 'asama dengan "a"), dan #mengambil kode char berikutnya dan menjadi nomor itu ( #esama dengan 101).
  • Apa pun di antara tanda-tanda dolar $tetap sama selama proses transpilasi. Anda dapat menggunakan ini untuk mengimplementasikan forloop, misalnya, karena Japt tidak memilikinya, tetapi saya akan menyarankan menggunakan metode lain (sepertim pada string dan array, atau opada angka).
  • Kebanyakan karakter lain yang biasa digunakan dalam JS - "", 0-9, (, +, =, dll - tetap sama ketika transpiled (untuk sebagian besar, anyway).

Dan hanya itu yang perlu Anda ketahui untuk menulis kode Japt dasar. Mencapai kekuatan golf maksimum di Japt membutuhkan lebih banyak pengetahuan, tetapi itu dapat ditemukan di jawaban lain.


Inilah contoh dasar. Katakanlah Anda ingin mengambil serangkaian karakter ASCII dan ganti masing-masing dengan kode karakter heksadesimalnya. Berikut ini cara melakukannya dalam JavaScript:

U.split("").map(x=>x.charCodeAt(0).toString(16)).join("")

Sekarang untuk mengkonversi ke Japt. .split("")di JS setara dengan q""di Japt, atau bahkan lebih pendek, adil q. .join("")juga hanya q, perbedaannya adalah bahwa objek tersebut adalah array bukan string. .map(adalah m, .charCodeAt(adalah c, dan .toString(sedang s. Jadi kode Japt kami mungkin terlihat seperti:

Uq mX{Xc0 s16} q 

Di Japt, mberfungsi dengan baik pada string seperti halnya pada array, jadi kita bisa menghapus keduanya q:

UmX{Xc0 s16}

Uji secara online! Seperti yang dapat Anda lihat di kotak "kode JS", ini langsung mentranslil ke:

U.m(function(X){return X.c(0).s(16)})

Saat Anda belajar untuk bekerja dengan Japt, Anda akan menjadi semakin tidak fokus dalam mengonversi bolak-balik dari JavaScript dan dapat membuat kode dalam Japt sebagai bahasa sendiri. Berikut ini penjelasan yang sepenuhnya meninggalkan bagian JavaScript:

UmX{Xc0 s16}
               // Implicit: U = input string
UmX{       }   // Take U, and replace each character X with the result of this function:
    Xc0        //   Take the char-code at index 0 in X (the first and only one).
        s16    //   Convert this to a hexadecimal string.
               // Implicit: output result of last expression
Produksi ETH
sumber
Mungkin lebih baik untuk menunjukkan langkah lain: pintasan unicode. Dalam hal ini, kita bisa menghemat 2B dengan mereka. Juga, Anda mungkin ingin menambahkan bahwa Anda dapat meninggalkan hal-hal tertentu pada akhirnya. Itu akan menghemat byte lain.
Lukas
Primer yang luar biasa, terima kasih, ETH. Ada cukup banyak di sana, saya pikir, untuk memulai beberapa tantangan sederhana.
Shaggy
Menggabungkan ini dengan apa yang telah saya dapatkan dari README sejauh ini, akankah saya benar bahwa contoh di atas dapat lebih pendek Um_c s16?
Shaggy
Atau, lebih pendek masih: ¡Xc s16?
Shaggy
1
@ Shaggy Anda benar! Man, Anda sudah tahu ini cepat ;-) Saya akan menambahkan beberapa tips dasar golf Japt (seperti cara pintas Unicode dan semacamnya), mungkin sebagai jawaban lain sekalipun.
ETHproduksi
8

Mengompresi Array String

PEMBARUAN: Alat-alat yang ditampilkan dalam tip ini sejak itu telah ditulis ulang, ditingkatkan dan diintegrasikan ke dalam penerjemah Japt saya . Untuk hasil terbaik, disarankan agar Anda menggunakan kompresor tersebut di atas yang terhubung di bawah ini. Saya akan meninjau kembali tip ini ketika saya punya waktu lebih banyak dan menulis ulang dengan kompresor baru dalam pikiran.

pengantar

Jika Anda memiliki larik string dalam kode Anda, cara paling jelas untuk mengompresnya adalah dengan menjalankan setiap string secaraOc terpisah. Untuk keperluan tip ini, kami akan bekerja dengan array ["lollipop","marshmallow","nougat","oreo"], yang awalnya berbobot 42 byte. Menjalankan setiap string Ocmemberi kita:

[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]

Itu sekarang 33 byte, penghematan yang layak.


Langkah 1

Tapi , kita bisa melakukan yang lebih baik. Jika kita bergabung dengan array ke string yang dipisahkan baris baru, kita bisa menghilangkan tanda kurung, koma, dan backtick asing dan dibagi pada baris baru untuk mendapatkan array kita. Menerapkannya pada contoh array kita memberi kita yang berikut:

`lo¥ipop
Ú\hÚaow
Í
eo`·

Turun ke 26 byte sekarang.


Langkah 2

Tapi , kita masih bisa melakukan yang lebih baik lagi! Kita dapat menggunakan huruf kecil untuk membatasi string, bukan baris baru, yang mungkin dimasukkan dalam kompresi. ztidak digunakan dalam string apa pun, jadi mari kita masukkan, dan lihat bagaimana kita melanjutkan.

`lo¥ipopzÚ\hÚaowzÍzeo`qz

Ah, gila - tidak ada perbaikan di sana; jumlah byte kami naik satu! Mungkin ada surat lain Anda bisa menggunakan tetapi, tergantung pada string Anda, mungkin ada beberapa untuk mencoba - dalam contoh kita ada 11: b,c,d,f,j,k,q,v,x,y,z. Mencoba masing-masing akan sangat membosankan, di situlah alat praktis ini masuk; beri makan string yang dipisahkan baris baru Anda dan itu akan mencoba untuk membatasi string dengan setiap huruf yang tidak terkandung di dalamnya dan output:

  • string terkompresi terpendek,
  • pembatas yang digunakannya, dan
  • panjangnya.

Menjalankan string sampel kami melalui itu menunjukkan yang bmemberikan hasil terbaik:

`lo¥ipáæqrÚaowbÍÞo`qb

Dan begitulah, kita hanya tinggal 24 byte.


Langkah 3

Tapi , kita bisa melakukan yang lebih baik lagi! Jika urutan string dalam array Anda tidak masalah, mungkin ada permutasi yang berbeda yang dikombinasikan dengan pembatas yang berbeda yang dapat bekerja lebih pendek. Namun, mencoba setiap kemungkinan akan jauh lebih membosankan. Dengan 4 string kami, ada 24 permutasi yang berbeda untuk dicoba. Dengan masing-masing dari 11 surat yang mungkin menjadi 264! Di situlah alat ini berperan. Sekali lagi, beri baris baru Anda dengan string yang terpisah dan itu akan mencoba setiap kombinasi dari setiap permutasi dan setiap huruf pembatas, menghasilkan:

  • urutan string dalam string terkompresi terpendek,
  • string terkompresi,
  • pembatas yang digunakannya, dan,
  • panjangnya.

Menjalankan string sampel kami melalui itu menunjukkan bahwa "nougat","oreo","lollipop","marshmallow"dengan bsebagai pembatas memberikan hasil terbaik, dengan jumlah byte terakhir hanya 23:

`ÍÞo½o¥ipáæqrÚaow`qb


Tip Bonus: Kompresi Array Integer

Anda dapat menerapkan prinsip yang sama untuk array bilangan bulat dengan terlebih dahulu mengonversikan masing-masing ke basis yang lebih tinggi. Menggunakan sampel ini, array 36 byte:

[588181,156859,595676,475330,680474]

Kita dapat menurunkannya menjadi 29 byte dengan terlebih dahulu mengubahnya menjadi array string 32 dan kemudian menjalankannya melalui program kompresi pertama:

`huclt4p5r5ÛÊg62tkogq`qt mnH

Atau serendah 27 byte menggunakan program kedua:

`4p5Ïcl5ÛÊg62tkogq`qt mnH

Anda mungkin dapat menyimpan byte atau 2 lain di atasnya dengan memindahkan konversi integer ke metode yang sudah Anda jalankan pada array.


Catatan

  1. Jangan lupa untuk memperhitungkan 1 atau 2 byte tambahan q<letter>(<space>)biaya lebih ·. Meskipun, Anda mungkin dapat menggunakan salah satu cara pintas Unicode untuk mendapatkan byte kembali, tergantung pada pembatas Anda ( sama dengan ql<space>, misalnya).
  2. Sebuah kata hati-hati saat menggunakan alat terakhir: semakin banyak string yang Anda miliki, semakin banyak permutasi akan ada dan semakin lambat program akan berjalan, sampai akhirnya runtuh. Sebagaimana dirinci di atas, dengan 4 string sampel dan 11 huruf yang memungkinkan untuk dicoba, ada 264 kemungkinan kombinasi, tambahkan jumlah string hanya 1 dengan 11 huruf yang sama dan kami sudah memiliki 1320 kombinasi untuk dicoba. (Anda dapat menggunakan alat ini untuk menghitung jumlah kombinasi, jika Anda mau).

Kredit

  • Oliver untuk inspirasi menciptakan alat yang ditemukan di tip ini.
  • ETHproduk untuk proofreading.
Shaggy
sumber
6

Mengompresi string

Japt (saat ini) menggunakan pustaka shoco untuk kompresi string. Anda bisa mengompres string arbitrer menggunakan Oc, asalkan itu mengandung huruf kecil:

Oc"Hello, World!"

Output ini HÁM, WŽld! (well, Žsecara teknis karakter yang tidak patut dicetak). Anda dapat mendekompres ini dengan membungkusnya dalam backticks:

`HÁM, WŽld!`

Uji secara online!

Atau, Anda dapat menggunakan Odfungsi ini untuk mendekompresi string yang berubah-ubah. Ini biasanya tidak berguna, tetapi memiliki tujuan ...

Produksi ETH
sumber
Jadi, jika saya menjawab "Halo, Dunia!" tantangan, akankah saya menggunakan hanya HÁM, WŽld!atau perlu tertutup dalam backticks? Saya menduga yang terakhir.
Shaggy
2
@Shaggy Saat menjawab pertanyaan, Anda harus memasukkan semua kode, jadi `HÁM, WŽld! dalam hal ini
Martijn Vissers
6

Memendekkan Angka Dengan Kode-Char

Di Japt, Anda bisa menggunakan # , diikuti oleh karakter untuk membuat kode-char. Ini berguna saat memperpendek angka yang lebih panjang.

Seperti yang disebutkan oleh @ETHproductions, ini hanya bekerja pada lintasan tiga digit pada kisaran 100-255, kecuali jika Anda bersedia untuk beralih ke UTF-8.

Contoh:

123 dapat disingkat menjadi #{

101 dapat disingkat menjadi #e

Anda bahkan dapat mengaitkan ini bersama-sama:

123101 dapat disingkat menjadi #{#e

Anda dapat menggunakan String.fromCharCode(123)JavaScript, atau 123dJapt untuk menemukan karakter yang sesuai.

String.fromCharCode(123) kembali {

Oliver
sumber
Terima kasih, @obarakon, tip yang bagus untuk membuat bola bergulir; String.fromCharCode()adalah salah satu dari mereka (banyak!) Metode JS panjang panjang yang dapat menampung jumlah byte Anda. Mungkin, ini akan dianggap sebagai bilangan bulat? yaitu, jika saya membutuhkan integer 123dalam suatu solusi, saya dapat menggunakan #{untuk menyimpan byte.
Shaggy
1
Ya, ini adalah bilangan bulat. Jika Anda menambahkan -Qbendera ke jendela input Anda, Anda dapat lebih baik melihat jenis output: tanda kutip di sekitar string , array , dll.
Oliver
1
Anda harus menyebutkan bahwa itu String.fromCharCode(123)berfungsi dalam JavaScript, tetapi Anda bisa melakukannya 123ddi Japt untuk mendapatkan hasil yang sama ;-) Juga, ini hanya berfungsi pada tiga digit proses dalam rentang 100- 255(kecuali jika Anda mau beralih ke UTF-8)
ETHproduksi
@ EHProduk Panggilan bagus, diperbarui!
Oliver
5

Kiat cepat: Array kosong []

Japt memiliki konstan untuk array kosong: A. Tetapi, untuk mengaksesnya, Anda harus menambahkan titik koma ;ke program Anda untuk menggunakan konstanta alternatif Japt, jika tidak Aakan 10. Jadi menggunakan ;Asebenarnya menawarkan penghematan 0 byte [], tetapi akan menghemat byte jika Anda perlu menetapkan array ke variabel (misalnya, A=[]).

Namun, jika (dan hanya jika) program Anda tidak mengambil input apa pun, Anda dapat mengakses array kosong hanya dengan 1 byte menggunakan Nvariabel, yang merupakan array input - tanpa input, itu akan kosong. Cobalah di sini .

Ini juga memiliki manfaat tambahan yang memungkinkan Anda untuk menggunakan nilai konstan default dalam program Anda dan, dalam beberapa kasus, masih dapat menghemat byte lebih dari penggunaan ;Abahkan ketika program Anda mengambil input berkat pintas untuk s1dan s2.

Shaggy
sumber
2
Wow, saya belum berpikir untuk menggunakan N, ide bagus.
ETHproduksi
2
Bagus, @Shaggy!
Oliver
4

Mengevaluasi JavaScript

Japt memungkinkan Anda untuk mengeksekusi JavaScript mentah dengan membungkusnya $...$.

Sebagai contoh, $alert("hello world")$

Ini dapat dipersingkat dengan memanfaatkan penutupan otomatis Japt $dan ).

$alert("hello world")$ dapat disingkat menjadi $alert("hello world"

Mengompresi JavaScript

Anda juga dapat memampatkan JavaScript menggunakan Ox.

Jika ada fungsi JavaScript yang ingin Anda gunakan, katakanlah screen.width, Anda dapat mengompres string "screen.width"menggunakanOc , lalu memasukkan hasilnya di antara Ox` ... `

Perhatikan bahwa Anda tidak perlu menutup kutipan di Japt ketika itu tidak diikuti oleh hal lain.

Oliver
sumber
@ Shaggy Anda perlu Oxmengevaluasi string. Jika tidak, Anda hanya akan menampilkan teks "screen.width". Contoh
Oliver
4

Ketahui benderanya

Sesuai konsensus meta terbaru (Des 2017) , bendera baris perintah tidak lagi dihitung terhadap byte. Ini benar-benar berita bagus untuk Japt karena memiliki banyak tanda untuk perawatan tambahan pada input / output.

Semua flag yang tersedia di Japt diuraikan di bawah ini, sesuai urutan evaluasi . Bendera di grup yang sama eksklusif satu sama lain. Perhatikan bahwa bendera dalam grup yang berbeda dapat digunakan dalam kombinasi, menghasilkan sesuatu seperti ini :)

mdefæ

Seluruh program dipetakan di atas argumen pertama ( U).

Jika lebih banyak argumen hadir, mereka dilewatkan apa adanya (yaitu tidak dipetakan berpasangan). Jika tidak, argumen kedua adalah indeks, dan argumen ketiga adalah seluruh array, sama seperti U.m. Jika Uangka, itu dikonversi ke rentang; jika string, itu dikonversi ke array karakter dan hasilnya digabungkan bersama.

  • -m: Berlaku di atas dan tidak ada yang lain.
  • -d: Mengembalikan truejika beberapa hasil benar, falsejika tidak.
  • -e: Mengembalikan truejika semua hasil benar, falsejika tidak.
  • -f: Mengembalikan berbagai elemen Uyang hasilnya benar.
  • : Menerapkan -fdan mengembalikan elemen pertama.

gh

Mengambil elemen pada indeks yang ditentukan.

  • -g: Mengambil elemen pertama (indeks 0).
  • -gX: Mengambil elemen pada indeks X(bisa berupa bilangan bulat positif).
  • -h: Mengambil elemen terakhir.

Ubah hasilnya menjadi boolean.

  • -!: Terapkan boolean tidak.
  • : Terapkan boolean tidak dua kali (mengembalikan kebenaran).

N

Ubah hasilnya menjadi angka. Plus unary digunakan.

PRSQ

Konversikan ke string.

  • -P: Bergabung dengan array dengan "".
  • -R: Bergabung dengan array dengan "\n".
  • -S: Bergabung dengan array dengan " ".
  • -Q: Terapkan JSON.stringify(bisa berupa objek apa pun, bukan hanya array). Contoh .

x

Menerapkan fungsi xke output. (Secara harfiah x, bukan "fungsi alfabet huruf kecil apa pun".)

  • Array: Jumlah.
  • String: Potong dari kedua ujungnya.
  • Nomor: Bulat ke bilangan bulat.
Bubbler
sumber
2
Perhatikan bahwa menggunakan flag tidak dihitung sebagai pengiriman Japt, itu dianggap sebagai pengiriman Japt-dengan-yang-spesifik-bendera-bahasa.
Nit
3

Pintasan Unicode

Ada banyak struktur umum di Japt yang tidak dapat disimpan dalam char ASCII tunggal, seperti qS , p2 , mX{, , dll Jadi untuk berkeliling ini, Japt memiliki "jalan pintas Unicode", yang adalah karakter dalam kisaran \xA1- \xDE( ¡- Þ) yang berkembang ke struktur umum ini. Anda dapat menemukan daftar lengkapnya di dokumen juru bahasa .

Selain itu, @singkatan XYZ{, dan _singkatan Z{Z, untuk membantu membangun fungsi. Jadi mari kita lihat contoh program kami dari jawaban lain :

UmX{Xc0 s16}

Pertama, kita bisa mengganti X{Xdengan _, yang memberi kita:

Um_c0 s16}

Kemudian kita bisa mengganti m_dengan ®menyimpan byte lain:

U®c0 s16}

Atau kita bisa menggantinya X{dengan @, yang memberi kita:

Um@Xc0 s16}

Ini kemudian memungkinkan kita untuk menggunakan ¡pintasan untuk menyimpan dua byte:

¡Xc0 s16}

Salah satu dari dua jalur ini dapat dipersingkat 1 byte lebih dari yang lain. Bisakah Anda mencari tahu yang mana?

Produksi ETH
sumber
1
®c s16untuk 6 byte - apakah saya memenangkan cookie?
Shaggy
@Shaggy Anda dapat menyimpan 1 byte lebih banyak jika Anda terlihat cukup keras ...;)
ETHproduksi
Apakah akan ®c sG?
Shaggy
1
Ya! Saya pikir itu serendah yang Anda bisa. Sudah selesai dilakukan dengan baik! :-)
ETHproduksi
2
Luar biasa melihat ke belakang pada ini, melihat perkembangan Japt dalam beberapa bulan singkat. Ini sekarang dapat dicapai dengan csG.
Shaggy
3

Manfaatkan variabel preset

Variabel A- Sadalah preset untuk nilai-nilai umum yang membutuhkan lebih dari satu byte untuk diwakili dalam Japt:

  • A- Gadalah 10- 16.
  • His 32, Iis 64, Jis -1, Lis 100.
  • Kdidefinisikan sebagai new Date(), yang dapat Anda manipulasi dengan berbagai cara.
  • Mdan Obenda dengan berbagai fungsi yang bermanfaat. Anda dapat mempelajari lebih lanjut di dokumen.
  • Padalah string kosong, Qadalah tanda kutip, Radalah baris baru, dan Smerupakan spasi.
  • Tdiatur ke 0, sehingga Anda dapat menggunakannya sebagai akumulator jika perlu.

Jika karakter pertama dalam program ini adalah titik koma ;, atur A-Lulang sebagai berikut:

  • Aadalah array kosong [].
  • Badalah "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
  • Cadalah "abcdefghijklmnopqrstuvwxyz".
  • Dadalah "QWERTYUIOP\nASDFGHJKL\nZXCVBNM".
  • Eadalah "[a-z]", dan Fini "[A-Za-z]"(berguna sebelum saya menambahkan ini sebagai fitur regex)
  • Gis 36, His 65, and Iis 91(berguna untuk rentang alfabet).
  • Jadalah koma tunggal; L, satu periode.

Saat ini hanya A, B, C, dan Ddari daftar ini benar-benar berguna. Saya berencana untuk menambahkan sistem yang lebih baik yang memungkinkan hingga 256 variabel dua-byte, yang akan ditetapkan ke nilai-nilai ini dan lebih banyak lagi.

Produksi ETH
sumber
3

Gunakan fungsi otomatis

Anda kemungkinan besar sudah mengetahui itu @dan _merupakan pintasan untuk XYZ{dan Z{Z, masing-masing (tercakup dalam jawaban pintasan Unicode ). Tetapi kadang-kadang Anda dapat membuat fungsi lebih pendek.

Misalkan Anda memiliki array karakter dan Anda ingin memetakan setiap karakter ke kode karakternya. Anda dapat melakukan ini dengan salah satu dari ini:

mX{Xc} 
m_c} 

Tapi ada cara yang lebih baik. Jika suatu metode atau operator adalah item pertama setelah metode lain atau (, itu akan berubah menjadi string. Jadi dua baris ini setara:

r'a'b  // Replace all "a"s with "b"s; transpiles to .r("a","b")
ra'b   // Does the same thing, 1 byte less; transpiles to the same thing

Tetapi bagaimana hal itu membantu fungsi kita? Nah, sebagian besar metode yang menerima fungsi, jika diberi string yang mewakili metode atau operator, akan menafsirkannya sebagai fungsi. Yang berarti Anda juga dapat melakukan ini:

m_c}  // Map each item to its char code
m'c   // Does the same thing, 1 byte less
mc    // Also does the same thing, 2 bytes less

Saya menyebutnya "fungsi-otomatis". Ada beberapa varietas yang berbeda:

  • m@Xc}mc
  • m@Xc1}mc1
  • m@X+1}m+1
  • m@1+X}m!+1
  • m@2pX}m!p2

Semoga Anda mendapatkan idenya. Untuk bertukar argumen, cukup awali metode atau operator dengan !.

Produksi ETH
sumber
Apakah perlu dicatat di sini bahwa menggunakan fungsi otomatis juga dapat memungkinkan penghematan lebih lanjut melalui penggunaan pintasan? misalnya, m@2pXÃm!p2<space>m!².
Shaggy
Wow! Saya tidak berpikir tentang menggunakan string di peta, bahkan tidak tahu itu mungkin. Mungkin saya akan menghemat beberapa byte berkat ini di masa depan.
RedClover
Hei @ Soaku, entah bagaimana aku merindukan bahwa Anda telah menjawab dengan Japt, jadi izinkan saya untuk memperpanjang Anda Selamat Datang terlambat! Semoga Anda menikmati menggunakannya sejauh ini. Jika Anda memiliki pertanyaan, saran, atau hanya ingin berbicara, silakan bergabung dengan kami di chatroom Japt (Github biasanya bekerja dengan baik untuk dua yang pertama;))
ETHproduksi
3

Penugasan Variabel Tersirat

Setiap kali Anda memulai baris baru di Japt, hasil dari baris sebelumnya secara otomatis ditetapkan ke salah satu variabel input ( U- Z), dengan baris pertama adalah U, baris kedua V, dan seterusnya.

Mari kita ambil contoh: misalkan Anda ingin membuat 2 array untuk dikerjakan, satu berisi angka 1-10 dan lainnya berisi kotak mereka. Jalan panjang untuk melakukan ini adalah seperti ini:

U=Aõ V=Um² [do something with the arrays]

Namun, menggunakan penugasan variabel otomatis yang dapat disingkat menjadi:

Aõ
Um²
[do something with the arrays]

Kami telah menyimpan 4 byte di sana. Tetapi, dalam contoh ini, kita dapat menyimpan satu byte lagi karena array 1-10 ditugaskan Udan Udapat dihilangkan dalam skenario tertentu :

Aõ
m²
[do something with the arrays]

Peringatan

Satu hal yang perlu diperhatikan dengan tip ini adalah Anda tidak menimpa variabel input apa pun yang mungkin Anda perlukan nanti dalam program Anda. Ini dapat dihindari dengan meninggalkan satu atau lebih baris kosong di awal. Dalam contoh berikut, 2 array akan ditugaskan ke variabel V& W, alih-alih U& V:


Aõ
Vm²
[do something with the arrays]
Shaggy
sumber
3

Ketahui Javascript

Karena kode Japt apa pun berjalan sebagai JS yang dialihkan, pemahaman yang baik tentang operator JS dan metode bawaan sangat membantu dalam memainkan potongan-potongan kode Japt.

Kiat JS yang relevan

[]Vm@...
...
  • Hubungan arus pendek
  • Memisahkan dengan angka
    • Ini dapat digeneralisasikan ke metode apa pun yang menerima string tetapi bukan angka. Angka yang lewat di sana secara implisit akan dilemparkan ke string, sering kali menyimpan byte (misalnya 0lebih '0).

Fungsi bawaan JS yang relevan

Lihat dengan cermat parameter apa yang diteruskan ke argumen fungsi.

Untuk metode string, ada baiknya mengetahui bagaimana perilaku berbeda antara melewati string atau regex dengan atau tanpa gflag.

Bubbler
sumber
3

Gunakan beberapa baris bila perlu

Untuk sebagian besar tantangan yang tidak terlalu sulit, Anda dapat mengekspresikan solusinya hanya dalam satu baris Japt, sebagai urutan penerapan fungsi bawaan. Tetapi yang lebih kompleks akan membutuhkan untuk menggunakan konstruksi perulangan, rekursi, atau menggunakan kembali sejumlah besar kode. Di sinilah pemrograman multi-line masuk

Hapus parens penutup

Tugas : Diberikan array angka, pasangkan setiap elemen dengan indeks kuadrat, dan urutkan berdasarkan jumlah.

[5,1,17,9,3] => [[5,0],[1,1],[17,4],[9,9],[3,16]] => [[1,1],[5,0],[9,9],[3,16],[17,4]]

Solusi satu baris adalah íUm@Yp2})ñx, tetapi })biaya dua byte (dan tidak ada jalan pintas satu byte). Anda dapat menghapus })dengan hanya memindahkan trailing ñxke baris berikutnya, sehingga kode terlihat seperti ini:

íUm@Yp2
ñx

dan JS yang diubah menjadi:

U = U.í(U.m(function(X, Y, Z) { return Y.p(2) })); U.ñ("x")

Anda dapat dengan jelas melihat ini melakukan hal yang sama dengan solusi satu baris, hanya menetapkan kembali hasil antara U.

Berulang-ulang dengan argumen implisit

Fungsi rekursi ßmengambil semua UVWXYZsebagai parameter implisit, jika tidak ditentukan. Ujelas merupakan input utama, tetapi Anda dapat menggunakan salah satu VWXYZuntuk melacak nilai lain yang Anda butuhkan. Misalnya, Anda dapat melakukan sesuatu seperti berikut:

(modify input and implicit assign to U)
(modify V and implicit assign to V)
(test something and call ß without arguments; U and V are passed automatically)

Atau, jika semua yang Anda inginkan adalah variabel sementara, Anda bisa menggunakan penugasan sebaris, seperti (T=...), sebagai variabelT (0) jarang digunakan apa adanya.

Gunakan kembali fungsi yang panjang

Untuk ini, saya tidak berpikir saya bisa datang dengan tugas contoh yang baik, jadi saya akan referensi satu-satunya solusi tip ini digunakan , dan hanya menguraikan beberapa ide umum.

  • Untuk menggunakan kembali suatu fungsi, Anda perlu menyimpannya dalam variabel. Memulai garis dengan fungsi-pembuka {, @atau _melakukan pekerjaan. Atau, Anda juga dapat melakukan sesuatu seperti (T=@...})menanamkan penugasan fungsi di dalam garis yang lebih kompleks.
  • Sebenarnya tidak sepele untuk memanggil fungsi yang tersimpan. Misalkan Vadalah fungsi dan kami ingin memanggil V(U)dalam JS. VUtidak bekerja karena itu hanya berarti V,U. V(Ujuga tidak; nyaV,(U) . Bahkan metode fungsi tidak banyak membantu. Cara terbaik yang kami temukan adalah:
    • [U]xV (peta dan jumlah) jika hasilnya adalah angka
    • UmVjika Usatu char dan Vmengembalikan sebuah string, atau
    • $V($Uatau [U]mV gsecara umum.
  • Namun, pemetaan atau pengulangan dengan itu agak mudah. Untuk memetakan di atas larik, gunakan UmV. Untuk menemukan bilangan bulat pertama yang memuaskan V, gunakan Va.
Bubbler
sumber
2

Bersenang-senang dengan Fungsi Otomatis

Sebagai tindak lanjut dari tip umum ETH pada fungsi-otomatis , tip ini akan memberikan beberapa contoh spesifik dari trik penghematan byte yang dapat Anda capai dengan itu, yang akan saya tambahkan ketika saya memikirkan lebih lanjut.


Dapatkan bilangan bulat terbesar dalam sebuah array.

Asumsikan kita memiliki larik yang [3,1,4,2]ditetapkan ke variabel Udan kami ingin mengambil nomor terbesar darinya. Kita bisa melakukannya dalam 4 byte dengan mengurutkan array dan kemudian memunculkan elemen terakhir:

Un o

Kelemahannya adalah kami telah memodifikasi array asli; Usekarang [1,2,3]yang mungkin tidak selalu diinginkan. Untungnya, ada cara untuk melakukannya tanpa memodifikasi array yang juga satu byte lebih pendek:

Urw

Apa yang telah kami lakukan di sana adalah mengurangi array menggunakan wmetode, yang, ketika digunakan pada integer mengembalikan yang lebih besar dari integer dan argumen metode (misalnya, 2w5mengembalikan 5). Jadi di atas sama dengan UrÈwYatau UrXY{XwY}. Namun, perhatikan bahwa tip ini tidak akan berfungsi jika semua bilangan bulat dalam array negatif.

Shaggy
sumber
1
Catatan: Saya berencana untuk menambahkan fungsi untuk mendapatkan min dan maks array, meskipun mungkin hanya di v2.
ETHproduk
2

Kapan tidak digunakaní

í adalah built-in yang berguna untuk pasangan tersebut (atau zip dua array atau string, dan secara opsional memetakan setiap pasangan melalui suatu fungsi. Namun, saat ini ia memiliki beberapa masalah kecil ketika diberikan array atau string yang tidak merata:

  • Jika array pertama memiliki lebih banyak item daripada yang kedua, item yang tidak ada di array kedua akan diberikan sebagai undefined .
  • Jika array kedua memiliki lebih banyak item daripada yang pertama, array akan berhenti diproses pada akhir array pertama.

Ini bisa membuatnya sulit untuk, katakanlah, membandingkan dua string yang tidak rata dan mengambil char dengan titik kode yang lebih tinggi dari masing-masing pasangan. Bahkan jika Anda tahu bahwa Uitu akan menjadi lebih lama, masih butuh banyak byte untuk menyelesaikan tugas sederhana ini:

UíUç hV @[XY]n o

Apa yang bisa Anda lakukan adalah mengambil input sebagai array dari dua string, transpos array dengan y, dan kemudian memetakan setiap baris ke hasil yang benar:

Uy m_q n o

Ini memiliki keunggulan selalu melapisi string yang lebih pendek dengan spasi, membuatnya menjadi sepotong kue untuk melewati keseluruhan kedua string.

Contoh kehidupan nyata: 1 , 2

Produksi ETH
sumber
2

Hasilkan Kisaran ASCII

Pembaruan: Japt sekarang memiliki konstanta untuk rentang ASCII; nilai alternatif untuk E, dapat diakses dengan ;. Lihat tip ini untuk informasi lebih lanjut tentang konstanta Japt.

Meskipun Japt belum (belum) memiliki built-in untuk rentang ASCII, Anda dapat menghasilkan array karakter hanya dalam 5 byte:

95odH

Cobalah


Bagaimana itu bekerja

95omenciptakan rentang [0,95)dengan setiap elemen yang dilewatkan melalui fungsi-otomatis d yang, ketika digunakan pada angka, mengembalikan karakter pada titik kode itu. Berikan nomor sebagai argumen ke dmetode, dalam hal iniH , konstanta Japt untuk 32, dan itu akan ditambahkan ke nomor asli sebelum dikonversi.

Solusi yang setara dalam JavaScript adalah:

[...Array(95)].map((_,x)=>String.fromCharCode(x+32))

Karakter acak

Untuk mendapatkan karakter acak dalam rentang ASCII, gunakan ösebaliknya, yang mengembalikan nomor acak dari rentang [0,X), di mana Xnomor itu dijalankan.

95ö dH

Atau, untuk mendapatkan berbagai karakter acak, berikan jumlah karakter yang Anda butuhkan sebagai argumen ö. Berikut ini akan mengembalikan 10 karakter:

95öA mdH
Shaggy
sumber
1

Hapus karakter struktural yang tidak perlu

Dengan karakter struktural, maksud saya {}, (), $, bahkan "dan `. Anda biasanya dapat menghapus karakter ini setiap kali terjadi tepat di akhir program (misUmX{Xc +"; "} -> UmX{Xc +"; .).

Selain itu, Anda dapat menghapus paren atau spasi setiap kali muncul di tempat-tempat berikut:

  • Melawan titik koma ; (atau akhir program);
  • Di sebelah kanan {(dan dengan ekstensi, @) atau [, atau di sebelah kiri ]atau }.

Juga, koma sangat jarang dibutuhkan untuk memisahkan argumen. Jika Anda menulis AB, misalnya, Japt tahu maksud Anda Adan Bsecara terpisah. Anda hanya benar-benar memerlukan koma untuk memisahkan dua literal numerik, sepertiUs2,5 .

Akhirnya, jika ada Upada awal program atau setelah {atau ;, diikuti dengan metode panggilan (huruf kecil atau shortcut Unicode terkait) atau operator biner tidak termasuk +dan -( *, &, ==, dll), Anda dapat menghapus Uuntuk menyimpan byte dan Japt akan menyisipkannya untuk Anda.

Produksi ETH
sumber
Saya telah menemukan beberapa contoh lain di mana Udapat dihilangkan meskipun itu tidak di awal program.
Shaggy
@ Shaggy Oh benar, ini juga berfungsi setelah a {atau ;. Apakah ada orang lain yang Anda ketahui? (Sudah lama sejak saya mengkodekan fitur ini: P)
ETHproduksi
Tidak bisa memikirkan mereka dari atas kepala saya; Saya akan memeriksanya lagi ketika saya kembali ke komputer saya besok.
Shaggy
1

Ubah Elemen Terakhir dalam Array

Terkadang Anda mungkin perlu memodifikasi elemen terakhir dalam sebuah array, jadi inilah penjelasan tentang cara singkat untuk melakukannya. Kami akan bekerja dengan array yang [2,4,8,32]ditugaskan untuk memasukkan variabel Udan membagi integer terakhir ( 32) dengan 2.

Cara yang jelas untuk mencapai ini adalah dengan solusi 9 byte ini ( Demo ):

UhJUgJ /2
  • hnxsetel elemen pada indeks nmenjadi x.
  • gnmengembalikan elemen pada indeks n.
  • Jadalah konstanta Japt untuk -1, yang, berkat dukungan Japt untuk indeks negatif, memungkinkan kita untuk bekerja dengan elemen terakhir dalam sebuah array; berguna ketika Anda tidak tahu ukuran array.
  • Dan /2 hanya dibagi 2.

Jadi set atas elemen pada indeks -1dalam array ke elemen pada indeks -1dalam array dibagi 2. Atau dalam JavaScript: U[3]=U[3]/2. Ketika Anda menulisnya seperti itu, sepertinya cara yang terlalu panjang untuk melakukannya. Untungnya, ada adalah cara yang lebih pendek; kita bisa memunculkan elemen terakhir dari array, memodifikasinya dan mendorongnya kembali ke array. Melakukan masing-masing operasi tersebut secara individual akan membutuhkan lebih dari 9 byte, tetapi kita dapat melakukannya sekaligus hanya untuk 7 byte, penghematan 2 byte ( Demo )

UpUo /2

Diterjemahkan ke JS, itu setara dengan:

U.push(U.pop()/2)&&U
Shaggy
sumber