Обновлено еще раз: См. Ниже. Если это может быть достигнуто с помощью javascript или jquery, я готов пойти по этому пути.
Я работаю над проектом, и все идет гладко, пока я не уперся в математическую стену.
В настоящий момент мы работаем над этим вручную путем реверс-инжиниринга из числа, ответ на который мы уже знаем (2114), но каждый из нас работает над этим немного по-своему, и иногда это занимает довольно много времени, поскольку никто из нас не очень хорош с калькулятором. мы всегда заканчиваем, если результаты немного отличаются. Отсюда потребность в чем-то, что помогает. И добавляем в нашу интранет.
Любая помощь в этом была бы потрясающей. Благодарю.
Правила;
Получить число (пробел) от 590 до 4500
Определите размеры панелей и заполнителей, необходимых для заполнения этого пробела, согласно приведенным ниже правилам;
Панели должны = нечетное число
Заполнения (при необходимости) должны быть равны четному количеству и быть не более чем на 1 по количеству больше, чем количество панелей.
Минимальный размер панелей = 590 Максимальный размер панелей = 705
Минимальный размер заполнения = 75 Максимальный размер заполнения = 175
Ниже то, что у меня есть на данный момент, это моя 13-я попытка.
Обновлено: этот код «работает до определенной степени», но чем больше (пробел), тем больше я теряюсь и запутываюсь, и тем длиннее и, казалось бы, избыточным становится код. Я чувствую, что есть уравнение, которое могло бы сделать это в двух строках, но здесь я пишу несколько сотен строк, которые просто повторяются и в конце концов что-то упускают или просто старые ошибки. И да, все, что нужно для этого, - это заполнить пробел как можно меньшим количеством панелей и заполнителей (в пределах направляемых размеров).
$max_size = 705;
$min_size = 590;
$panel_qty = 3;
$infill_qty = 0;
$infills_max = 150;
$infills_min = 50;
$cut_off = 0;
$gremain = 0;
// devide by panels #
$gap = $new_width / $panel_qty;
// check if gap too big
if ($gap > $max_size) {
$infill_qty = 2;
// get difference between gap and max_size
$gremain = ($panel_qty * ($gap - $max_size)) / $infill_qty;
// makesure gremain is higher then infills min
if ($gremain < $infills_min) {
//cut off from panels
$gremain_total = $gremain * 2;
$cut_off = $gremain_total / 6;
$small_cut_off = $cut_off;
$large_cut_off = $cut_off;
if ($cut_off < 10) {
$small_cut_off = 0;
$large_cut_off = $gremain_total / 2;
}
$infill_qty = 0;
} elseif ($gremain > $infills_max) {
// more infills
$infill_qty = 4;
$gremain = ($panel_qty * ($gap - $max_size)) / $infill_qty;
if ($gremain < $infills_min) {
//cut off from panels
$down_size = ($gremain * 4) - ($infills_min * 2);
$gremain_total = $down_size * 2;
$cut_off = $gremain_total / 6;
$small_cut_off = $cut_off;
$large_cut_off = $cut_off;
if ($cut_off < 10) {
$small_cut_off = 0;
$large_cut_off = $gremain_total / 2;
}
$gremain = $down_size / 2;
$infill_qty = 2;
} elseif ($gremain > $infills_max){
if ($gremain < 410) {
// cut off panels
$gremain_total = $gremain * 2;
$cut_off = $gremain_total / 6;
$small_cut_off = $cut_off;
$large_cut_off = $cut_off;
if ($cut_off < 10) {
$small_cut_off = 0;
$large_cut_off = $gremain_total / 2;
}
} elseif ($gremain > 410) {
// more panels
}
}
}
}
}
Обновлено еще раз: Правила;
Получить число (пробел) от 590 до 4500
Определите размеры панелей и заполнителей, необходимых для заполнения этого пробела, согласно приведенным ниже правилам;
Панели должны = нечетное число (кроме 2, поэтому 1, 2, 3, 5, 7, 9)
Заполнения (при необходимости) должны быть равны четному количеству и быть не более чем на 1 по количеству больше, чем количество панелей, но не = количеству панелей, если количество панелей не равно 1 или 2.
Минимальный размер панелей = 640 Максимальный размер панелей = 705
Минимальный размер заполнения = 75 Максимальный размер заполнения = 175 (есть немного места, чтобы поиграть с максимальным / минимальным заполнением, но не очень)
Итак, в основном это то, что мне нужно:
width = panel-width * panel-quantity + infill-width * infill-quantity
Я ввожу «ширину», и она выведет 4 значения; 'ширина панели, количество панелей, ширина заполнения, количество заполнения'
ниже - моя текущая (16-я) попытка, она работает до определенной степени, но как только числа начинают становиться выше 3000 или ниже 2000, все становится ужасно неправильным.
// input - 3 for adjustment
$new_width = 2515 - 3;
$un_cut = 740;
$max_size = 705;
$min_size = 640;
$infills_max = 175;
$infills_min = 75;
$cut_off = 0;
$gremain = 0;
$small_cut_off = 0;
$large_cut_off = 0;
$d1ginw = 0;
$d1ginqty = 0;
$infill_size = 0;
// see how many max size penls fit
$gpanels = floor($new_width / $max_size);
// make sure odd number
if ($gpanels < 3){
// its cool
} elseif ($gpanels % 2 == 0){
$gpanels = $gpanels - 1;
}
// get remainer
$gremain = floor($new_width - ($gpanels * $max_size));
// check if panels can be cut down alone or need infills
$infill_check = floor($gremain / ($infills_max - $infills_min));
// make sure odd number
if ($infill_check == $gpanels){
if ($gpanels < 3){
// all good
} else {
$infill_check = $infill_check - 1;
}
}
if ($infill_check > $gpanels) {
// needs infills
} elseif ($infill_check < $gpanels) {
// cut panels only
$cut_off = $gremain / ($gpanels * 2);
// make sure cut off not too small
if ($cut_off < 10) {
$small_cut_off = 0;
$large_cut_off = $gremain / 2;
} elseif ($cut_off > 65) {
// need infills too
$infill_qty = 1;
$infill_size = $gremain * $infill_qty;
if ($infill_size > $infills_max) {
$infill_qty = 2;
$infill_size = $gremain * $infill_qty;
if ($infill_size > $infills_max) {
// check how much over
}
} elseif ($infill_size < $infills_min) {
// get remainder
$left_after_infill = $gremain - ($infills_min * $infill_qty);
$infill_qty = 1;
$infill_size = $infills_min;
$cut_off = $left_after_infill / $gpanels;
if ($cut_off < 10) {
$small_cut_off = 0;
$large_cut_off = $gremain_total / 2;
}
}
}
$small_cut_off = $cut_off; // move
$large_cut_off = $cut_off; // move
}
if ($infill_size == 0) {$d1ginw = $infill_size;} else {$d1ginw = $infill_size + 35;}
$d1ginqty = $infill_qty;
$d1gsmlsize = floor(($un_cut - ($max_size + 35)) / 2 + $small_cut_off);
$d1glrgsize = floor(($un_cut - ($max_size - 5)) / 2 + $large_cut_off);
$d1gsmlqty = $gpanels - 1;
$d1glrgqty = 1;
У меня тоже возникли проблемы с пониманием этой проблемы. Какие переменные являются входными, а какие должны быть выведены? Мы просто пытаемся заполнить произвольный пробел как можно большим количеством панелей с наименьшим количеством заполнений?
Входные переменные - это промежуток, а конечный результат - количество панелей / заполнителей и их размеры, но да, конечная цель - просто заполнить промежуток панелями и заполнителями.
Все панели должны быть одинакового размера? Все заполнения должны быть одинакового размера? Учитывая ширину ($new_width), вам нужно количество панелей, размер панелей, количество заполнений и размер заполнения s.t. $new_width = $panel-qty * $panels_size + $infill_qty * $infills_size? Каким должно быть решение, если $new_width = 706?
если $ new_width = 706, то $ panel_qty = 1 * $ panel_size = 655 + $ infill_qty = 1 * $ infill_size * 50. Оптимальным для меня является сохранение меньшего размера заполнения (лучше без заполнения), но не обязательно, если все внутри указанные правила.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Каковы конкретные проблемы с кодом, который вы нам показали выше? Какой расчет работает не так, как ожидалось? На тематической странице в центр помощи говорится: «Вопросы поиск помощи по отладке («почему этот код не работает?») должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для их воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не будут полезны другим читателям. См. : Как создать минимальный воспроизводимый пример. " Вы показали нам назначенные правила и выбросили кучу кода, но без чего-то более конкретного, мы не знаем, где искать.