Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Классическая задача для моделирования эвристических алгоритмов. (I need help) (https://javascript.ru/forum/project/41034-klassicheskaya-zadacha-dlya-modelirovaniya-ehvristicheskikh-algoritmov-i-need-help.html)

Koshelenok 29.08.2013 03:27

Классическая задача для моделирования эвристических алгоритмов. (I need help)
 
Здравствуйте господа. После недолгого изучения JavaScript решил попробовать написать старую детскую головоломку, в которой на поле размером 4x4 нужно расположить числа от 1 до 15. Полученный скрипт доступен по ссылке. www.dropbox.com/s/osza66pmqu30tga/puzzle.html

Главная сложность оказалась в том, что не все из генерируемых комбинаций можно решить. И хотя на высокоуважаемой википедии представлена формула, по которой следует определить "решаемость комбинации" долгие и томные взгляды на нее не смогли дать ощутимый логический результат (только попытка его изобразить в 155 строчке), поэтому смиренно прошу помощи у вас старожилы данного ресурса, чтобы как могли объяснили что же мне нужно добавить в исходный код. Да и просто буду рад конструктивной критике о качестве написанного (лишь бы не увидеть себя на govnokod.ru).

Статья на вики: http://ru.wikipedia.org/wiki/%D0%9F%...88%D0%BA%D0%B8

ksa 29.08.2013 08:28

Цитата:

Сообщение от Koshelenok
решил попробовать написать старую детскую головоломку
...
долгие и томные взгляды на нее не смогли дать ощутимый логический результат

Может стоит взять посильную задачку для продолжения изучения JS?:D

А то получается такая ситуация:
- решил подкачаться
- сразу поставил на штангу 150кг
- чета поднять не смог
- помоготе начать поднимать ту штангу

Т.ч. совет - начни с гантелей! :D

Koshelenok 29.08.2013 11:54

Цитата:

Сообщение от ksa (Сообщение 269838)
Может стоит взять посильную задачку для продолжения изучения JS?:D

Т.ч. совет - начни с гантелей! :D


Позвольте мне принести свои глубочайшие извинения.:cray: Мне кажется, я не правильно выразился, когда написал что буду рад "конструктивной критике". Ведь вы явно решили, что мне требуются псевдоумные советы как строить процесс обучения. Как же мне повезло, что сразу же после регистрации мне попался такой юзер как вы который, даже не смотря в написанный код, сразу же определил, что для меня написать "Пятнашки" это не посильная задача (аж целых 150 кг) и мне необходимо "начать с гантелей".

И, тем не менее, я надеюсь на адекватные советы...

ksa 29.08.2013 13:23

Цитата:

Сообщение от Koshelenok
Ведь вы явно решили

Ты даже близко не угадал что я "решил"... :D

рони 29.08.2013 13:32

Koshelenok,
можно просто перемешивать заранее правильную комбинацию
Игра "Пятнашки" пост #19

rekzi 29.08.2013 16:00

Там простая формула. Перемешивать ничего не надо. Просто чайку сладкого выпейте и еще раз посмотрите. По коду сказал бы: а) открывающая скобка должна быть на той строке, к сущности которой относится; закрывающая наоборот и вровень с отступом; б) одна операция - одна строка; где надо строим ступеньки; в) бессмысленные комментарии типа этого: "обычный рандом который выдает числа из указанного промежутка", там по названию и параметрам все понятно, а вот включая ли концы или нет - непонятно; г) return всегда должен быть в конце функции, там его ищут обычно; д) пробелы не забывать; е) сверху переменные, далее функции, далее обычная последовательность выполнения; ж) оборачивайте все в анонимную функцию, глобальную область засорять не рекомендуют; з) null мне не нравиться, используйте undefined - более понятнее)) и) придерживайтесь одного стиля оформления кода, желательно самого распространенного для языка на котором пишите.
Я практикующий junior, вот такие моменты выделил.:)

рони 30.08.2013 03:02

генератор правильных комбинаций для пятнашек
 
:write:
по формуле из википедии 1 пост
генератор правильных комбинаций для пятнашек
function gen() {
         function f(a) {
             for (var b = 4, c = 0; c < a.length - 1; c++) {
                 !a[c] && (b -= 4 - c / 4 | 0);
                 for (var d = c + 1; d < a.length; d++) a[c] && a[d] && a[d] < a[c] && b++
             }
             return !(b % 2)
         }
         for (var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 14, ""]; !f(a);)
             for (var b = a.length - 1; 0 < b; b--) {
                 var e = Math.floor(Math.random() * (b + 1)),
                     g = a[e];
                 a[e] = a[b];
                 a[b] = g
             }
         return a
     };

 alert(gen());

функцию f можно использовать для проверки правильности автономно - на входе массив 15 чисел и пусто на выходе true/false

Koshelenok 31.08.2013 08:32

Большое спасибо за помощь. Воспользуюсь советами и недочетами:)


Часовой пояс GMT +3, время: 04:11.