77 lines
2.5 KiB
Plaintext
77 lines
2.5 KiB
Plaintext
include "NSLog.incl"
|
|
|
|
#plist NSAppTransportSecurity @{NSAllowsArbitraryLoads:YES}
|
|
|
|
local fn Dictionary as CFArrayRef
|
|
CFURLRef url = fn URLWithString( @"http://wiki.puzzlers.org/pub/wordlists/unixdict.txt" )
|
|
CFStringRef string = fn StringWithContentsOfURL( url, NSUTF8StringEncoding, NULL )
|
|
end fn = fn StringComponentsSeparatedByCharactersInSet( string, fn CharacterSetNewlineSet )
|
|
|
|
local fn TestIndexes( array as CFArrayRef, obj as CFTypeRef, index as NSUInteger, stp as ^BOOL, userData as ptr ) as BOOL
|
|
end fn = fn StringIsEqual( obj, userData )
|
|
|
|
void local fn IndexSetEnumerator( set as IndexSetRef, index as NSUInteger, stp as ^BOOL, userData as ptr )
|
|
NSLog(@"\t%@\b",fn ArrayObjectAtIndex( userData, index ))
|
|
end fn
|
|
|
|
void local fn DoIt
|
|
CFArrayRef words
|
|
CFMutableArrayRef sortedWords, letters
|
|
CFStringRef string, sortedString
|
|
IndexSetRef indexes
|
|
long i, j, count, indexCount, maxCount = 0, length
|
|
CFMutableDictionaryRef anagrams
|
|
CFTimeInterval ti
|
|
|
|
ti = fn CACurrentMediaTime
|
|
|
|
NSLog(@"Searching...")
|
|
|
|
// create another word list with sorted letters
|
|
words = fn Dictionary
|
|
count = len(words)
|
|
sortedWords = fn MutableArrayWithCapacity(count)
|
|
for string in words
|
|
length = len(string)
|
|
letters = fn MutableArrayWithCapacity(length)
|
|
for i = 0 to length - 1
|
|
MutableArrayAddObject( letters, mid(string,i,1) )
|
|
next
|
|
MutableArraySortUsingSelector( letters, @"compare:" )
|
|
sortedString = fn ArrayComponentsJoinedByString( letters, @"" )
|
|
MutableArrayAddObject( sortedWords, sortedString )
|
|
next
|
|
|
|
// search for identical sorted words
|
|
anagrams = fn MutableDictionaryWithCapacity(0)
|
|
for i = 0 to count - 2
|
|
j = i + 1
|
|
indexes = fn ArrayIndexesOfObjectsAtIndexesPassingTest( sortedWords, fn IndexSetWithIndexesInRange( fn CFRangeMake(j,count-j) ), NSEnumerationConcurrent, @fn TestIndexes, (ptr)sortedWords[i] )
|
|
indexCount = len(indexes)
|
|
if ( indexCount > maxCount )
|
|
maxCount = indexCount
|
|
MutableDictionaryRemoveAllObjects( anagrams )
|
|
end if
|
|
if ( indexCount == maxCount )
|
|
MutableDictionarySetValueForKey( anagrams, indexes, words[i] )
|
|
end if
|
|
next
|
|
|
|
// show results
|
|
NSLogClear
|
|
for string in anagrams
|
|
NSLog(@"%@\b",string)
|
|
indexes = anagrams[string]
|
|
IndexSetEnumerateIndexes( indexes, @fn IndexSetEnumerator, (ptr)words )
|
|
NSLog(@"")
|
|
next
|
|
|
|
NSLog(@"\nCalculated in %0.6fs",fn CACurrentMediaTime - ti)
|
|
end fn
|
|
|
|
dispatchglobal
|
|
fn DoIt
|
|
dispatchend
|
|
|
|
HandleEvents
|