Déterminer si les chaînes sont des anagrammes

85

Défi

Si vous avez deux chaînes, déterminez si elles contiennent exactement les mêmes caractères.

Exemple

Contribution

mot, wrdo

Cela retourne trueparce qu'ils sont identiques mais simplement brouillés.

Contribution

mot, wwro

Cela revient false.

Contribution

bateau, toba

Cela retourne true

Règles

Voici les règles!

  • Supposons que la longueur d'entrée soit d'au moins 1 caractère et d'au plus 8 caractères.
  • Pas de caractères spéciaux, seulement a-z
  • On peut supposer que toutes les entrées sont en minuscules

Cas de test

boat, boat = true
toab, boat = true
oabt, toab = true
a, aa = false
zzz, zzzzzzzz = false
zyyyzzzz, yyzzzzzy = true
sleepy, pyels = false
p,p = true
Tom Gullen
la source
10
9 réponses en 13 vues ... wow!
Tom Gullen
@Tom, parce que tout le monde voulait prouver que votre commentaire sur l'utilisation d'un entier 64 bits allait dans la mauvaise direction: P
Peter Taylor
5
Demande du titre: Cod Elf, Go!
5
"Falcon Rage, deviens fou!"
Geobits
7
Ma suggestion de nom: "sont-ils des anagrammes" → "gérer les tableaux"
Esolanging Fruit

Réponses:

39

Python, 32 octets

f=lambda a,b,S=sorted:S(a)==S(b)
gnibbler
la source
3
@Debanjan, c'est exactement la même chose que def f(a,b):return sorted(a)==sorted(b)le compromis est que vous devez remplacer def + return par lambda en échange de ne pas utiliser de déclarations
gnibbler
1
@Debanjan, je pense que cela ne vous sauve qu'un seul personnage. J'ai utilisé une variante ici, mais elle a la même longueur que la vôtre, car
j'échange
4
@ Thomas, un non-sens. La question ne précise pas le programme complet, donc soit une fonction ou d' un programme complet sont acceptables.
Gnibbler
2
@Tomas, La majorité des réponses ici ne répondent pas à vos critères. Pourquoi ne pas donner un upvote à tous ceux qui le font?
Gnibbler
4
@ Thomas, ce n'est pas un abus de règle. Certaines questions sont délibérément ouvertes comme celle-ci. Comparez avec une question bien spécifiée comme celle-ci . Si vous ne souhaitez pas que ces réponses se plaindre à la question asker
gnibbler
27

Golfscript, 3 caractères?

$$=

usage:

'boat'$'baot'$=
1

'toab'$'boat'$=
1

'oabt'$'toab'$=
1

'a'$'aa'$=
0

'zzz'$'zzzzzzzz'$=
0

'zyyyzzzz'$'yyzzzzzy'$=
1

'sleepy'$'pyels'$=
0

'p'$'p'$=
1
TOI
la source
23
C'est une interprétation intéressante de la façon de fournir l'entrée :)
gnibbler
4
Explication s'il vous plaît :(
st0le
10
@ st0le, sérieusement? Je ne connais pas golfscript, mais c'est évidemment $ (trier), $ (trier), = (comparer)
Peter Taylor
11
Est-ce pas tricher un peu? Je veux dire, ce n'est pas une entrée variable. Il doit être codé en dur. Dans tous les cas, j'ajouterais 4 au nombre de caractères pour les caractères quote ( ').
Thomas Eding
6
Ce n'est pas valide par nos règles actuelles. Vous pouvez toutefois le remplacer par la fonction 4 octets de @ JanDvorak, qui accepterait la saisie via un format de saisie valide .
Bouton de porte
20

J, 8

-:&(/:~)

Littéralement, match ( -:) sur ( &) trier ( /:~)

Exemple d'utilisation:

   'boat' -:&(/:~) 'boat'
1
   'toab' -:&(/:~) 'boat'
1
   'oabt' -:&(/:~) 'toab'
1
   'a' -:&(/:~) 'aa'
0
   'zzz' -:&(/:~) 'zzzzzzzz'
0
   'zyyyzzzz' -:&(/:~) 'yyzzzzzy'
1
   'sleepy' -:&(/:~) 'pyels'
0
   'p' -:&(/:~) 'p'
1

Où entrent les entiers 64 bits?

JB
la source
N'est-il pas possible d'écrire des fonctions / sous-routines en J?
2
@ Tim Nordenfur: on les appelle "verbes", et on prend soit un argument à droite, comme dans v arg(monades), soit deux des deux côtés, comme dans arg1 v arg2(dyades). Celui que j'ai soumis est évidemment une dyade. Je n'ai pas pris la peine de le nommer, car il n'était pas demandé et est plus court de cette façon. Si vous voulez vraiment lui donner un nom, faites-le comme ceci: is_anagram_of =: -:&(/:~)et utilisez ensuite 'a' is_anagram_of 'aa'.
JB
Il a semblé un peu coûteux de substituer les arguments dans le code, mais je vois maintenant que c'est essentiellement une dyade. Ça ne fait rien.
29
J ressemble toujours aux restes d'une explosion d'usine d'émoticônes.
St0le
19

Javascript, 192 157 152 147 125 octets

Ok, certaines de ces langues sont beaucoup plus flexibles que je ne le pensais! Quoi qu'il en soit, je suppose que c'est le chemin le plus long, mais au moins une technique différente.

Comprimé

Merci à Peter et David d’avoir envoyé plus de personnages!

for(a=[j=p=2];j<123;)a[j]?p%a[++j]<1&&p++&&(j=0):(a[j]=p,j=0);function b(c,i){return c[i=i||0]?a[c.charCodeAt(i)]*b(c,++i):1}

Alors fais:

alert(b("hello")==b("elloh"));

Code développé

La compression a eu beaucoup de changements, mais ceci est la théorie de base:

// Define dictionary of primes
a = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101];

// Returns the unique ID of the word (order irrelevant)
function b(c) {
    r = 1;
    for (i = 0; i < c.length; i++)
        r *= a[c[i].charCodeAt(0) - 97];
    return r
}

alert(b("hello") == b("hlleo"));
Tom Gullen
la source
Excellente idée d'utiliser des nombres premiers.
@ Tim merci! Je l'ai eu à 157 maintenant.
Tom Gullen
2
Vous pouvez supprimer quelques caractères de l'initialisation du dictionnaire à l'aide du tamis. a=[2];for(p=3,j=0;j<26;)if(a[j]){if(p%a[j++]==0){p++;j=0}}else{a[j]=p;j=0}
Peter Taylor
1
@Tom, dépend du degré d'optimisation des routines de tri, étant donné que vous avez limité les entrées à 8 caractères: P
Peter Taylor
1
125 caractères . Récurrence et ternaires FTW:for(a=[j=p=2];j<123;)a[j]?p%a[++j]<1&&p++&&(j=0):(a[j]=p,j=0);function b(c,i){return c[i=i||0]?a[c.charCodeAt(i)]*b(c,++i):1}
David Murdoch
15

Golfscript, 8 octets

Ceci définit une fonction appelée A

{$\$=}:A

Cas de test

;
'boat' 'boat' A
'toab' 'boat' A
'oabt' 'toab' A
'a' 'aa' A
'zzz' 'zzzzzzzz' A
'zyyyzzzz' 'yyzzzzzy' A
'sleepy' 'pyels' A
'p' 'p' A
gnibbler
la source
11

Haskell, 31 octets

fonction - 31

import List
f=(.sort).(==).sort

programme - 81 58 55

import List
g=sort`fmap`getLine
main=(`fmap`g).(==)=<<g

Usage:

$ runghc anagram.hs
boat
boat
True
$ runghc anagram.hs
toab
boat
True
$ runghc anagram.hs
a
aa
False

Bravo à Lambdabot et à sa refactorisation sans aucun problème .

Joey Adams
la source
Est-ce que le code Haskell qui ne fait que ce que l'on veut sous runghc, mais pas quand il est compilé, s'appelle toujours "programme"?
JB
3
@JB: Le code Perl qui ne contient que ce qui est recherché est-il perlencore appelé un "programme"? :-)
Joey Adams
JB: Les langages fonctionnels d’aujourd’hui déforment le sens d’un programme en en faisant une abstraction d’ordre supérieur. Plutôt qu'une liste d'instructions à exécuter, le programme haskell peut simplement être vu comme un ensemble de fonctions, même si elles ne sont pas appelées.
Callum Rogers
@ Callum Rogers: mon code est le suivant: son code se comporte différemment, qu'il soit exécuté sous runghc ou compilé, dans un domaine sensible. La "fonction" est bien. Le "programme" ne résout le problème que sous runghc, et runghc n'est pas le seul moyen légitime d'exécuter des programmes Haskell. Dans ce contexte, le fragment est un "script runghc" et non un "programme Haskell". ... pas que j'estime que la question est importante, comme je l'ai dit, la fonction est bonne et de toute façon, elle est plus courte.
JB
2
x#y=sort x==sort yest 1 caractère plus court
Rotsor
10

C #, 129 caractères

namespace System.Linq{class X{static void Main(string[]a){Console.Write(a[0].OrderBy(_=>_).SequenceEqual(a[1].OrderBy(_=>_)));}}}

Lisible:

namespace System.Linq
{
    class X
    {
        static void Main(string[] a)
        {
            Console.Write(a[0].OrderBy(_ => _)
                  .SequenceEqual(a[1].OrderBy(_ => _)));
        }
    }
}
Timwi
la source
Je pense que vous pourriez jouer au golf quelques octets avec using System.Linq;au lieu de le nommer?
Stackstuck
10

Ruby, 34 octets

En utilisant le schéma IO de la solution Perl de Peter Taylors:

p gets.chars.sort==gets.chars.sort
Steenslag
la source
Lance une erreur:-e:1:in '<main>': undefined method 'chars' for nil:NilClass (NoMethodError)
Tomas
9

Programme C, 118

t[52],i;main(c){for(;i<52;)(c=getchar())<11?i+=26:t[i+c-97]++;
for(i=27;--i&&t[i-1]==t[i+25];);puts(i?"false":"true");}
Joey Adams
la source
1
Avez-vous déjà envisagé de postuler à l' IOCCC ?
Mateen Ulhaq
9
@muntoo: avez-vous vu quelque chose à l'IOCCC? C'est trop lisible pour ça.
R. Martinho Fernandes
@Martinho Oui, les codes sources de l'IOCCC sont si beaux. Symphonies Mais il devrait au moins essayer de composer un petit morceau. :)
Mateen Ulhaq
@muntoo: Je ne savais même pas qu'ils étaient toujours actifs.
Joey Adams
1
Je viens de voir celui-ci ... Très bien. Mais peut être plus court: t[256],i;main(c){for(;c+3;)(i=getchar())>10?t[i]+=c:(c-=2);for(i=257;--i&&!t[i-1];);puts(i?"false":"true");}- c'est 108 caractères. Très important, votre castuce d'initialisation est toujours utilisée.
Ugoren
7

Perl, 58 octets

(programme complet, contrairement à l'autre réponse Perl qui n'est qu'une fonction)

($c,$d)=map{[sort split//]}<>;print"@$c"eq"@$d"?true:false

49 en fonction

sub f{($c,$d)=map{[sort split//]}<>;"@$c"eq"@$d"}
Timwi
la source
Bien sûr, vous pouvez enregistrer 4 caractères dans le programme en supprimant les "expressions true et false, car sans mot-clé / warnings, un mot-clé est une chaîne.
Joel Berger le
Merci!
Timwi
Je préfère ceci comme ($c,$d)=map{[sort split//]}@ARGV;exit("@$c"ne"@$d")(51 caractères) afin qu'il puisse prendre des arguments de ligne de commande et utiliser les codes de sortie de ligne de commande. Ce serait conserver 48 caractères <>avec une entrée multiligne.
Adam Katz
6

Clojure - 23 caractères

En tant que fonction anonyme:

#(apply = (map sort %))

Exemple de cas de test:

(#(apply = (map sort %)) ["boat" "boat"])
=> true
Mikera
la source
Cool, j'aime ça
Chiron
1
Bonne réponse. J'aime particulièrement les chaînes de test que vous avez choisies ;-)
coredump
6

JavaScript

Basé sur la solution de @ zzzzBov.

Comparaison, 65 caractères (40 sans fonction)

function f(a,b){return a.split('').sort()==b.split('').sort()+""}

Comparateur, 43 caractères

function f(a){return a.split('').sort()+""}

la source
Clever en utilisant le +""pour contraindre à la chaîne.
Casey Chu
6

C ++ (104 caractères non-ws)


Basé sur la sorte de comptage. Remarque: Suppose des chaînes de même longueur, ce qui semble être impliqué (bien que non indiqué) par la question.

int u[123], i;

int a(char **c) {
    for(; c[0][i]; ) {
        u[c[0][i]]++;
        u[c[1][i++]]--;
    }

    i=123;
    while(i && !u[--i]);
    return !i;
}
Matthew Read
la source
En C, si vous déclarez une variable dans la portée globale, elle est initialisée à zéro. Je suppose que cela est également vrai pour C ++.
Joey Adams
Les variables locales, en revanche, ne sont pas initialisées automatiquement à zéro.
Joey Adams
OK, j'ai supprimé mon avertissement depuis que j'ai trouvé des moyens de m'en passer.
Matthew Lu
1
Bzzzt. Vous réussissez les tests, mais "helle" et "hollo" sont apparemment les mêmes. Solution facile: remplacez l'un des ++ par un -. Alors juste si (u [i ++]) retourne 0;
Dave Gamble
1
Je n’ai pas testé cela, mais les trois dernières lignes peuvent être écrites de la manière suivante:i=123;while(i&&u[--i]);return!i;
St0le
4

PHP (ligne de commande, 87 caractères)

function d($s){
    return array_count_values(str_split($s));
}

echo d($argv[1]) == d($argv[2]);
ts01
la source
4

Javascript

Une version (très) un peu plus courte de la solution de @ zzzzBov, qui utilise à la .join()place de la boxe string:

function a(b,c){return b.split('').sort().join()==c.split('').sort().join()}
alert(a('abc','bca')); //true

De même:

function a(b){return b.split('').sort().join()}
alert(a('abc')==a('bca')); //true
Blair Mitchelmore
la source
3
c'est la réponse ID 1337. congratz
TheDoctor
4

Clojure REPL 41 caractères

(= (sort (read-line)) (sort (read-line)))
Calamar
la source
Bienvenue sur le réseau Stack Exchange. Mise en forme de l'aide ici .
dmckee
4

Java

(La langue préférée de tout le monde apparemment!)

173 caractères:

import java.util.*;class g{public static void main(String[]p){String[]a=p[0].split(""),b=p[1].split("");Arrays.sort(a);Arrays.sort(b);System.out.print(Arrays.equals(a,b));}}

(N'imprime pas de caractère de nouvelle ligne pour enregistrer 2 caractères de println)

Compiler et exécuter:

javac g.java
java -cp . g abcdef fedcba
true

J'adore en voir un plus court ...

Greg Schueler
la source
Je sais que cela fait plus de 6,5 ans (lol), mais vous pouvez jouer au golf avec 10 octets en ajoutant java.util.Arrays x=null;et utiliser à la x.place de Arrays.: class g{public static void main(String[]p){java.util.Arrays x=null;String[]a=p[0].split(""),b=p[1].split("");x.sort(a);x.sort(b);System.out.print(x.equals(a,b));}}( 163 octets ). Et en le convertissant en Java 8, cela class g{public static void mainpourrait être interface g{static void mainaussi bien, mais je suppose que Java 8 n'a pas pas encore en 2011, donc garder classest également bien. ; p
Kevin Cruijssen le
4

sed, 45 caractères

C'est même possible dans mon préféré - sed! Juste une expression régulière pour résoudre l'anagramme ! Continuez simplement à supprimer les lettres correspondantes:

:
s/(.)(.*,.*)\1/\2/
t
/\w/{i\false
d}
i\true

(à invoquer avec -nE)

Perl, 48 ans

1while s/(.)(.*,.*)\1/\2/;$_=/\w/?"false":"true"

Être invoqué avec -p.

Fonction Perl, 39

sub f{$,while s/(.)(.*,.*)\1/\2/;!/\w/}
Tomas
la source
4

APL, 2 caractères

≡⍦

C'est le match Multiset fonction de Nars2000 , l' un des avant-gardistes mises en œuvre APL. Appliqué aux chaînes, il calcule exactement la fonction requise:

      'elvis' ≡⍦ 'lives'
1
      'alec guinness' ≡⍦ 'genuine class'
1
Tobia
la source
Juste curieux, combien d'octets est-ce? 4? 6?
Maltysen
Cela dépend de l'encodage. 6 octets en UTF-8, 4 octets en UCS-2, 2 octets si l'un des jeux de caractères APL hérités à un octet possède le symbole, ce dont je doute.
Tobia
4

05AB1E , 6 4 octets (non concurrents)

{I{Q

Essayez-le en ligne!

Cela a pris du temps à cause de difficultés d’entrée. Golfé en raison de la pop.

Explication:

{I{Q    Original code

{       Takes first input e.g. word and sorts -> 'dorw'
 I      Takes second input e.g. 'wrdo'
  {     Sorts second input -> 'dorw'
   Q    Compare if sorted 1 = sorted 2, then print result. 'dorw' = 'dorw', so prints 1.
Geno Racklin Asher
la source
1
Puisque 05AB1E est plus récent que ce défi, cette réponse est non compétitive.
Loovjo
Désolé, je n'ai pas réalisé.
Geno Racklin Asher
4

Perl, 77 75 caractères

Les E / S du problème ne sont pas bien spécifiées. cela lit deux lignes de stdin et renvoie true ou false à stdout.

sub p{join'',sort split'',$a}$a=<>;$x=p;$a=<>;print$x eq p()?"true":"false"

(Merci à Tim pour 77 -> 75)

Peter Taylor
la source
Quelque chose ne va pas. $a=;? En outre, vous pouvez ignorer les parenthèses sortet l'espace après print.
@Tim, le génie qui a développé cette plate-forme de partage de code sur le net a décidé que, dans les blocs de code, les utilisateurs devaient échapper à moins de caractères. Mais bon, c'est pas grave: ce n'est pas comme si quelqu'un les utilisait dans le code, non? Continue à me chercher.
Peter Taylor
2
Ok, j'ai enlevé le vote négatif. Vous voudrez peut-être utiliser le formatage du code à l'avenir, c'est-à-dire un code d'indentation avec quatre espaces.
1
Ok, donc il y a trois façons de formater le code (un en ligne et deux en bloc), et les deux en bloc sont peu pratiques de différentes manières. Soupir.
Peter Taylor
4

Perl, 62 octets

Cette fonction prend les chaînes en tant qu'arguments et renvoie true ou false.

sub f{my@a;for$.(1,-1){$a[ord]+=$.for split//,pop}!grep{$_}@a}

Stocke les valeurs ASCII dans un tableau et vérifie si celui-ci est uni. Incréments pour le premier mot et décrément pour le second mot.

jrtapsell
la source
4

Python 3, 107 97 76 64

s=sorted;a,b=input().split(', ')
print(str(s(a)==s(b)).lower())

Évidemment, cela peut être abrégé si nous ne prenons pas les libellés du PO littéralement et minuscules "vrai" et "faux" ...

Wooble
la source
Vous pouvez supprimer quelques caractères si vous ajoutez ;s=sortedà la première ligne puis remplacez les deux occurrences de sortedavec sdans la deuxième ligne. Faut-il sauvegarder ... 3 personnages?
Alex Van Liew
1
En effet. Python 3 économise également un peu d’espace et il est probablement raisonnable de l’utiliser maintenant, 5 ans après la publication de cette réponse. En outre, le .strip () était redondant, compte tenu des entrées spécifiées.
Wooble
Ouais désolé. Je n'ai pas remarqué l'âge de cette question quand j'ai commenté, seulement qu'elle était au premier plan. ^^;
Alex Van Liew
4

Python, 32 octets

p=sorted
f=lambda a,b:p(a)==p(b)
Chimérique
la source
Ne fait rien en python. Etes-vous sûr que c'est un programme complet qui prend l'entrée et produit la sortie comme demandé?
Tomas
1
@Tomas C'est une fonction
TuxCrafting
4

Bash, 88 caractères

diff <(grep -o .<<<$1|sort) <(grep -o .<<<$2|sort)>/dev/null && echo true || echo false
Martin
la source
4

R , 54 octets

function(x,y,`~`=sort,`+`=utf8ToInt)identical(~+x,~+y)

Essayez-le en ligne!

J.Doe
la source
Je suis très intrigué par votre utilisation de utf8ToInt, non seulement dans cette réponse, mais dans beaucoup d'autres que j'ai vues.
Sumner18
1
Avez-vous vu des astuces pour jouer au golf en R ? utf8ToIntet son inversion tendent à raccourcir la division des chaînes par rapport aux fonctions classiques.
J.Doe
3

Scala dans REPL (32)

readLine.sorted==readLine.sorted

Fonction de Scala (43)

def f(a:String,b:String)=a.sorted==b.sorted

Programme Scala (61)

object A extends App{println(args(0).sorted==args(1).sorted)}

Celles-ci exploitent une fonctionnalité intéressante de Scala selon laquelle une chaîne peut également être traitée comme une séquence de caractères ( Seq), toutes les opérations Seqétant disponibles.

ebruchez
la source
3

APL - 13 caractères

{(⍺[⍋⍺])≡⍵[⍋⍵]}

Appelle comme ça:

      'boat' {(⍺[⍋⍺])≡⍵[⍋⍵]} 'baot'
1
      'baot' {(⍺[⍋⍺])≡⍵[⍋⍵]} 'boat'
1
      (,'a') {(⍺[⍋⍺])≡⍵[⍋⍵]} 'aa'
0

Dans le dernier exemple, 'a'représente un seul caractère et le préfixe ,le convertira en chaîne.

Elias Mårtenson
la source
3

Java (134 octets)

int[][]c=new int[2][26];
for(int i=0;i<2;i++)for(byte a:args[i].getBytes())c[i][a-97]++;
System.out.print(Arrays.equals(c[0],c[1]));`

Cela fait un tableau pour compter le nombre de fois que chaque lettre apparaît, puis compare les tableaux pour vérifier si elles sont égales.

codecubé
la source
1
Bienvenue chez PPCG! Nice premier post! Vous pouvez supprimer 2 espaces, (c[0], c[1])et for (int i=0;.
Rɪᴋᴇʀ
3

JavaScript, 41

Fonction de comparaison (41) :

a=b=>''+[...b].sort()
b=(c,d)=>a(c)==a(d)
alert(b('abc', 'cba')) // true

Fonction de comparaison (21) :

a=b=>''+[...b].sort()
alert(a('abc') == a('bca')); //true

Fonction de comparaison (48):

function a(b){return String(b.split('').sort())}
alert(a('abc')==a('bca')); //true

Fonction de comparaison (78):

function a(b,c){return String(b.split('').sort())==String(c.split('').sort())}
alert(a('abc','bca')); //true

Assume Stringa splitet Arraya sort.

zzzzBov
la source
38 octets:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Shieru Asakoto