Recentemente tive uma dúvida: é possível escrever palavras em português cujas letras estejam em ordem alfabética? Ora, evidente que sim. Palavras como cem e foz satisfazem esta condição.

Mas qual será a maior palavra em português em essa característica? Resolvi utilizar meus conhecimentos em expressões regulares para descobrir isso.

O primeiro passo foi obter palavras em português para analisar. Encontrei listas de palavras em um site da USP e no guithub. Juntei os dois, de modo a obter um conjunto de dados bastante grande:

library(stringi)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
palavras_usp <- 
  read.csv(file = "https://www.ime.usp.br/~pf/dicios/br-utf8.txt", 
           header = FALSE) %>%
  mutate(V1 = stri_trans_general(str = V1, id = "Latin-ASCII"))

dim(palavras_usp)
## [1] 261798      1
palavras_github <- 
  read.csv("https://github.com/pythonprobr/palavras/blob/master/palavras.txt?raw=true", 
           header = FALSE) %>%
  mutate(V1 = stri_trans_general(str = V1, id = "Latin-ASCII"))

dim(palavras_github)
## [1] 320139      1
palavras <- 
  palavras_usp %>%
  bind_rows(palavras_github) %>%
  arrange(V1) %>%
  distinct()

Com a lista completa de 540523` palavras, bastou aplicar expressões regulares para filtrar aquelas me me interessam. Eu apliquei 3 filtros nesta lista de palavras:

  1. A expressão regex abaixo, que encontra apenas palavras cujas letras estejam em ordem algabética
  2. Uma segunda filtragem na qual são excluídas todas as palavras com alguma letra maiúscula, para evitar as siglas das listas de palavras que obtive
  3. Exibir apenas as palavras com 6 ou mais letras
regex <- "^a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*$"

grep(regex, palavras$V1, value = TRUE) %>%
  grep("[A-Z]", ., value = TRUE, invert = TRUE) %>%
  grep("\\w{6}", ., value = TRUE)
##  [1] "abenuz" "acenos" "acenou" "adejos" "adimos" "afilos" "afinou" "agimos"
##  [9] "beijos" "beijou" "ceemos" "chinos" "chintz" "defino" "filmou"

Desta forma, “abenuz” (variação de ébano) e “chintz” (tecido de algodão estampado) são as únicas palavras da língua portuguesa com 6 ou mais letras em que todas elas estão em ordem alfabética, sem serem verbos conjugados ou plurais.