Japt , 85 octets
97
`...`£`...`hXiU°d}R
où les deux paires de crochets représentent des chaînes de caractères imprimables et non imprimables apparemment aléatoires. Essayez-le en ligne! Production:
achinesses
boninesses
cozinesses
dozinesses
easinesses
fozinesses
gorinesses
hazinesses
ickinesses
jokinesses
keennesses
lazinesses
mazinesses
nosinesses
oozinesses
pipinesses
quadrantes
riminesses
sizinesses
tininesses
uglinesses
vainnesses
warinesses
xylotomies
yeomanries
zaninesses
Explication
La technique de base est:
97 Set U to 97
`ch
on
...`£ }R Map each line X in this multiline string to:
U°d Take U.toCharCode() and increment U. ["a", "b", "c", ...]
Xi Prepend this to X. ["ach", "bon", "c", ...]
`cozinesses`h Overwrite this onto the beginning of "cozinesses".
["achinesses", "boninesses", "cozinesses", ...]
£ }R Rejoin with newlines and implicitly output.
J'ai trouvé cozinesses
en commençant par nesses
que d'autres réponses ont utilisé et en trouvant à plusieurs reprises la lettre précédente qui apparaissait parmi la plupart des 26 lettres. Comme les techniques gourmandes ne sont pas souvent optimales, j'ai écrit plus tard un script pour trouver le vrai mot optimal:
alphabet="abcdefghijklmnopqrstuvwxyz".split``;
wordlist=alphabet.map(x=>[]);
document.body.innerText.split`\n`.slice(0,-1).map(x=>wordlist[x.charCodeAt()-97].push(x));
f=(q="",n=7,s=0,words=wordlist,z=n&&alphabet.map(x=>[x+q,words.map(y=>[y=y.filter(z=>z[n]==x),t+=0 in y][0],t=0),t]))=>n?z.filter(x=>x[2]>=Math.max(1,...z.map(x=>(x[2]-2)*2/3))).map(x=>f(x[0],n-1,s+26-x[2],x[1])).sort((a,b)=>a[1]-b[1])[0]:[q,s];
console.time("find optimal word");
console.log(f());
console.timeEnd("find optimal word");
(Je m'en fous que ce soit incroyablement moche. C'est ainsi que PPCG m'a appris à coder: P Ne vous inquiétez pas, je ne fais pas ça en production.)
Quoi qu'il en soit, lorsqu'il est exécuté dans la console du navigateur sur la liste de mots à 10 lettres , cela génère
[ "ozinesses", 57 ]
le 57
étant le nombre de lettres qui devraient apparaître dans la chaîne multiligne. Cela a également pris environ 17 secondes sur mon ordinateur, alors soyez patient lorsque vous l'exécutez.
En remplaçant la f=
ligne par
f=(q="",n=9,s=0,words=wordlist,z=n&&alphabet.map(x=>[x+q,words.map(y=>[y=y.filter(z=>z[n]==x),t+=0 in y][0],t=0),t]))=>n?[for(x of z.filter(x=>x[2]>=Math.max(1,...z.map(x=>(x[2]-2)*2/3))))for(y of f(x[0],n-1,s+26-x[2],x[1]))y].sort((a,b)=>a[1]-b[1]).filter((x,i,a)=>x[1]<=a[0][1]+20):[[q,s]];
vous pouvez obtenir tous les suffixes à moins de 20 caractères de l'optimum. (Remplacez le 20
à la fin par quelque chose d'autre pour régler cela. Remarque: cette fonction ne fonctionne probablement que dans Firefox.) Vous pouvez trouver une liste de tous les suffixes sous 100 ici. .
Quoi qu'il en soit, à partir de là, il ne reste plus qu'à trouver le mot pour chaque lettre de l'alphabet qui a le plus long suffixe en commun avec ozinesses
. J'ai écrit un script Japt pour cela, ainsi que compresser les préfixes nécessaires pour moi et me dire combien de temps le programme résultant sera. (Vous devrez cependant coller manuellement la liste de mots entre les guillemets.)
Cette explication était probablement un peu confuse, alors n'hésitez pas à poser toutes les questions que vous pourriez avoir.