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


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

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

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

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 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 18.04 LTS with GNOME 3.

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Скрамбл для кубика рубика 3х3
« Ответ #1 : 24 Мая 2015, 20:37:54 »
Вам нужен генератор случайной последовательности поворотов? Чтобы в итоге было 20 поворотов типа F, B', U, ...? А язык какой?
Вот, например, на C++. Здесь 20 это количество поворотов (в вашем примере почему-то 25), а 12 - все возможные комбинации: F, F', B, B' ...)
Код: (CPP) [Выделить]
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
int main()
{
    vector<string> turn = {"F", "F'", "B", "B'", "L", "L'", "R", "R'", "U", "U'", "D", "D'"};
    srand(time(NULL));
    int index;
    for(int i = 0; i < 20; i++){
        index = rand() % 12;
        cout << turn[index] << " ";
    }
    return 0;
}
Linux is only free if your time has no value (c) Jamie Zawinski

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

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

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

Пользователь решил продолжить мысль [time]28 Май 2015, 17:28:43[/time]:
Код: (cpp) [Выделить]
//main.cpp
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include "universal.h"
using namespace std;

       const int ScrambleLenght = 20;
             
       void Scramble()
       {
srand(time(NULL));

int Face;

bool R = false;
bool L = false;
bool F = false;
bool B = false;
bool D = false;
bool U = false;

bool RullOnTime;
bool DoubleRull;
bool Block = false;

for (int i=0; i<ScrambleLenght; i++)
{
           
            while (!Block)
            {
                Face = rand() % 6;
                switch (Face)
                {
             case 0 :
             if (!R)
                 {
cout << "R"; R = true; Block = true; break;
       }
   else
   {
   R = false;
   F = false;
   B = false;
   D = false;
   U = false;
   }
   
         case 1 :
         if (!F)
         {
   cout << "F"; F = true; Block = true; break;
         }
         else
         {
   R = false;
   F = false;
   L = false;
   D = false;
   U = false;
   }
   
         case 2 :
         if (!B)
         {
   cout << "B"; B = true; Block = true; break;
         }
         else
         {
   R = false;
   U = false;
   B = false;
   D = false;
   L = false;
         }
         
         case 3 :
         if (!D)
         {
   cout << "D"; D = true; Block = true; break;
         }
         else
         {
   R = false;
   F = false;
   B = false;
   D = false;
   L = false;
         }
         
         case 4 :
         if (!L)
         {
   cout << "L"; L = true; Block = true; break;
   }
   else
   {
   L = false;
   F = false;
   B = false;
   D = false;
   U = false;
         }
         
         case 5 :
         if (!U)
         {
   cout << "U"; U = true; Block = true; break;
   }
   else
   {
   R = false;
   F = false;
   B = false;
   L = false;
   U = false;
   }
    }
      }
      Block = false;
     
      DoubleRull = rand() % 2;
            if (DoubleRull) cout << 2;
           
if (!DoubleRull)
{
     RullOnTime = rand() % 2;
     if (RullOnTime) cout << "\'";
}

cout << "  ";
      }      
}
void PrintInterface()
       {
       cout << "\tКубик Рубика 3 х 3\t\n" << endl;
}
       int main()
       {
double time = 0;
while (true)
{
       PrintInterface();
       Scramble(); cout << endl;
       cout << endl << time;
       if (getch()==' ')
       {
clear_scr();
time = 0;
       while (true)
       {
      PrintInterface();
      cout << endl << time << endl;
      time_s(0.01);
      time += 0.01;
      if (kbhit())
      {
if (getch() == ' ') break;
      }
      clear_scr();
}
}
if (kbhit())
      {
if (getch() == 27) break;
      }
clear_scr();
  }

return 0;
}

Пользователь решил продолжить мысль [time]28 Май 2015, 17:34:20[/time]:
Код: (cpp) [Выделить]
//universal.h
#include <iostream>         
#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <unistd.h>
#include <termios.h>
#include <sys/select.h>
using namespace std;
void time_s(double second)
   {
   int CLOCKS_PER_MSEC = CLOCKS_PER_SEC / 1;   
       clock_t end_time = clock() + second * CLOCKS_PER_MSEC ;
       while (clock() < end_time) {}
   }

void clear_scr()
   {
     cout<<"\033[H\033[J\033[m";
   }
int kbhit()
{
  struct timeval tv;
  fd_set fds;
  tv.tv_sec = 0;
  tv.tv_usec = 0;
  FD_ZERO(&fds);
  FD_SET(STDIN_FILENO, &fds);
  select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
  return FD_ISSET(STDIN_FILENO, &fds);
}
void nonblock(int state)
     {
     struct termios ttystate;
     tcgetattr(STDIN_FILENO, &ttystate);
     if (state == 1)
      {
        ttystate.c_lflag &= ~ICANON;
        ttystate.c_cc[VMIN] = 1;
     }
     else if (state == 0)
      {
        ttystate.c_lflag |= ICANON;
      }
      tcsetattr(0, TCSANOW, &ttystate);
    }
   
int getch()
   {
   nonblock(1);
       return fgetc(stdin);
       nonblock(0);
   }

Пользователь решил продолжить мысль [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 18.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 18.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • 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 18.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • 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 18.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • 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 18.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • 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 18.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • 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 18.04 LTS with GNOME 3.

Оффлайн alsoijw

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

 

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