Информация об изменениях

Сообщение 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)


Вот код решения на скорую руку
#!/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)


Вот код решения на скорую руку
#!/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