[아카이브] 순수수학, 물리학, 화학 등 : 거래와 무관한 두뇌 트레이닝 퍼즐 - 페이지 510

 
IgorM :
나는 계속 및 중단 문을 사용하는 것을 좋아하지 않지만, 특히 mql에서 중첩이 작동하지 않을 수 있는 경우 36배가 도움이 될 수 있습니다.
작동하지 않으면 계속을 사용합니다... 하지만 그걸로 어지럽힐 생각은 전혀 없습니다. 흥미롭긴 하지만 다른 알고리즘을 구현하는 것이 좋습니다.
 
MaxZ :

그리고 복잡한 36겹 테스트 조건으로 구성된 if를 간단한 조건으로 36 ifs로 쪼개어 내 코드 속도를 높일 수 있습니다! :)))

코드 속도가 눈에 띄게 빨라질 것이라고 생각하지만 컴파일로 인해 발생하는 기계 명령어를 확실히 이해해야 합니다.

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 ;
    }
}
작업 시간 == 200ms
 

끔찍하지만 다음과 같이 코드를 최적화하는 것이 좋습니다. 몇 배 더 빠르게! 그리고 여기서 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()를 다시 작성했습니다.

이제 다음과 같이:

작업 시간 == 200ms

그것은 아름답게 밝혀졌습니다! 내가 가진 것처럼.

열에 나눗셈 알고리즘을 작성하는 아이디어가 있습니다. 비트 단위로 나누어 나머지를 쓰고 결과가 일치하거나 결과가 6보다 크면 계속 연산을 수행합니다. 이것은 내가 오늘 오후에 한 일입니다. 다섯 가지를 분류하고 모든 것을 하나의 열로 나눴습니다. 하지만 오랜만이야! :))

사용자가 하는 대로 6자리 숫자의 표현에서 최적화를 수행해야 합니다.

 
MaxZ :

열에 나눗셈 알고리즘을 작성하는 아이디어가 있습니다. 비트 단위로 나누어 나머지를 쓰고 결과가 일치하거나 결과가 6보다 크면 계속 연산을 수행합니다. 이것은 내가 오늘 오후에 한 일입니다. 다섯 가지를 분류하고 모든 것을 하나의 열로 나눴습니다. 하지만 오랜만이야! :))

사용자가 하는 대로 6자리 숫자의 표현에서 최적화를 수행해야 합니다.

영형! 아이디어가 좋습니다. 다시 작성했습니다. 작업 시간=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 :

영형! 좋은 아이디어입니다. 다시 작성했습니다. 작업 시간=125ms

이제 하키 선수들은 분명히 행복할 것입니다! :)))) 정확히 그런 뜻은 아니었지만! ;디


그리고 내 코드에 따라 시간 카운터는 얼마나 표시됩니까?


변경 사항을 이해합니다. 나는 아직 그것에 대해 이해하지 못했습니다.

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

"|=" - 논리적 "OR"? 그리고 거기에 완전한 혼란이 있습니다 ...

 
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 :

응.

새 코드는 훨씬 더 빠르지만 버그가 있습니다.

중괄호의 수가 일치하지 않습니다. 그러나 그것은 쓰레기처럼 보이며 후자를 제거하여 처리됩니다.

강조 표시된 줄의 의미를 설명합니다. 나는 따라잡지 않는다.

바로... 브래드! :))) 그리고 표준과 같은 괄호를 사용하여 완성된 코드에서 복사했습니다.

다음과 같아야 합니다.

 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는 단일 매개변수 함수입니다.
아마도 구식 방법 ... 메모리 및 캐시 bool 할당
모든 유효한 인수 값에 대해?