MATL adalah bahasa golf yang diciptakan oleh Luis Mendo . MATL telah terbukti sangat kompetitif, seringkali mengalahkan kiriman dalam bahasa golf lainnya seperti Pyth, CJam dan Jelly.
Apa saja tips berguna untuk bermain golf di MATL? (Seperti biasa, satu tip per jawaban, kumohon!)
- Sebagai catatan, MATL dapat diuji online di sini .
- Dokumentasi dapat ditemukan di Github
accumarray
(XQ
) bisa sangat kuat (mungkin bahkan lebih daripada di MATLAB / Oktaf karena pegangan fungsi panjang memiliki kode numerik yang berguna), tapi saya tidak cukup tahu untuk menggambarkan dengan contoh yang baik. Jika itu benar-benar berguna, dapatkah seseorang membuat jawaban dengan ide-ide tentang bagaimana menggunakannya?Jawaban:
Ketahui literal yang telah ditetapkan
Meskipun beberapa dari mereka menyimpan informasi saat disalin ke clipboard, mereka semua memiliki nilai yang telah ditentukan.
F
, mendorong 0 (sebenarnya Salah )T
, mendorong 1 (sebenarnya Benar )H
, mendorong 2 (nilai clipboard yang telah ditentukan)I
, mendorong 3 (nilai clipboard yang telah ditentukan)K
, mendorong 4 (nilai clipboard yang telah ditentukan)J
, mendorong 0 + 1j (nilai clipboard yang telah ditentukan)Tidak yakin apakah saya telah membahas semua nilai yang telah ditentukan sebelumnya.
sumber
L
juga memiliki nilai yang telah ditentukan, tetapi mereka dimaksudkan untuk penggunaan khusus (bukan umum, nilai-nilai umum). Misalnya,1L
memberi[1 0]
(yang digunakan sebagai indeks1:end
),2L
memberi[0 -1 1]
(untuk1:-1:end
). Juga, berfungsil
danO
mengambil 0 input secara default dan menghasilkan0
dan1
masing4
?1
, maka4
,14
tidak akan berhasil. Kamu akan membutuhkan1 4
. Atau1K
untuk menyimpan satu byteK
alih-alih4
berguna adalah:1-4
berarti: mendorong1
, lalu mendorong-4
; sedangkan1-K
artinya: dorong1
, kurangi dari apa pun yang ada di bawah dalam tumpukan, lalu dorong4
The
&
Meta-Function (Alternatif Input / Spesifikasi Output)Cara tradisional untuk menentukan jumlah argumen input untuk diteruskan ke suatu fungsi adalah dengan menggunakan
$
fungsi-metaDemikian pula, untuk menentukan jumlah argumen output, Anda dapat menggunakan
#
fungsi-meta yang menentukan jumlah argumen output,atau jika Anda melewati nomor yang lebih besar dari jumlah argumen keluaran ditetapkan untuk fungsi, hanya satu
mod(N, numberOfOutputs) + 1
output disediakan.Anda juga dapat menentukan array logis sebagai input untuk
#
hanya mengambil argumen output tertentu.Semua spesifikasi input / output ini berguna tetapi mereka menaikkan byte-count Anda dengan sangat cepat. Untuk mengatasinya, MATL memperkenalkan
&
fungsi-meta di rilis 17.0.0 .&
Fungsi-meta ini bertindak sebagai pintasan untuk spesifikasi input atau output tertentu untuk suatu fungsi. Mari kita lihat apa artinya itu.Dalam contoh kami di atas, kami ingin menggunakan versi dua-input dari
:
(membuat vektor dengan nilai spasi sama). Sementara jumlah default argumen input:
adalah1
(membuat array dari[1...N]
), sangat umum bahwa pengguna ingin menentukan nilai awal rentang yang membutuhkan input kedua. Jadi untuk:
, kami telah menetapkan&
sebagai jalan pintas untuk2$
.Sekarang menjadi yang berikut, menghemat satu byte !
Bagaimana kita bisa menentukan berapa jumlah alternatif argumen?
Spesifikasi input / output yang
&
diterjemahkan adalah fungsi spesifik sehingga kami mengoptimalkan penghematan byte.Bagian argumen input / output dari deskripsi bantuan untuk setiap fungsi telah diperbarui untuk menunjukkan apa jumlah input / output alternatif ini (jika ada). Jumlah argumen input atau output yang mungkin ditampilkan sebagai rentang dan nilai default untuk masing-masing ditampilkan dalam tanda kurung. Input / output spec yang dapat diganti dengan
&
ditampilkan setelah/
karakter dalam tanda kurung.Berikut adalah bagian argumen input / output dari deskripsi bantuan untuk
:
Bagaimana Anda menentukan apa
&
artinya untuk setiap fungsi?Dengan sangat hati-hati. Dengan menggunakan StackExchange API , kami dapat mengunduh semua jawaban MATL yang pernah digunakan dalam tantangan PPCG. Dengan menguraikan masing-masing jawaban, kami kemudian dapat menentukan frekuensi penggunaan setiap spesifikasi input / output untuk setiap fungsi. Dengan menggunakan informasi ini, kami kemudian dapat mengidentifikasi secara objektif spesifikasi input / output yang
&
harus mewakili fungsi-meta untuk setiap fungsi. Terkadang tidak ada pemenang yang jelas, begitu banyak fungsi saat ini tidak&
didefinisikan.Berikut ini skrip yang kami gunakan (sayangnya ditulis dalam MATLAB dan bukan MATL).
Dan di sini adalah contoh dari histogram dari
$
/#
penggunaansumber
&
akan berarti "menambah jumlah input dengan 1 sehubungan dengan default". Sarannya ternyata jauh lebih bergunaBiasakan diri dengan definisi kebenaran / kepalsuan MATL
Sementara
true
(T
) danfalse
(F
) masing-masing secara jelas mewakili keluaran yang benar dan salah, definisi yang disepakati secara luas tentang kebenaran / kepalsuan memberi kita sedikit lebih banyak fleksibilitas dalam MATL.Definisi tersebut menyatakan:
Jadi kita dapat menulis tes MATL truthy / falsy cepat yang akan mengulang semua input dan menampilkan apakah mereka dianggap benar atau salah
Ini adalah versi online.
Apa artinya ini di MATL
Apa ini sebenarnya diterjemahkan ke dalam MATL (dan karena itu dalam MATLAB dan Oktaf) adalah bahwa suatu kondisi dianggap benar jika jika tidak kosong dan komponen nyata dari semua nilainya tidak nol . Ada dua bagian untuk ini yang harus ditekankan.
Non-nol : Ini berarti persis seperti itu, tidak sama dengan nol (
==
). Ini termasuk angka positif, angka negatif, karakter non-null, dll. Anda dapat dengan mudah memeriksa dengan mengonversi nilai yang diberikan kelogical
nilai (g
) atau Anda dapat menggunakan~~
Semua nilai : Biasanya kita menganggap skalar sebagai benar atau salah, tetapi dalam MATL, kita dapat mengevaluasi skalar, vektor baris, vektor kolom, atau bahkan matriks multi-dimensi dan mereka dianggap benar jika dan hanya jika setiap nilai tunggal adalah bukan nol (seperti didefinisikan di atas), kalau tidak mereka palsu. Berikut adalah beberapa contoh untuk ditunjukkan
Kasing satu tepi, seperti yang disebutkan di atas, adalah array kosong
[]
, yang selalu dianggap palsu ( contoh )Bagaimana saya bisa menggunakan ini untuk bermain golf yang lebih baik?
Jika tantangan hanya menyebutkan bahwa output Anda harus benar atau salah, Anda mungkin dapat mengeksploitasi definisi di atas untuk memotong beberapa byte dari jawaban Anda. Untuk menyimpan kebingungan, Anda disarankan untuk menyertakan tautan ke tes kebenaran / kepalsuan online di atas dalam jawaban Anda untuk membantu menjelaskan bagaimana nilai kebenaran / kepalsuan MATL bekerja.
Beberapa contoh spesifik:
Sebuah jawaban yang berakhir dengan
A
. Jika tantangan membutuhkan truthy atau output falsy dan Anda berakhir jawaban Anda diall
(A
) untuk membuat skalar, Anda dapat menghapus byte terakhir ini dan jawaban Anda akan tetap benar (kecuali output adalah[]
karena[]
adalahfalse
tetapi[]A
adalahtrue
).Memastikan bahwa array hanya berisi satu nilai unik : Menggunakan
&=
menggantikanun1=
. Jika semua nilai dalam array sama, perbandingan kesetaraan elemen-bijaksana yang disiarkan akan menghasilkanN x N
matriks semua nilai. Jika semua nilai tidak sama, matriks ini akan berisi beberapa0
nilai dan karenanya dianggap palsu.sumber
Masukan Tersirat
Sebagian besar fungsi menerima sejumlah input. Input ini diambil dari bagian atas tumpukan. Jika bagian atas tumpukan tidak mengandung cukup argumen, itu akan menarik argumen yang tersisa dari input. (Lihat Bagian 7.3 dalam dokumentasi) Saya ingin mengutip penjelasan asli:
sumber
Array logis sering dapat digunakan sebagai array numerik
Anda sering dapat menggunakan
TF
notasi " " alih-alih array literal dari nol dan satu. Misalnya,FTF
sama dengan[0,1,0]
, hanya yangFTF
menghasilkanlogical
nilai, bukandouble
nilai. Ini biasanya bukan masalah, karena operasi aritmatika akan memperlakukan nilai logis sebagai angka. Misalnya,FTFQ
memberi[1,2,1]
(Q
adalah "meningkat sebesar 1").Dalam beberapa kasus, konversi angka menjadi biner mungkin lebih pendek. Sebagai contoh,
[1,0,1]
,TFT
dan5B
adalah sama; lagi dengan hati-hati bahwa dua yang terakhir adalahlogical
nilai.Suatu kasus di mana perbedaan antara
TF
(logis) dan[1 0]
(numerik) penting adalah ketika digunakan sebagai indeks. Array tipe yanglogical
digunakan sebagai indeks berarti: pilih elemen yang sesuaiT
, buang elemen yang terkait dengannyaF
. Jadi[10 20]TF)
menghasilkan10
(pilih elemen pertama), sedangkan[10 20][1 0])
menghasilkan[10 20]
(indeks[1 0]
memiliki interpretasi1:end
, yaitu, pilih semua elemen array).sumber
Untuk lilitan ukuran n-1
Pertimbangkan untuk mengganti
dengan
untuk menyimpan hingga satu byte atau lebih .
sumber
@
/X@
dalam loop atau tidak. Mungkin Anda bisa mengatakan "untuk menyimpan byte"Pindahkan hal-hal dari setelah loop ke dalam loop, untuk mengeksploitasi ujung implisit
end
Pernyataan loop]
,, dapat ditinggalkan jika tidak ada kode setelahnya. Mereka diisi oleh parser MATL secara implisit.Jadi, jika Anda bisa memindahkan sesuatu dari setelah loop ke dalam loop Anda bisa menyimpan final
]
.Sebagai contoh khusus, kode berikut ini menemukan berapa banyak nol yang ada di dalam faktorial suatu angka
N
(lihat di sini ):1
keN
.5
hadir.5
muncul (ini berhasil karena masing-masing5
setidaknya ada satu2
).Ide pertama adalah
:"@Yf5=]vs
(perhatikan bahwa ada pernyataan setelah loop):Karena
v
secara default menggabungkan semua konten stack, itu dapat dipindahkan ke loop. Dan karena penambahan itu asosiatif,s
bisa dipindahkan juga. Yang tersisa]
di akhir kode, dan karenanya dapat dihilangkan:"@Yf5=vs
::sumber
Cara yang lebih pendek untuk mendefinisikan array numerik kosong, jika tumpukan kosong
Untuk mendorong array numerik kosong yang biasa Anda gunakan
[]
. Namun, jika stack kosong, Anda dapat menyimpan byte menggunakanv
. Fungsi ini secara default menggabungkan semua konten stack secara vertikal, jadi jika stack kosong, itu menghasilkan array kosong.Anda dapat melihatnya beraksi misalnya di sini .
sumber
Beberapa fungsi diperluas dibandingkan dengan MATLAB atau Oktaf
Jika Anda berasal dari MATLAB atau Oktaf, Anda akan menemukan banyak fungsi MATL mirip dengan fungsi dalam bahasa tersebut. Tetapi dalam beberapa dari mereka fungsionalitas telah diperluas.
Sebagai contoh, pertimbangkan
reshape
fungsi MATLAB , yang sesuai dengan MATLe
. Cuplikan kodereshape([10 20 30 40 50 60], 2, 3)
danreshape([10 20 30 40 50 60], 2, [])
masing-masing berarti "membentuk kembali vektor baris[10 20 30 40 50 60
menjadi matriks 2 × 3", atau "menjadi matriks 2 baris dengan kolom sebanyak yang diperlukan". Jadi hasilnya, dalam kedua kasus, adalah array 2DSesuatu seperti
reshape([10 20 30 40 50 60], 2, 2)
ataureshape([10 20 30 40 50 60], 5, [])
akan memberikan kesalahan karena ukuran yang tidak kompatibel. Namun, MATL akan menghapus elemen dalam kasus pertama ( coba online! ) Atau isi dengan nol di kedua ( coba online! ) Untuk menghasilkan, masing-masing,dan
Fungsi lain yang memiliki fungsionalitas diperluas dibandingkan dengan rekan-rekan MATLAB mereka adalah (daftar non-lengkap)
S
(sort
),Yb
(strsplit
),m
(ismember
),h
(horzcat
),v
(vertcat
),Zd
(gcd
),Zm
(lcm
),YS
(circshift
),YA
(dec2base
),ZA
(base2dec
),Z"
( ), (blanks
).sumber
Dapatkan indeks elemen non-nol pertama, jika ada
The
f
Fungsi memberikan indeks dari semua non zero-elemen array. Seringkali Anda menginginkan indeks dari elemen bukan nol pertama . Itu akan menjadif1)
: menerapkanf
dan memilih elemen pertama. Tetapi jika array asli tidak mengandung nilai bukan nolf
akan menghasilkan array kosong ([]
), dan mencoba untuk memilih elemen pertamanya akan memberikan kesalahan.Persyaratan umum yang lebih kuat adalah mendapatkan indeks elemen pertama jika setidaknya ada satu , dan
[]
sebaliknya. Ini bisa dilakukan denganif
cabang setelahf
, tapi itu mahal byte. Cara yang lebih baik adalahfX<
, yaitu, menerapkan fungsi minimumX<
ke outputf
.X<
mengembalikan array kosong ketika inputnya adalah array kosong.Cobalah online! (Perhatikan bahwa array kosong tidak ditampilkan sama sekali). Atau lihat contoh ini bekerja di sini .
sumber
Hasilkan rentang selama array yang diberikan
TL; WR : gunakan
f
sebagai gantin:
jika array hanya memiliki elemen bukan nol.Hal ini sering terjadi bahwa salah satu kebutuhan untuk menghasilkan sebuah array
[1 2 ... L]
di manaL
adalah jumlah elemen dari array yang diberikan. Cara standar untuk melakukannya adalahn:
. Misalnya kodenyatn:*
mengambil vektor numerik sebagai input dan menghitung setiap entri dikalikan dengan indeksnya.Jika array yang diberikan dijamin hanya berisi entri bukan nol (misalnya, itu dibentuk oleh bilangan bulat positif, atau string dengan karakter yang dapat dicetak),
n:
dapat diganti denganf
, yang menghasilkan array dengan indeks entri bukan nol. Jadi kode di atas menjaditf*
, yang menghemat 1 byte.Beberapa contoh yang lebih rumit: 1 , 2 , 3 .
sumber
Mendefinisikan literal array numerik secara efisien
Berikut adalah beberapa cara yang dapat digunakan untuk menyimpan byte saat mendefinisikan literal array numerik. Tautan diberikan sebagai contoh jawaban yang menggunakannya. Ini telah diperoleh dengan menggunakan skrip analitik yang dibuat oleh @Suever .
Rangkaian dan literasi yang telah ditentukan sebelumnya
Untuk array dengan angka kecil Anda kadang-kadang dapat menggunakan gabungan (fungsi
h
danv
), serta liter yang telah ditentukan untuk menghindari menggunakan spasi sebagai pemisah: bandingkan[2 4]
,2 4h
dan2Kh
, yang semuanya mendefinisikan array[2 4]
. Demikian pula,2K1v
dengan mendefinisikan tumpukan kosong[2; 4; 1]
. Contoh .Huruf dalam literal array numerik
Untuk angka yang sedikit lebih besar, Anda dapat menghemat ruang dengan mengeksploitasi fakta bahwa beberapa huruf memiliki makna angka dalam literal array. Jadi alih-alih
[3 5 2 7;-4 10 12 5]
Anda bisa menggunakan[IAHC;dX12A]
. Contoh .Secara khusus, dalam literal array,
O
,l
,H
I
K
Memiliki makna yang biasa mereka0
, ...,4
A
, ...,E
berarti5
, ...,9
X
cara10
a
, ...d
berarti-1
, ...,-4
J
danG
berarti1j
dan-1j
P
carapi
Y
carainf
N
berartiNaN
.Perbedaan string dan berturut-turut
Untuk angka yang lebih besar, mendefinisikan string dan menghitung perbedaan berurutannya (dengan
d
) dapat membantu: alih-alih[20 10 35 -6]
Anda dapat menggunakannya'!5?b\'d
. Ini berfungsi karenad
menggunakan titik kode karakter untuk menghitung perbedaan. Contoh .sumber