Utilisateur:Romainbehar/Programmation : mots sans répétitions de lettres

Liste des mots sans répétition de lettres en français modifier

Le programme suivant liste les mots, pouvant contenir des tirets, dont les lettres sont uniques. Dans le dump du 2 mars 2018, il trouve 15 mots record de 14 lettres listés dans les curiosités linguistiques.

Le résultat montre que les tirets ne permettent pas de se hisser sur le podium et que les noms propres n’ont qu’un seul représentant : Bricklehampton.

Programme modifier

#!/usr/bin/perl -w

# trouver les mots sans répétition de lettres (en français)

use strict;
use utf8;

use MediaWiki::DumpFile::FastPages;
use Text::Unidecode;

my $pages = MediaWiki::DumpFile::FastPages->new('frwiktionary-latest-pages-articles.xml');
my $titre;
my $texte;

# lecture de toutes les pages du Wiktionnaire
while (($titre, $texte) = $pages->next) {

	# exclu si la page ne contient pas de section {{langue|fr}}
	next if (not $texte =~ /\{\{langue\|fr\}\}/m);

	# suppression des accents (transforme aussi par exemple 'œ' en 'oe')
	my $sansaccents = unidecode($titre);

	# exclu si le résultat contient autre chose que des lettres et des tirets
	next if (not $sansaccents =~ /^[A-Za-z-]+$/);

	# tout en minuscules
	my $lettres = lc $sansaccents;

	# suppression des tirets (ils ne comptent pas)
	$lettres =~ s/-//g;

	# tri des lettres dans l'ordre alphabétique en conservant les doublons
	my $lettrestriees = (join '', sort { $a cmp $b } split(//, $lettres));

	# on passe au suivant si une lettre se répète
	next if ($lettrestriees =~ /(\w)\1+/);

	# c'est bon : on affiche le nombre de lettres et le mot
	print sprintf("%3d", length($lettres)) . " $titre\n";
}