Determine whether strings are anagrams

Challenge

Given two strings, work out if they both have exactly the same characters in them.

Example

Input

word, wrdo

This returns true because they are the same but just scrambled.

Input

word, wwro

This returns false.

Input

boat, toba

This returns true

Rules

Here are the rules!

• Assume input will be at least 1 char long, and no longer than 8 chars.
• No special characters, only az
• All inputs can be assumed to be lowercase

Test Cases

boat, boat = true
toab, boat = true
oabt, toab = true
a, aa = false
zzz, zzzzzzzz = false
zyyyzzzz, yyzzzzzy = true
sleepy, pyels = false
p,p = true

• 9 answers in 13 views... wow! – Tom Gullen Mar 8 '11 at 16:44
• @Tom, because everyone wanted to prove that your comment about using a 64-bit integer was pointing in the wrong direction :P – Peter Taylor Mar 8 '11 at 18:15
• Title request: Cod Elf, Go! – user54200 Jul 9 '16 at 12:48
• "Falcon Rage, go mad!" – Geobits Oct 6 '16 at 17:25
• My name suggestion: "are they anagrams" → "manage the arrays" – Esolanging Fruit Oct 31 '17 at 4:32

import java.util.Scanner;
public class Match
{
public static void main(String[] args)
{
Scanner s=new Scanner(System.in);
String s1=s.nextLine();
String s2=s1.toLowerCase();
char []a=s2.toCharArray();
String s3=s.nextLine();
String s4=s3.toLowerCase();
char []e=s4.toCharArray();
int h,g = 0,l=0,r=0,h1=0,m=0;
int b=(int)a[0];
int f=(int)e[0];
//System.out.println();
for(int k=0;k<a.length;k++)
{
for(h=1+k;h<a.length;h++)
{
if(b>(int)a[h])
{
b=a[h];
char temp=a[h];
a[h]=a[k];
a[k]=temp;
}

}
if(l<a.length-1)
{
b=a[++l];
}
}
for(int k1=0;k1<e.length;k1++)
{
for(h1=1+k1;h1<e.length;h1++)
{
if(f>(int)e[h1])
{
f=e[h1];
char temp=e[h1];
e[h1]=e[k1];
e[k1]=temp;
}

}
if(m<e.length-1)
{
f=e[++m];
}
}
if(a.length==e.length)
{
int flag=0;
for(int j=0;j<a.length;j++)
{
if(a[j]==e[j])
{
flag++;
}
}
if(flag==e.length)
{
System.out.println("True");
}
else
{
System.out.println("false");
}
}
else
{
System.out.println("False");
}
}
}


C#, 144 chars

namespace System.Linq{class m{static void Main(string[]a){Console.Write(a[0].Select(t=>a[1].Select(y=>t!=y)).Count()*2==(a[0]+a[1]).Length);}}}


Function: 90 chars

bool i(string a,string b){return a.Select(t=>b.Select(y=>t!=y)).Count()*2==(a+b).Length;}


Bash (66 58)

f(){ fold -w1<<<$1|sort;} g(){ [ "$(f $1)" == "$(f $2)" ];}  Call it with g <word1> <word2>. Edit: Stupid me, I do not need to unic -c after I sort VB.net Module Q Sub Main(a As String()) Console.WriteLine(a(0).Count=-a(0).Sum(Function(c)a(1).Sum(function(x)x=c))) End Sub End Module  C 138 Code finds the sum of the differences of the characters then checks if they are same length and sum == 0. int s,t,i,j; void f(char*a,char*b) { while (*a&&*b){ s+=*a-*b; a++;b++; i++;j++; } if (i==j&&s==0)t=1; puts(t?"true":"false"); }  • This can not be ok every input... What about string has the same value example "caa" and "bba" ? – RosLuP Dec 20 '18 at 15:04 Groovy 44 def f(a,b){print !(a-b)&&a.size()==b.size()}  Groovy 42 def f(a,b){print ((b as Set)==(a as Set))}  pure bash 136 There is a method without sorting step! anagramCmp() { x=0 y=0 for((i=0;i<${#1};i++));do
((x+=7**(36#${1:i:1}-10))) ((y+=7**(36#${2:i:1}-10)))2>/dev/null
done
return $((${#1}$x==${#2}$y?0:1)) }  Then now: if anagramCmp Blah Halb ; then echo Yo; else echo Uh; fi Yo if anagramCmp Blahblah Hhaallab ; then echo Yo; else echo Uh; fi Uh  Javascript - 57 chars function o(a,b){return b?o(a)==o(b):1+a.split("").sort()}  • Your function will fail if in the first try, b was empty. – Optimizer Sep 14 '14 at 22:04 • All inputs will be at least 1 char long, you give the function the 2 strings you want to compare so that won't happen – Kevin Wu Sep 15 '14 at 22:25 • @Optimizer did you even try running it? – Kevin Wu Sep 15 '14 at 22:37 • Ah, I see. In that case, it will be fine. – Optimizer Sep 16 '14 at 6:43 Pyth - 19 qS@cz", "0S@cz", "1  Try it here. Note that the two words in the input must be separated by a comma and a space. Python Mapping and explanation q # equal( "Check equality" S # sorted( "Sort" @ # list looku "Extract element from list" c # chop( "Separate by delimiter" z # input( "Input variable" ", " # ", " "This delimiter" 0 # 0 "The 0th element" S@cz", "1 # .. "The same thing with the 1st element  I'm sure someone can come up with a shorter implementation, but I've only been learning Pyth for a few days. It would also be a lot shorter if I didn't stick strictly to the input format given in the question. For instance: qS@Q0S@Q1 Which is only 9 bytes, works if the input is formatted like 'parse','spare'. So which one do you count? Good practice though! Ruby, 32 h=->{gets.chars.sort} p h[]==h[]  Javascript, 143 119 bytes a=prompt()[s="split"](" ");a[0]=a[0][s]("");a[1]=a[1][s]("");a[0].sort();a[1].sort();alert(a[0][j="join"]()==a[1][j]())  Takes a single space-seperated pair of strings as input. rs, 35 bytes +(.)(.*) (.*)\1/\2 \3 \s/ .+/0 ^$/1


Yay regexes!!

BTW, rs was created way after this was posted, so this technically doesn't count. Still cool.

Live demo and all test cases.

R, 63 Bytes

length(unique(lapply(strsplit(c(s,m),''),sort))[[1]])==nchar(m)


It seens it passes the test cases.

(just realized this question is 4 year old, but posting anyway)

• Passing the test cases does not necessary make a working function. Your function only works when the number of unique characters in s is equal to the number of characters in m. For instance, s="boatee" and m="toobee" yields TRUE, when it should actually be FALSE. – Sumner18 Dec 17 '18 at 21:31

Javascript (ES6) 35

Requires lambdas

Just like the other solutions, but with lambda

f=x=>x.split.sort()
f(a)==f(b)+""


Usage

// a, b = input
f=x=>x.split.sort()
console.log(f(a)==f(b)+"")


thanks @comment

• Welcome to PPCG! Since you're using ES6, you could replace split('')... with split... to save two bytes. – ETHproductions Oct 5 '15 at 17:04
• You can also shave off 3 bytes by replacing x.split with [...x] – Scott May 17 '16 at 19:36

Powershell 48 bytes

param([char[]]$a,[char[]]$b)![bool](diff $a$b)


Cast incoming strings as an array of char. Use diff (compare-object) on the two objects and cast as bool. Since a blank result (diff only shows differences not similarities) is False, negating it with ! will result in true for identical strings.

Added benefit: it will work on any arbitrary length strings (if equal whitespace).

Pyke, 4 bytes (non-competing)

Pyke is FAR newer than this challenge

mSXq


Try it here!

Also 4 bytes

SRSq


Try it here!

Retina, 10 bytes

This answer is non-competing since Retina is much newer than this challenge. Byte count assumes ISO 8859-1 encoding.

%O.
D
¶$ Input is linefeed-separated. Try it online! Explanation %O.  This sorts (O) the individual characters (.) in each line (%), i.e. it sorts each input string separately. D  This deduplicates the input on the (implicit) regex .*, which means it removes the characters from the second line if both strings are equal. ¶$


Finally, this tries to match a linefeed followed by the end of the string. Since the input strings are guaranteed to be non-empty, this can only happen if the second string was removed in the previous stage.

Jelly, 5 Bytes (Non-competitive)

Ṣ⁼⁴Ṣ¤


Special thanks to Leaky Nun for helping me fix a problem.

Outputs one if true. Try it Online!

R, 69 bytes

a=function(b,d)identical(table(strsplit(b,"")),table(strsplit(d,"")))


I think this is the shortest R implementation which deals with a("b","bb") being FALSE.

Python, 20 bytes

lose to golfscript again...... :(

sorted(x)==sorted(y)

• This will work, but it does not include the parsing of x and y, which can contribute to the length of the answer. – ericmarkmartin Jan 24 '15 at 7:17

Scala - 64 Bytes

Could be made shorter (the toList could be changed to toSeq, I believe) ('a'to'z').forall(c=>y.toList.count(_==c)==z.toList.count(_==c))

Racket 92 bytes

(λ(a b)(define(g s)(sort(map(λ(x)(char->integer x))(string->list s))>))(equal?(g a)(g b)))


Ungolfed:

(define f
(λ (a b)
(define (g s)    ; fn to get sorted list of string chars as numbers.
(sort
(map
(λ(x)(char->integer x))
(string->list s))
>))
(equal? (g a) (g b))))


Testing:

(f "test" "ttse")
(f "boat" "boat")
(f "toab" "boat")
(f "oabt" "toab")
(f "zyyyzzzz" "yyzzzzzy")
(f "a" "aa")
(f "zzz" "zzzzzzzz")
(f "sleepy" "pyels")


Output:

#t
#t
#t
#t
#t
#f
#f
#f


C 87 bytes

char*a,*b,*c;d(i,k){return!a[i]||!(c=strchr(b,a[i]))?i==k+1:(*c=1,d(i+1,k<c-b?c-b:k));}


this is one recursive function that has one not common way to have its input and write in one its argument...this use recursion + library function...

/*
char*a,*b,*c;
d(i,k)
{return !a[i]||!(c=strchr(b,a[i]))?i==k+1:(*c=1,d(i+1,k<c-b?c-b:k));}
87
*/

main()
{char m1[]="12345", m2[]="54321", m3[]="a", m4[]="e";
int  r;

a=m1;b=m2;r=d(0,0);printf("r=%d m1=%s  m2=%s\n", r, m1, m2);
a=m3;b=m4;r=d(0,0);printf("r=%d m3=%s  m4=%s\n", r, m3, m4);
}

• How it is possible 20 min ago I not remember a C solution less than 109 bytes, now I read C solutions less bytes than 80 bytes edited in 2011... – RosLuP Oct 7 '16 at 10:56

C 110 bytes

char*a,*b;l(i,j,k){y:if(!b[j]||!a[i])return i==k+1;if(a[i]==b[j]){b[j]=1;return l(i+1,0,j>k?j:k);}++j;goto y;}


this is one recursive function that has one not common way to have its input and write in one its argument... but not use library functions....

/*
l(i,j,k)
{y: if(!b[j]||!a[i])return i==k+1;
if(a[i]==b[j]){b[j]=1;return l(i+1,0,j>k?j:k);}
++j;goto y;
}
//110
r=1 m1=12345  m2=?????
r=0 m3=a  m4=e
*/

main()
{char m1[]="12345", m2[]="54321", m3[]="a", m4[]="e";
int  r;

a=m1;b=m2;r=l(0,0,0);printf("r=%d m1=%s  m2=%s\n", r, m1, m2);
a=m3;b=m4;r=l(0,0,0);printf("r=%d m3=%s  m4=%s\n", r, m3, m4);
}

• Please do not vandalize your posts. – DJMcMayhem Oct 20 '16 at 17:49

awk, 63 65 bytes

It only accepts chars a-z (0141-0172). gsub counts occurrances of each char in alphabet, appends them to a variable (variable looks something like 140213000000000000..., starts with 140 for initialization) and compares frequencies in variables in the end. It returns the value of the comparison on exit:

{for(a=i=140;++i<173;)a=a gsub("\\"i,1);if(p>1)exit(p==a);p=a}


Test it:

$cat file aabccc abcacc$ awk '{for(a=i=140;++i<173;)a=a gsub("\\"i,"");if(p>1)exit(p==a);p=a}' file
$echo$?  # will output 0 or 1 where 1=true and 0=false
1


APL (Dyalog), 10 bytes

≡/(⊂∘⍋⌷⊢)¨


Try it online!

The program takes in two strings in a single array as its right argument.

Explanation

¨            For each string
(⊂∘⍋⌷⊢)      Sort it
≡/           And check if both strings are equal


Excel VBA, 87 Bytes

Anonymous VBE immediate window function that takes input from range A1:B1 and outputs whether the two inputs are anagrams of one another to the VBE immediate window. This a destructive process as the value inputted into range B1 is destroyed

For i=1To[Len(A1)]:[B1]=Replace([B1],Mid([A1],i,1),"|",,1):Next:?[B1=Rept("|",len(A1))]


Wolfram Language 26 bytes ( Mathematica )

ContainsAll@@Characters@#&


Usage:

%@{"BOAT","TOAB"}


Output:

True

J, 8 bytes

-:&(/:~)


Match -: after sorting /:~ both args &.

Try it online!