Rosalind – Introduction to Set Operations

Como faz tempo que não coloco nada aqui no blog, tem um problema que resolvi a algum tempo do Rosalind, bem simples que nem coloquei aqui.

O problema é bem simples, basta realizar alguma operações de conjunto, apenas para ver como funciona.

Então a entrada é assim:

10
{1, 2, 3, 4, 5}
{2, 8, 5, 10}

O primeiro valor da primeira linha, 10 quer dizer que o espaço inteiro dos elementos é de 1 até 10. As duas linhas depois são dois conjuntos, com os elementos entre as chaves e separados por virgulas.

A partir dessa entrada a gente tem que produzir 6 conjuntos.

A \cup B , A \cap B , A - B , B - A , A^c e B^c

União e interseção e diferenças a gente usa somente os conjuntos enquanto para o complemento, a gente precisa saber todos os elementos do espaço dos conjuntos.

Podemos definir uma função para fazer as operações a partir da entrada

1
2
3
4
5
6
7
8
9
def conjuntos(n, a, b):
    return [
        a | b,
        a & b,
        a - b,
        b - a,
        set(range(1, n + 1)) - a,
        set(range(1, n + 1)) - b
    ]

E dai é so fazer o parse da entrada, que é bem simples, são sempre 3 linhas, so pegar o primeiro elemento e depois os elementos dentro das chaves, e temos que arrumar a saída também, para sair na formação que a pergunta pede. Eu usei sys.stdout.write pois achei mais fácil para formatar com ele do que com a função print do python. Essa função é o motivo do import sys no começo do arquivo.

Bem é isso ai, o script vai estar la no repositório recologia, e se eu escrevi alguma bobeira, algo errado, deixe um comentário corrigindo ou mande um e-mail e até mais.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import sys
 
def conjuntos(n, a, b):
    return [
        a | b,
        a & b,
        a - b,
        b - a,
        set(range(1, n + 1)) - a,
        set(range(1, n + 1)) - b
    ]
 
 
'''
n=10
a=set([1, 2, 3, 4, 5])
b=set([2, 8, 5, 10])
 
saida=conjuntos(n,a,b)
'''
dados=open("/home/augusto/Downloads/rosalind_seto.txt",'r').read()
 
n=int(dados[0:dados.find('\n')])
 
chave1=dados.find('{')
chave2=dados.find('{',chave1+1)
 
a=dados[chave1+1:dados.find('}')]
a=a.split(', ')
a=map(int,a)
a=set(a)
 
b=dados[chave2+1:dados.find('}',chave2)]
b=b.split(', ')
b=map(int,b)
b=set(b)
 
saida=conjuntos(n,a,b)
 
for conjunto in saida:
    conjunto=list(conjunto)
    tamanho=len(conjunto)
    print "{",
    for i in range(0,tamanho):
        if i == tamanho-1:
            sys.stdout.write("%d" % conjunto[i])
        else:
            sys.stdout.write("%d, " % conjunto[i])
    print"}"