terça-feira, 17 de novembro de 2015

Teste # 1 - Especial

Pergunta 2

Uma slot-machine tem três posições, podendo aparecer um de 5 objectos diferentes em cada posição. Pretendia-se uma programa que simulasse uma jogada indicando se se ganhou (todas as posições iguais) ou se se perdeu. Esta pergunta era muito simples, tanto mais que se dava a informação relativamente ao método choice do módulo random. Assim uma solução possível seria:
01.import random
02. 
03.def slot_machine():
04.    valores = 'ABCDE'
05.    res_1 = random.choice(valores)
06.    res_2 = random.choice(valores)
07.    res_3 = random.choice(valores)
08.    if res_1 == res_2 and res_2 == res_3:
09.        return True
10.    return False
Notar que os valores possíveis são fixos e o número de posições também (igual a 3). Podemos generalizar para qualquer conjunto de objectos e qualquer número de posições. Vejamos como.
01.def slot_machine_b(valores,k):
02.    res = ''
03.    for i in range(k):
04.        res += random.choice(valores)
05.    return all_equal(res)
06. 
07.def all_equal(cadeia):
08.    conta = cadeia.count(cadeia[0])
09.    return conta == len(cadeia)
Como se observa passamos a usar um ciclo for com uma variável a fazer de acumulador. Uma variante para este caso:
1.def slot_machine_c(valores,k):
2.    ganhar = [''.join(k * [str(elem)]) for elem in valores]
3.    res = ''
4.    for i in range(k):
5.        res += random.choice(valores)
6.    return res in ganhar
Aqui usamos listas por compreensão para gerar todas as sequências de vitória, o que facilita o teste de tudo igual.

Pergunta 3

Pediam-se dois programas usando o módulo turtle. Um primeiro, que permitia desenhar uma lâmina, parametrizando a sua posição central, o tamanho dos dois braços e a orientação. O segundo, devia usar o primeiro para desenhar diferentes tipos de ventoinhas. Comecemos pelo primeiro.
01.def lamina(cent_x,cent_y,lado_1,lado_2,angulo, orient):
02.    # inicialização
03.    turtle.showturtle()
04.    turtle.penup()
05.    turtle.goto(cent_x, cent_y)
06.    turtle.setheading(orient)
07.    turtle.pendown()
08.    turtle.dot(10)
09.    # lamina superior
10.    turtle.forward(lado_2//2)
11.    turtle.lt(angulo)
12.    turtle.forward(lado_1)
13.    # recentra
14.    turtle.penup()
15.    turtle.goto(cent_x, cent_y)
16.    turtle.setheading(orient+180)
17.    turtle.pendown()
18.    # lamina inferior
19.    turtle.forward(lado_2//2)
20.    turtle.lt(angulo)
21.    turtle.forward(lado_1) 
22.    # finaliza
23.    turtle.hideturtle()
Limita-se a ser … comprido. Mas não é difícil. Os comentários dispensam mais explicações. Procure tornar o código mais sintético, por exemplo, usando um mesmo programa para desenhar as duas partes da lâmina.

Resolvida esta questão, o segundo programa é trivial.
01.def ventoinha(num, dist, cent_x,cent_y,lado_1,lado_2,angulo, orient):
02.    # inicialização
03.    turtle.showturtle()
04.    turtle.penup()
05.    turtle.goto(cent_x, cent_y)
06.    turtle.pendown()
07.    turtle.dot(10)
08.    # desenha num lâminas
09.    for i in range(num):
10.        lamina_c(cent_x,cent_y,lado_1,lado_2,angulo, orient)
11.        orient += dist

Sem comentários:

Enviar um comentário