Monday Mini-Golf: Une série de courts défis de golf à code , affichés (espérons-le!) Tous les lundis.
(Désolé celui-ci est un peu en retard.)
Je suis sûr que la plupart d'entre vous ont entendu parler de la distance de Levenshtein , un algorithme pour calculer la distance entre deux chaînes. Eh bien, ce défi consiste à implémenter un algorithme similaire de ma propre invention *, appelé distance anagramme . La principale différence est que l'ordre des caractères n'a pas d'importance; au lieu de cela, seuls les caractères uniques à une chaîne ou à l'autre sont mesurés.
Défi
Le but du défi est d'écrire un programme ou une fonction qui prend deux chaînes et renvoie la distance entre elles entre les anagrammes. La principale façon de procéder consiste à utiliser la logique suivante:
- Convertissez les deux chaînes en minuscules et (facultativement) triez les caractères de chacun par ordre alphabétique.
- Bien que les chaînes contiennent au moins un caractère égal, supprimez la première instance de ce caractère de chaque chaîne.
- Ajoutez les longueurs des chaînes restantes et retournez / sortez le résultat.
Exemple
Si les entrées sont:
Hello, world!
Code golf!
Ensuite, en minuscules et triés, ceux-ci deviennent: (par le tri par défaut de JS; notez les espaces de tête)
!,dehllloorw
!cdefgloo
En supprimant tous les caractères des deux chaînes, nous nous retrouvons avec:
,hllrw
cfg
Ainsi, la distance anagramme entre les deux chaînes originales = 6 + 3 = 9.
Détails
- Les chaînes peuvent être prises dans n'importe quel format raisonnable.
- Les chaînes seront uniquement constituées d'ASCII imprimables.
- Les chaînes elles-mêmes ne contiendront aucun espace autre que des espaces réguliers. (Pas d'onglets, de nouvelles lignes, etc.)
- Vous n'avez pas besoin d'utiliser cet algorithme exact, tant que les résultats sont les mêmes.
Cas de test
Entrée 1:
Hello, world!
Code golf!
Sortie 1:
9
Entrée 2:
12345 This is some text.
.txet emos si sihT 54321
Sortie 2:
0
Entrée 3:
All unique characters here!
Bdfgjkmopvwxyz?
Sortie 3:
42
Entrée 4:
This is not exactly like Levenshtein distance,
but you'll notice it is quite similar.
Sortie 4:
30
Entrée 5:
all lowercase.
ALL UPPERCASE!
Résultat 5:
8
Notation
Il s'agit de code-golf , donc le code valide le plus court en octets l'emporte. Tiebreaker passe à la soumission qui a atteint son nombre d'octets final en premier. Le gagnant sera choisi lundi 12 octobre prochain. Bonne chance!
Edit: Félicitations au gagnant, @isaacg, en utilisant (à nouveau) Pyth pour un incroyable 12 octets!
* Si cet algorithme a été utilisé ailleurs et / ou a reçu un autre nom, veuillez me le faire savoir! Je n'ai pas pu le trouver avec une recherche de 20 minutes.
Réponses:
Pyth, 12 octets
Suite de tests
L'opération en question est équivalente à l'opérateur de soustraction par sac de Pyth
.-
, appliqué dans les deux directions. Vous pourriez l'appeler bagwise xor, je suppose.La solution est:
.z
: obtenir une entrée sous forme de liste de 2 chaînes.rR0
: convertit les deux en minuscules..p
: Forme toutes les permutations, c'est-à-dire normales et inversées..-M
: Mappez l'.-
opération sur chaque commande.s
: Concaténer les résultats.l
: Imprimer la longueur.la source
JavaScript (ES7), 92 octets
Définit une fonction anonyme.
Pour tester, exécutez l'extrait ci-dessous. Vous pouvez modifier le code et cliquer sur «Test» pour comparer sa sortie avec l'original. (Laissez un commentaire si vous trouvez une amélioration!) L'entrée est comme
"Hello, world!", "Code golf!"
dans la zone de saisie.Merci à @ETHproductions pour avoir économisé 6 octets!
En savoir plus sur la suite de tests
Comment ça marche
la source
.join("")+b
avec.join``+b
sans effet.CJam,
2319 octetsEssayez-le en ligne dans l' interpréteur CJam .
Comment ça marche
la source
Rubis, 62
Il doit y avoir une meilleure façon.
Edit: 57 caractères grâce à iamnotmaynard enquêtant sur un chemin que j'étais trop paresseux.
la source
sub
peut prendre des chaînes. Ne pourriez-vous pas utiliser à lac.downcase
place de/#{Regexp.escape c}/i
?Python,
9087818079 octetsVersion Python <3.5, 80 octets
Explication
Pour chaque caractère dans a ou b, comptez le nombre d'occurrences dans chaque chaîne et ajoutez la différence (positive).
Edit: relisez les règles, les fonctions anonymes réalisées sont acceptables, réponse améliorée en supprimant raw_input. Premier golf, soyez doux!
Merci à sp3000 pour l'amélioration de la redéfinition de str.lower et pour me faire réaliser que l'impression n'était pas nécessaire. Espaces également. Encore à apprendre.
En utilisant python> = 3.5, il existe un moyen plus court de définir des ensembles, donc un octet peut être enregistré par rapport aux versions précédentes.
la source
Rétine,
4020 octets20 octets économisés grâce à Martin Büttner.
Placez chaque ligne dans son propre fichier et remplacez la
\n
par une nouvelle ligne littérale.la source
pb , 648 octets
Prend la saisie avec un caractère de tabulation séparant les deux chaînes.
Celui-ci était un doozy. En fait, la mise en œuvre de l'algorithme n'était pas la partie difficile, cela est venu assez facilement. Mais j'ai dû faire deux choses qui sont difficiles à faire en pb: Insensibilité à la casse et itoa. Il se trouve que j'avais un programme de conversion en minuscules qui traîne (lui-même 211 octets de long) et tout le reste a été cloué à la fin pour faire le travail spécifiquement pour ce défi.
Vous pouvez regarder ce programme exécuté sur YouTube! Il y a quelques choses que vous devez garder à l'esprit si vous le faites:
chr(-1)
bloque l'interpréteur lors de l'exécution en mode veille.Hello, world!
etCode golf.
. Ceci est légèrement différent de l'un des exemples d'intrants du défi; Je l'ai utilisé parce qu'il était court mais je l'ai modifié pour que la sortie correcte soit 10 au lieu de 9. C'est juste pour montrer que le numéro est imprimé correctement même s'il s'agit de plusieurs chiffres, ce qui est difficile en pb.chr(10)
n'est pas géré correctement les rend largement inutiles ici. Cela étant dit, je pense que c'est presque assez beau à regarder. C'est un énorme gâchis de code horrible interprétant un autre code horrible, des morceaux se décomposant devant vos yeux, et pourtant tout fonctionne juste assez pour obtenir la bonne réponse. Il semble que les ordures soient imprimées, mais si vous regardez assez attentivement avec la connaissance de la source, vous pouvez comprendre ce qu'il fait et pourquoi à tout moment. Je me sens comme Cypher quand je regarde cette vidéo:I... I don’t even see the code. All I see is blonde, brunette, red-head.
Sans plus tarder, voici le code non golfé.
la source
C ++ 199 octets
Utilise un tableau pour stocker le nombre de chaque caractère dans la première chaîne, minis le nombre dans la deuxième chaîne. Ensuite, il trouve la somme des valeurs absolues des éléments du tableau: c'est la distance.
Golfé:
Non golfé:
la source
PowerShell, 79 octets
Presque le même code exact que ma réponse sur Anagram Code Golf ... mais ... Je reçois un comportement étrange si je coupe juste la
-eq0
réponse, donc j'ai fini par devoir explicitement.ToLower()
et refondre en dehors de laparam
déclaration. +Explication également (principalement) copiée à partir de cette réponse - Prend les deux entrées de chaîne, les rend en minuscules et les retransmet en tant que tableaux de caractères. La
diff
fonction (un alias pourCompare-Object
) prend les deux tableaux et renvoie des éléments différents entre les deux. Nous tirons parti de cela en recréant le retour sous forme de tableau avec()
, puis en vérifiant sa longueur.+ Par exemple, j'obtenais de faux résultats avec
param([char[]]$a,[char[]]$b)(diff $a $b).length
leall lowercase.
/ALL UPPERCASE!
test. Si je séparais manuellement les tableaux (par exemple, courais(diff ('a','l','l'...
), cela fonctionnait bien, mais échouait à chaque fois qu'il y avait un chevauchement majuscule / minuscule avec le casting. Tout ce que je peux lire sur la documentationdiff
est insensible à la casse par défaut, alors ... hausser les épaules ???la source
Bash,
6867 octetsJe pense que cela fonctionne. Notez l'espace de fin sur la deuxième ligne.
Cas de test
la source
Perl,
5246 octets + 3 commutateurs (a, F, n) =5549 octetsPrend l'entrée de STDIN avec les chaînes d'entrée dans leurs propres lignes, terminées par EOF.
Commutateurs:
Code:
la source
Utilitaires Bash + GNU, 53
sed
se transforme en minuscules et divise la chaîne en lignes poursort
. Comme nous devons le faire deux fois, je l'ai mis dans une fonction.comm3 -3
filtre les lignes pertinentes etwc -l
produit le nombre.L'entrée se fait via
STDIN
; puisque deux commandes sont lues séquentiellement, vous devez envoyerEOF
(Ctrl-D) deux fois, entre les chaînes et à la fin. Remplace le fichier1
, le cas échéant.la source
Matlab, 91 octets
Essayez-le en ligne .
Cela fonctionne comme suit:
la source
Gelée , 6 octets
Essayez-le en ligne!
la source
F #,
134126 octetsExplication :
a
etb
séparément.Réduisez chaque groupe avec l'
-
opérateur, ce qui a l'effet suivant:Additionnez la valeur absolue des valeurs de l'étape précédente.
la source
Scala ,
13481 octetsMerci @ ASCII uniquement pour leur travail.
Essayez-le en ligne!
la source