se(true) - página 6

 
Georgiy Merts:

Eu não sei...

Na minha opinião, tanto tais blocos "vazios" como "loops infinitos" (seja por ou enquanto) são um estilo de programação ruim, perigoso para erros potencialmente difíceis de calcular.

Se temos um "loop infinito", isso significa que há algumas saídas e quebras adicionais dentro do loop e elas nem sempre são óbvias. A propósito, eu também não gosto de operador de pausa - eu sempre uso operador contínuo em um loop.


E, como foi dito aqui, a ofuscação do código é apenas infantil. Grandes programadores-copiadores reunidos aqui que temem que alguém venda seu código ou receba milhões de dólares de outras formas... O orgulho é um dos pecados mortais!

não estão de acordo.
Tente reescrever este código sem o loop infinito e quebrar

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:

não concordam.
Tente reescrever este código sem o loop infinito e quebrar

Uma tarefa interessante.

Na minha opinião, o código apresentado é bastante "opaco" e difícil de entender, embora a estrutura seja clara para mim, e a função seja útil.

À primeira vista, o laço deve ser (i<size) {....}, mas eu ainda não entendi bem.

Assim que eu conseguir, vou chegar a ele.

 
Georgiy Merts:

Uma tarefa interessante.

Na minha opinião, o código apresentado é bastante "opaco" e difícil de entender, embora a estrutura seja clara para mim e a função seja útil.

À primeira vista, o laço deve ser (i<size) {....}, mas ainda não o entendi completamente.

Assim que eu chegar a ele, eu chegarei a ele.

A função remove todos os valores de val do array a[] e o compacta, removendo "furos" dos elementos apagados sem alterar a seqüência de dados.

 
Nikolai Semko:

A função apaga todos os valores de val da matriz a[] e a compacta, removendo "furos" dos elementos apagados sem alterar a seqüência de dados.

Sim, sim, eu lhe disse - o propósito é claro, a função em si é útil. Agora ainda não posso, mais tarde vou descobrir como funciona, e vou reescrevê-la sem loop infinito. Bem, e então - vou escrever minha variante de função, como eu escreveria.

 
Georgiy Merts:

Sim, sim, eu lhe disse - o propósito é claro, a função em si é útil. Agora eu ainda não posso, mais tarde eu vou ordenar meu trabalho e reescrevê-lo sem loop infinito. Bem, e então - vou escrever minha versão da função, como eu a escreveria.

o código foi tirado daqui. Houve uma competição espontânea há um ano e meio atrás.

 
Nikolai Semko:

não estão de acordo.
Tente reescrever este código sem o loop infinito e quebrar


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


Sim, é claro que existem variantes mais compactas, mas mais lentas.
Sua variante é 2-3 vezes mais lenta do que acima e há um erro em algum lugar, pois dá um checksum errado.
Estamos falando da opção mais rápida sem o 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 микросекунд
Arquivos anexados:
 
Georgiy Merts:

Eu não sei...

Na minha opinião, tanto tais blocos "vazios" como "loops infinitos" (seja por ou enquanto) são um estilo de programação ruim, perigoso para erros potencialmente difíceis de calcular.

Se temos um "loop infinito", isso significa que há algumas saídas e quebras adicionais dentro do loop e elas nem sempre são óbvias. A propósito, eu também não gosto de operador de pausa - eu sempre uso operador contínuo em um loop.


E, como foi dito aqui, a ofuscação do código é apenas infantil. Grandes programadores-copiadores reunidos aqui que temem que alguém venda seu código ou receba milhões de dólares de outras formas... O orgulho é um dos pecados mortais!

Sim....
 
Maxim Kuznetsov:


Maxim, não funciona assim, deveria haver 2 ciclos, caso contrário não há como. Primeiro você remove elementos desnecessários, depois "encolhe" a matriz para cima (flutua). A segunda etapa está dentro da primeira.

 

A para construção envolve a verificação de uma condição e a saída antes do início do ciclo.

A construção de um loop envolve a verificação de uma condição e a saída antes que o loop termine.

Um loop infinito implica em verificar a condição e sair em qualquer ponto do loop.