사실이면) - 페이지 6

 
Georgiy Merts :

몰라...

제 생각에는 이러한 "빈" 블록과 "무한 루프"(적어도 for, 적어도 while)는 잘못된 프로그래밍 스타일이며 잠재적으로 계산하기 어려운 오류로 위험합니다.

루프 조건 테스트 연산자는 의미가 없어야 하지만 일종의 부하를 수행해야 합니다. "무한 루프"가 있는 경우 - 내부에 몇 가지 추가 출구가 있음을 의미합니다. 중단 - 항상 명확하지 않습니다. 그건 그렇고, 나는 break 문도 좋아하지 않습니다. 저는 항상 루프에서 계속 문을 사용합니다 .


그리고 여기에서 말했듯이 코드 난독화는 유치한 것입니다... 젠장, 누군가가 코드를 팔거나 다른 방법으로 수백만 달러를 빼낼까봐 두려워서 모인 훌륭한 카피스트 프로그래머들... 교만은 치명적인 죄 중 하나입니다!

동의하지 않는다.
무한 루프 및 중단 없이 이 코드를 다시 작성해 보십시오.

 int ArrayDeleteVal( int &a[], const int val) 
  {
   int size= ArraySize (a);
   int i= 0 ,start,s,count;
   while (i<size && a[i]!=val) i++; // ищем первый элемент массива со значением val
   if (i==size) return size;
   start=i; i++;
   while (i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
   if (i==size) { ArrayResize (a,start); return start;}
   s=i; i++;
   for (;;)
     {
       while (i<size && a[i]!=val) i++; // ищем элемент массива со значением val
      count=i-s;
       if (count> 6 ) { ArrayCopy (a,a,start,s,count); start+=count;} // если нужно скопировать более 6 элементов, то имеет смысл воспользоваться ArrayCopy
       else for (; s<i; start++,s++) a[start]=a[s];                 // иначе простой цикл
       if (i==size) break ;
      i++;
       while (i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
       if (i<size) s=i; else break ;
      i++;
     }
   if (start<size) ArrayResize (a,start); else start=size;
   return (start);
  }
 
Nikolai Semko :

동의하지 않는다.
무한 루프 및 중단 없이 이 코드를 다시 작성해 보십시오.

흥미로운 작업입니다.

제 생각에는 제시된 코드가 다소 "불투명"하고 이해하기 어렵습니다. 비록 구조가 명확하고 기능이 유용하긴 하지만요.

언뜻보기에 루프는 while (i<size) {....}이어야하지만 아직 완전히 이해하지 못했습니다.

손이 닿는 대로 - 할게요.

 
Georgiy Merts :

흥미로운 작업입니다.

제 생각에는 제시된 코드가 다소 "불투명"하고 이해하기 어렵습니다. 비록 구조가 명확하고 기능이 유용하긴 하지만요.

언뜻보기에 루프는 while (i<size) {....}이어야하지만 아직 완전히 이해하지 못했습니다.

손이 닿는 대로 - 할게요.

이 함수는 a[] 배열에서 모든 val 값을 제거하고 압축하여 데이터 시퀀스를 변경하지 않고 제거된 요소에서 "구멍"을 제거합니다.

 
Nikolai Semko :

이 함수는 a[] 배열에서 모든 val 값을 제거하고 압축하여 데이터 시퀀스를 변경하지 않고 제거된 요소에서 "구멍"을 제거합니다.

예, 그렇습니다. 목적이 명확하고 기능 자체가 유용합니다. 지금은 아직 못하고, 나중에 작품을 알아내서 무한루프 없이 다시 쓰겠습니다. 글쎄, 그리고 나서 - 나는 내가 쓰는 것처럼 함수의 내 자신의 버전을 작성할 것입니다.

 
Georgiy Merts :

예, 그렇습니다. 목적이 명확하고 기능 자체가 유용합니다. 지금은 아직 못하고, 나중에 작품을 알아내서 무한루프 없이 다시 쓰겠습니다. 글쎄, 그리고 나서 - 나는 내가 쓰는 것처럼 함수의 내 자신의 버전을 작성할 것입니다.

여기에서 코드를 받았습니다. 1년 반 전에 자발적인 경쟁이 있었습니다.

 
Nikolai Semko :

동의하지 않는다.
무한 루프 및 중단 없이 이 코드를 다시 작성해 보십시오.


 /// навскидку, даже не проверял
void ArrayDeleteVal( int &arr[], int val)
{
   int size= ArraySize (arr);
   int count= 0 ;   // кол-во удалённых
   for ( int i= 0 ;i<size;i++) {
       if (arr[i]==val) count++;
       else if (count) {
         arr[i-count]=arr[count];
      }
   }
   ArrayResize (arr,size-count);
}
 
Maxim Kuznetsov :


예, 더 컴팩트한 옵션이 있지만 더 느립니다.
귀하의 변형은 위의 것보다 2-3배 느리고 동시에 어딘가에 오류가 있습니다. 잘못된 체크섬을 생성합니다.
이것은 HashSet을 사용하지 않고 가장 빠른 옵션입니다.


 2020.04 . 08 14 : 15 : 35.829 ArrayDeleteValue1 (EURUSD,D1)   === Тест с сохранением порядка ===
2020.04 . 08 14 : 15 : 35.829 ArrayDeleteValue1 (EURUSD,D1)   
2020.04 . 08 14 : 15 : 35.977 ArrayDeleteValue1 (EURUSD,D1)   вариант Pastushak   : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения - 144668 микросекунд
2020.04 . 08 14 : 15 : 35.981 ArrayDeleteValue1 (EURUSD,D1)   вариант Korotky     : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   2416 микросекунд
2020.04 . 08 14 : 15 : 35.985 ArrayDeleteValue1 (EURUSD,D1)   вариант Fedoseev    : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   1675 микросекунд
2020.04 . 08 14 : 15 : 35.988 ArrayDeleteValue1 (EURUSD,D1)   вариант Semko       : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -     797 микросекунд
2020.04 . 08 14 : 15 : 35.991 ArrayDeleteValue1 (EURUSD,D1)   вариант Nikitin     : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   1866 микросекунд
2020.04 . 08 14 : 15 : 35.997 ArrayDeleteValue1 (EURUSD,D1)   вариант Vladimir    : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   3453 микросекунд
2020.04 . 08 14 : 15 : 36.006 ArrayDeleteValue1 (EURUSD,D1)   вариант Peter       : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   7633 микросекунд
2020.04 . 08 14 : 15 : 36.009 ArrayDeleteValue1 (EURUSD,D1)   вариант fann95      : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   1135 микросекунд
2020.04 . 08 14 : 15 : 36.013 ArrayDeleteValue1 (EURUSD,D1)   вариант Kuznetsov   : Контрольная сумма = 7156.067670 ; элементов - 998994 ; время выполнения -   2368 микросекунд
2020.04 . 08 14 : 15 : 36.017 ArrayDeleteValue1 (EURUSD,D1)   вариант Kuznetsov1  : Контрольная сумма = 7219.503559 ; элементов - 1000000 ; время выполнения -   1874 микросекунд
2020.04 . 08 14 : 15 : 36.021 ArrayDeleteValue1 (EURUSD,D1)   вариант Kuznetsov2  : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   2554 микросекунд
2020.04 . 08 14 : 15 : 36.021 ArrayDeleteValue1 (EURUSD,D1)   
2020.04 . 08 14 : 15 : 36.021 ArrayDeleteValue1 (EURUSD,D1)   === Порядок в массиве не сохраняется ===
2020.04 . 08 14 : 15 : 36.024 ArrayDeleteValue1 (EURUSD,D1)   вариант Kuznetsov3  : Контрольная сумма = 7224.813498 ; элементов - 998994 ; время выполнения -     735 микросекунд
2020.04 . 08 14 : 15 : 36.027 ArrayDeleteValue1 (EURUSD,D1)   вариант Semko2      : Контрольная сумма = 7224.813498 ; элементов - 998994 ; время выполнения -   1408 микросекунд
파일:
 
Georgiy Merts :

몰라...

제 생각에는 이러한 "빈" 블록과 "무한 루프"(적어도 for, 적어도 while)는 잘못된 프로그래밍 스타일이며 잠재적으로 계산하기 어려운 오류로 위험합니다.

루프 조건 테스트 연산자는 의미가 없어야 하지만 일종의 부하를 수행해야 합니다. "무한 루프"가 있는 경우 - 내부에 몇 가지 추가 출구가 있음을 의미합니다. 중단 - 항상 명확하지 않습니다. 그건 그렇고, 나는 break 문도 좋아하지 않습니다. 저는 항상 루프에서 계속 문을 사용합니다 .


그리고 여기에서 말했듯이 코드 난독화는 유치한 것입니다... 젠장, 누군가가 코드를 팔거나 다른 방법으로 수백만 달러를 빼낼까봐 두려워서 모인 훌륭한 카피스트 프로그래머들... 교만은 치명적인 죄 중 하나입니다!

앗....
 
Maxim Kuznetsov :


Maxim, 이것은 작동하지 않습니다. 2개의 주기가 있어야 합니다. 그렇지 않으면 아무 것도 없습니다. 처음에는 배열을 위쪽으로 "압축"(부동)한 후 불필요한 요소를 삭제합니다. 두 번째 주기는 첫 번째 주기 안에 있습니다.

 

for 구문은 루프가 시작되기 전에 조건을 확인하고 종료하는 것을 의미합니다.

while 구문은 조건을 확인하고 루프가 끝나기 전에 종료하는 것을 의미합니다.

무한 루프는 조건을 확인하고 루프의 아무 곳에서나 종료하는 것을 의미합니다.