[アーカイブ!】純粋数学、物理学、化学など:トレードとは一切関係ない脳トレ問題集 - ページ 510

 
IgorM:
私はcontinueとbreakの演算子を使うのが好きではありませんが、もしかしたらあなたの助けになるかもしれません。
うまくいかなかったら、continueを使おうかな...。でも、わざわざやる必要はまったくない。むしろ、違うアルゴリズムを作ったほうが、少なくとも面白いでしょう。
 
MaxZ:

そして加速する 私のコードは、複雑な36項目のチェック条件からなるifを、単純な条件の36個のifに分解することができるのです!:)))

コンパイルの結果であるマシン命令を理解する必要がありますが、コードは顕著にスピードアップすると思います。

MT5であなたのコードを実行しました。 すでに論理演算子の短時間での評価が実装(ビルトイン)されているので、コードをたくさんのifに分割する必要はないのです。

MT4では違うので、この最適化はそちらで意味があります。しかし、私はMT5で、短いスキームで時間評価をしてみました。

 

4倍に加速した。 Validate()を書き直した。

今はこんな感じです。

bool Validate(int X)
  {
   int XX=0;
   int A[];
   IntToArray(X,A);
   for(int i=5;i>-1;i--)
     {
      XX|=int(1<<A[i]);
     }
   if(XX==0x7E) {return true;}
   return false;
  }
void IntToArray(int X, int &A[])
{
  ArrayResize(A,6);
  for(int i=0;i<6;i++)
    {
     A[i]=X%10; X/=10;
    }
}
ワークタイム == 200 ms
 

恐ろしいことに、次のようにコードを最適化することに意味があるのです。何倍も速い!そして、ここではMT5はもう役に立ちません。

もちろん、アイデアではありません。でも、どれくらいのスピードで動くんだろう!:))

また、コードでは、除数値の範囲を 狭めました。654321/2 = 327160,5...

for (int A6 = 1; A6 <= 6; A6++)
   for (int A5 = 1; A5 <= 6; A5++)
   {
      if (A5 == A6) continue;
      for (int A4 = 1; A4 <= 6; A4++)
      {
         if (A4 == A5 || A4 == A6) continue;
         for (int A3 = 1; A3 <= 6; A3++)
         {
            if (A3 == A4 || A3 == A5 || A3 == A6) continue;
            for (int A2 = 1; A2 <= 6; A2++)
            {
               if (A2 == A3 || A2 == A4 || A2 == A5 || A2 == A6) continue;
               for (int A1 = 1; A1 <= 6; A1++)
               {
                  if (A1 == A2 || A1 == A3 || A1 == A4 || A1 == A5 || A1 == A6) continue;
for (int B6 = 1; B6 <= 3; B6++)
{
   if (B6 == A6) continue;
   for (int B5 = 1; B5 <= 6; B5++)
   {
      if (B6 == 3 && B5 > 2) continue;
      if (B5 == A5) continue;
      if (B5 == B6) continue;
      for (int B4 = 1; B4 <= 6; B4++)
      {
         if (B4 == A4) continue;
         if (B4 == B5 || B4 == B6) continue;
         for (int B3 = 1; B3 <= 6; B3++)
         {
            if (B3 == A3) continue;
            if (B3 == B4 || B3 == B5 || B3 == B6) continue;
            for (int B2 = 1; B2 <= 6; B2++)
            {
               if (B2 == A2) continue;
               if (B2 == B3 || B2 == B4 || B2 == B5 || B2 == B6) continue;
               for (int B1 = 1; B1 <= 6; B1++)
               {
                  if (B1 == A1) continue;
                  if (B1 == B2 || B1 == B3 || B1 == B4 || B1 == B5 || B1 == B6) continue;
                  
                  int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
                  int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;
                  if (MathMod(A, B) == 0)
                  Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B);
               }
            }
         }
      }
   }
}
               }
            }
         }
      }
   }
 
MetaDriver:

4倍に加速した。 Validate()を書き直した。

今はこんな感じです。

ワークタイム == 200 ms

きれいですねー。私のとは違う。

列分割のアルゴリズムを書くアイデアがあります。桁で割り、割り算の余りを書き、結果が6より大きいとき、continue操作を行う。それこそ、今日の午後、5を調べているときに、全部をコラムで分けたんです。でも、久々の登場です!:))

16進数表現でこそ、あなたのような最適化が必要なのです。

 
MaxZ:

列分割のアルゴリズムを書くアイデアがあります。桁で割って、割り算の余りを書き、一致するか結果が6より大きければ、コンティニュー操作を行う。そ れこそ、今日の午後、5を調べているときに、全部をコラムで分けたんです。でも、久々の登場です!:))

6桁の数字の表現にこそ、あなたのような最適化が必要なのです。

О!それは悪いことではありません。もう一度書き直す。 WorkTime=125ms。

bool Validate(int X)
  {
   int XX=0;
   int A[];
   if(!IntToArray(X,A)) return false; // изменено здесь тоже, но основное ниже
   for(int i=5;i>-1;i--)
     {
      XX|=int(1<<A[i]);
     }
   if(XX==0x7E) {return true;}
   return false;
  }
bool IntToArray(int X,int &A[])
  {
   ArrayResize(A,6);
   int x=X%10;
   if(x==0 || x>6) return false;  // главное изменение
   else A[0]=x;
   for(int i=1;i<6;i++)
     {
      X/=10;
      x=X%10;
      if(x==0 || x>6) return false;  // главное изменение
      else A[i]=x;
     }
    return true;
  }
 
MetaDriver:

О!それは悪いことではありません。もう一度書き直します。 WorkTime=125ms

これでホッケー選手もハッピーでいられること間違いなしです:))))でも、そういう意味じゃないんですよー。;D


Myコードによるタイムカウンターはどのくらい表示されるのですか?


変更点は理解している。ただ、まだ使いこなせていないだけなんです。

   for(int i=5;i>-1;i--)
     {
      XX|=int(1<<A[i]);
     }
   if(XX==0x7E) {return true;}

"|="は論理和なのか?あとは行き止まり...。

 
MaxZ:
これで、ホッケー選手も喜ぶこと間違いなし!:))))

そうですね。

新しいコードはさらに高速化されましたが、そこにはいくつかのバグがあります。

for (int A6 = 1; A6 <= 6; A6++)
   for (int A5 = 1; A5 <= 6; A5++)
   {
      if (A5 == A6) continue;
      for (int A4 = 1; A4 <= 6; A4++)
      {
         if (A4 == A5 || A4 == A6) continue;
         for (int A3 = 1; A3 <= 6; A3++)
         {
            if (A3 == A4 || A3 == A5 || A3 == A6) continue;
            for (int A2 = 1; A2 <= 6; A2++)
            {
               if (A2 == A3 || A2 == A4 || A2 == A5 || A2 == A6) continue;
               for (int A1 = 1; A1 <= 6; A1++)
               {
                  if (A1 == A2 || A1 == A3 || A1 == A4 || A1 == A5 || A1 == A6) continue;
for (int B6 = 1; B6 <= 3; B6++)
{
   if (B6 == A6) continue;
   for (int B5 = 1; B5 <= 6; B5++)
   {
      if (B6 == 3 && B5 > 2) continue;
      if (B5 == A5) continue;
      if (B5 == B6) continue;
      for (int B4 = 1; B4 <= 6; B4++)
      {
         if (B4 == A4) continue;
         if (B4 == B5 || B4 == B6) continue;
         for (int B3 = 1; B3 <= 6; B3++)
         {
            if (B3 == A3) continue;
            if (B3 == B4 || B3 == B5 || B3 == B6) continue;
            for (int B2 = 1; B2 <= 6; B2++)
            {
               if (B2 == A2) continue;
               if (B2 == B3 || B2 == B4 || B2 == B5 || B2 == B6) continue;
               for (int B1 = 1; B1 <= 6; B1++)
               {
                  if (B1 == A1) continue;
                  if (B1 == B2 || B1 == B3 || B1 == B4 || B1 == B5 || B1 == B6) continue;
                  
                  int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
                  int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;
                  if (MathMod(A, B) == 0)
                  Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B);
               }
            }
         }
      }
   }
}
               }
            }
         }
      }
   }

中括弧の数が合わなかった。でも、何のことはない、最後の一枚を削除すれば直るのだと思います。

ハイライトされた行の意味を説明してください。理解できない。

 
MetaDriver:

そうですね。

新しいコードはさらに高速化されましたが、そこにはいくつかのバグがあります。

中括弧の数が合わなかった。でも、なんでもない、最後の一枚を削除すれば直ると思います。

分離線の意味を説明する。理解できない。

その通り...嘘つけ!:)))ブラケットもOKのようです、既成のコードからコピーしました。

こうあるべきなのです。

for (int A6 = 1; A6 <= 6; A6++)
   for (int A5 = 1; A5 <= 6; A5++)
   {
      if (A5 == A6) continue;
      for (int A4 = 1; A4 <= 6; A4++)
      {
         if (A4 == A5 || A4 == A6) continue;
         for (int A3 = 1; A3 <= 6; A3++)
         {
            if (A3 == A4 || A3 == A5 || A3 == A6) continue;
            for (int A2 = 1; A2 <= 6; A2++)
            {
               if (A2 == A3 || A2 == A4 || A2 == A5 || A2 == A6) continue;
               for (int A1 = 1; A1 <= 6; A1++)
               {
                  if (A1 == A2 || A1 == A3 || A1 == A4 || A1 == A5 || A1 == A6) continue;
for (int B6 = 1; B6 <= 3; B6++)
   for (int B5 = 1; B5 <= 6; B5++)
   {
      if (B6 == 3 && B5 > 2) continue;
      if (B5 == B6) continue;
      for (int B4 = 1; B4 <= 6; B4++)
      {
         if (B4 == B5 || B4 == B6) continue;
         for (int B3 = 1; B3 <= 6; B3++)
         {
            if (B3 == B4 || B3 == B5 || B3 == B6) continue;
            for (int B2 = 1; B2 <= 6; B2++)
            {
               if (B2 == B3 || B2 == B4 || B2 == B5 || B2 == B6) continue;
               for (int B1 = 1; B1 <= 6; B1++)
               {
                  if (B1 == B2 || B1 == B3 || B1 == B4 || B1 == B5 || B1 == B6) continue;
                  if (A6 != B6 && A5 != B5 && A4 != B4 && A3 != B3 && A2 != B2 && A1 != B1)
                  {
                     int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
                     int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;
                     if (MathMod(A, B) == 0)
                        Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B);
                  }
               }
            }
         }
      }
   }
               }
            }
         }
      }
   }

また、MQL5では、比較のスピードが少し速くなります。

                     if (A > B && MathMod(A, B) == 0)

しかし、125msは明らかに追いついていない。

 

それとも、全部C++なのかな?
.
Validate- 1 パラメータ機能。
昔ながらの方法はどうだろう...。メモリを確保し、boolをキャッシュする
は、引数のすべての有効な値に対して?