Работа с математикой в ​​php Trouble

Обновлено еще раз: См. Ниже. Если это может быть достигнуто с помощью 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;

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

Chris 14.04.2018 17:34

У меня тоже возникли проблемы с пониманием этой проблемы. Какие переменные являются входными, а какие должны быть выведены? Мы просто пытаемся заполнить произвольный пробел как можно большим количеством панелей с наименьшим количеством заполнений?

Cobra_Fast 14.04.2018 18:22

Входные переменные - это промежуток, а конечный результат - количество панелей / заполнителей и их размеры, но да, конечная цель - просто заполнить промежуток панелями и заполнителями.

Rath Baloth 14.04.2018 18:37

Все панели должны быть одинакового размера? Все заполнения должны быть одинакового размера? Учитывая ширину ($new_width), вам нужно количество панелей, размер панелей, количество заполнений и размер заполнения s.t. $new_width = $panel-qty * $panels_size + $infill_qty * $infills_size? Каким должно быть решение, если $new_width = 706?

coproc 14.04.2018 21:42

если $ new_width = 706, то $ panel_qty = 1 * $ panel_size = 655 + $ infill_qty = 1 * $ infill_size * 50. Оптимальным для меня является сохранение меньшего размера заполнения (лучше без заполнения), но не обязательно, если все внутри указанные правила.

Rath Baloth 14.04.2018 22:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
57
0

Другие вопросы по теме