Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Скрамбл для кубика рубика 3х3  (Прочитано 23114 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Скрамбл для кубика рубика 3х3
« : 21 Май 2015, 20:44:23 »
Привет!
Недавно задумал сделать программку для более удобной сборки кубика рубика: таймер и скрамбл генератор. С таймером проблем не возникло, а вот с генератором - кучу. Если кто не знает, скрамбл - это последовательность вращений кубика в зафиксированом положении, которая из собранного кубика делает кубик, готовый к сборке. Записывается
так : http://speedcubing.com.ua/howto/3x3fri2.php (используються только вращения одной грани). В скрамбле должно быть 20 ходов. После его выполнения кубик должен быть нормально запутан. В общем, я не в курсах какой алгоритм для генерации такого скрамбла, в гугле искал, не нашёл. Если кто сможет, помогите пожалуйста или скинте ссылку на статью. 

Вот пример: F'  L'  R  B'  U'  D'  R2  L  F  D'  R  U  D2  L'  U  B  L  B'  L2  B  U2  L2  D  B  D'
« Последнее редактирование: 21 Май 2015, 20:50:43 от Гриб_под_зонтом »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 16.04 LTS with GNOME 3.

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 614
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #1 : 24 Май 2015, 20:37:54 »
Вам нужен генератор случайной последовательности поворотов? Чтобы в итоге было 20 поворотов типа F, B', U, ...? А язык какой?
Вот, например, на C++. Здесь 20 это количество поворотов (в вашем примере почему-то 25), а 12 - все возможные комбинации: F, F', B, B' ...)
Код: C++
  1.  #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <vector>
  5. using namespace std;
  6. int main()
  7. {
  8.     vector<string> turn = {"F", "F'", "B", "B'", "L", "L'", "R", "R'", "U", "U'", "D", "D'"};
  9.     srand(time(NULL));
  10.     int index;
  11.     for(int i = 0; i < 20; i++){
  12.         index = rand() % 12;
  13.         cout << turn[index] << " ";
  14.     }
  15.     return 0;
  16. }
  17.  
Why join the navy if you can be a pirate? (c) Steve Jobs

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #2 : 28 Май 2015, 16:17:35 »
Вам нужен генератор случайной последовательности поворотов? Чтобы в итоге было 20 поворотов типа F, B', U, ...? А язык какой?
Вот, например, на C++. Здесь 20 это количество поворотов (в вашем примере почему-то 25), а 12 - все возможные комбинации: F, F', B, B' ...)
Код: C++
  1.  #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <vector>
  5. using namespace std;
  6. int main()
  7. {
  8.     vector<string> turn = {"F", "F'", "B", "B'", "L", "L'", "R", "R'", "U", "U'", "D", "D'"};
  9.     srand(time(NULL));
  10.     int index;
  11.     for(int i = 0; i < 20; i++){
  12.         index = rand() % 12;
  13.         cout << turn[index] << " ";
  14.     }
  15.     return 0;
  16. }
  17.  

В вашем примере может быть не 20 ходов (например R R') будет как 0 ходов. Тем более R L R'. И ещё есть 2R. Сам то алгоритм я уже реализовал, но забыл тему закрыть. Не много попозже скину реализацию

Пользователь решил продолжить мысль [time]28 Май 2015, 17:28:43[/time]:
Код: C++
  1. //main.cpp
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <fstream>
  6. #include "universal.h"
  7. using namespace std;
  8.  
  9.        const int ScrambleLenght = 20;
  10.              
  11.        void Scramble()
  12.        {
  13.                 srand(time(NULL));
  14.                
  15.                 int Face;
  16.                
  17.                 bool R = false;
  18.                 bool L = false;
  19.                 bool F = false;
  20.                 bool B = false;
  21.                 bool D = false;
  22.                 bool U = false;
  23.                
  24.                 bool RullOnTime;
  25.                 bool DoubleRull;
  26.                 bool Block = false;
  27.  
  28.                 for (int i=0; i<ScrambleLenght; i++)
  29.                 {
  30.                    
  31.                     while (!Block)
  32.                     {
  33.                         Face = rand() % 6;
  34.                         switch (Face)
  35.                         {
  36.                                  case 0 :
  37.                                  if (!R)
  38.                                      {
  39.                                                  cout << "R"; R = true; Block = true; break;
  40.                                        }
  41.                                    else
  42.                                    {
  43.                                            R = false;
  44.                                            F = false;
  45.                                            B = false;
  46.                                            D = false;
  47.                                            U = false;
  48.                                    }
  49.                                    
  50.                                  case 1 :
  51.                                  if (!F)
  52.                                  {
  53.                                            cout << "F"; F = true; Block = true; break;
  54.                                  }
  55.                                  else
  56.                                  {
  57.                                            R = false;
  58.                                            F = false;
  59.                                            L = false;
  60.                                            D = false;
  61.                                            U = false;
  62.                                    }
  63.                                    
  64.                                  case 2 :
  65.                                  if (!B)
  66.                                  {
  67.                                            cout << "B"; B = true; Block = true; break;
  68.                                  }
  69.                                  else
  70.                                  {
  71.                                            R = false;
  72.                                            U = false;
  73.                                            B = false;
  74.                                            D = false;
  75.                                            L = false;
  76.                                  }
  77.                                  
  78.                                  case 3 :
  79.                                  if (!D)
  80.                                  {
  81.                                            cout << "D"; D = true; Block = true; break;
  82.                                  }
  83.                                  else
  84.                                  {
  85.                                            R = false;
  86.                                            F = false;
  87.                                            B = false;
  88.                                            D = false;
  89.                                            L = false;
  90.                                  }
  91.                                  
  92.                                  case 4 :
  93.                                  if (!L)
  94.                                  {
  95.                                            cout << "L"; L = true; Block = true; break;
  96.                                    }
  97.                                    else
  98.                                    {
  99.                                            L = false;
  100.                                            F = false;
  101.                                            B = false;
  102.                                            D = false;
  103.                                            U = false;
  104.                                  }
  105.                                  
  106.                                  case 5 :
  107.                                  if (!U)
  108.                                  {
  109.                                            cout << "U"; U = true; Block = true; break;
  110.                                    }
  111.                                    else
  112.                                    {
  113.                                            R = false;
  114.                                            F = false;
  115.                                            B = false;
  116.                                            L = false;
  117.                                            U = false;
  118.                                    }
  119.                             }
  120.                       }
  121.                       Block = false;
  122.                      
  123.                       DoubleRull = rand() % 2;
  124.                     if (DoubleRull) cout << 2;
  125.                    
  126.                         if (!DoubleRull)
  127.                         {
  128.                              RullOnTime = rand() % 2;
  129.                              if (RullOnTime) cout <<    "\'";
  130.                         }
  131.                        
  132.                         cout << "  ";
  133.               }      
  134.          }
  135.          void PrintInterface()
  136.        {
  137.                cout << "\tКубик Рубика 3 х 3\t\n" << endl;
  138.          }
  139.        int main()
  140.        {
  141.                  double time = 0;
  142.                  while (true)
  143.                  {
  144.                        PrintInterface();
  145.                        Scramble(); cout << endl;
  146.                        cout << endl << time;
  147.                        if (getch()==' ')
  148.                        {
  149.                                  clear_scr();
  150.                                  time = 0;
  151.                                while (true)
  152.                                {
  153.                                       PrintInterface();
  154.                                       cout << endl << time << endl;
  155.                                       time_s(0.01);
  156.                                       time += 0.01;
  157.                                       if (kbhit())
  158.                                       {
  159.                                                 if (getch() == ' ') break;
  160.                                       }
  161.                                       clear_scr();
  162.                                  }       
  163.                          }
  164.                          if (kbhit())
  165.                                       {
  166.                                                 if (getch() == 27) break;
  167.                                       }
  168.                          clear_scr();
  169.                   }
  170.                  
  171.                  return 0;
  172.          }

Пользователь решил продолжить мысль [time]28 Май 2015, 17:34:20[/time]:
Код: C++
  1. //universal.h
  2. #include <iostream>          
  3. #include <ctime>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <unistd.h>
  7. #include <termios.h>
  8. #include <sys/select.h>
  9. using namespace std;
  10. void time_s(double second)
  11.    {
  12.            int CLOCKS_PER_MSEC = CLOCKS_PER_SEC / 1;  
  13.        clock_t end_time = clock() + second * CLOCKS_PER_MSEC ;
  14.        while (clock() < end_time) {}
  15.    }
  16.  
  17. void clear_scr()
  18.    {
  19.      cout<<"\033[H\033[J\033[m";       
  20.    }
  21. int kbhit()
  22. {
  23.   struct timeval tv;
  24.   fd_set fds;
  25.   tv.tv_sec = 0;
  26.   tv.tv_usec = 0;
  27.   FD_ZERO(&fds);
  28.   FD_SET(STDIN_FILENO, &fds);
  29.   select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
  30.   return FD_ISSET(STDIN_FILENO, &fds);
  31. }
  32. void nonblock(int state)
  33.      {
  34.      struct termios ttystate;
  35.      tcgetattr(STDIN_FILENO, &ttystate);
  36.      if (state == 1)
  37.       {
  38.         ttystate.c_lflag &= ~ICANON;
  39.         ttystate.c_cc[VMIN] = 1;
  40.      }
  41.      else if (state == 0)
  42.       {
  43.         ttystate.c_lflag |= ICANON;
  44.       }
  45.       tcsetattr(0, TCSANOW, &ttystate);
  46.     }
  47.    
  48. int getch()
  49.    {
  50.            nonblock(1);
  51.        return fgetc(stdin);
  52.        nonblock(0);
  53.    }

Пользователь решил продолжить мысль [time]28 Май 2015, 17:55:42[/time]:
Извиняюсь, алгоритм на проверку оказался не рабочим , сам не знаю почему. Довольно часто выкидывает что то типа "2L R' 2L" хотя не должен. Кто нить может обьяснить?
« Последнее редактирование: 28 Май 2015, 19:12:53 от Гриб_под_зонтом »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 16.04 LTS with GNOME 3.

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #3 : 31 Май 2015, 17:32:59 »
Помогите пожалуйста, готовлюсь к соревнованиям и таймер позарез нужен  :-[
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 16.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #4 : 31 Май 2015, 17:36:03 »
Гриб_под_зонтом, ты же говорил что с таймером проблем не возникло. Что там с генератором последовательностей?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #5 : 31 Май 2015, 17:40:22 »
alsoijw,
Да с таймером не возникло а вот со скрамблом фигня :( Есть блоки типа R2 R2 и что -то в этом роде, хотя вроде всё это предусмотрел
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 16.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #6 : 31 Май 2015, 17:54:02 »
Гриб_под_зонтом, словами объясни какой последовательности быть не может.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #7 : 31 Май 2015, 18:22:12 »
alsoijw,
нужно исключить все возможные обороты одной рани подряд
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 16.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #8 : 31 Май 2015, 18:38:00 »
Гриб_под_зонтом, R, R' не коректная? А R, R?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #9 : 31 Май 2015, 19:16:41 »
alsoijw,
Абсолютно верно, оба эти варианты не корректны
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 16.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #10 : 31 Май 2015, 19:23:50 »
R L R' это коррекно?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #11 : 31 Май 2015, 19:30:55 »
alsoijw,
Нет. Я об этом не упомянул только потому, что в последовательности такого не отображалось
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 16.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #12 : 31 Май 2015, 21:38:16 »
Гриб_под_зонтом, можешь привести примеры всех некоректных сочитсаний? Не полный список вариантов а список правил?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #13 : 31 Май 2015, 21:58:06 »
alsoijw,
Если два R подряд(не обращая внимания на 2 или ') или разделены противоположной гранью (R L2 R', на 2 и ' по прежнему не обращаем внимания) то не корретный случай. Всё остальное берём на stdin
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 16.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #14 : 01 Июнь 2015, 15:11:18 »
Гриб_под_зонтом, можно ещё список граней и им противоположных? R L это коректно?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

 

Страница сгенерирована за 0.083 секунд. Запросов: 24.