задачка :)

Laxandra

Новичок
задачка :)

Уважаемые :)

Мой коллега прислал мне задачку - никак не получается ее решить. Помогите, плиз :)

Улитка начинает свое движение по резинке длинной 1 метр. Каждый час улитка проползает 1 см, а резинка растягивается на 5 см. Считаем, что длинна улитки не имеет значения. Достигнет ли когда-нибудь улитка другого конца резинки, и если достигнет, то через сколько часов?

Написать программу, которая вычислит ответ с любыми условиями. То есть, можно задавать расстояние, проползенное улиткой и растяжение резинки.
 

korchasa

LIMB infected
PHP:
<?php

$length = 100;
$delta = 5;
$speed = 1;
$position = 0;
$counter = 0;

while($position < $length) {
  $position += $speed;
  $new_length = $length + $delta;
  $position *= $new_length / $length;
  $length = $new_length;
  $counter++;
  echo $counter . ': ' . $position . '/' . $length . PHP_EOL;
}
?>
 

WoLFiks

Не курю...
Laxandra
1 if (резинка < улитки) 2 переменные + один while

))
)) почему-то вспомнил точно эту же задачу в школе на кружке программирования решали с условием "как можно меньше операторов, условий, циклов"....
 

Bitterman

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

zerkms

TDD infected
Команда форума
Bitterman
с какой стати :)
резинка растягивается равномерно, так что растягивание лишь увеличивает число итераций, а не делает цель недостижимой :)
 

zerkms

TDD infected
Команда форума
WoLFiks
1. подумай о задаче внимательно
2. изучи код korchasa
3. запусти этот код
 

HraKK

Мудак
Команда форума
Достигнет если резинка растягивается в противоположную сторону, а конец куда она движется зафиксирован.
 

Bitterman

Новичок
zerkms
Может я чего-то недопонял, но улитка тоже ползет равномерно, так что все зависит от того насколько растягивается резинка. Если скорость ее растягивания больше, чем скорость улитки, то цель недостижима.
Но это, собственно, детали. Я говорил о том, что приведенный код моделирует передвижение улитки и при достижении ею цели выводит накопленную информацию. Соответственно при недостижимости цели мы никакой информации не получим. ИМХО, правильнее здесь не моделировать, а расчитывать. Тем более, что, на первый взгляд, задачка для первого-второго класса церковно-приходской школы.)))
 

zerkms

TDD infected
Команда форума
Bitterman
Может я чего-то недопонял
верно, недопонял
Тем более, что, на первый взгляд, задачка для первого-второго класса церковно-приходской школы
и тем не менее ты эту задачку не решил бы :)
Если скорость ее растягивания больше, чем скорость улитки, то цель недостижима.
неправда.
1я итерация: улитка отползла на 1см, резинка растянулась, равномерно на 5 см, теперь улитка (как материальная точка), также переместилась от края на 5/100, и находится на расстоянии 1.05см от края, а ползти осталось, 103.95см...
итд
на 2875 итерации улитка достигнет конца резинки, в тот момент резинка будет длиной 14475см, а улитка проползёт 14475.126442744
 

tashkentchi

Новичок
Если подойти к делу правильно, то сначала нужно построить математическую модель:

Код:
|-----------------|---------------------------------------------|-------->
0                f(t)                                          g(t)      x

t   - время
v1  - скорость растяжения резинки
v2  - скорость улитки
g0  - первоначальная длина резинки
f0  - первоначальная координата улитки

g(t) = g0 + v1 * t

f(t) = f0 + v2 * t + v1 * \int_0^t \frac{f(s)}{g(s)} ds

Если следующее уравнение имеет решение, то улитка доползет, куда надо:

f(t)=g(t) при t>0
Чо та у мну интерес пропал :(
 

korchasa

LIMB infected
Автор оригинала: zerkms
WoLFiks
2. изучи код korchasa
Нее, не надо его изучать. Он некрасивый - в нем ряда не видно.

-~{}~ 26.03.08 13:06:

Надо было считать через изменение скорости, при постоянной длинне, тогда бы нагляднее было.

Кто перепишет? ;)
 

damner2

Новичок
PHP:
<?php 

set_time_limit(0);

$step = 3600;
$length = 100; 
$delta = 5; 
$speed = 1; 
$position = 0; 
$counter = 0; 

$time_start = time();

while ($position < $length) { 
  sleep($step);
  $position += $speed;
  $position = ($length + $delta) * $position / $length;
  $length += $delta; 
  echo date("z H:i:s", time() - $time_start).": ".$position."/".$length.PHP_EOL;
} 
?>
так более реалистично =)
 
Сверху