[bcn-pm] bé, aquí van els programets...
Raimon Grau
raimonster a gmail.com
div abr 17 05:04:05 PDT 2009
Hola, he fet el 21 a la meva manera (tampoc soc gaire més que un
'llama'). Intentaré explicar les diferències en el codi respecte el
teu.
#!/usr/bin/perl
use strict;
use warnings;
sub printa_rusc {
my ($f,$c) = @_;
my $first = ' - ' x $c ;
chop $first; # es carrega l'ultim caracter de la string
print $first , "\n";
my $top_line = '/ \_' x $c;
my $bottom_line = '\_/ ' x $c;
chop $top_line;
chop $bottom_line;
foreach (1..$f) {
print $top_line, "\n";
print $bottom_line, "\n";
}
}
while(<STDIN>){
printa_rusc($1,$2) if (/^(\d+) (\d+)$/); #comprovem que la entrada es valida
}
Per a rebre la entrada separada per linies, simplement utilitzant
while(<STDIN>) posa en $_ cada linia (amb el "\n" final inclos) a
cada iteracio.
Despres faig una comprovació per asegurar que a cada linia només hi
han 2 numeros separats per 1 espai.
Salut,
Rai
2009/4/17 Jordi Delgado <jdelgado a lsi.upc.edu>:
> Hola,
>
> Els enunciats els teniu a:
> http://www.lsi.upc.edu/~jdelgado/enunciats.tar.gz
>
> Es diuen P0021.ps, P0022.ps i P0023.ps
> Ho dic perque les solucions van anomenades de la
> mateixa manera.
>
> Les (meves) solucions son les que trobareu mes avall.
>
> Alguns comentaris sobre els programes:
>
> 1) els enunciats estan pensats per a que les dades es
> llegeixin des de teclat, sense que hi hagi cap format
> especific (mes enlla del que demana l'enunciat). Vull
> dir que poden estar separades per espai, salt de linia,
> etc. La idea es que es llegeixin amb 'cin >> ...' i
> aquest ja fa aquesta feina. Com que jo no conec l'equivalent
> en Perl, he fet aixo:
> local $/=undef;
> $entrada = <STDIN>;
> @entrada = split /\s+/,$entrada;
> que et deixa a @entrada les dades que un vol. Segur que es
> pot fer millor, pero un "nivell Llama" arriba on arriba ;-)
>
> 2) L'examen es un parcial, per tant nomes poden fer
> servir coneixements que els hem ensenyat fins ara.
> Aixo exclou qualsevol estructura de dades no elemental
> (excepte strings).
> Fixeu-vos que els meus programes nomes utilitzen llistes
> pel tema de l'entrada de dades. A la resta, nombres i
> strings (escalars, a Perl).
>
> 3) El parcial tenia dos torns. Uns feien el P0021 i el P0022,
> i el segon torn feia el P0023 i el P0024. No us poso el
> P0024 perque no vaig tenir temps de fer-lo. Malgrat aixo,
> demanava llegir l'entrada caracter a caracter. Aixo a Perl
> com es faria? Aixo funciona:
> chomp($line = <STDIN>);
> @chars = ($line =~ /[\+-\d]/ig);
> foreach (@chars) {
> print "$_\n";
> };
> ja que els caracters que podiem trobar a l'entrada podien
> ser nomes '-', '+' o qualsevol digit numeric.
> Estic segur, pero, que es pot fer millor.
>
> 4) Finalment, despres dels programes, trobareu uns
> fitxers de dades com a jocs de proves. Els programes
> funcionen be amb aquests fitxers (cada un amb el seu
> corresponent).
>
> I res mes. Lamento marejar-vos amb cosetes tan trivials.
> Si em deixen, ja us comentare com va anar el parcial. Vull
> dir quins van ser els resultats.
>
> Salut!
>
> Jordi
>
>
>
> ###################################
> #p0021.perl
>
> sub pinta_rusc {
> my ($f, $c) = @_;
> print ' _ ' x ($c - 1) , " _\n";
> $s = (('/ \_' x ($c - 1)) . '/ \\' . "\n" . ('\_/ ' x ($c - 1))
> . '\_/' . "\n") x $f;
> print "$s";
> }
>
> local $/=undef;
> $entrada = <STDIN>;
> @entrada = split /\s+/,$entrada;
> for($i=0; $i < @entrada; $i+=2) {
> print "\n" if $i > 0;
> &pinta_rusc($entrada[$i], $entrada[$i+1]);
> }
>
>
> ###################################
> #p0022.perl
>
> sub modifica {
> my $n = shift;
> return 0 if $n==0;
> return 1 if $n==1;
> return 8 if $n==8;
> return 6 if $n==9;
> return 9 if $n==6;
> return -1;
> }
>
> sub es_estrobogramatic {
> my $n = shift;
> my $ntmp = $n;
> my $nreves = 0;
> while (1 <= $ntmp) {
> my $v = &modifica($ntmp % 10);
> return 0 if $v < 0;
> $nreves = 10 * $nreves + $v;
> $ntmp /= 10;
> }
> return ($nreves == $n);
> }
>
> local $/=undef;
> $entrada = <STDIN>;
> @entrada = split /\s+/,$entrada;
> $senar = 0;
> foreach (@entrada) {
> chomp;
> $ho_es = 'no';
> if (&es_estrobogramatic($_)) {
> $senar += 1 if ($_ % 2);
> $ho_es = 'si';
> }
> print "$_ ", $ho_es , " es estrobogramatic\n";
> };
> print "\nestrobogramatics senars: $senar\n";
>
> ###################################
> #p0023.perl
>
> sub escriu_triangle {
> my $n = shift;
> foreach (1..$n) {
> my $espais = " " x (2*($n - $_));
> my $s = $espais . " " . ('/\ ' x ($_-1)) . '/\\' . "\n";
> $s .= $espais . ('/__\\' x $_) . "\n";
> print "$s";
> }
> }
>
> local $/=undef;
> $entrada = <STDIN>;
> @entrada = split /\s+/,$entrada;
> $primer = 1;
> foreach (@entrada) {
> if ($primer) { $primer = 0; }
> else { print "\n" if $_ > 0; };
> &escriu_triangle($_);
> };
>
> ###################################
> # Fitxer de dades dat0021.dat
> 3 4
> 1 1
> 2 1 1 2 5 5
> 1 11
>
> ###################################
> # Fitxer de dades dat0022.dat
> 1 2 8
> 11
>
> 101
> 111 1110 0
> 38 18
> 1881
> 44
> 69
> 96
> 99
> 123456789 969689696
>
> ###################################
> # Fitxer de dades dat0023.dat
> 4
> 1 -5 3 2
> 11 7
> -5
> _______________________________________________
> llista dels Barcelona-pm
> Barcelona-pm a pm.org
> http://mail.pm.org/mailman/listinfo/barcelona-pm
> BCN Perl Mongers: http://barcelona.pm.org
Més informació sobre la llista de correu Barcelona-pm