• Как выйти из JFrame без System.exit?

    @cthulhudx
    Можно просто вызывать у JFrame метод dispose();
    Например:
    JFrame frame = new JFrame();
    .....
    frame.dispose();
    Ответ написан
    1 комментарий
  • Где есть удаленные курсы повышения квалификации с выдачей бумажного красивого документа?

    @beduin01
    www.atraining.ru
    и только www.atraining.ru

    Цены посмотрите и бесплатные курсы. Ничего лучше на рынке просто нет. Будете приятно удивлены ценами. Местами цены в 10 (!) раз ниже чем у конкурентов.
    Ответ написан
    Комментировать
  • Где есть удаленные курсы повышения квалификации с выдачей бумажного красивого документа?

    vicodin
    @vicodin
    Имею некоторый опыт
    certifications.ru вот тут можно сертификат по почте получить
    Ответ написан
    Комментировать
  • Где есть удаленные курсы повышения квалификации с выдачей бумажного красивого документа?

    @ttyigor
    Интересуют исключительно наши, отечественные.

    Первое, что приходит на ум:
    https://stepic.org
    https://www.lektorium.tv
    Хотя, не уверен про бумажный красивый диплом:)
    Ответ написан
    Комментировать
  • Как расписать циклы через goto, а потом преобразовать в state-машину?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Возьмём программу, в которой есть и циклы, и goto. Например, проверка, есть ли в матрице нулевая строка:
    void Check(int M[5][5]){
      for(int a=0;a<5;a++){
        for(int b=0;b<5;b++){
          if(M[a][b]!=0) goto L1;
       }
       goto L2;
    L1: continue;
      }
      printf("No\n"); return;
    L2:
      printf("Yes\n"); 
    }

    Опишем все переменные в начале, а циклы распишем прямо по определению.
    Кроме того, return превратим в goto на метку Return в конце функции:
    void Check(int M[5][5]){
      int a,b;
      a=0;
      goto Loop1_Check;
    Loop1_Body:
      b=0;
      goto Loop2_Check;
    Loop2_Body:
          if(M[a][b]!=0) goto L1;
          b++;
    Loop2_Check:
          if(b<5) goto Loop2_Body;  
       goto L2;
    L1: 
    Loop1_End:
       a++;
    Loop1_Check:  
      if(a<5) goto Loop1_Body;
      printf("No\n"); goto Return;
    L2:
      printf("Yes\n"); 
    Return: ;
    }

    Теперь между любыми двумя метками у нас находится линейная последовательность, в которой могут встретиться конструкции if(condition) goto label;
    Заводим переменную state.
    Каждой метке присваиваем какое-нибудь значение этой переменной, и вместо goto label пишем state=label; а вместо if(condition) goto label; - if(condition) state=label; else{ остаток кода до следующей метки }. Если перед какой-нибудь меткой label не было безусловного goto, пишем перед ней state=label;
    void Check(int M[5][5]){
      const int Return=0;
      const int Loop1_Check=1;
      const int Loop1_Body=2;
      const int Loop2_Check=3;
      const int Loop2_Body=4;
      const int L1=5;
      const int L2=6;
    
      int state;
      int a,b;
      a=0;
      state=Loop1_Check;
    Loop1_Body:
      b=0;
     state=Loop2_Check;
    Loop2_Body:
          if(M[a][b]!=0) state=L1;
          else{
             b++;
             state=Loop2_Check;
          }
    Loop2_Check:
          if(b<5) state=Loop2_Body;  
          else state=L2;
    L1: 
          a++;
          state=Loop1_Check;
    Loop1_Check:  
      if(a<5) state=Loop1_Body;
      else{
          printf("No\n"); 
          state=Return;
      }
    L2:
      printf("Yes\n"); 
      state=Return;
    Return: ;
    }

    (это преобразование было неэквивалентным).
    Теперь перед первой меткой вставляем while(state!=Return){ switch(state){
    а каждую метку label: заменяем на break; case label:
    break; перед первой меткой убираем, а case Return: меняем на } }
    void Check(int M[5][5]){
      const int Return=0;
      const int Loop1_Check=1;
      const int Loop1_Body=2;
      const int Loop2_Check=3;
      const int Loop2_Body=4;
      const int L1=5;
      const int L2=6;
    
      int state;
      int a,b;
      a=0;
      state=Loop1_Check;
      while(state!=Return){
        switch(state){
          case Loop1_Body:
            b=0;
            state=Loop2_Check;
            break;
          case Loop2_Body:
            if(M[a][b]!=0) state=L1;
            else{
              b++;
              state=Loop2_Check;
            }
            break;
          case Loop2_Check:
            if(b<5) state=Loop2_Body;  
            else state=L2;
            break;
          case L1: 
            a++;
            state=Loop1_Check;
            break;
          case Loop1_Check:  
             if(a<5) state=Loop1_Body;
             else{
                printf("No\n"); 
                state=Return;
             }
             break;
           case L2:
              printf("Yes\n"); 
              state=Return;
              break;
         }
      }
      ;
    }

    Всё.
    Ответ написан
    4 комментария
  • Как можно порождать перестановки с дополнительными ограничениями для элементов итеративно?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    А чем не нравится goto? Вполне легальный оператор. В случае чего, от него легко избавиться, преобразовав код в конечный автомат (получится цикл с одним switch внутри). Хотя чаще хватает одной дополнительной логической переменной.
    И какого типа ограничения? И есть ли ограничение на порядок выдачи перестановок?

    UPD. Вот вариант решения на C#. Не самый эффективный, правда.
    class Program{
            static IEnumerable<int[]> Permutations(int N,Func<int,int,bool>Cond1,Func<int,int,int,int,bool> Cond2) {
                int[] res=new int[N];
                int k=0;
                res[0]=0;
                while(k>=0){
                    if(++res[k]<=N){
                        if(Cond1(k+1,res[k]) && GoodValue(res,k,Cond2)){
                            if(k==N-1) yield return res;
                            else res[++k]=0;
                        }
                    }else k--;
                }
            }
            static private bool GoodValue(int[] res,int k,Func<int,int,int,int,bool> Cond) {
                for(int i=0;i<k;i++) {
                    if(res[i]==res[k] || !Cond(i+1,res[i],k+1,res[k])) return false;
                }
                return true;
            }
    
            static int N=6;
            static bool Cond1(int a,int va) {
                if(a==1) return va==1;
                if(a==N) return va==N;
                return true;
            }
            static bool Cond2(int a,int va,int b,int vb) { 
                return Math.Abs(a-b)>1 || Math.Abs(va-vb)<=3;
            }
            static void Main(string[] args) {
                foreach(int[] perm in Permutations(N,Cond1,Cond2))
                    Console.WriteLine(String.Join(",",perm));
            }
        }

    Функции Permutations передаются два условия. Первое Cond1(a,va) проверяет, может ли элемент va находиться в позиции a, второе Cond2(a,va,b,vb) - могут ли одновременно находиться va в позиции a и vb в позиции b.
    В качестве примера - печать перестановок из задачи про лягушку из ProjectEuler: https://projecteuler.net/problem=490
    Для N=6 выдаёт ожидаемые 14 перестановок:
    1,2,3,4,5,6
    1,2,3,5,4,6
    1,2,4,3,5,6
    1,2,4,5,3,6
    1,2,5,3,4,6
    1,2,5,4,3,6
    1,3,2,4,5,6
    1,3,2,5,4,6
    1,3,4,2,5,6
    1,3,5,2,4,6
    1,4,2,3,5,6
    1,4,2,5,3,6
    1,4,3,2,5,6
    1,4,5,2,3,6


    Если не нравится конструкция yield return - вставьте вместо неё свою обработку перестановки, а функцию опишите, как void. Если из GoodValue yбрать проверку res[I]==res[k], то вместо перестановок будут печататься все N-элементные наборы из чисел 1..N, удовлетворяющие условию.
    Ответ написан
    4 комментария
  • Как удалить все содержимое папки?

    @bardimnik
    Нужно создать reg-файлик для Windows с таким содержимым:

    Windows Registry Editor Version 5.00

    [HKEY_CLASSES_ROOT\Directory\shell\DeleteFolderContent]
    @="Удалить содержимое папки"

    [HKEY_CLASSES_ROOT\Directory\shell\DeleteFolderContent\command]
    @="cmd /c \"cd /d %1 && del /s /f /q *.*\" "

    После этого запустить его.

    В контекстном меню папок появится строка с предложением удаления содержимого папки.

    Вот и всё.
    Ответ написан
    Комментировать