-3
A music loop is an excerpt of music that has been composed to repeat continuously (i.e., the excerpt starts again every time it reaches the end). Loops can be scanned for example using PCM. PCM, from Pulse Code Modulation, is a technique for representing analog signals, widely used in digital audio. In this technique, the signal magnitude is sampled at regular intervals of time, and the sampled values are stored in sequence. A peak in a waveform is a value of a sample representing a local maximum or minimum, i.e., a point of inflection of the waveform.
ENTREE
The input contains several test cases. The first line of a test case contains an integer N, representing the number of samples in the music loop. The second line contains integers N, separated by spaces, representing the sequence of sample magnitudes. The end of the input is indicated by a line containing only the zero number.
EXIT
For each input test case your program must print a single line, containing only an integer, the number of spikes in the music loop.
link for this problem in the URI
To solve this problem I did this program, which works but is very slow:
while True:
n = int(input())
if n == 0:
break
loop = list(map(int, input().split())) """ criando lista a partir dos inputs """
listaSentido = [] """ lista para armazenar o sentido da onda, +1 para crescente -1 para decrescente """
for i in range(len(loop)): """ por se tratar de um loop, o ultimo elemento da lista se relaciona ao primeiro
assim, verifico se o elemento que estou analisando é o último """
if i + 1 < len(loop):
if loop[i] > loop[i + 1]: """ Sendo o valor seguinte menor, temos sentido decrescente, e adicionamos -1 """
cente = -1 """ à lista auxiliar, caso contrário, adicionamos +1 """
listaSentido.append(cente)
else:
cente = 1
listaSentido.append(cente)
else: """ quando chego ao último elemento da lista, o comparo com o primeiro """
if loop[(len(loop)-1)] > loop[0]:
listaSentido.append(-1)
else:
listaSentido.append(1)
inversao = 0 """ estabeleço um contador para monitorar a quantidade de vezes que o sentido mudou """
for i in range(len(listaSentido)): """ pois quando o sentido muda, certamente há um pondo de inflexão """
if i + 1 < len(listaSentido):
if listaSentido[i] != listaSentido[i + 1]: """ sempre cuidando para que o último elemento seja comparado com o primeiro """
inversao += 1
else:
if listaSentido[len(listaSentido)-1] != listaSentido[0]:
inversao += 1
print(inversao) """ no fim, o valor armazenado em inversão é correspondente ao número de picos (máximos e mínimos) """
Notice I review the list loop
, based on it I create a second list listaSentido
which stores the sense of the wave and only then calculate the peaks. I believe that it is not necessary to create this second list. Creating and then analyzing it takes a lot of time. But how to calculate this value from the list only loop
?
@Yoyo, solution of the question
1089
ofURI
. Running time only0.017 s
. My position at URI 12º (Carlos Silva).– Solkarped