Как Вы представили бы Кубик Рубика в коде?

Как указано в комментариях, вам, вероятно, следует использовать константу вместо глобальной переменной

#initializers/redis.rb

DRIVER_LOCATIONS = "driver_locations"

# ...

REDIS.with do |conn|
  conn.geoadd(DRIVER_LOCATIONS, latitude, longitude, id)
end

Использование глобальной переменной не должно быть таким уж плохим в вашем случае использования, как это было установлено во время инициализации и Я предполагаю, что это делается только один раз.

56
задан starblue 31 October 2010 в 08:17
поделиться

9 ответов

Этот Бумага ACM описывает несколько альтернативных способов, которыми она раньше представляла кубик Рубика и сравнивает их друг с другом. К сожалению, у меня нет учетной записи для получения полного текста, но состояний описания:

Семь альтернативных представлений Кубика Рубика представлены и сравнены: массив 3-разрядных целых чисел 3 на 3 на 3; массив литералов 6 на 3 на 3; литеральная матрица 5 на 12; ll-by-ll редкая литеральная матрица; вектор с 54 элементами; массив с 4 размерами; и вложенный массив 3 на 3 на 3. Функции APL даны для перемещений ориентации и четвертей оборота плюс несколько полезных инструментов для решения куба.

кроме того, этот файл RubiksCube.java содержит довольно чистое представление наряду с соответствующими нормами для вращения разделов (при поиске фактического кода). Это использует ячейку и стоит перед массивом.

22
ответ дан Confuse 26 November 2019 в 17:30
поделиться

Один путь состоял бы в том, чтобы сфокусироваться на общем виде.

куб А имеет шесть поверхностей, и каждая поверхность три тремя массив квадратов. Так

Color[][][] rubik = new Color[6][3][3];

Затем каждое перемещение является методом, который переставляет определенный набор цветных квадратов.

11
ответ дан joel.neely 26 November 2019 в 17:30
поделиться

Интересный метод для представления куба используется программным обеспечением "Cube Explorer". Используя большое количество умной математики, что метод может представить куб с помощью только 5 целых чисел. Автор объясняет математику позади своей программы на его веб-сайт . По словам автора представление подходит реализовывать быстрые решатели.

7
ответ дан mdm 26 November 2019 в 17:30
поделиться

Существует много способов сделать это. Некоторые пути, делают более эффективное использование памяти, чем другие.

я видел, что люди используют массив объектов кубоида 3 x 3 x 3, где объект кубоида должен хранить информацию о цвете (и да, тот центральный объект никогда не используется). Я видел, что люди используют 6 массивов, каждый из которых является массивом кубоидов 3 x 3. Я видел массив кубоидов 3 x 18. Существует много возможностей.

, Вероятно, большее беспокойство - то, как представить различные преобразования. Вращение единственной поверхности физического куба (все перемещения куба являются по существу вращениями единственной поверхности) должно было бы быть представлено путем свопинга вокруг большого количества объектов кубоида.

Вашим выбором должен быть тот, который имеет смысл для любого приложения, которое Вы пишете. Может случиться так, что Вы только представляете куб. Может случиться так, что нет никакого UI. Можно решать куб.

я выбрал бы массив 3 x 18.

5
ответ дан Paul Beckingham 26 November 2019 в 17:30
поделиться

Существует 20 cubies тот вопрос. Таким образом, один способ сделать это как массив 20 строк. Строки содержали бы 2 или 3 символа, указывающие на цвета. Любое единственное перемещение влияет на 7 из cubies. Таким образом, Вам просто нужен remapper для каждой из этих шести сторон.

Примечание: Этому решению не удается помнить ориентацию этикетки логотипа, это находится на белом центре.

Между прочим, я помог кому-то сделать Кубик Рубика программного обеспечения однажды, возможно, 15 лет назад, но я не могу помнить, как мы представили его.

4
ответ дан Nosredna 26 November 2019 в 17:30
поделиться

Вы могли вообразить куб как три вертикальных круговых связанных списка, которые пересекают три горизонтальных связанных списка.

Каждый раз, когда определенная строка куба повернута, Вы просто повернули бы соответствующие указатели.

Это было бы похоже на это:

struct cubeLinkedListNode {
    cubedLinkedListNode* nextVertical;
    cubedLinkedListNode* lastVertical;
    cubedLinkedListNode* nextHorizontal;
    cubedLinkedListNode* lastHorizontal;
    enum color;
}

Вам, возможно, не на самом деле понадобились бы 2 'последних '-указателя.

[я сделал это с C, но он мог быть сделан в Java или C# просто с помощью простого класса для cubeLinkedListNode с каждым классом, содержащим ссылки на другие узлы.]

Помнят, что существует шесть взаимосвязанных круговых связанных списков. 3 вертикальных горизонтальные 3.

Для каждого вращения Вы просто циклично выполнились бы через соответствующий круговой связанный список, последовательно смещающий ссылки вращающегося круга, а также соединяющихся кругов.

Что-то как этот, по крайней мере...

2
ответ дан Alex Baranosky 26 November 2019 в 17:30
поделиться

Другие хорошо обращенное описание физического куба, но относительно состояния куба... Я попытался бы использовать массив векторных преобразований для описания изменений куба. Тем путем Вы могли сохранить историю rubiks куба, поскольку изменения внесены. И интересно, могли ли Вы умножить векторы в матрицу преобразования для нахождения простого решения?

0
ответ дан ccook 26 November 2019 в 17:30
поделиться

Как перестановка 48 поверхностей, которые могут переместиться. Основные вращения являются также перестановками, и перестановки могут быть составлены, они формируют группу.

В программе такая перестановка была бы представлена массивом 48 элементов, содержащих числа от 0 до 47. Цвета, соответствующие числам, фиксируются, таким образом, визуальное представление может быть вычислено из перестановки, и наоборот.

0
ответ дан starblue 26 November 2019 в 17:30
поделиться

Избегать оптимизации; сделать его объектно-ориентированным. Схема класса псевдокода, которую я использовал, выглядит следующим образом:

class Square
    + name : string
    + accronym : string

class Row
    + left_square : square
    + center_square : square
    + right_square : square

class Face
    + top_row : list of 3 square
    + center_row : list of 3 square
    + bottom_row : list of 3 square

    + rotate(counter_clockwise : boolean) : nothing

class Cube
    + back_face : face
    + left_face : face
    + top_face : face
    + right_face : face
    + front_face : face
    + bottom_face : face

    - rotate_face(cube_face : face, counter_clockwise : boolean) : nothing

Объем используемой памяти настолько мал, а обработка настолько минимальна, что оптимизация совершенно не нужна, особенно когда вы жертвуете удобством использования кода.

12
ответ дан 26 November 2019 в 17:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: