PDA

View Full Version : Задачка Эйнштейна


matematik
16-01-2006, 00:15
Решена.
Спасибо.
А как Вам Сахаровская задачка?
Из пункта А в одном направлении двигаются Мальчик со скоростью 7 км/ч и Девочка со скоростью 5км/ч,
между ними постоянно бегает Собачка со скоростью 11 км/ч.
Определить расстояние от п.А до собачки по прошествии 2 часов?

Wisper
16-01-2006, 00:17
Пошукай по форуму, эта загадка уже была. И по моему 98% ее разгадали.:)

tigrazoid
16-01-2006, 00:18
Было уже.
Не далее, как в прошлом году.

matematik
16-01-2006, 00:37
Было.

Еще раз спасибо.
А теперь?

hrjusha
16-01-2006, 00:44
12км (погрешност +/-2км), если собачка конечно не сдохла от такой беготни ранше чем через 2 часа

TOR
17-01-2006, 10:57
11.76 km. Pravilno?

matematik
17-01-2006, 12:35
11.76 km. Pravilno?
По-моему - это ОДИН ИЗ возможных ответов

spb_kostya
17-01-2006, 14:15
Я тоже предложу свой вариант ответа - 13,89 км.

только не спрашивайте как я его получил :-)))

интересно, а какой ответ правильный?

Elki-Palki
17-01-2006, 14:41
10000...14000 м
Ё!

Kaktus
17-01-2006, 15:07
Вот прикинусь школьником и выдам...
У собачки в начальный момент неопределенность скорости, точнее, ее направления. Поэтому самый правильный ответ у Хрюши и у Елок с Палками :).
Можно пойти с другого бока: А пусть через 2 часа собачка будет в любой точке между 10 и 14 км, и это кино мы будем мотать назад. Человеки и собачка побегут задом наперед. Как бы собачка ни бегала, она окажется в пункте А.

Угадал?

zuber
17-01-2006, 15:59
У меня получается 10.467 км , надо проверить еше, правда.

П.С. да... проверка говорит, что собака пробежала 21.997 км :)

Канарейка
17-01-2006, 16:04
"Гринписа" на вас нету! Натравлю общество защиты животных и Брибжит Бардо в частности! Так собачку мучать, изверги!

Канарейка
17-01-2006, 16:05
А мальчик когда вышел? Дня на три раньше девочки? Ну и участь у собачки...

zuber
17-01-2006, 16:09
/* U popa byla sobaka
* created by Zuber
*/

#include <stdlib.h>
#include <stdio.h>

#define BOY_SPEED 7.0
#define GIRL_SPEED 5.0
#define DOG_SPEED 11.0
// step is one second
#define TIMER_STEP 1
// 2 hours
#define TIME_UNITS 60*60
#define MAX_TIME 2 * TIME_UNITS

#define TO_BOY 1
#define TO_GIRL 2

int main(void){

int timer;
double boy_pos = 0.0;
double girl_pos = 0.0;
double dog_pos = 0.0;
int dog_runs_to = TO_GIRL;

double tmp_distance;
double distance_to_run;
double part_distance_to_run;

// report counters
int total_oscillations;
double total_trek = 0.0;


for(timer = 0; timer < MAX_TIME; timer ++){
if( boy_pos != girl_pos ){ // only if not at the same place

// NOTE, girl_pos is always less then a boy pos due to speed diff
tmp_distance = boy_pos - girl_pos;

// NOTE: since we have a somewhat descreet values, there could be small glitches in the beginning,
// when dog is actually catching up with the girl
distance_to_run = DOG_SPEED/((double)TIME_UNITS);
total_trek = total_trek + distance_to_run;

while(distance_to_run != 0){
switch(dog_runs_to){
case TO_BOY:
part_distance_to_run = boy_pos - dog_pos;
if( part_distance_to_run < 0){
printf("BUG! Dog is infront! \n");
exit(0);
}else if( part_distance_to_run == 0 ){
// same position, dog reverses
dog_runs_to = TO_GIRL;
total_oscillations++;
}else{
if(distance_to_run <= part_distance_to_run){
dog_pos = dog_pos + distance_to_run;
distance_to_run = 0.0;
}else{
dog_pos = boy_pos;
distance_to_run = distance_to_run - part_distance_to_run;
}
} // end of if(part_distance_to_run)
break; // TO_BOY
case TO_GIRL:

part_distance_to_run = dog_pos - girl_pos;
if( part_distance_to_run < 0){
// starting feature... have to catch up
dog_pos = girl_pos;
distance_to_run = distance_to_run - part_distance_to_run;
break;
}else if( part_distance_to_run == 0 ){
// same position, dog reverses
dog_runs_to = TO_BOY;
total_oscillations++;
}else{
if(distance_to_run <= part_distance_to_run){
dog_pos = dog_pos - distance_to_run;
distance_to_run = 0.0;
}else{
dog_pos = girl_pos;
distance_to_run = distance_to_run - part_distance_to_run;
}
} // end of if(part_distance_to_run)
break; // TO_GIRL
default:
printf("BUG! Nowhere to RUN! \n");
exit(0);
}
}
} // end if boy != girl

boy_pos = boy_pos + BOY_SPEED/((double)TIME_UNITS);
girl_pos = girl_pos + GIRL_SPEED/((double)TIME_UNITS);
} // end timer loop

// PRINTING RESULTS
printf("Resulting positions (in km)\n");
printf("Boy: %2.3f\n", boy_pos);
printf("Girl: %2.3f\n", girl_pos);
printf("Dog: %2.3f\n", dog_pos);
printf("Total DOG travel: %2.3f\n",total_trek);
printf("Total oscillations: %d\n", total_oscillations);

return 0;
}

ank
17-01-2006, 16:26
Человеки и собачка побегут задом наперед. Как бы собачка ни бегала, она окажется в пункте А.

Угадал?
Вот что значит фундаментальное образование!
Уважаю!

Kaktus
17-01-2006, 17:27
Zuber
Ехидное замечание с места. Время свободного пробега собачки должно быть много больше шага таймера (поначалу это не выполняется). Иначе направление бега собачки можно и не угадать. Вот если бы собачка выскочила из своей будки с задержкой, типа спохватилась. Вот тогда можно и программулю нкаваять. А так, какая-то неопределенность получается, как у Гейзенберга. Непонятно, в какую сторону собачка бежит, расстояние-то между человеками 0, приходится в препятствие утыкаться

zuber
17-01-2006, 17:35
Зубер
Ехидное замечание с места. Время свободного пробега собачки должно быть много больше шага таймера (поначалу это не выполняется). Иначе направление бега собачки можно и не угадать. Вот если бы собачка выскочила из своей будки с задержкой, типа спохватилась. Вот тогда можно и программулю нкаваять. А так, какая-то неопределенность получается, как у Гейзенберга. Непонятно, в какую сторону собачка бежит, расстояние-то между человеками 0, приходится в препятствие утыкаться

А в программе первый шаг собачки пропушен. Она начинает бегать только через секунду. Что приводит к тому, что в какой-то момент она может догонять девочку. (тама в коментах сказанно). Что, впрочем не сильно влияет на определение местоположения собачки, т.к. при шаге времени стремяшимся к нулю, погрешность стремится к нулю. Через одну секунду, мальчик и девочка будут на расстоянии 56 сантиметров друг от друга. ;) Думаю, мой результат +- 1 метр.

Kaktus
17-01-2006, 18:32
Извиняюсь, сразу в твой код не врубился, да и не силен. Так вот что такое catch up :) Подозревал, что ты кого-то придерживаешь. Я что подозреваю. Погрешность-то поначалу к нулю стремится, но потом-то погрешность накапливается. А существует ли предел? Смена направления бега собачки будет сильно в другие моменты времени. Собачка-то свои километры набегает...
Предлагаю собачку придержать на 100 микросекунд секунд, отсчитывать микросекунды, а потом сокращать время придерживания собачки и смотреть, к чему это дело стремится.

zuber
17-01-2006, 19:14
Извиняюсь, сразу в твой код не врубился, да и не силен. Так вот что такое цатч уп :) Подозревал, что ты кого-то придерживаешь. Я что подозреваю. Погрешность-то поначалу к нулю стремится, но потом-то погрешность накапливается. А существует ли предел? Смена направления бега собачки будет сильно в другие моменты времени. Собачка-то свои километры набегает...
Предлагаю собачку придержать на 100 микросекунд секунд, отсчитывать микросекунды, а потом сокращать время придерживания собачки и смотреть, к чему это дело стремится.

Ого... очень интересные результаты. Взависимости от временного шага, при 10 микросекундах собака будет в 11.622. При 1 микросекунде, собака будет в 10.576

Kaktus
17-01-2006, 19:30
Как бы не оказалось, что предела не существует. Какой-нибудь sin(1/x), x-->0. Бывает же такое

zuber
17-01-2006, 19:40
Да, но, практически, данный результат программы означает, что без аналитечиского решения через формулу предела точное местоположение определить крайне сложно.

Kaktus
17-01-2006, 19:41
А ты сперва докажи, что предел существует

ank
17-01-2006, 19:47
zuber,
есть такие понятия "устойчивое решение" и "неустойчивое решение". Вполне применимы к численным методам решений, в частности к этому.