[cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Fwd: Organización del ProgramaME en Valencia y Libro "Introducción a los concursos de programación" publicado bajo Creative Commons

  • From: "J. Moreno" <jmorep@xxxxxxxxx>
  • To: cfinformatica-grup@xxxxxxxxxxxxx
  • Date: Wed, 5 Feb 2014 21:02:23 +0100

Bona solució, Moisès i, finalment, el codi no resulta tant "críptic" com el
de l'anunci del ministeri sobre el cicle de DAW :-P:

http://www.youtube.com/watch?v=4tZQtU8QiiY

Posades en línia, la solució en C++ (sense POO) té uns 185 caràcters i
aquesta en Python uns 156. Una reducció més o menys del 15%.

No sé si és possible simplificar i reduir més l'algorisme. El que sí que és
possible és fer-lo tan llarg com es vulgui. Només cal començar a definir
classes abstractes, interfaces, jerarquies de classe, ... per convertir
aquest petit programa en una aplicació amb moltes línies de codi ;-).

En qualsevol cas, jo amb els alumnes intento fer que apliquin algunes
conegudes regles de sentit comú, les quals transcrit en català perquè sonin
millor :-D:

RTFM: llegeix el maleït manual
DRY: no et repeteixis
KISS: mantingues-ho senzill, ximplet.

Salutacions.

José Moreno


2014-02-05 Moisès Gómez <iesmoises@xxxxxxxxx>:

> Doncs a mi el repte del José m'ha picat prou. Finalment penso que he
> trobat la manera de fer-ho en una línia amb Python. No serà elegant ni
> eficient, i probablement força discutible, però... està expressat en una
> línia:
>
> exec 'import ast\ntry:\n\tast.literal_eval(("()"+"".join([c for c in
> raw_input() if c in
> "()"])).replace(")","),"))\n\tresp="SI"\nexcept:\n\tresp="NO"\nprint resp'
>
> Evidentment hom em podria objectar que així qualsevol programa es pot
> expressar en una línia i... bé, tindria raó :P Amb tot, no em negareu que
> fer servir l'avaluador de tuples del propi Python per resoldre el problema
> queda una mica... cool
>
> Moltes gràcies José pel repte.
>
> Per cert Joan, és molt xula la teva solució! Normalment no trobo excusa
> (segurament per falta de coneixement) per a fer servir generadors. Havia
> pensat una de semblant generant els parcials amb [ l[0:i] for i in
> range(len(l))] per evitar la solució recursiva.
>
> És una llàstima que no muntem un concurs "casolà" de programació per
> nosaltres. Aquest tipus d'exercicis permeten aprendre moltíssim.
>
>
> 2014-02-02 Joan Josep Ordinas Rosa <jordinas@xxxxxxxxxxxxxxxxxxxxxxxxxxx>:
>
> 2014-01-31 Moisès Gómez <iesmoises@xxxxxxxxx>:
>> > Jo amb Python m'he quedat amb tres, però també m'encantaria veure-ho amb
>> > una!
>> >
>> > p = [0] + [1 if c=='(' else -1 for c in raw_input() if c in '()']
>> > while len(p)>1 and p[0]>=0: p[0]+=p.pop(1)
>> > print 'SI' if p[0]==0 else 'NO'
>>
>> Variació exageradament pythonica en estil funcional (compatible amb
>> Python 2.x i 3):
>>
>> ====================
>> import sys
>>
>> def partials(it, n=0):
>>     for i in it: n += i; yield n
>>
>> p = tuple(partials(1 if c == '(' else -1 for c in sys.stdin.read() if
>> c in '()'))
>> nested = p[len(p)-1] == 0 and all((x >= 0 for x in p))
>> print('SI' if nested else 'NO')
>> ====================
>>
>> No es la versió més eficient, però serveix per mostrar diversos tipus
>> de generadors
>> i un estil altament funcional.
>>
>> JJOR
>>
>>
>

Other related posts:

  • » [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Re: [cfinformatica-grup] Fwd: Organización del ProgramaME en Valencia y Libro "Introducción a los concursos de programación" publicado bajo Creative Commons - J. Moreno