Desafio da semana

79 views
Skip to first unread message

Pinguim Azul

unread,
Jul 22, 2012, 3:09:35 PM7/22/12
to pyth...@googlegroups.com
A minha solução para o desafio da semana:

import itertools

def problema(filename):
ages = {}
def parse():
it = [itertools.chain(open(filename, 'r'), itertools.repeat('', 2))] * 3
for elem in itertools.izip(*it):
name, age, _ = (i.strip() for i in elem)
if not age or not age.isdigit():
raise IOError
ages[age] = 1 + ages.get(age, 0)
yield int(age), name
persons = list(sorted(parse()))
if persons:
print persons[0][1]
print persons[-1][1]
print ages


--
Ricardo Bittencourt
http://www.ricbit.com

Isac Sandin

unread,
Aug 5, 2012, 7:55:12 PM8/5/12
to pyth...@googlegroups.com
def problema(arq):
  print arq,":"
  try:
    f = open(arq)
  except Exception as e:
    print "IOError"
    return
  
  lines = f.read().split("\n")
  if len(lines) % 3 != 0:
    print "IOError"
    return
  
  espacos = [lines[i] for i in range(2,len(lines),3) if len(lines[i]) == 0]
  if len(espacos) != len(lines) / 3:
     print "Faltam espaços em branco"
     return
  
  try:
    dados = [(int(lines[i+1]),lines[i+0]) for i in range(0,len(lines),3)]
  except ValueError as v:
    print "Problemas na leitura da idade, valor lido foi:",lines[i+1]
    return
  if len(dados) != len(lines) / 3:
    print "Par nome/idade incompleto"
    return
  
  dados.sort()
  idades = {}
  
  for i,j in dados:
    if not idades.has_key(i): idades[i] = 0
    idades[i]+=1
  
  print dados[0][1]
  print dados[-1][1]
  print idades
  f.close()
  
problema('teste0.txt')
problema('teste1.txt')
problema('teste2.txt')
problema('teste3.txt')
problema('teste4.txt')
problema('teste5.txt')
problema('exemplo1.txt')

Thiago Dias

unread,
Aug 6, 2012, 12:50:27 PM8/6/12
to pyth...@googlegroups.com
# coding:utf-8
import operator

def problema(nome_arquivo):
arquivo = open(nome_arquivo)
linhas = arquivo.read().split()
if len(linhas) == 0:
print
return
if linhas[-1].isdigit() == False:
print 'IOError'
return
idades = linhas[1::2]
pessoas = linhas[0::2]
dicionario = {}
i = 0
while i < len(pessoas):
pessoas[i] = [pessoas[i],idades[i]]
if pessoas[i][1] not in dicionario:
dicionario[pessoas[i][1]] = 1
else:
dicionario[pessoas[i][1]] = dicionario[pessoas[i][1]] + 1
i += 1
pessoas.sort(key=operator.itemgetter(1,0))

print pessoas[0][0]
print pessoas[-1][0]
print dicionario
problema('teste4.txt')
problema('teste2.txt')
problema('teste3.txt')
problema('teste1.txt')
problema('teste5.txt')

Pinguim Azul

unread,
Aug 12, 2012, 11:24:36 AM8/12/12
to pyth...@googlegroups.com
Tentem essa entrada:

Ricardo
1

Ila
11

Vinil
2

A resposta deve ser:

Ricardo
Ila
{'1': 1, '11': 1, '2': 1}

De olho acho que tem três soluções que falham nesse teste.

On Wed, Aug 8, 2012 at 6:29 PM, Genilson Israel
<genilso...@gmail.com> wrote:
> def problema(caminho):
> try:
> with open(caminho) as arquivo:
> listaPessoas = [item.split() for item in
> arquivo.read().split('\n\n')]
> except IOError:
> print 'IOError\n'
> return
>
> if [] in listaPessoas:
> print '\n'
> return
>
> if not len(listaPessoas) % 2:
> print 'IOError\n'
> return
>
> for iterador in listaPessoas:
> iterador[0], iterador[1] = iterador[1], iterador[0]
>
> listaPessoas.sort()
> idades = [idade[0] for idade in listaPessoas]
> dicionario = {}
>
> for item in set(idades):
> dicionario.update(({item:idades.count(item)}))
>
> print '{pessoa1}\n{pessoa2}'.format(pessoa1 = listaPessoas[0][1],
> pessoa2 = listaPessoas[-1][1])
> print '{dic}\n'.format(dic=dicionario)
>
>
> Em domingo, 22 de julho de 2012 16h09min35s UTC-3, Ricardo Bittencourt
> escreveu:
> --
Message has been deleted
Message has been deleted

Cássio Botaro

unread,
Aug 12, 2012, 9:47:14 PM8/12/12
to pyth...@googlegroups.com
Olá pessoal,
Prazo terminado e ranking já montado.
Gostaria de agradecer a todos a participação e avisar que mandei email pessoal mostrando as falhas que foram encontradas em seus respectivos códigos.
Parabéns a todos,tivemos resoluções muito interessantes espero contar com todos nos desafios futuros.
Deixo um convite especial aos iniciantes, para participarem pois uma solução mesmo que falhe em algum ponto..pode servir como aprendizado.
Para não ser extenso, não discuti com cada um o seu respectivo erro,mas não só eu como a comunidade estamos abertos a buscar uma solução discutindo seus erros.
Aqueles que participaram e estão com email mostrando seu erro, tragam para lista suas dúvidas caso não consigam resolver.

Vou citar então alguns erros comuns para que possamos discutir.

O  teste 6 do Rafael Bittencourt citado neste tópico poem abaixo várias lógicas.
Porque ele derrubou a todos?

Porque não lançar exceções.Problema do enunciado ou dos testes e exemplos?





 
Message has been deleted
Message has been deleted

Genilson Israel

unread,
Aug 13, 2012, 1:55:11 PM8/13/12
to pyth...@googlegroups.com
Correções:

- retirada dos tratamentos de exceção e utilização de "raise IOError"
- utilização de uma função anônima passada para o método sort() que permite ordenar idades e nomes, respectivamente, mantendo as idades como strings.
- adaptações necessárias para funcionamento com as modificações.

def problema(caminho):
    arquivo = open(caminho)
    listaPessoas = [item.split() for item in arquivo.read().split('\n\n')]
    if [] in listaPessoas:
        print '\n'
        return
    if not len(listaPessoas) % 2:
        raise IOError
    listaPessoas.sort(key=lambda tupla: (int(tupla[1]), tupla[0]))
    idades = [pessoa[1] for pessoa in listaPessoas]
    dicionario = {}
    for item in set(idades):
        dicionario.update(({item:idades.count(item)}))
    print '{pessoa1}\n{pessoa2}'.format(pessoa1 = listaPessoas[0][0], pessoa2 = listaPessoas[-1][0])
    print '{dic}\n'.format(dic=dicionario)


Em domingo, 22 de julho de 2012 16h09min35s UTC-3, Ricardo Bittencourt escreveu:
Message has been deleted

André Costa

unread,
Aug 13, 2012, 3:26:30 PM8/13/12
to pyth...@googlegroups.com
CORRIGIDO.

from operator import itemgetter

def problema(filename):
    L = []
    arq = open(filename)
    line = arq.readline()
    while line:
        nome = line.strip()
        line = arq.readline()
        if line:
            idade = int(line.strip())
        else:
            raise IOError
        L.append((nome,idade))
        line = arq.readline() #branco
        line = arq.readline() #prox nome
    if L:
        L = sorted(L, key=itemgetter(1,0))
        primeiraPessoa = L[0]
        ultimaPessoa = L[-1]
        d = {}
        for x in L:
            value = str(x[1])
            if value not in d:
                d[value] = 1
            else:
                d[value] += 1
        print primeiraPessoa[0]
        print ultimaPessoa[0]
        print d
    
    arq.close()

Em sábado, 4 de agosto de 2012 19h28min59s UTC-3, André Costa escreveu:
from operator import itemgetter

def problema(filename):
    L = []
    arq = open(filename)
    line = arq.readline()
    while line:
        nome = line.strip()
        line = arq.readline()
        if line:
            idade = int(line.strip())
        else:
            raise IOError
        L.append((nome,idade))
        line = arq.readline() #branco
        line = arq.readline() #prox nome
    if L:
        L = sorted(L, key=itemgetter(1,0))
        primeiraPessoa = L[0]
        ultimaPessoa = L[-1]
        d = {}
        for x in L:
            if x[1] not in d:
                d[x[1]] = 1
            else:
                d[x[1]] += 1
        print primeiraPessoa[0]
        print ultimaPessoa[0]
        print d
    
    arq.close()

problema('teste1.txt')
problema('teste2.txt')
problema('teste3.txt')
#problema('teste4.txt')

Francisco

unread,
Aug 14, 2012, 7:39:39 PM8/14/12
to pyth...@googlegroups.com
Correção:

#!/usr/bin/env python2.7
#coding: utf-8

import collections

def problema(arquivo):
    f = open(arquivo, 'r')

    conjunto = f.read().split('\n');
    nomes = conjunto[::3]
    idades = conjunto[1::3]
    quebras = conjunto[2::3]
   
    if len(quebras) == 0: return ## Se o arquivo estiver vazio (teste1), não processa nada

    if len(quebras) != len(idades) or '' in idades or '' in nomes:
        raise IOError

    z = zip(*sorted(zip(idades, nomes)))

    print z[1][0]
    print z[1][-1]
    print str(collections.Counter(idades)).strip('Counter()')
Reply all
Reply to author
Forward
0 new messages