si(verdadero) - página 6

 
Georgiy Merts:

No sé...

En mi opinión, tanto estos bloques "vacíos" como los "bucles infinitos" (ya sean for o while) son un mal estilo de programación, peligroso por los errores que pueden producirse.

El operador de comprobación de la condición del bucle no debe carecer de sentido, sino que debe llevar alguna carga. Si tenemos un "bucle infinito", significa que hay algunas salidas y rupturas adicionales dentro del bucle y no siempre son obvias. Por cierto, a mí tampoco me gusta el operador break, siempre uso el operador continue en un bucle.


Y como se dijo aquí la ofuscación del código es simplemente infantil... Se reunieron aquí grandes programadores-copistas que tienen miedo de que alguien venda su código o consiga millones de dólares de otras maneras... ¡El orgullo es uno de los pecados capitales!

no están de acuerdo.
Intenta reescribir este código sin el bucle infinito y el 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:

no están de acuerdo.
Intenta reescribir este código sin el bucle infinito y el break

Una tarea interesante.

En mi opinión, el código presentado es bastante "opaco" y difícil de entender, aunque la estructura es clara para mí, y la función es útil.

A primera vista, el bucle debería ser while (i<size) {....}, pero aún no lo he entendido bien.

En cuanto lo tenga en mis manos, me pondré a ello.

 
Georgiy Merts:

Una tarea interesante.

En mi opinión, el código presentado es bastante "opaco" y difícil de entender, aunque la estructura es clara para mí y la función es útil.

A primera vista, el bucle debería ser while (i<size) {....}, pero todavía no lo he entendido bien.

En cuanto me ponga a ello, lo haré.

La función elimina todos los valores val del array a[] y lo compacta, eliminando los "huecos" de los elementos eliminados sin cambiar la secuencia de datos.

 
Nikolai Semko:

La función borra todos los valores val del array a[] y lo compacta, eliminando los "huecos" de los elementos borrados sin cambiar la secuencia de datos.

Sí, sí, te lo dije - el propósito es claro, la función en sí es útil. Ahora no puedo todavía, más tarde voy a averiguar cómo funciona, y voy a reescribirlo sin bucle infinito. Bueno, y luego - voy a escribir mi variante de la función, como lo haría.

 
Georgiy Merts:

Sí, sí, te lo dije - el propósito es claro, la función en sí es útil. Ahora no puedo todavía, más tarde voy a ordenar mi trabajo y reescribirlo sin bucle infinito. Bien, y entonces - escribiré mi versión de la función, como la escribiría yo.

el código fue tomado de aquí. Hace un año y medio hubo un concurso espontáneo.

 
Nikolai Semko:

no están de acuerdo.
Intenta reescribir este código sin el bucle infinito y el break


/// навскидку, даже не проверял
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:


Sí está claro que hay variantes más compactas, pero más lentas.
Tu variante es 2-3 veces más lenta que la anterior y hay un error en alguna parte, porque da una suma de comprobación errónea.
Estamos hablando de la opción más rápida sin 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 микросекунд
Archivos adjuntos:
 
Georgiy Merts:

No sé...

En mi opinión, tanto los bloques "vacíos" como los "bucles infinitos" (ya sean for o while) son un mal estilo de programación, peligroso por los errores que puede provocar.

El operador de comprobación de la condición del bucle no debe carecer de sentido, sino que debe llevar alguna carga. Si tenemos un "bucle infinito", significa que hay algunas salidas o rupturas adicionales dentro del bucle y no siempre son obvias. Por cierto, a mí tampoco me gusta el operador break, siempre uso el operador continue en un bucle.


Y como se dijo aquí la ofuscación del código es simplemente infantil... Grandes programadores-copistas reunidos aquí que tienen miedo de que alguien venda su código o consiga millones de dólares de otras maneras... ¡El orgullo es uno de los pecados capitales!

Sí....
 
Maxim Kuznetsov:


Maxim, no funciona así, debería haber 2 ciclos, si no, no hay manera. Primero se eliminan los elementos innecesarios y luego se "encoge" el array hacia arriba (float). El segundo bucle está dentro del primero.

 

Una construcción for implica la comprobación de una condición y la salida antes de que se inicie el ciclo.

Una construcción while implica comprobar una condición y salir antes de que el bucle termine.

Un bucle infinito implica comprobar la condición y salir en cualquier punto del bucle.