0

クラスでさまざまなプログラミング言語を学んでおり、現在 APLX プロジェクトに取り組んでいます。回避しなければならない制限は、If、For、While などを使用できないことです。ループや条件は使用できません。0 ~ 7 の範囲の数字の面を取り、2 以上の数字をその数字の深さまで置き換え、理想的には 1 を 0 に変更できる必要があります。例えば:

0100230 => 0000560

1 から 0 への変更は非常に簡単ですが、深度アスペクトでの置換をどのように行うべきかわかりません。テーブル内の整数のセットを生成することができ、特定の値を置き換える方法を理解していますが、関数中に決定する必要がある値ではなく、他の特定の値にのみ置き換えます。深さは、多次元の深さではなく、行の深さである必要があります。

記録のために、これはプログラムの全体ではありません。プログラム自体は、ポーカー ディールおよびスコアリング プログラムです。これは、私の教授が私が使用することを推奨した採点方法の特定の側面です。

TOTALS„SCORE PHAND;TYPECOUNT;DEPTH;ISCOUNT;TEMPS;REPLACE
:If (½½PHAND) = 0
  PHAND„DEAL PHAND
:EndIf
TYPECOUNT„CHARS°.¹PHAND
DEPTH„2Þ(½TYPECOUNT)
REPLACE „ 2 3 4 5 6 7
ISCOUNT „ +/ TYPECOUNT

ISCOUNT „ ³ISCOUNT
((1=,ISCOUNT)/,ISCOUNT)„0
©((2=,ISCOUNT)/,ISCOUNT)„1
©TEMPS „ ISCOUNT
Œ„ISCOUNT
Œ„PHAND
4

2 に答える 2

1

教授の最初のレッスンを見逃したかもしれません。他のプログラミング言語のアイデアを忘れてしまったら、ベクトルについて学び、それらをどのように簡単に扱うことができるかをもう一度見てみると役立つかもしれません ;-)

A1 から 7 までの数字を持つベクトルがあると仮定します: A←⍳7 A 1 2 3 4 5 6 7

ここで、値 > 3 を検索する場合は、次のようにします。

      A>3
0 0 0 1 1 1 1

結果もベクトルであり、多くの操作で 2 つを簡単に組み合わせることができます。

  • 値 > 0 のみを保持し、その他を 0 に置き換える乗算:

      A×A>3
    

    0 0 0 4 5 6 7

  • または 3 より大きい値に 500 を加算

    A+500×A>3 1 2 3 504 505 506 507

  • または、値 > 3 のインデックスを見つけます。

      (A>3)×⍳⍴A 
    

    0 0 0 4 5 6 7

さて、あなたの q をもう一度見てみると、「深さ」という言葉は APL で特定の意味を持っています。値 > 2 をこれらの値の「インデックス」に置き換えたいということを正しく理解していますか? さて、私が前に示したことで、これは簡単です:

A←0 1 0 0 2 3 0
      (A≥2)×⍳⍴A 
0 0 0 0 5 6 0

編集:多次元配列を見る: この例を見てみましょう:

      A←(⍳5)∘.×⍳10
      A
1  2  3  4  5  6  7  8  9 10
2  4  6  8 10 12 14 16 18 20
3  6  9 12 15 18 21 24 27 30
4  8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50

では、20 より大きい数値と 30 より小さい数値はどれですか?

      z←(A>20)∧A<30 
      z 
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 1 1 0 0 0
0 0 0 0 1 0 0 0 0 0

次に、値にそのブール値を掛けて、条件を満たすものだけを除外できます。

      A×z 
0 0 0 0  0  0  0  0  0 0
0 0 0 0  0  0  0  0  0 0
0 0 0 0  0  0 21 24 27 0
0 0 0 0  0 24 28  0  0 0
0 0 0 0 25  0  0  0  0 0

または、値の列インデックスに興味があるのではないでしょうか?

      z×[2]⍳¯1↑⍴z
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 7 8 9 0
0 0 0 0 0 6 7 0 0 0
0 0 0 0 5 0 0 0 0 0

注意: このステートメントは、すべての APL 方言で機能するとは限りません。これを定式化する別の方法を次に示します。

      z×((1↑⍴z)⍴0)∘.+⍳¯1↑⍴z
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 7 8 9 0
0 0 0 0 0 6 7 0 0 0
0 0 0 0 5 0 0 0 0 0

これがあなたに遊びのアイデアを与えることを願っています。一般に、ブール値を使用して数学演算で配列を操作することは、APL では非常に強力なアイデアであり、非常に長い道のりになります ;-)

また、同じものをもっと見たい場合は、FinnAPL Idiomsを見てください- 何年にもわたって成長したいくつかの便利なショートティー ;-)

再編集します。「変更されていない値を維持する」: 配列 A の例に戻る:

      A←(⍳5)∘.×⍳10
      A
1  2  3  4  5  6  7  8  9 10
2  4  6  8 10 12 14 16 18 20
3  6  9 12 15 18 21 24 27 30
4  8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50

20 から 30 の間の値をこれらの値の 2 乗で置き換え、他のすべての値は変更しません。

      touch←(A>20)∧A<30 
      (touch×A*2)+A×~touch
  1  2  3  4   5   6   7   8   9 10
  2  4  6  8  10  12  14  16  18 20
  3  6  9 12  15  18 441 576 729 30
  4  8 12 16  20 576 784  32  36 40
  5 10 15 20 625  30  35  40  45 50

あなたがその考えを理解してくれることを願っています...

于 2015-03-07T12:02:39.860 に答える
0

またはより良い: 新しい q を質問してください。そうしないと、これは本当に壮大な次元になりますが、stackoverflow の考え方は「1 つの問題 - 1 つの質問」のようなものです...

于 2015-03-09T18:24:19.067 に答える