[solucion] [caracas-pm] Caracas Perl Quiz #1

Cesar Mendoza mendoza at kitiara.org
Wed Feb 9 09:19:35 PST 2005


Hola,

Aquí les va mi solución al quiz.

#!/usr/bin/perl
#name: telefono.pl
#author: Cesar Mendoza <mendoza at kitiara.org>
#usage: telefono.pl /usr/share/dict/spanish

use strict;
$|++;

my %dial = (a=>2,b=>2,c=>2,d=>3,e=>3,f=>3,g=>4,h=>4,i=>4,j=>5,k=>5,l=>5,m=>6,n=>6,o=>6,p=>7,q=>7,r=>7,s=>7,t=>8,u=>8,v=>8,w=>9,x=>9,y=>9,z=>9);

my %seen;
my %result;

while (<>) #leer el archivo en @ARGV o el stdin
{
    chomp;
    tr/áéíóúñA-Z'/aeiouna-z/d; #quitar acentos y poner en minúscula

    next unless !$seen{$_}++ && /^.{5,7}$/; #evitar duplicados como amagó y amago y solo procesar palabras entre 5 y 7 letras

    my $number = join('', map { $dial{$_} } split('', $_)); #transformar la palabra en número
    if (defined $result{$number} )
    {
        #si está definido agregar al arreglo
        push @{$result{$number}}, $_;
    }
    else
    {
        $result{$number} = [$_];
    }
}

for my $number (sort {$a <=> $b} keys %result)
{
    next unless @{$result{$number}} > 1;
    print '0-800-','0'x(7-length($number)),"$number: ";
    print $_,' ' for @{$result{$number}};
    print "\n";
}

Bye
Cesar Mendoza
http://www.kitiara.org
--
"First they tell you, you're wrong and they can prove it; 
then they tell you, you're right but it isn't important; 
then they tell you, it's important but they knew it all along."
 --Charles Kettering

On Wed, Feb 09, 2005 at 10:35:29AM -0400, Ernesto Hernández-Novich wrote:
> El año pasado nos fue muy bien con la tradición de reunirnos
> periódicamente. Vamos a ver si éste año podemos introducir la tradición
> de enviar a la lista al menos un ejercicio mensual que nos permita
> ejercitarnos en cosas que no necesariamente son "del mundo real" pero
> que nos den herramientas para enfocar los problemas de manera diferente.
> 
> Se me ocurrió el nada original nombre de Caracas Perl Quiz y éste es el
> primero. Yo diría que tomemos las siguientes "reglas" para que éstos
> ejercicios sean del disfrute de todos:
> 
> 0. Sean tan creativos como quieran. Se vale usar módulos, se vale
> preguntar todo lo que se les ocurra y proponer descabelladas y novedosas
> técnicas para resolver el problema. El punto de usar Perl es divertirse,
> expresarse y resolver.
> 
> 1. Mantengamos _un_ sólo hilo raíz para el ejercicio (es decir,
> cualquier cosa relacionada con el ejercicio, que sea un Reply al mensaje
> original o alguno de los mensajes del hilo; evitar crear un mensaje
> nuevo).
> 
> 2. Cuando alguien quiera enviar una solución _completa_, ponga en el
> asunto "[solucion]". De ese modo aquellos que todavía están pensando en
> el ejercicio pero _no_ quieren "viciarse" ni quieren "pistas", pueden
> dejar de leer ese mensaje.
> 
> 3. Sería excelente dedicar algunos minutos de nuestra reunión mensual
> para hablar del Quiz y las soluciones propuestas por los participantes.
> 
> El Quiz del mes es como sigue:
> 
> Todo el mundo conoce los números 0-800-USEPERL, en los cuales se usan
> letras para facilitar la memorización del número teléfonico. Si bien el
> ejemplo que yo puse tiene dos palabras ("use" y "perl"), concentrémonos
> en aquellos números que tienen _una_ sola palabra de siete, seis o cinco
> letras, e.g. 0-800-HALLACA, 0-800-0SOLERA o 0-800-00PIZZA. Noten que el
> 0-800 y el '0' o '00' prefijos no son importantes. La pregunta es,
> ¿habrá palabras que _compartan_ el mismo número? Es decir, dada la
> palabra P1 en el diccionario, habrá otra palabra P2 que tenga el mismo
> "número telefónico".
> 
> La idea del ejercicio es escribir un programa que analice el diccionario
> de un idioma [1], se concentre en las palabras que nos interesan y
> cuando encuentre dos o más palabras que compartan el mismo número
> telefónico indique el número y _todas_ las palabras que lo comparten.
> 
> [1] En cualquier sistema GNU/Linux, en /usr/share/dict/ tienen archivos
>     con las palabras del diccionario. En Debian, pueden instalarlos con
>     apt-get install wenglish wspanish
> -- 
> Ernesto Hernández-Novich - On Linux 2.6.10 i686 - Unix: Live free or die!
> Geek by nature, Linux by choice, Debian of course.
> If you can't apt-get it, it isn't useful or doesn't exist.
> GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3
> 
> _______________________________________________
> caracas-pm mailing list
> caracas-pm at pm.org
> http://mail.pm.org/mailman/listinfo/caracas-pm



More information about the caracas-pm mailing list