Pretendo ainda fazer um resumão do FISL, mas por enquanto vamos a palestra e ao Code Golf.

Durante o FISL, apresentei a palestra “Lapidando Ruby”, um estudo de boas práticas em programas Ruby e em Rails. Basicamente, uma apresentação sobre as diversas práticas que eu percebi que levavam a um código melhor. Como eu disse na apresentação, parte do estudo é que as pessoas discordem de algumas coisas que eu faço. Pela reação do pessoal, acho que muitas pessoas concordaram com a maioria do que eu falei. A apresentação está no slideshare, e está abaixo (nota, que é melhor baixar o arquivo do SlideShare, fica um pouco melhor do que a apresentação que eles colocam lá):

Uma das mensagens que acho que foi bem recebida foi a importância do código limpo. Por sinal, fiquei muito feliz em ver tantas pessoas assistindo a palestra, quem sabe o Clean Code tem chance de sobreviver.

Depois da palestra, entreguei o Code Golf. Parece um pouco estranho, porque a palestra foi sobre código limpo, e o Golf foi ganho usando um código bem sujo, mas faz parte. A idéia do Golf, promovido pelo IG, foi basicamente a seguinte: resolver 5 problemas, usando uma determinada linguagem de programação, usando o mínimo de código o possível. Por mínimo de código, eles entenderam que era para usar o mínimo de linhas, caracteres, espaços, etc (eles mediam pelo tamanho do arquivo). Então, basicamente, foram dados os seguintes problemas:

Dado o número de iterações exibir a sequência de Fibonacci até aquela iteração
Exemplo:
entrada: 6
saida: 1, 1, 2, 3, 5, 8

Este problema, eu resolvi sem recursão usando o seguinte código:

a=b=1
puts (0...gets.to_i).map {|x|x<=1?1:(a,b=b,a+b)[1]}.join ","

2) Dado uma frase retornar se é um palíndrome ou não e listar os caracteres em ordem decrescente de número de incidências na mesma
Exemplo:
entrada: “A mala nada na lama”
saída:
Palíndrome
8 a
2 m
2 n
2 l
1 d

entrada: “ig no fisl”
saída:
Não é Palíndrome
2 i
1 g
1 f
1 n
1 o
1 s
1 l

Esse foi o código que eu acho que eu poderia ter melhorado. Eu sei que alguém fez um código melhor que o meu, e acho que foi esse exemplo.

f=$*[0].downcase.gsub(' ','')
puts "#{'Não é ' if f!=f.reverse}Palíndrome"
puts f.chars.group_by{|x|x}.map{|x,y|[y.size,x]}.sort{|a,b|b[0]<=>a[0]}.map{|x|x.join ' '}

3) Dado um endereço IP e uma máscara de rede, retornar o endereço de broadcast e a conotação CIDR da rede
Exemplo:
entrada: 201.94.10.19 255.255.255.0
saída: 201.94.10.255 /24

Relativamente simples, só contei o número de 255’s no netmask e o usei no resto do código

i,m=$*
m=m.scan(/255/).size
i=i.split('.').each_with_index.map{|x,c|c<=m-1?x:255}.join('.')+"/#{m*8}"
puts i

4) Dados dois números naturais m e n e duas sequências ordenadas com m e n números inteiros, obter uma única sequência ordenada contendo todos os elementos das sequências originais sem repetição.
Sugestão: Imagine uma situação real, por exemplo, dois fichários de uma biblioteca.
Update: as duas sequencias são passadas como input e tem seus elementos separados por virgulas
Exemplo de entrada: 1,5,6,10,12 2,5,9,29

Esse foi o mais simples de todos:

a,b=$*
p (a.split(',')|b.split(',')).sort

5) Escreva uma função que recebe uma matriz de caracteres 8×8 representando um tabuleiro de xadrez e calcula o valor total das peças do jogo. Espaços vazios do tabuleiro são codificados como casas com ‘v’ e têm valor 0 (zero). O valor das demais peças é dado de acordo com a tabela:

Peça Valor
peão 1
cavalo 3
bispo 3
torre 5
rainha 10
rei 50

Tabuleiro Completo, valendo 180 pontos

tcbarbct
pppppppp
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
pppppppp
tcbarbct

Esse foi mais complexo, porque eles mudaram a regra no meio do caminho. De qualquer forma, ficou pequeno também: tudo o que eu fiz foi achatar a matriz, e buscar um por um nos elementos somando o valor dele.

s=0
STDIN.each_char{|c|s+=c=='p'?1: c=='t'?5: c=='c'||c=='b'?3: c=='r'?50: c=='a'?10:0}
p s

É isso. Depois faço um resumão do FISL, e espero participar de outras competições interessantes como esta. Pena que o iG não publicou nem os vencedores, nem a foto dos vencedores, e muito menos o código deles no blog oficial, mas faz parte. Eles não pareciam também muito organizados no próprio FISL (um código meu quase foi rejeitado porque eles rodaram no Ruby 1.8.6, ao invés do 1.8.7 como estava anunciado…)


1 Comment

Ricardo · 2010-08-04 at 19:06

Achei que em Ruby fosse usar mais caracteres. Das linguagens participantes parece a que deu os resultados mais curtos.

Faltou pensar mais nas regras mesmo, mas no final foi tranquilo. Publicamos no nosso blog os códigos em PHP e Javascript, lá tem um link também pro pessoal que fez em Java e Python 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *