Сообщение Re[3]: Детская задачка для скучающих от 05.01.2017 23:43
Изменено 05.01.2017 23:57 kov_serg
Re[3]: Детская задачка для скучающих
Здравствуйте, vdimas, Вы писали:
V>Ну да, школьная задача по геометрии.
V>Расписывать и форматировать решение облом, но понятно, что имеем 3 уравнения для 3-х неизвестных (A1, B1, D).
V>(ну или 5 уравнений для 5 неизвестных до подстановки: A2=A-A1 и B2=B-B1)
Задача из экзаменационных билетов по информатике для студентов.
Вообще-то получается всего два неравенства для одной переменной.
Делаем замену переменных
a1=d1*cos(f1)
b1=d1*sin(f1)
a2=d2*cos(f2)
b2=d2*sin(f2)
Получаем неравенство:
d2*sin(f2)*sin(a)+d2*cos(f2)*cos(a) <= d1*cos(f1)
d2*sin(f2)*cos(a)+d2*cos(f2)*sin(a) <= d1*sin(f1)
Вот код решения на скорую руку
Выдача
V>Ну да, школьная задача по геометрии.
V>Расписывать и форматировать решение облом, но понятно, что имеем 3 уравнения для 3-х неизвестных (A1, B1, D).
V>(ну или 5 уравнений для 5 неизвестных до подстановки: A2=A-A1 и B2=B-B1)
Задача из экзаменационных билетов по информатике для студентов.
Вообще-то получается всего два неравенства для одной переменной.
Делаем замену переменных
a1=d1*cos(f1)
b1=d1*sin(f1)
a2=d2*cos(f2)
b2=d2*sin(f2)
Получаем неравенство:
d2*sin(f2)*sin(a)+d2*cos(f2)*cos(a) <= d1*cos(f1)
d2*sin(f2)*cos(a)+d2*cos(f2)*sin(a) <= d1*sin(f1)
Вот код решения на скорую руку
#!/usr/bin/lua
function check_rect(a1,b1,a2,b2)
local find_angles=function (d1,a1,d2,a2)
local q1,q2,p2,r
p2=0.5*math.pi
q2=d1/d2*math.sin(a1)
r={ a2, a2+p2 }
if q2<=1 then
u1=math.acos(q2)
if r[2]<u1 then return {} end
if a2<u1 then r[1]=u1 end
end
q1=d1/d2*math.cos(a1)
if q1>1 then return {r} end
v1=math.asin(q1)
if v1>=r[1] then r={ {r[1],v1} } else r={} end
if a2+v1>=p2 then r[#r+1]={ p2-v1,a2+p2 } end
return r
end
local d1,f1,d2,f2,r
d1=math.sqrt(a1*a1+b1*b1); f1=math.atan2(a1,b1)
d2=math.sqrt(a2*a2+b2*b2); f2=math.atan2(a2,b2)
r=find_angles(d1,f1,d2,f2)
-- for k,v in pairs(r) do print(string.format('%d [%.3f, %.3f]',k,v[1],v[2])) end
return #r>0
end
function check_list(list)
for k,v in pairs(list) do
local r=check_rect(v.a1,v.b1,v.a2,v.b2) and 'possible' or 'impossible'
print(string.format("[%.3f * %.3f] <-- [%.3f * %.3f] - %s",v.a1,v.b1,v.a2,v.b2,r))
end
end
check_list
{
{ a1=2,b1=2, a2=1,b2=1 },
{ a1=1,b1=1, a2=2,b2=2 },
{ a1=5,b1=5, a2=5.5,b2=1 },
}
Выдача
[2.000 * 2.000] <-- [1.000 * 1.000] - possible
[1.000 * 1.000] <-- [2.000 * 2.000] - impossible
[5.000 * 5.000] <-- [5.500 * 1.000] - possible
Re[3]: Детская задачка для скучающих
Здравствуйте, vdimas, Вы писали:
V>Ну да, школьная задача по геометрии.
V>Расписывать и форматировать решение облом, но понятно, что имеем 3 уравнения для 3-х неизвестных (A1, B1, D).
V>(ну или 5 уравнений для 5 неизвестных до подстановки: A2=A-A1 и B2=B-B1)
Задача из экзаменационных билетов по информатике для студентов.
Вообще-то получается всего два неравенства для одной переменной.
Делаем замену переменных
a1=d1*cos(f1)
b1=d1*sin(f1)
a2=d2*cos(f2)
b2=d2*sin(f2)
Получаем неравенство:
d2*sin(f2)*sin(a)+d2*cos(f2)*cos(a) <= d1*cos(f1)
d2*sin(f2)*cos(a)+d2*cos(f2)*sin(a) <= d1*sin(f1)
Вот код решения на скорую руку
Выдача
V>Ну да, школьная задача по геометрии.
V>Расписывать и форматировать решение облом, но понятно, что имеем 3 уравнения для 3-х неизвестных (A1, B1, D).
V>(ну или 5 уравнений для 5 неизвестных до подстановки: A2=A-A1 и B2=B-B1)
Задача из экзаменационных билетов по информатике для студентов.
Вообще-то получается всего два неравенства для одной переменной.
Делаем замену переменных
a1=d1*cos(f1)
b1=d1*sin(f1)
a2=d2*cos(f2)
b2=d2*sin(f2)
Получаем неравенство:
d2*sin(f2)*sin(a)+d2*cos(f2)*cos(a) <= d1*cos(f1)
d2*sin(f2)*cos(a)+d2*cos(f2)*sin(a) <= d1*sin(f1)
Вот код решения на скорую руку
#!/usr/bin/lua
function check_rect(a1,b1,a2,b2)
local find_angles=function (d1,a1,d2,a2)
local q1,q2,p2,r
p2=0.5*math.pi
q2=d1/d2*math.sin(a1)
r={ a2, a2+p2 }
if q2<=1 then
u1=math.acos(q2)
if r[2]<u1 then return {} end
if a2<u1 then r[1]=u1 end
end
q1=d1/d2*math.cos(a1)
if q1>1 then return {r} end
v1=math.asin(q1)
if v1>=r[1] then r={ {r[1],v1} } else r={} end
if a2+v1>=p2 then r[#r+1]={ p2-v1,a2+p2 } end
return r
end
local d1,f1,d2,f2,r
d1=math.sqrt(a1*a1+b1*b1); f1=math.atan2(b1,a1)
d2=math.sqrt(a2*a2+b2*b2); f2=math.atan2(b2,a2)
r=find_angles(d1,f1,d2,f2)
-- for k,v in pairs(r) do print(string.format('%d [%.3f, %.3f]',k,v[1],v[2])) end
return #r>0
end
function check_list(list)
for k,v in pairs(list) do
local r=check_rect(v.a1,v.b1,v.a2,v.b2) and 'possible' or 'impossible'
print(string.format("[%.3f * %.3f] <-- [%.3f * %.3f] - %s",v.a1,v.b1,v.a2,v.b2,r))
end
end
check_list
{
{ a1=2,b1=2, a2=1,b2=1 },
{ a1=1,b1=1, a2=2,b2=2 },
{ a1=5,b1=5, a2=5.5,b2=1 },
}
Выдача
[2.000 * 2.000] <-- [1.000 * 1.000] - possible
[1.000 * 1.000] <-- [2.000 * 2.000] - impossible
[5.000 * 5.000] <-- [5.500 * 1.000] - possible