Apa tips umum yang Anda miliki untuk bermain golf di Octave? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk Oktaf (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.
18
Jawaban:
a
bebas dari nilai nol, menggunakannnz(a)
suku cadang sebanyak 2 karakter dibandingkannumel(a)
.a(a==0)
untuka(find(a==0))
.~t
lebih pendek darit==0
, dan bahkan~~t
lebih pendek darit!=0
.0*(1:n)
lebih pendek darizeros(1,n)
||
dan&&
, tidak seperti banyak operator lain, skalarisasi hasilnya ketika argumen pertama adalah skalar. Untuk matriks, hanya matriks non-kosong tanpa elemen sama dengan nol yang memiliki nilai logis true .Oleh karena itu, kita dapat melakukan
0||m
alih - alihall(all(m))
matriks apa pun.Coba dengan
0||[1 1;1 0]
dan0||[1 1;1 1]
untuk meyakinkan diri Anda sendiri.Ketika Anda menggunakan builtin beberapa kali, lakukan pegangan fungsi untuk mengampuni karakter misalnya.
f=@find
. Untuk nama fungsi pendek setidaknya 3 kejadian membenarkan ini, untuk yang lama - bahkan dengan dua kejadian.Ketika suatu fungsi adalah pernyataan tunggal, lebih suka
f=@(n)dosomething(n)
notasi daripadafunction r=f(n)r=dosomething(n);end
satu.Sayangnya, variabel global harus dideklarasikan baik dalam lingkup global dan dalam setiap fungsi yang menggunakannya. Tetapi ada pengecualian:
@(n)...
fungsi anonim "melihat" semua variabel dari lingkup tempat mereka dipanggil.Itu mungkin dilakukan
f(a=0,b=0)
sebagai gantinyaa=0;b=0;f(a,b)
.Ini tampaknya fitur yang tidak terdokumentasi, tetapi urutan evaluasi dari kiri ke kanan (dicentang pada v. 3.8.1), Anda dapat melakukannya
zeros(a=n,b=a*a)
untuk membuat matriks anxn ^ 2 dan menyimpan nomor baris dan kolom di dalama
danb
variabel.Tabel diutamakan operator adalah teman Anda. Jangan lakukan
b=(a==0)
karenab=a==0
itu sama.sumber
Saya tidak ingat dalam tantangan apa yang saya lihat seseorang menggunakan (tolong beri tahu kami =), tapi saya menemukan ini trik yang rapi:
Biasanya jika Anda menambahkan matriks Anda harus memiliki ukuran yang sama, tetapi untuk matriks satu dimensi (1xn dan nx1) ada jalan pintas (yang tidak berfungsi di Matlab):
menghasilkan efek yang sama dengan
Kemudian sesuatu yang pawel.boczarski sudah sebutkan: Di Oktaf Anda dapat (sementara Anda tidak bisa di Matlab) mendefinisikan variabel bantu dalam fungsi menangani, DAN tugas variabel itu sendiri memiliki nilai tugas sehingga Anda dapat benar-benar mempersingkat kode (baik ini adalah tidak berguna) contoh tetapi Anda akan mendapatkan triknya):
Kemudian trik lain (juga berlaku di Matlab) adalah menyalahgunakan string untuk menyimpan nomor (hardcoded) (trik rapi ini dicuri dari feersum) , Anda hanya perlu sesuatu yang mengartikan string sebagai angka, yang semudah misalnya menambahkan nol:
Atau
sumber
a+0
, bukana+'0'
. Selain itu, tip-tipnya bagus =)+= -= /=
operator dll dalam daftar Anda di bawah ini?+a
lebih pendek daria+0
Menggunakan daftar argumen:
Oktaf mampu mendapatkan argumen default sehingga ekspresi dapat dievaluasi dalam daftar argumen.
Fitur ini berguna ketika kami ingin menghitung ekspresi dan menggunakannya beberapa kali:
Satu kasus penggunaan adalah ketika kami menggunakan tugas yang diindeks untuk memodifikasi bagian dari array dan kami ingin menggunakan array:
Tetapi ekspresi
(a(2)=5)
kembalia(2)
, atau ekspresi(a([1 3])=4)
mengembalikan array dua elemen. Tidak mengembalikan seluruh array. Kita dapat menggunakan daftar argumen:Di sini hasil dari tugas yang diindeks disimpan ke dalam variabel dummy
b
dan fungsi mengembalikan array.sumber
-Dalam Oktaf dimungkinkan untuk menerapkan pengindeksan pada ekspresi sementara, fitur yang dilarang dalam MATLAB dan fitur ini sangat berguna untuk bermain golf. contoh:
Oktaf:
[1 23 4 5 7](3:4)
dan yang setara dengan MATLAB:a=[1 23 4 5 7];a(3:4)
Oktaf:
hilb(4)(4:5,4:5)
dan yang setara dengan MATLAB:h=hilb(4);h(4:5,4:5)
Oktaf:
{1,4,{4 5 6},[7 ;3]}{3}
dan yang setara dengan MATLAB:a={1,4,{4 5 6},[7 ;3]};a{3}
Oktaf:
num2cell([1 2 3 4]){:}
untuk pembuatan daftar yang dipisahkan komaOktaf:
a'(:)'
-Kadang-kadang dalam fungsi anonim sebagai fungsi normal kita perlu mengevaluasi beberapa ekspresi, yang termasuk penugasan, Satu pendekatan adalah bahwa kita dapat menempatkan setiap ekspresi dalam sel (karena sel dapat berisi objek dari berbagai jenis) dan ketika kita membutuhkan nilainya dari setiap ekspresi kita dapat menggunakan pengindeksan untuk mengekstrak elemen itu.
{1,4,{4 5 6},[7 ;3]}{3}
atau
{a=1,b=4,c={4 5 6},[b ;3]}{4}
sumber
Lewati titik koma!
Saya akan menggunakan jawaban ini untuk menggambarkan maksudnya.
Kode aslinya adalah:
Setelah menghapus titik koma, itu bisa dikurangi menjadi yang berikut, menghemat tiga byte:
Ini dapat digunakan di beberapa tempat, dan hal-hal yang bahkan tidak Anda coba karena sepertinya kesalahan sintaks sering berhasil.
sumber
Ini sederhana, tetapi bermanfaat.
Di Oktaf, tetapi bukan MATLAB, Anda bisa melakukannya seperti di C ++:
sumber
Satu lagi yang sederhana, tetapi bermanfaat (tidak mungkin di MATLAB):
Tetapkan nilai yang sama untuk beberapa variabel:
sumber
Gunakan
eval
!Terinspirasi oleh jawaban Luis Mendo di sini .
Dalam banyak kasus, fungsi anonim lebih pendek daripada membuat skrip yang membutuhkan satu atau lebih panggilan
input('')
. Kelemahannya adalah loop dan modifikasi variabel (seperti menukar dua elemen dalam sebuah matriks) tidakmungkinrumit.Dengan
eval
, Anda dapat mengambil input seperti yang Anda lakukan dengan fungsi anonim normal, dan menjalankan skrip seperti yang Anda lakukan dengan skrip normal:Pertimbangkan ini :
Dibandingkan dengan ini:
Kode identik, tetapi bagian input jauh lebih pendek.
Ini juga dapat digunakan untuk memodifikasi variabel input, seperti ini (kredit untuk Luis Mendo untuk ini!):
sumber
Gunakan
rows(a)
sebagai gantisize(a,1)
sumber
Terkait, tetapi bukan kiat yang identik untuk MATLAB .
Fitur Octave yang sedikit diketahui dan sedikit digunakan adalah bahwa sebagian besar fungsi builtin dapat dipanggil tanpa tanda kurung, dalam hal ini mereka akan memperlakukan apa pun yang mengikutinya sebagai string (asalkan tidak mengandung spasi). Jika berisi spasi, Anda perlu tanda kutip. Ini sering dapat digunakan untuk menyimpan satu atau dua byte saat menggunakan
disp
. Semua pekerjaan berikut, dan memberikan hasil yang sama:Jika Anda memiliki spasi, maka Anda harus memiliki tanda kutip:
Contoh lain yang kurang bermanfaat termasuk:
sumber