[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