L'art de faire compliqué en Python

Quand on veut à tout prix utiliser les trucs pythonesques qu'on a découvert.

Connaissez-vous les « Clash of Code » ? Ce sont des petites compétitions entre membres de CodinGame, de 5 à 15 min, dont l’objectif peut varier. Certains de ces Clashs consistent à produire le code le plus court. Lors de l’un deux, votre serviteur affrontait vaillamment d’autres clashers pour produire le code le plus concis répondant à l’énoncé que voici.

On donne une chaîne de caractères en entrée. En sortie, on attend une chaîne composée des mêmes caractères dans cet ordre : premier, dernier, deuxième, avant-dernier, etc.

Bien trop impatient d’utiliser toutes les pythoneries que j’avais apprises et qu’il me tardait d’essayer, j’ai produit le code suivant.

1
2
a = input()
print(''.join(list((''.join((i, j)) for i, j in zip(a, reversed(a)))))[:len(a)])

Détaillons.

1
zip(a, reversed(a))

Nous créons ici un générateur qui associe la première et la dernière lettre, puis la deuxième et l’avant-dernière, etc jusqu’à la dernière avec la première.

1
list((''.join((i, j)) for i, j in zip(a, reversed(a))))

Maintenant, nous créons une liste de chaîne de caractères, chaque chaîne étant le résultat de la concaténation de i et j.

1
''.join(list((''.join((i, j)) for i, j in zip(a, reversed(a)))))

Le second join sert à passer d’une liste de chaînes à une chaîne unique. Ne reste plus qu’à afficher tous les caractères de 0 jusqu’à len(a), d’où le code présenté au début.

Et pourtant, je fus défait par un membre qui eut l’idée d’écrire un code bien plus simple que le mien et par là, bien plus court (j’ai volontairement aéré le code.

1
2
3
4
5
6
a = input()
s = ''
while a:
    s += a[0]
    a = a[1:][::-1]
print(s)

Rien d’étonnant donc si je vous annonce que la première place ne m’est pas échue.

Conclusion

  • Simple is better than complex.
  • Venez faire des « Clashs of Code », c’est amusant et ça dérouille pour commencer la journée.
  • N’essayez pas de faire le code le plus cours en Java1, vous perdrez toujours face à Ruby, Python ou JS. Non vraiment j’insiste, c’est une très mauvaise idée. Vraiment.

  1. Je vous assure, certains tentent vraiment le coup ! 



7 commentaires

N’essayez pas de faire le code le plus cours en Java, vous perdrez toujours face à Ruby, Python ou JS. Non vraiment j’insiste, c’est une très mauvaise idée. Vraiment.

Faites aussi attention au Bash (bon, c’est pas le plus optimal en général, mais sur certains, je bats assez facilement du Python :D ).

Et je connais un adepte de la tasse à café. Mais rien que ses en-têtes sont plus long que le code des participants utilisant du Python ou du Ruby :’)

+1 -0

Arf :s

Le C on part trop de rien pour gagner à ce petit jeu :

1
2
#include<stdio.h>
main(){char a[100],*b=gets(a),*c=a+strlen(a)-1;while(b<c)printf("%c%c",*b++,*c--);b==c?putchar(*b):0;}

Haskell est déjà plus sympa pour ça :D :

1
2
3
f[]=[]
f(h:t)=h:(f$reverse t)
main=getLine>>=putStr.f
+3 -0

@informaticienzero: Note que ton code pourrait être nettement plus court quasiment sans rien changer (-26 caractères) :

1
print(''.join(i+j for i,j in zip(a,a[::-1]))[:len(a)])

Après, l’autre code est toujours plus court, mais voici une proposition encore plus courte (-4), basée sur la même idée en plus tordu:

1
2
3
4
5
6
a=input()
s=''
while a:
 *a,h=a[::-1]
 s+=h
print(s)
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte