Octaveでのゴルフのヒント


18

オクターブでゴルフをするための一般的なヒントは何ですか?私は、少なくともオクターブ特有のゴルフ問題全般のコーディングに適用できるアイデアを探しています(例えば、「コメントの削除」は答えではありません)。回答ごとに1つのヒントを投稿してください。


2
関連しているが重複していない:MATLABでのゴルフのヒント
デニスジャヘルディン14年

回答:


9
  1. 一度わかったらa、ゼロの値はありnnz(a)ませんnumel(a)。スペアを使用すると、に比べて2文字多くなります。
  2. 優先a(a==0)a(find(a==0))
  3. ~tは、よりも短くt==0、さらに~~tはよりも短いですt!=0
  4. 0*(1:n) より短い zeros(1,n)
  5. 通常、||および&&、他の多くの演算子とは異なり、最初の引数がスカラーの場合、結果をスカラー化します。行列の場合、ゼロに等しい要素を持たない空でない行列のみがtrueの論理値を持ちます

したがって、任意の行列の0||m代わりに行うことができますall(all(m))

を試して0||[1 1;1 0]0||[1 1;1 1]自分を納得させてください。

  1. ビルトインを何度も使用しているときは、たとえば、文字をスペアするための関数ハンドルを実行します f=@find。短い関数名の場合、少なくとも3回の出現がこれを正当化し、長い関数名の場合は2回出現します。

  2. 関数が単一のステートメントである場合、1 つよりもf=@(n)dosomething(n)表記を優先しfunction r=f(n)r=dosomething(n);endます。

  3. 残念ながら、グローバル変数は、グローバルスコープとそれらを使用する各関数の両方で宣言する必要があります。ただし、例外があります。匿名@(n)...関数は、呼び出し元のスコープからすべての変数を「参照」します。

  4. f(a=0,b=0)代わりに行うことが可能ですa=0;b=0;f(a,b)

  5. これは文書化されていない機能のようですが、評価の順序は左から右(zeros(a=n,b=a*a)v。3.8.1で確認)であり、anxn ^ 2行列を作成して行と列の番号ab変数を保存することができます。

  6. 演算子の優先順位テーブルはあなたの友人です。同じだb=(a==0)からしないでくださいb=a==0


7

誰かがどのチャレンジで使用したのか覚えていません(教えてください=)が、これはきちんとしたトリックであることがわかりました:

通常、行列を追加する場合、同じサイズにする必要がありますが、1次元(1xnおよびnx1)行列にはショートカットがあります(Matlabでは機能しません):

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

と同じ効果が得られます

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

次に、pawel.boczarskiが既に言及したこと:Octaveでは(Matlabではできませんが)関数ハンドル内で補助変数を定義できます。また、変数の割り当て自体に割り当ての値があるため、コードを本当に短縮できます(これは無意味です)例ですが、トリックを取得します):

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

次に、別のトリック(Matlabでも適用可能)は(ハードコードされた)数値を格納するために文字列を悪用します(このきちんとしたトリックはfeersumから盗まれます)。文字列を数値として解釈するものが必要です。

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

または

sum('abc') == 294

私はそれがそうa+0ではないはずだと信じていa+'0'ます。それ以外のヒントはいいです=)
Stewie Griffin

そう、ありがとう!PS:+= -= /=リストにetc演算子を追加できますか?
flawr

1
+aより短いa+0
ルイスメンドー

7

引数リストを使用する:

Octaveはデフォルトの引数を取得できるため、引数リストで式を評価できます。

この機能は、式を計算して複数回使用する場合に便利です。

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

1つのユースケースは、インデックス付きの割り当てを使用して配列の一部を変更し、配列を使用する場合です。

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

ただし、式(a(2)=5)はを返すa(2)か、式(a([1 3])=4)は2つの要素の配列を返します。どちらも配列全体を返しません。引数リストを使用できます。

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

ここでは、インデックス付き割り当ての結果がダミー変数に格納されb、関数は配列を返します。


6

-Octaveでは、MATLABで禁止されている機能である一時的な式にインデックスを適用できます。この機能はゴルフに非常に役立ちます。例:

Octave:[1 23 4 5 7](3:4) および同等のMATLAB:a=[1 23 4 5 7];a(3:4)
Octave:hilb(4)(4:5,4:5) および同等のMATLAB:h=hilb(4);h(4:5,4:5)
Octave:{1,4,{4 5 6},[7 ;3]}{3}および同等のMATLAB:a={1,4,{4 5 6},[7 ;3]};a{3}
Octave:num2cell([1 2 3 4]){:}コンマ区切りリストの作成
Octave:a'(:)'

-匿名関数では、割り当てを含む複数の式を評価する必要がある通常の関数の場合があります。1つのアプローチは、各式をセルに配置できることです(セルには複数のタイプのオブジェクトを含めることができるため)各式のインデックスを使用して、その要素を抽出できます。

{1,4,{4 5 6},[7 ;3]}{3}
または

{a=1,b=4,c={4 5 6},[b ;3]}{4}


@StewieGriffin素敵なヒント!回答が更新されました!
rahnema1

5

セミコロンをスキップ!

この回答を使用して、ポイントを説明します。

元のコードは次のとおりです。

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

セミコロンを削除すると、次のようになり、3バイト節約されます。

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

これは非常に多くの場所で使用でき、構文エラーがよく機能するように見えるため、試してさえいないものを使用できます。


1
構文エラーがよく機能するように見えるため、試してさえいないもの
-Octaveの

2

これはシンプルですが、便利なものです。

MATLABではなく、Octaveでは、C ++のようにできます。

x = 0  ->  x = 0
x++    ->  ans = 0
x      ->  x = 1
++x    ->  ans = 2
x      ->  x = 2


2

使用してくださいeval

ルイスメンドーの答えに触発されました


匿名関数は、ほとんどの場合、1つ以上のを呼び出す必要があるスクリプトを作成するよりも短くなりますinput('')。欠点は、ループと変数の変更(マトリックス内の2つの要素の交換など)が面倒なことではありません

を使用evalすると、通常の匿名関数で行うように入力を取得し、通常のスクリプトで行うようにスクリプトを実行できます。

これを考慮してください:

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

これと比較して:

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

コードは同じですが、入力セクションはずっと短くなっています。


これは、次のように入力変数を変更するためにも使用できます(これはLuis Mendoの功績です!)。

f(x)eval('x([1,4])=x([4,1])`;

3
コードは同一です Onlyく、遅く、読みにくいだけです。さらに何を求めることができますか?:-D
ルイスメンドー


1

関連していますが、MATLABのヒントと同一ではありません。

Octaveのあまり知られておらず、ほとんど使用されていない機能は、ほとんどの組み込み関数を括弧なしで呼び出すことができることです。スペースが含まれる場合は、引用符が必要です。これは、を使用するときに1バイトまたは2バイトを節約するために頻繁に使用できdispます。以下のすべてが機能し、同じ結果が得られます。

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

スペースがある場合は、引用符が必要です。

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

その他のあまり有用ではない例は次のとおりです。

nnz PPCG
ans = 4

size PPCG
ans = 1  4

str2num 12
ans = 12
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.