En supposant A = 1, B = 2 ... Z = 26, et la valeur d'un mot est la somme de ces valeurs de lettre, il est possible de diviser certains mots en deux morceaux de sorte qu'ils aient des valeurs égales.
Par exemple, "wordsplit" peut être divisé en deux morceaux comme ceci: ordsl wpit, car o + r + d + s + l = w + p + i + t.
C'était un défi que mon professeur d'informatique nous avait lancé - c'est apparemment un vieux défi de Lionhead Studios. Je l'ai résolu en Python et posterai ma réponse sous peu.
Défi: Le programme le plus court qui peut répertorier toutes les divisions possibles qui ont des scores égaux. Notez qu'il ne doit en lister qu'un pour chaque groupe de lettres - ordsl wpit est le même que rdosl wtip, par exemple. Il est plus facile de les énumérer dans l'ordre où ils apparaissent dans le mot.
Prime:
- Si vous mettez en surbrillance des paires où les deux mots sont des mots anglais valides (ou une permutation des lettres), utilisez une liste de mots. (Cela pourrait être fait en plaçant un astérisque à côté de chaque méthode ou d'une autre, mais clarifiez-le.)
- Ajout de l'option de suppression des doublons (ce ne devrait pas être la valeur par défaut.)
- Prenant en charge plus de deux divisions, par exemple, trois, quatre ou même divisions à n.
Réponses:
Perl, 115
118123Courez avec
perl -nE '<code goes here>'
. Ce «n» est compté dans la taille du code.Repensé:
Avec des commentaires et des noms de variables:
Certaines des astuces utilisées:
1..1<<@_
couvre la même plage de bits que0..(1<<@_)-1
, mais est plus court. (notez que le fait de considérer le problème de plus loin, y compris les limites de plage plusieurs fois, n'entraînerait pas une mauvaise sortie de toute façon)64-ord$_[$_]
au lieu d'ajouter ajouteord$_[$_]-64
un caractère invisible: puisqu'il se termine par un délimiteur, il rend l'espace avantfor
inutile.cond ? var1 : var2 = new_value
.&&
et||
sont utilisées à la place des conditions appropriées.$l-$r
est plus court que$l!=$r
la source
J (109)
Sortie pour
wordsplit
:Explication:
1!:1[1
: lire une ligne de stdin([{~(i.@!A.i.)@#)
: obtenez toutes les permutations"1
: pour chaque permutation:(96-~a.&i.)
: obtenir les scores des lettres}.@(split~&.>i.@#@>)@<
: divise chaque permutation des scores à chaque espace possible, sauf avant le premier et après le dernier nombre>(>@(=/@:(+/"1&>)&.>)#[)
: voyez quelles permutations ont des moitiés correspondantes et sélectionnez-les{&a.@(96&+)&.>
: retransformez les partitions en lettres~.(/:{[)
: supprimer les variations triviales (par exempleordsl wpit
etordsl wpti
)la source
{a,bc}
est déjà trouvé, à supprimer{a,cb}
mais pas à supprimer{bc,a}
. (Et bien sûr, je ne suis pas offensé, si j'ai réellement / eu / dupliqué la réponse de quelqu'un, je le préférerais si quelqu'un le signalait.)c99 - 379 caractères nécessaires
L'approche est assez évidente. Il existe une fonction qui résume un mot selon un masque et une qui l'imprime également selon un masque. Entrée depuis l'entrée standard. Une particularité est que la routine d'impression insère des espaces pour la lettre non dans le masque. Un onglet est utilisé pour séparer les groupes.
Je ne fais aucun des objets bonus, et il n'est pas facilement converti pour les prendre en charge.
Lisible et commenté:
Validation
la source
Ruby: 125 caractères
Exemple d'exécution:
la source
Mathematica
123111Trouve tous les sous - ensembles de mots qui ont la moitié « total ascii » du mot,
d
. Trouve ensuite les compléments de ces sous-ensembles.d = "WORDSPLIT"
la source
J, 66 caractères
Utilisation des chiffres des nombres base2 pour sélectionner tous les sous-ensembles possibles.
la source
Ma solution est ci-dessous. C'est un anti-golf presque dans sa taille, mais cela fonctionne très bien. Il prend en charge les divisions à n voies (bien que le temps de calcul devienne très long pour plus de 3 divisions environ) et il prend en charge la suppression des doublons.
Exemple de sortie:
la source
Lua - 195
l'entrée doit être en majuscules:
la source
Python - 127
et ici une version n-split avec 182 octets sans doublons:
L'entrée est par exemple:
la source