Полный и половинный цикл расчета с использованием простого массива - PullRequest
0 голосов
/ 09 апреля 2020

Моя программа принимает случайные входные данные массива, где массив имеет значения целых чисел от 0-n и букву "M", которая обозначает маркеры. На основе этого массива я должен определить, сколько циклов в массиве. Входные данные:

[M, 1,2,3,4,5,6] = один полупериод

[M, 1,2,3,4,5, 6, M] = один полный цикл

[1,2,3,4,5, M] = один полупериод

[1,2,3,4] = один полупериод

[M, 1,2,3,4] = один полупериод

[M, 1,2,3,4, M, 6] = один полный и один полупериод

[М, 1,2,3,4, М, 6,7,8, М] = Два полных цикла

[М, 1,2,3,4, М, 6, 7,8, M, M, 9] = два полных цикла и половинный цикл

Как мне написать код для такого рода логи c?

1 Ответ

0 голосов
/ 10 апреля 2020

Чтобы ответить на этот вопрос, вам нужно структурировать свои мысли. Давайте сначала возьмем ваши списки и перегруппируем их.

Сначала посмотрим на группу «Полупериод».

[M,1,2,3,4,5,6] = One half cycle
[1,2,3,4,5,M] = One half cycle
[1,2,3,4] = One half cycle
[M, 1,2,3,4] = One half cycle

Как вы видите, они имеют некоторые свойства. У них ноль или один М максимум. Этого критерия достаточно для их идентификации. Позже мы увидим, как.

У группы "один полный" есть два "М" в списке. Хотя, если буква «М» - не последняя, ​​нам нужно добавить «и один полупериод».

[M,1,2,3,4,5,6,M] = One full cycle
[M,1,2,3,4,M,6] = One Full and one halfcycle

Более двух «М» заканчивается на «Два полных». Опять же, если «М» не является последним, нам нужно добавить «с половиной цикла».

[M,1,2,3,4,M,6,7,8,M] = Two Full Cycles
[M,1,2,3,4,M,6,7,8,M,M,9] = Two Full Cycles and a half cycle

Как мы можем реализовать это? Нам нужно посчитать количество «М» в различных примерах. Учитывая список:

a=["M",1,2,3,4,5,6]

, вы можете использовать:

a.count("M")

В списке «а» он вернет 1.

Теперь для всех случаев мы Можно написать простую процедуру. Пожалуйста, прочитайте комментарии в коде.

def find_cycles(alist):
    # we define the events, half, one or two cycle
    ares=["One half cycle", "One full cycle", "Two full cycle"]
    half=" and one half cycle"
    # here we count the number of "M" in the list
    indices = alist.count("M")
    # we define a counter "r" that will be used in "ares"
    r=-1
    # zero or one "M" are the "one half cycle"
    if(indices==0 or indices==1):
        r=0
    # two "M" are the "One full cycle"
    elif(indices==2):
        r=1
    # more than two "M" are "Two full cycle"
    elif(indices>2):
        r=2

    ### BUT we need to check if there is an "halfcycle" more
    ### in the case where there are more than 1 M
    ### to do this we need to check that the last element
    ### in our array is not a "M" and we r should be different than 0
    if(alist[-1]!="M" and r!=0):
        return(ares[r]+half)
    else:
        return(ares[r])

Теперь, чтобы проверить это (обратите внимание, что M нужны кавычки):

a=["M",1,2,3,4,5,6]
b=[1,2,3,4,5,"M"]
c=[1,2,3,4]
d=["M", 1,2,3,4]
e=["M",1,2,3,4,5,6,"M"]
f=["M",1,2,3,4,"M",6]
g=["M",1,2,3,4,"M",6,7,8,"M"]
h=["M",1,2,3,4,"M",6,7,8,"M","M",9]

all_lists=[a,b,c,d,e,f,g,h]

for i in all_lists:
    print(find_cycles(i))

Вывод:

One half cycle
One half cycle
One half cycle
One half cycle
One full cycle
One full cycle and one half cycle
Two full cycle
Two full cycle and one half cycle

Помните, что это работает только для приведенного вами примера. Гораздо больше «М» все закончится в «Два полных цикла». Из вопроса неясно, хотите ли вы обобщить более двух полных циклов.

...