[Rio-pm] Golf: Criando rodadas de um campeonato

Blabos de Blebe blabos em gmail.com
Quarta Julho 2 06:32:54 PDT 2008


Bem, vamo lá

Para as crianças que não tiveram infância e mataram as aulas de matemática...

my $j;  ## Numero de jogos unicos
my $t;  ## Numero de times
my $r;  ## Numero de rodadas unicas


## Cada time joga uma vez para cada adversário, e não joga contra si mesmo.
## No caso de número ímpar de times, cada time joga com seus $t-1
adversários e folga uma rodada ($t-1 + 1 -> $t);
$r = $t%2 ? $t: $t-1;


## Em cada rodada, um jogo para cada par de times.
$j = $r*$t/2;

É muito simples


2008/7/2 Gabriel Vieira <gabriel.vieira em gmail.com>:
> Corrija-me se eu estiver errado:
>
> Saída:
> ---------------------8<---------------------
> 1a Rodada:
>
>
> A              x              E
> D              x              B
>
> 2a Rodada:
>
>
> B              x              A
> E              x              C
>
> 3a Rodada:
>
>
> A              x              C
> B              x              D
>
> 4a Rodada:
>
>
> D              x              A
> C              x              E
>
> 5a Rodada:
>
>
> A              x              E
> D              x              B
>
> 6a Rodada:
>
>
> B              x              A
> E              x              C
>
> 7a Rodada:
>
>
> A              x              C
> B              x              D
>
> 8a Rodada:
>
>
> D              x              A
> C              x              E
>
> 9a Rodada:
>
>
> A              x              E
> D              x              B
>
> 10a Rodada:
>
>
> B              x              A
> E              x              C
> --------------------->8---------------------
>
>
> Está repetindo jogos. :)
>
> Deveria ser:
> ---------------------8<---------------------
>  1a  Rodada
>
> E              x               A
> D              x               B
>
>
>  2a  Rodada
>
> A              x               D
> E              x               C
>
>
>  3a  Rodada
>
> C              x               A
> B              x               E
>
>
>  4a  Rodada
>
> C              x               B
> D              x               E
>
>
>  5a  Rodada
>
> B              x               A
> D              x               C
> --------------------->8---------------------
>
> =)
>
> 2008/7/1 Fernando Oliveira <fernandocorrea em gmail.com>:
>> perl -e'@a=@ARGV;for$r(1..2*@a-2*$#a%2){print$/,$r,"a
>> Rodada:",$/x3;printf"%-15sx%15s$/", em a[$_%2?(-$_-1,$_):$_||$r%2?($_,-$_-1):(-$_-1,$_)]for
>> 0..$#a/2- em a%2;@a[1..$#a]=@a[2..$#a,1]}' A B C D E
>>
>>
>> 2008/7/1 Blabos de Blebe <blabos em gmail.com>:
>>>
>>> Na época de futebol de botão eu fazia isso na mão...
>>>
>>> 2008/7/1 Fernando Oliveira <fernandocorrea em gmail.com>:
>>> > Quem dá menos?!
>>> >
>>> > 2008/7/1 Márcio Vitor <cromo.jml em gmail.com>:
>>> >>
>>> >> Sinistro! Aqui funciona, parabéns Fernando será que alguém abaixa ?
>>> >>
>>> >> Márcio Vitor
>>> >>
>>> >> 2008/7/1 Fernando Oliveira <fernandocorrea em gmail.com>:
>>> >> > Pô... como fica mais facil qdo se deixa de preguiça e se lê a wiki!!!
>>> >> >
>>> >> > minha tacada:
>>> >> >
>>> >> > perl -e '@a=@ARGV;for(1..2*@a-2*!(@a%2)){print$/,$_,"a
>>> >> > Rodada:",$/x3;printf"%-15sx%15s$/", em a[$_, -$_-1] for
>>> >> > 0..$#a/2;@a[1..$#a]
>>> >> > =
>>> >> > @a[2..$#a,1]}' "Atltico MG" "Atltico PR" Botafogo Coritiba
>>> >> > Figueirense
>>> >> > Flamengo Fluminense Goias Gremio Internacional Ipatinga Nautico
>>> >> > Palmeiras
>>> >> > Portuguesa "Sao Paulo" Sport Vasco Vitoria
>>> >> >
>>> >> > (ignorando parada de em casa ou fora de casa...)
>>> >> >
>>> >> > 2008/7/1 Fernando Oliveira <fernandocorrea em gmail.com>:
>>> >> >>
>>> >> >> Na verdade, eu acho q tá certo... seria assim o ida e volta?
>>> >> >>
>>> >> >> 2008/7/1 Fernando Oliveira <fernandocorrea em gmail.com>:
>>> >> >>>
>>> >> >>> Agora q eu acho  q entendí!!! aquele codigo ta totalmente errado!!!
>>> >> >>>
>>> >> >>> 2008/7/1 Fernando Oliveira <fernandocorrea em gmail.com>:
>>> >> >>>>
>>> >> >>>> Eu não sei se entendí muito bem não, mas seria algo assim?
>>> >> >>>>
>>> >> >>>> perl -e '@a=@ARGV;for$r(1..$#a){push em a,shift em a;print$/,$r,"a
>>> >> >>>> rodada:",$/x3;printf"%-15s x %15s$/",$ARGV[$_],$a[$_]for
>>> >> >>>> 0..($#a/2)}'
>>> >> >>>> "Atltico MG" "Atltico PR" Botafogo Coritiba Figueirense Flamengo
>>> >> >>>> Fluminense
>>> >> >>>> Goias Gremio Internacional Ipatinga Nautico Palmeiras Portuguesa
>>> >> >>>> "Sao
>>> >> >>>> Paulo"
>>> >> >>>> Sport Vasco Vitoria
>>> >> >>>>
>>> >> >>>> 2008/7/1 Gabriel Vieira <gabriel.vieira em gmail.com>:
>>> >> >>>>>
>>> >> >>>>> Ok,
>>> >> >>>>>
>>> >> >>>>> se tiver impar cada time fica fora 1 rodada (nao tem par para
>>> >> >>>>> ele),
>>> >> >>>>> dai todos jogam entre si e o mesmo número de partidas.
>>> >> >>>>>
>>> >> >>>>> Jogos de ida e volta:
>>> >> >>>>> - Cada jogo há um mandante (o time que joga em casa e o
>>> >> >>>>> visitante).
>>> >> >>>>> - ex.: Cruzeiro e Vasco jogam em MG, logo Cruzeiro é o Mandante.
>>> >> >>>>> - O Mandante é determinado pelo 1o time do confronto (Flamengo e
>>> >> >>>>> Vitória - Flamengo é Mandante)
>>> >> >>>>> - Logo, jogos de ida e volta seria 1 jogo com o time A mandante e
>>> >> >>>>> B
>>> >> >>>>> visitante, e outro ao contrário.
>>> >> >>>>>
>>> >> >>>>>
>>> >> >>>>> No código, há 20 times e 3 times, só escolher :)
>>> >> >>>>> ---------------------->8----------------------
>>> >> >>>>> my($c,$d,$i);
>>> >> >>>>> format Rodada =
>>> >> >>>>>
>>> >> >>>>>
>>> >> >>>>> ^##@| @<<<<<<
>>> >> >>>>> $i,"a","Rodada"
>>> >> >>>>>
>>> >> >>>>> .
>>> >> >>>>> format Jogos =
>>> >> >>>>> ^<<<<<<<<<<<<  @|  @>>>>>>>>>>>>
>>> >> >>>>> $c,"x",$d
>>> >> >>>>> .
>>> >> >>>>> my em t=("Atlético MG","Atlético
>>> >> >>>>>
>>> >> >>>>>
>>> >> >>>>>
>>> >> >>>>> PR","Botafogo","Coritiba","Cruzeiro","Figueirense","Flamengo","Fluminense","Goiás","Grêmio","Internacional","Ipatinga","Náutico","Palmeiras","Portuguesa","Santos","São
>>> >> >>>>> Paulo","Sport","Vasco","Vitória");
>>> >> >>>>> my em t=("Atlético MG","Atlético PR","Botafogo");
>>> >> >>>>> my$j=($#t+1)/2;
>>> >> >>>>> my em a=@t[0..$j-1];
>>> >> >>>>> my em b=reverse em t[$j..$#t];
>>> >> >>>>> push(@a,"")if$j=~/\./;
>>> >> >>>>> for(0..$#a+$#b){
>>> >> >>>>> i(((++$i/2)=~/\./?(\@b,\@a):(\@a,\@b)));
>>> >> >>>>> @a=(shift em a,shift em b, em a);
>>> >> >>>>> push(@b,pop em a);
>>> >> >>>>> }
>>> >> >>>>> sub i{
>>> >> >>>>> $~='Rodada';
>>> >> >>>>> write;
>>> >> >>>>> my$i=-1;
>>> >> >>>>> $~='Jogos';
>>> >> >>>>> for(@{$_[0]}){
>>> >> >>>>> $c=@{$_[0]}[++$i];
>>> >> >>>>> $d=@{$_[1]}[$i];
>>> >> >>>>> write if $c and $d;
>>> >> >>>>> }
>>> >> >>>>> }
>>> >> >>>>> ----------------------8<----------------------
>>> >> >>>>>
>>> >> >>>>>
>>> >> >>>>> 2008/7/1 Fernando Oliveira <fernandocorrea em gmail.com>:
>>> >> >>>>> > Tipo, eu não sei nada de futebol, mas me diz, como fica se
>>> >> >>>>> > tiver
>>> >> >>>>> > numero
>>> >> >>>>> > impar?
>>> >> >>>>> > E como é esse negocio de jogo ida e volta?
>>> >> >>>>> >
>>> >> >>>>> > 2008/7/1 Gabriel Vieira <gabriel.vieira em gmail.com>:
>>> >> >>>>> >>
>>> >> >>>>> >> Então,
>>> >> >>>>> >>
>>> >> >>>>> >> só fiz mudar nomes de variáveis a algumas funções pra diminuir
>>> >> >>>>> >> o
>>> >> >>>>> >> código.
>>> >> >>>>> >> Como sei que o Fernando vai fazer isso em 30 caracteres, fica
>>> >> >>>>> >> só
>>> >> >>>>> >> de
>>> >> >>>>> >> tacada inicial :P
>>> >> >>>>> >>
>>> >> >>>>> >> ----------------------8<----------------------
>>> >> >>>>> >> my($c,$d,$i);
>>> >> >>>>> >> format Rodada =
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >> ^##@| @<<<<<<
>>> >> >>>>> >> $i,"a","Rodada"
>>> >> >>>>> >>
>>> >> >>>>> >> .
>>> >> >>>>> >> format Jogos =
>>> >> >>>>> >> ^<<<<<<<<<<<<  @|  @>>>>>>>>>>>>
>>> >> >>>>> >> $c,"x",$d
>>> >> >>>>> >> .
>>> >> >>>>> >> my em t=("Atlético MG","Atlético
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >> PR","Botafogo","Coritiba","Cruzeiro","Figueirense","Flamengo","Fluminense","Goiás","Grêmio","Internacional","Ipatinga","Náutico","Palmeiras","Portuguesa","Santos","São
>>> >> >>>>> >> Paulo","Sport","Vasco","Vitória");
>>> >> >>>>> >> my$j=($#t+1)/2;
>>> >> >>>>> >> my em a=@t[0..$j-1];
>>> >> >>>>> >> my em b=reverse em t[$j..$#t];
>>> >> >>>>> >> push(@a,"")if$j=~/\./;
>>> >> >>>>> >> for(0..$#t-1){
>>> >> >>>>> >> i(((++$i/2)=~/\./?(\@b,\@a):(\@a,\@b)));
>>> >> >>>>> >> @a=(shift em a,shift em b, em a);
>>> >> >>>>> >> push(@b,pop em a);
>>> >> >>>>> >> }
>>> >> >>>>> >> sub i{
>>> >> >>>>> >> $~='Rodada';
>>> >> >>>>> >> write;
>>> >> >>>>> >> my$i=-1;
>>> >> >>>>> >> $~='Jogos';
>>> >> >>>>> >> for(@{$_[0]}){
>>> >> >>>>> >> $c=@{$_[0]}[++$i];
>>> >> >>>>> >> $d=@{$_[1]}[$i];
>>> >> >>>>> >> write if $c and $d;
>>> >> >>>>> >> }
>>> >> >>>>> >> }
>>> >> >>>>> >> ---------------------->8----------------------
>>> >> >>>>> >>
>>> >> >>>>> >> Abraços,
>>> >> >>>>> >>
>>> >> >>>>> >> ---------- Forwarded message ----------
>>> >> >>>>> >> From: Gabriel Vieira <gabriel.vieira em gmail.com>
>>> >> >>>>> >> Date: 2008/7/1
>>> >> >>>>> >> Subject: Golf: Criando rodadas de um campeonato
>>> >> >>>>> >> To: Perl Mongers Rio de Janeiro <rio-pm em pm.org>
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >> Opa!
>>> >> >>>>> >>
>>> >> >>>>> >> Um colega me veio pedindo ajuda em um código para elaborar as
>>> >> >>>>> >> rodadas
>>> >> >>>>> >> de um campeonato.
>>> >> >>>>> >>
>>> >> >>>>> >> Me mostrou o seguinte link
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >> (http://pt.wikipedia.org/wiki/Torneio#Algoritmo_para_marca.C3.A7.C3.A3o_de_jogos).
>>> >> >>>>> >>
>>> >> >>>>> >> Entreguei, então pensei num golfe ;)
>>> >> >>>>> >>
>>> >> >>>>> >> Seria um programa que a partir de uma lista @times organiza um
>>> >> >>>>> >> campeonato com 1 jogo apenas entre as mesmas equipes.
>>> >> >>>>> >>
>>> >> >>>>> >> Ou caso queiram, podemos fazer um jogo de ida e outro de
>>> >> >>>>> >> volta.
>>> >> >>>>> >>
>>> >> >>>>> >> Só para ilustração:
>>> >> >>>>> >>
>>> >> >>>>> >> -----------------8<-----------------
>>> >> >>>>> >> my @times = (   "Atlético MG",
>>> >> >>>>> >>               "Botafogo",
>>> >> >>>>> >>               "Cruzeiro",
>>> >> >>>>> >>               "Flamengo",
>>> >> >>>>> >>               "Fluminense",
>>> >> >>>>> >>               "Ipatinga",
>>> >> >>>>> >>               "Palmeiras",
>>> >> >>>>> >>               "São Paulo",
>>> >> >>>>> >>               "Vasco",
>>> >> >>>>> >>               "Vitória",
>>> >> >>>>> >> );
>>> >> >>>>> >> ----------------->8-----------------
>>> >> >>>>> >>
>>> >> >>>>> >> Exemplo:
>>> >> >>>>> >>
>>> >> >>>>> >> -----------------8<-----------------
>>> >> >>>>> >> my @times = (   "Atlético MG",
>>> >> >>>>> >>               "Botafogo",
>>> >> >>>>> >>               "Cruzeiro",
>>> >> >>>>> >>               "Flamengo",
>>> >> >>>>> >> );
>>> >> >>>>> >> ----------------->8-----------------
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >> Saída:
>>> >> >>>>> >> -----------------8<-----------------
>>> >> >>>>> >>  1a  Rodada
>>> >> >>>>> >>
>>> >> >>>>> >> Flamengo        x      Atlético MG
>>> >> >>>>> >> Cruzeiro        x         Botafogo
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >>  2a  Rodada
>>> >> >>>>> >>
>>> >> >>>>> >> Atlético MG     x         Cruzeiro
>>> >> >>>>> >> Flamengo        x         Botafogo
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >>  3a  Rodada
>>> >> >>>>> >>
>>> >> >>>>> >> Botafogo        x      Atlético MG
>>> >> >>>>> >> Flamengo        x         Cruzeiro
>>> >> >>>>> >> ----------------->8-----------------
>>> >> >>>>> >>
>>> >> >>>>> >> Deu pra entender?
>>> >> >>>>> >>
>>> >> >>>>> >> Abraços!
>>> >> >>>>> >>
>>> >> >>>>> >> --
>>> >> >>>>> >> Gabriel Vieira
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >>
>>> >> >>>>> >> --
>>> >> >>>>> >> Gabriel Vieira
>>> >> >>>>> >> _______________________________________________
>>> >> >>>>> >> Rio-pm mailing list
>>> >> >>>>> >> Rio-pm em pm.org
>>> >> >>>>> >> http://mail.pm.org/mailman/listinfo/rio-pm
>>> >> >>>>> >
>>> >> >>>>> >
>>> >> >>>>> >
>>> >> >>>>> > --
>>> >> >>>>> > Just another Perl Hacker,
>>> >> >>>>> > Fernando (SmokeMachine)
>>> >> >>>>> > http://perl-e.org
>>> >> >>>>> > _______________________________________________
>>> >> >>>>> > Rio-pm mailing list
>>> >> >>>>> > Rio-pm em pm.org
>>> >> >>>>> > http://mail.pm.org/mailman/listinfo/rio-pm
>>> >> >>>>> >
>>> >> >>>>>
>>> >> >>>>>
>>> >> >>>>>
>>> >> >>>>> --
>>> >> >>>>> Gabriel Vieira
>>> >> >>>>> _______________________________________________
>>> >> >>>>> Rio-pm mailing list
>>> >> >>>>> Rio-pm em pm.org
>>> >> >>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>> >> >>>>
>>> >> >>>>
>>> >> >>>>
>>> >> >>>> --
>>> >> >>>> Just another Perl Hacker,
>>> >> >>>> Fernando (SmokeMachine)
>>> >> >>>> http://perl-e.org
>>> >> >>>
>>> >> >>>
>>> >> >>> --
>>> >> >>> Just another Perl Hacker,
>>> >> >>> Fernando (SmokeMachine)
>>> >> >>> http://perl-e.org
>>> >> >>
>>> >> >>
>>> >> >> --
>>> >> >> Just another Perl Hacker,
>>> >> >> Fernando (SmokeMachine)
>>> >> >> http://perl-e.org
>>> >> >
>>> >> >
>>> >> > --
>>> >> > Just another Perl Hacker,
>>> >> > Fernando (SmokeMachine)
>>> >> > http://perl-e.org
>>> >> > _______________________________________________
>>> >> > Rio-pm mailing list
>>> >> > Rio-pm em pm.org
>>> >> > http://mail.pm.org/mailman/listinfo/rio-pm
>>> >> >
>>> >> _______________________________________________
>>> >> Rio-pm mailing list
>>> >> Rio-pm em pm.org
>>> >> http://mail.pm.org/mailman/listinfo/rio-pm
>>> >
>>> >
>>> >
>>> > --
>>> > Just another Perl Hacker,
>>> > Fernando (SmokeMachine)
>>> > http://perl-e.org
>>> > _______________________________________________
>>> > Rio-pm mailing list
>>> > Rio-pm em pm.org
>>> > http://mail.pm.org/mailman/listinfo/rio-pm
>>> >
>>> _______________________________________________
>>> Rio-pm mailing list
>>> Rio-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>> --
>> Just another Perl Hacker,
>> Fernando (SmokeMachine)
>> http://perl-e.org
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>
>
>
> --
> Gabriel Vieira
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>


Mais detalhes sobre a lista de discussão Rio-pm