Kiat untuk bermain golf di Oktaf

18

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.

RAM
sumber
2
Terkait, tetapi bukan duplikat: Tips untuk bermain golf di MATLAB
Dennis Jaheruddin

Jawaban:

9
  1. Setelah Anda tahu, itu abebas dari nilai nol, menggunakan nnz(a)suku cadang sebanyak 2 karakter dibandingkan numel(a).
  2. Lebih memilih a(a==0)untuk a(find(a==0)).
  3. ~tlebih pendek dari t==0, dan bahkan ~~tlebih pendek dari t!=0.
  4. 0*(1:n) lebih pendek dari zeros(1,n)
  5. Secara umum, ||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||malih - alih all(all(m))matriks apa pun.

Coba dengan 0||[1 1;1 0]dan 0||[1 1;1 1]untuk meyakinkan diri Anda sendiri.

  1. 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.

  2. Ketika suatu fungsi adalah pernyataan tunggal, lebih suka f=@(n)dosomething(n)notasi daripada function r=f(n)r=dosomething(n);endsatu.

  3. 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.

  4. Itu mungkin dilakukan f(a=0,b=0)sebagai gantinya a=0;b=0;f(a,b).

  5. 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 dalam adan bvariabel.

  6. Tabel diutamakan operator adalah teman Anda. Jangan lakukan b=(a==0)karena b=a==0itu sama.

pawel.boczarski
sumber
7

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):

z = (1:5)+(6:10)';

menghasilkan efek yang sama dengan

[x,y]=meshgrid(1:5,6:10);
z = x+y;

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):

f=@(n)(z=n+1)*z; %returns (n+1)^2

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:

a = 'abc';
a+0 %returns
[97 98 99]

Atau

sum('abc') == 294
cacat
sumber
Saya percaya itu seharusnya a+0, bukan a+'0'. Selain itu, tip-tipnya bagus =)
Stewie Griffin
Benar terima kasih! PS: Bisakah Anda menambahkan += -= /=operator dll dalam daftar Anda di bawah ini?
flawr
1
+alebih pendek daria+0
Luis Mendo
7

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:

f = @(x,a=sort(x))a(a>.5);

Satu kasus penggunaan adalah ketika kami menggunakan tugas yang diindeks untuk memodifikasi bagian dari array dan kami ingin menggunakan array:

a=[1 2 3 4]
a(2)=5;

Tetapi ekspresi (a(2)=5)kembali a(2), atau ekspresi (a([1 3])=4)mengembalikan array dua elemen. Tidak mengembalikan seluruh array. Kita dapat menggunakan daftar argumen:

f=@(a=[1 2 3 4],b=a(2)=5)a;

Di sini hasil dari tugas yang diindeks disimpan ke dalam variabel dummy bdan fungsi mengembalikan array.

rahnema1
sumber
6

-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 koma
Oktaf: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}

rahnema1
sumber
@StewieGriffin Tip yang bagus! Jawaban diperbarui!
rahnema1
5

Lewati titik koma!

Saya akan menggunakan jawaban ini untuk menggambarkan maksudnya.

Kode aslinya adalah:

function f(x);if~movefile('f.m',x);disp("+-+\n| |\n+-+");end

Setelah menghapus titik koma, itu bisa dikurangi menjadi yang berikut, menghemat tiga byte:

function f(x)if~movefile('f.m',x)disp("+-+\n| |\n+-+")end

Ini dapat digunakan di beberapa tempat, dan hal-hal yang bahkan tidak Anda coba karena sepertinya kesalahan sintaks sering berhasil.

Stewie Griffin
sumber
1
hal-hal yang bahkan tidak Anda coba karena kelihatannya kesalahan sintaksis sering berhasil. Oktaf secara singkat
Sanchises
2

Ini sederhana, tetapi bermanfaat.

Di Oktaf, tetapi bukan MATLAB, Anda bisa melakukannya seperti di C ++:

x = 0  ->  x = 0
x++    ->  ans = 0
x      ->  x = 1
++x    ->  ans = 2
x      ->  x = 2
Stewie Griffin
sumber
2

Satu lagi yang sederhana, tetapi bermanfaat (tidak mungkin di MATLAB):

Tetapkan nilai yang sama untuk beberapa variabel:

a=b=c=0;
Stewie Griffin
sumber
2

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) tidak mungkin rumit.

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 :

c=(i=@input)('');N=i('');A=i('');for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A

Dibandingkan dengan ini:

@(c,N,A)eval('for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A')

Kode identik, tetapi bagian input jauh lebih pendek.


Ini juga dapat digunakan untuk memodifikasi variabel input, seperti ini (kredit untuk Luis Mendo untuk ini!):

f(x)eval('x([1,4])=x([4,1])`;
Stewie Griffin
sumber
3
Kode identik. Hanya lebih jelek, lebih lambat, dan kurang bisa dibaca. Apa lagi yang bisa Anda minta? :-D
Luis Mendo
1

Gunakan rows(a)sebagai gantisize(a,1)

rahnema1
sumber
1

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:

disp('Hello')
disp Hello
disp"Hello"

Jika Anda memiliki spasi, maka Anda harus memiliki tanda kutip:

disp('Hello, World!')
disp"Hello, World!"

Contoh lain yang kurang bermanfaat termasuk:

nnz PPCG
ans = 4

size PPCG
ans = 1  4

str2num 12
ans = 12
Stewie Griffin
sumber