Готовимся к уничтожению вопроса о foobar вызов - PullRequest
0 голосов
/ 03 мая 2020

В этом вопросе о вызове Google foobar

Подготовка к уничтожению

В качестве личного помощника Commander Lambda вам была поручена настройка осевой ориентации устройства LAMBCHOP конца света. передач. Это должно быть довольно просто - просто добавьте шестерни, чтобы создать соответствующий коэффициент вращения. Но проблема в том, что из-за компоновки LAMBCHOP и сложной системы балок и труб, поддерживающих его, штифты, которые будут поддерживать шестерни, закреплены на месте.

Инженеры LAMBCHOP предоставили вам списки, идентифицирующие размещение групп колышков вдоль различных опорных балок. Вам нужно поставить шестерёнку на каждый колышек (иначе шестерни столкнутся с незанятыми колышками). Инженеры имеют в своем арсенале множество шестерен разных размеров, поэтому вы можете выбирать шестерни любого размера, начиная с радиуса от 1 и выше. Ваша цель - создать систему, в которой последняя передача вращается с удвоенной скоростью (в оборотах в минуту или об / мин) первой передачи, независимо от направления. Каждая передача (кроме последних) прикосновений и поворачивает шестерню на следующий колышек вправо.

1009 * Учитывая список различных натуральных чисел, названных колышки, представляющие местоположение каждого колышка вдоль опорной балки, написать функцию решения (колышки), который, если есть решение, возвращает список из двух натуральных чисел a и b, представляющих числитель и знаменатель радиуса первого зубчатого колеса в его простейшей форме, чтобы достичь цели, указанной выше, такой, что radius = a / b , Отношение a / b должно быть больше или равно 1. Не все вспомогательные конфигурации обязательно будут способны создать правильный коэффициент вращения, поэтому, если задача невозможна, решение функции (колышки) должно вернуть список [-1, -1].

Например, если колышки расположены в [4, 30, 50], то первая шестерня может иметь радиус 12, вторая шестерня может иметь радиус 14, а последняя имеет радиус 6. Таким образом, последняя передача будет вращаться в два раза быстрее первой. В этом случае колышками будет [4, 30, 50], а решение (колышками) должно возвращать [12, 1].

Колышки списка будут отсортированы в порядке возрастания и будут содержать как минимум 2 и не более 20 различных положительных целых чисел, все от 1 до 10000 включительно.

Я написал этот код как решение

'''when two cogs are attached they move same distance as they are attached at one point so
x*R=y*r where R and r are radius of two cogs and x and y are ang.speed of repective cogs
so if many cogs are joined linearly by above formula it can be said that first and last cogs also have same linear speed
therefore first cog's radius is twice of last cog's radius which can also be seen in test case
let positions be a1,a2,a3,...,an and size of cogs be 2*x,y1,y2,y3,...,yn-2,x
2*x+y1=a2-a1  y1+y2=a3-a2   y2+y3=a4-a3   ...  yn-3+yn-2=an-1-an-2   yn-2+x=an-an-1
summing up we get   3*x+2*(y1+y2+...yn)=an-a1
adding second last equation and all alternate equation twice except first equation we get 
 if(n is even) 2*(y1+y2+...yn-2)=2*(an-1+an-3+an-5+...a3)-2*(an-2+an-4+an-5+...a2)
    hence 3*x=2*(an-2+...a2)-2*(an-1+...a3)+an-a1
    so 3*x=2*(an+an-2+...a2)-2*(an-1+...a3+a1)+a1-an
 if(n is odd) 4*x+2*(y1+y2+...yn-2)=2*(an-1+an-3+an-5+...a2)-2*(an-2+an-4+an-5+...a1)
   hence x=2*(an-1+an-3+an-5+...a2)-2*(an+an-2+an-4+an-5+...a1)+a1-an+2*an
so it can be genralised x=twice sum of even indexed elements-twice sum of odd indexed elements+first element-last element
where base of index is 1 and if n is even x is to be divided by 3
else add 2*an
limits of x are x>=1
in above proof it is no where proved that all cogs are of size>1
so we have to find size of all cogs and size of cogs can be determined by equations as 2*x is determined then similarly y1,y2,...yn can also be determined
if (y1,y2,..yn,x<1)then output is [-1,-1]
if not it should be 2*x,1 or 3 depending on case'''
def solution(pegs):
    n=len(pegs)
    x=pegs[0]-pegs[n-1]
    odd=0
    even=0
    for i in range(1,n+1):
        if(i%2):
            odd+=pegs[i-1]
        else:
            even+=pegs[i-1]

    x+=2*(even-odd)
    if(n%2):
        x+=2*pegs[n-1]
        last_cog=x
    else:
        last_cog=x/3.0

    cog_size=2*last_cog

    for i in range(1,n):
        if(cog_size<1):
            return [-1,-1]
        cog_size=pegs[i]-pegs[i-1]-cog_size
    if(cog_size!=last_cog or cog_size<1):  #line
        return [-1,-1]

    if(n%2):
            return [2*x,1]
    else:
        if(x%3==0):
            x=x/3
            return [2*x,1]
        else:
            return [2*x,3]

с объяснением моего кода в начале

Когда я ставлю оператор if, который находится в строке, я получаю WA, а когда нет, я получаю A C, но, согласно моему условию, условие if всегда должно быть ложным. почему я получаю разные ответы?

Я думаю, что это, вероятно, потому, что когда числа с плавающей запятой используются в арифметических c операциях, их наименее значимые значения di git меняются, но я Я не уверен.

Просьба также предложить хороший стиль кодирования и прокомментировать, является ли мой код плохо отформатированным или хорошо отформатированным

Заранее спасибо

...