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.
Jawaban:
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, seperti
String.fromCharCode(x)
danMath.floor(x)
, dan kebosanan dalam melakukan hal-hal seperti membuat jangkauan. Inilah minimum yang perlu Anda ketahui saat beralih dari JavaScript ke Japt:U
,V
,W
,X
,Y
, danZ
; array lengkap disimpan diN
. Hasil dari ekspresi terakhir secara otomatis dicetak.a
-z
(danà
-ÿ
) pada angka, string, dan array. Ketika Anda menggunakan salah satu dari surat-surat ini, Japt mengisi.
dan(
;Uc
di Japt setara denganU.c(
JavaScript, yang bisa berarti ceil, charCodeAt, atau concat, tergantung pada jenisU
. Di sinilah sebagian besar kekuatan Japt berasal; Anda dapat menemukan daftar lengkap metode ini di bawah bagian "fungsi _____" dari dokumen Japt (di penerjemah ).)
, 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. (MeskipunUs w n
terlihat lebih baik daripadaUs)w)n)
, IMHO.)ABC{...}
, di manaABC
dapat 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 menggunakanreturn
atau suka tanda kurung ES6).'
menunjukkan string char tunggal (yaitu'a
sama dengan"a"
), dan#
mengambil kode char berikutnya dan menjadi nomor itu (#e
sama dengan101
).$
tetap sama selama proses transpilasi. Anda dapat menggunakan ini untuk mengimplementasikanfor
loop, misalnya, karena Japt tidak memilikinya, tetapi saya akan menyarankan menggunakan metode lain (sepertim
pada string dan array, atauo
pada angka).""
,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:
Sekarang untuk mengkonversi ke Japt.
.split("")
di JS setara denganq""
di Japt, atau bahkan lebih pendek, adilq
..join("")
juga hanyaq
, perbedaannya adalah bahwa objek tersebut adalah array bukan string..map(
adalahm
,.charCodeAt(
adalahc
, dan.toString(
sedangs
. Jadi kode Japt kami mungkin terlihat seperti:Di Japt,
m
berfungsi dengan baik pada string seperti halnya pada array, jadi kita bisa menghapus keduanyaq
:Uji secara online! Seperti yang dapat Anda lihat di kotak "kode JS", ini langsung mentranslil ke:
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:
sumber
Um_c s16
?¡Xc s16
?Mengompresi Array String
pengantar
Jika Anda memiliki larik string dalam kode Anda, cara paling jelas untuk mengompresnya adalah dengan menjalankan setiap string secara
Oc
terpisah. Untuk keperluan tip ini, kami akan bekerja dengan array["lollipop","marshmallow","nougat","oreo"]
, yang awalnya berbobot 42 byte. Menjalankan setiap stringOc
memberi kita: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:
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.
z
tidak digunakan dalam string apa pun, jadi mari kita masukkan, dan lihat bagaimana kita melanjutkan.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:Menjalankan string sampel kami melalui itu menunjukkan yang
b
memberikan hasil terbaik: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:
Menjalankan string sampel kami melalui itu menunjukkan bahwa
"nougat","oreo","lollipop","marshmallow"
denganb
sebagai pembatas memberikan hasil terbaik, dengan jumlah byte terakhir hanya 23: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:
Kita dapat menurunkannya menjadi 29 byte dengan terlebih dahulu mengubahnya menjadi array string 32 dan kemudian menjalankannya melalui program kompresi pertama:
Atau serendah 27 byte menggunakan program kedua:
Anda mungkin dapat menyimpan byte atau 2 lain di atasnya dengan memindahkan konversi integer ke metode yang sudah Anda jalankan pada array.
Catatan
q<letter>(<space>)
biaya lebih·
. Meskipun, Anda mungkin dapat menggunakan salah satu cara pintas Unicode untuk mendapatkan byte kembali, tergantung pada pembatas Anda (qÊ
sama denganql<space>
, misalnya).Kredit
sumber
Mengompresi string
Japt (saat ini) menggunakan pustaka shoco untuk kompresi string. Anda bisa mengompres string arbitrer menggunakan
Oc
, asalkan itu mengandung huruf kecil:Output ini
HÁM, WŽld!
(well,Ž
secara teknis karakter yang tidak patut dicetak). Anda dapat mendekompres ini dengan membungkusnya dalam backticks:Uji secara online!
Atau, Anda dapat menggunakan
Od
fungsi ini untuk mendekompresi string yang berubah-ubah. Ini biasanya tidak berguna, tetapi memiliki tujuan ...sumber
HÁM, WŽld!
atau perlu tertutup dalam backticks? Saya menduga yang terakhir.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, atau123d
Japt untuk menemukan karakter yang sesuai.String.fromCharCode(123)
kembali{
sumber
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 integer123
dalam suatu solusi, saya dapat menggunakan#{
untuk menyimpan byte.-Q
bendera ke jendela input Anda, Anda dapat lebih baik melihat jenis output: tanda kutip di sekitar string , array , dll.String.fromCharCode(123)
berfungsi dalam JavaScript, tetapi Anda bisa melakukannya123d
di Japt untuk mendapatkan hasil yang sama ;-) Juga, ini hanya berfungsi pada tiga digit proses dalam rentang100
-255
(kecuali jika Anda mau beralih ke UTF-8)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 tidakA
akan10
. Jadi menggunakan;A
sebenarnya 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
N
variabel, 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
;A
bahkan ketika program Anda mengambil input berkat pintas untuks1
dans2
.sumber
N
, ide bagus.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.
sumber
Ox
mengevaluasi string. Jika tidak, Anda hanya akan menampilkan teks"screen.width"
. ContohKetahui 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
. JikaU
angka, 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
: Mengembalikantrue
jika beberapa hasil benar,false
jika tidak.-e
: Mengembalikantrue
jika semua hasil benar,false
jika tidak.-f
: Mengembalikan berbagai elemenU
yang hasilnya benar.-æ
: Menerapkan-f
dan mengembalikan elemen pertama.gh
Mengambil elemen pada indeks yang ditentukan.
-g
: Mengambil elemen pertama (indeks 0).-gX
: Mengambil elemen pada indeksX
(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
: TerapkanJSON.stringify
(bisa berupa objek apa pun, bukan hanya array). Contoh .x
Menerapkan fungsi
x
ke output. (Secara harfiahx
, bukan "fungsi alfabet huruf kecil apa pun".)sumber
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,
@
singkatanXYZ{
, dan_
singkatanZ{Z
, untuk membantu membangun fungsi. Jadi mari kita lihat contoh program kami dari jawaban lain :Pertama, kita bisa mengganti
X{X
dengan_
, yang memberi kita:Kemudian kita bisa mengganti
m_
dengan®
menyimpan byte lain:Atau kita bisa menggantinya
X{
dengan@
, yang memberi kita:Ini kemudian memungkinkan kita untuk menggunakan
¡
pintasan untuk menyimpan dua byte:Salah satu dari dua jalur ini dapat dipersingkat 1 byte lebih dari yang lain. Bisakah Anda mencari tahu yang mana?
sumber
®c s16
untuk 6 byte - apakah saya memenangkan cookie?®c sG
?csG
.Manfaatkan variabel preset
Variabel
A
-S
adalah preset untuk nilai-nilai umum yang membutuhkan lebih dari satu byte untuk diwakili dalam Japt:A
-G
adalah10
-16
.H
is32
,I
is64
,J
is-1
,L
is100
.K
didefinisikan sebagainew Date()
, yang dapat Anda manipulasi dengan berbagai cara.M
danO
benda dengan berbagai fungsi yang bermanfaat. Anda dapat mempelajari lebih lanjut di dokumen.P
adalah string kosong,Q
adalah tanda kutip,R
adalah baris baru, danS
merupakan spasi.T
diatur ke0
, sehingga Anda dapat menggunakannya sebagai akumulator jika perlu.Jika karakter pertama dalam program ini adalah titik koma
;
, aturA-L
ulang sebagai berikut:A
adalah array kosong[]
.B
adalah"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
.C
adalah"abcdefghijklmnopqrstuvwxyz"
.D
adalah"QWERTYUIOP\nASDFGHJKL\nZXCVBNM"
.E
adalah"[a-z]"
, danF
ini"[A-Za-z]"
(berguna sebelum saya menambahkan ini sebagai fitur regex)G
is36
,H
is65
, andI
is91
(berguna untuk rentang alfabet).J
adalah koma tunggal;L
, satu periode.Saat ini hanya
A
,B
,C
, danD
dari 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.sumber
Gunakan fungsi otomatis
Anda kemungkinan besar sudah mengetahui itu
@
dan_
merupakan pintasan untukXYZ{
danZ{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:
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: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:
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
!
.sumber
m@2pXÃ
→m!p2<space>
→m!²
.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 adalahU
, baris keduaV
, 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:
Namun, menggunakan penugasan variabel otomatis yang dapat disingkat menjadi:
Kami telah menyimpan 4 byte di sana. Tetapi, dalam contoh ini, kita dapat menyimpan satu byte lagi karena array 1-10 ditugaskan
U
danU
dapat dihilangkan dalam skenario tertentu :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-alihU
&V
:sumber
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
U
dan kemudian mengevaluasiV.m
. (Memiliki baris baru mengaktifkan penugasan implisit keU
pada baris pertama.)0
lebih'0
).Fungsi bawaan JS yang relevan
Lihat dengan cermat parameter apa yang diteruskan ke argumen fungsi.
Array.prototype.map
Array.a/b/m/x/y/í
,Number.o/õ
,String.m/y/í
Array.prototype.reduce
Array.r/å
,String.å
; karenaå
, argumen ke-4 tidak lulus.Array.prototype.some
Array.d
Array.prototype.every
Array.e
Untuk metode string, ada baiknya mengetahui bagaimana perilaku berbeda antara melewati string atau regex dengan atau tanpa
g
flag.String.prototype.match
String.f/o
String.prototype.search
String.â
String.prototype.replace
String.e/k/r
e/r
, melewatkan fungsi sebagai argumen ke-2 adalah OK, dan memahami parameter fungsi sangat dianjurkan.sumber
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ñx
ke baris berikutnya, sehingga kode terlihat seperti ini:dan JS yang diubah menjadi:
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 semuaUVWXYZ
sebagai parameter implisit, jika tidak ditentukan.U
jelas merupakan input utama, tetapi Anda dapat menggunakan salah satuVWXYZ
untuk melacak nilai lain yang Anda butuhkan. Misalnya, Anda dapat melakukan sesuatu seperti berikut: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.
{
,@
atau_
melakukan pekerjaan. Atau, Anda juga dapat melakukan sesuatu seperti(T=@...})
menanamkan penugasan fungsi di dalam garis yang lebih kompleks.V
adalah fungsi dan kami ingin memanggilV(U)
dalam JS.VU
tidak bekerja karena itu hanya berartiV,U
.V(U
juga tidak; nyaV,(U)
. Bahkan metode fungsi tidak banyak membantu. Cara terbaik yang kami temukan adalah:[U]xV
(peta dan jumlah) jika hasilnya adalah angkaUmV
jikaU
satu char danV
mengembalikan sebuah string, atau$V($U
atau[U]mV g
secara umum.UmV
. Untuk menemukan bilangan bulat pertama yang memuaskanV
, gunakanVa
.sumber
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 variabelU
dan kami ingin mengambil nomor terbesar darinya. Kita bisa melakukannya dalam 4 byte dengan mengurutkan array dan kemudian memunculkan elemen terakhir:Kelemahannya adalah kami telah memodifikasi array asli;
U
sekarang[1,2,3]
yang mungkin tidak selalu diinginkan. Untungnya, ada cara untuk melakukannya tanpa memodifikasi array yang juga satu byte lebih pendek:Apa yang telah kami lakukan di sana adalah mengurangi array menggunakan
w
metode, yang, ketika digunakan pada integer mengembalikan yang lebih besar dari integer dan argumen metode (misalnya,2w5
mengembalikan5
). Jadi di atas sama denganUrÈwY
atauUrXY{XwY}
. Namun, perhatikan bahwa tip ini tidak akan berfungsi jika semua bilangan bulat dalam array negatif.sumber
Kapan tidak digunakan
í
í
adalah built-in yang berguna untuk pasangan tersebut (atauzip
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:undefined
.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
U
itu akan menjadi lebih lama, masih butuh banyak byte untuk menyelesaikan tugas sederhana ini: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: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
sumber
Hasilkan Kisaran ASCII
Meskipun Japt belum (belum) memiliki built-in untuk rentang ASCII, Anda dapat menghasilkan array karakter hanya dalam 5 byte:
Cobalah
Bagaimana itu bekerja
95o
menciptakan rentang[0,95)
dengan setiap elemen yang dilewatkan melalui fungsi-otomatisd
yang, ketika digunakan pada angka, mengembalikan karakter pada titik kode itu. Berikan nomor sebagai argumen ked
metode, dalam hal iniH
, konstanta Japt untuk 32, dan itu akan ditambahkan ke nomor asli sebelum dikonversi.Solusi yang setara dalam JavaScript adalah:
Karakter acak
Untuk mendapatkan karakter acak dalam rentang ASCII, gunakan
ö
sebaliknya, yang mengembalikan nomor acak dari rentang[0,X)
, di manaX
nomor itu dijalankan.Atau, untuk mendapatkan berbagai karakter acak, berikan jumlah karakter yang Anda butuhkan sebagai argumen
ö
. Berikut ini akan mengembalikan 10 karakter:sumber
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:
;
(atau akhir program);{
(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 AndaA
danB
secara terpisah. Anda hanya benar-benar memerlukan koma untuk memisahkan dua literal numerik, sepertiUs2,5
.Akhirnya, jika ada
U
pada awal program atau setelah{
atau;
, diikuti dengan metode panggilan (huruf kecil atau shortcut Unicode terkait) atau operator biner tidak termasuk+
dan-
(*
,&
,==
, dll), Anda dapat menghapusU
untuk menyimpan byte dan Japt akan menyisipkannya untuk Anda.sumber
U
dapat dihilangkan meskipun itu tidak di awal program.{
atau;
. Apakah ada orang lain yang Anda ketahui? (Sudah lama sejak saya mengkodekan fitur ini: P)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 variabelU
dan membagi integer terakhir (32
) dengan 2.Cara yang jelas untuk mencapai ini adalah dengan solusi 9 byte ini ( Demo ):
hnx
setel elemen pada indeksn
menjadix
.gn
mengembalikan elemen pada indeksn
.J
adalah 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./2
hanya dibagi 2.Jadi set atas elemen pada indeks
-1
dalam array ke elemen pada indeks-1
dalam 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 )Diterjemahkan ke JS, itu setara dengan:
sumber