Формула количества блоков с минометом на расстоянии

Я хочу разработать формулу, которую можно будет использовать в базовом коде для следующих сценариев.

d = distance
bw = block width
mw = mortar width
b = number of blocks

сколько блоков b (или его части) находится в d, если между каждым блоком есть раствор, но в конце последнего блока может быть раствор, а может и не быть.

сценарии по формуле b = d/(bw + mw)

d = 480
bw = 230
mw = 10

b будет равно 2, это правильно.

d = 470
bw = 230
mw = 10

b будет равно 1,958, это неверно, оно все равно должно равняться 2, поскольку мне нужно знать только количество блоков.

d = 595
bw = 230
mw = 10

b будет равно 2,479, это неверно, оно должно равняться 2,5, так как мне нужно знать только количество блоков, не считая дробной части раствора.

Мне кажется, вам нужно целочисленное деление и, возможно, оператор модуля, но вам нужно пометить язык, поскольку синтаксис может различаться.

Tangentially Perpendicular 29.08.2024 03:00

Я использую ArchiCAD gdl (я добавлю тег), но немногие его используют. Рад за Visual Basic, так как я могу конвертировать.

Mark 29.08.2024 08:41

Как оно может быть равно 2,5, если нужно знать количество блоков? Означает ли 0,5 половину квартала? Если да, то почему не 0,479 блока?

k314159 29.08.2024 18:41

Я в порядке, если в ответе есть десятичная дробь. Это не обязательно должны быть целые блоки. Но 230 + 10 + 230 + 10 + 115 = 595 и имело ровно 2,5 блока, а не 2,479, как дает моя формула.

Mark 29.08.2024 23:02

Я проголосовал за повторное открытие, потому что речь определенно идет о программировании - ОП использует язык программирования GDL, который отмечен тегами, и сказал, что решение на языке программирования Basic также будет приемлемым. Существует алгоритм, участвующий в вычислении решения, и, очевидно, речь идет о программировании.

k314159 30.08.2024 18:44

Поскольку он закрыт, я не могу опубликовать ответ, но здесь вы можете найти решение на языке Basic: jdoodle.com/ia/1fxf. Нажмите кнопку «Выполнить», чтобы увидеть доказательство.

k314159 30.08.2024 19:21

На что вы хотите, чтобы был ответ d = 235? Это один кирпич плюс 5 мм раствора (так b = 1), или всегда должно быть по кирпичику с каждого конца? В последнем случае это будет 10 мм раствора посередине и 112,5 мм кирпича с каждой стороны (итак b = 0.978).

k314159 01.09.2024 12:33

спасибо @k314159. если d=235, я бы хотел, чтобы оно было равно 1.

Mark 02.09.2024 02:29

@ k314159, пропустил твой jdoodle раньше. Да, ваш код подходит для нужного мне решения, спасибо.

Mark 02.09.2024 02:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте следующую измененную формулу: b = int ((d + bw) / (bw + mw)).
. В int(X) функция int округляет до наибольшего целого числа, меньшего или равного X.

С д = 480; чб = 230; мв = 10

                      Before INT()   After INT()

(  0 + 230) / (230 + 10) = 0

( 10 + 230) / (230 + 10) = 1       \
( 20 + 230) / (230 + 10) = 1.042   |
( 30 + 230) / (230 + 10) = 1.083   |
...                                |  1 brick for d = [10,240]
(220 + 230) / (230 + 10) = 1.875   |
(230 + 230) / (230 + 10) = 1.917   |
(240 + 230) / (230 + 10) = 1.958   /

(250 + 230) / (230 + 10) = 2       \
(260 + 230) / (230 + 10) = 2.042   |
(270 + 230) / (230 + 10) = 2.083   |
...                                |  2 bricks for d = [250,480]
(460 + 230) / (230 + 10) = 2.875   |
(470 + 230) / (230 + 10) = 2.917   |
(480 + 230) / (230 + 10) = 2.958   /

(490 + 230) / (230 + 10) = 3       \
(500 + 230) / (230 + 10) = 3.042   |
(510 + 230) / (230 + 10) = 3.083   |
...                                |
(595 + 230) / (230 + 10) = 3.438   |  3 bricks for d = [490,720]
...                                |
(700 + 230) / (230 + 10) = 3.875   |
(710 + 230) / (230 + 10) = 3.917   |
(720 + 230) / (230 + 10) = 3.958   /

Чтобы определить длину последнего частичного кирпича:

PartialBrick = d - ((b - 1) * (bw + mw))

например. Для расстояния 595 (b=3) получаем 595 - ((3 - 1) * (230 + 10)), что составляет всего 115 или полкирпича. Таким образом, потратив 3 кирпича, вы фактически израсходуете 2,5 кирпича.

Оператору нужны доли блока. Просто хотят исключить воздействие миномета на финальный блок. Таким образом, d=7 b=2 m=1 должно давать 2,5, но сейчас они получают 2,333.

MatBailie 30.08.2024 16:26

Спасибо @Сеп Роланд. Наставил меня на правильный путь. Я заменил code PartialBrick = d - ((b - 1) * (bw + mw)) на code if d - (b * (bw + mw)) > 0 then final_bricks = b + (d - (b * (bw + mw))) / bw' else final_bricks = b

Mark 02.09.2024 02:20
Ответ принят как подходящий
# integer division to calculate whole blocks
whole_blocks = d // (bw + mw)

# deduct whole blocks from distance
remaining_space = d - whole_blocks * (bw + mw)

# divide remaining space by block width to get partial blocks
# if greater than 1, reset to 1 (the rest will be mortar)
# then add to whole blocks
final_blocks = whole_blocks + min(remaining_space / bw, 1)

Я не думаю, что d - whole_blocks * (bw + mw) может быть отрицательным, поэтому вам следует упростить свой код.

k314159 30.08.2024 18:02

@ k314159 Согласен, это пережиток предыдущего (неправильного) кода. Когда я изменил это, мне следовало изменить и это.

MatBailie 30.08.2024 19:37

Спасибо @MatBailie. Однако если d=235, bw=230 и mw=10. Ответ будет 1,022, поскольку он вычисляет десятичную дробь миномета, что мне не нужно. Это должно быть = 1.

Mark 02.09.2024 02:08

@mark Вы используете целочисленное деление на первом этапе? Этот ответ должен давать 0 для целых блоков, 235 для оставшегося места и 1 для последних блоков.

MatBailie 02.09.2024 06:29

@Марк, я протестировал код Мэта, и кажется, он работает так, как ты хочешь. В этом ответе используется синтаксис Python, который вы можете перевести на GDL. // — это целочисленное деление, т. е. оно округляет результат до ближайшего целого числа. Посмотрите, как он работает: onecompiler.com/python/42qyjagty

k314159 02.09.2024 10:20

@ k314159, моя вина, я понял, что это целочисленное деление, но оно было неправильно рассчитано вручную, я думаю, что это хорошее решение, спасибо вам обоим.

Mark 02.09.2024 11:08

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