if(true) - 页 6

 
Georgiy Merts:

我不知道...

在我看来,这种 "空 "块和 "无限循环"(无论是for还是while)都是一种不好的编程风格,对于潜在的难以计算的错误来说是很危险的。

循环的条件检查运算符不应该是无意义的,而应该承担一些负担。 如果我们有一个 "无限循环",这意味着在循环内部有一些额外的输出或中断,而且它们并不总是很明显。顺便说一下,我也不喜欢break操作符--我总是在循环中使用continue操作符


正如这里所说的,代码混淆只是一种幼稚的做法......伟大的程序员-抄袭者聚集在这里,他们害怕有人会卖掉他们的代码或通过其他方式获得数百万美元......骄傲是致命的罪过之一!

不同意。
试着重写这段没有无限循环和中断的代码

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:

是的,是的,我告诉过你--目的是明确的,函数本身是有用的。 现在我还不能,以后我将整理我的工作,重写它,没有无限循环。好吧,然后--我将写出我的版本的函数,就像我写的那样。

该代码来自这里。一年半前有一次自发的竞争。

 
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操作符--我总是在循环中使用continue操作符


正如这里所说的,代码混淆只是一种幼稚的做法......伟大的程序员-抄袭者聚集在这里,他们害怕有人会卖掉他们的代码或通过其他方式获得数百万美元......骄傲是致命的罪过之一!

Yeah....
 
Maxim Kuznetsov:


马克西姆,不是这样的,应该有2个循环,否则就没有办法了。首先删除不必要的元素,然后将数组向上 "收缩"(浮动)。 第二个循环是在第一个循环里面。

 

for结构包括检查一个条件并在循环开始前退出。

while结构包括检查一个条件并在循环结束前退出。

无限循环意味着检查条件并在循环的任何一点退出。