Найти в Дзене
2018 подписчиков

👣 Решаем задачи с codewars


Начнем с простой задачи


Что такое анаграмма?
Aнаграмма – перестановка букв в слове или словосочетании, вследствие чего возникает другое слово или словосочетание. Два слова являются анаграммами друг друга, если они оба содержат одни и те же буквы.
Нппример:

'abba' & 'baab' == true

'abba' & 'bbaa' == true

'abba' & 'abbba' == false

'abba' & 'abca' == false

Напишите функцию, которая найдет все анаграммы слова из списка. Вам будет дано слово и массив со словами. Вы должны вернуть массив всех анаграмм для этого слова или пустой массив, если их нет. Например:

anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) => ['aabb', 'bbaa']

anagrams('racer', ['crazer', 'carer', 'racar', 'caers', 'racer']) => ['carer', 'racer']

anagrams('laser', ['lazing', 'lazy', 'lacer']) => []

Решение:

package kata

import (
"sort"
)

type Word string
type Words []string

func Anagrams(word string, words []string) []string {
sorted := Word(word).Sorted()

areAnagrams := func(b Word) bool {
return sorted == b.Sorted()
}

return Words(words).Filter(areAnagrams)
}

func (ctx Word) Sorted() Word {
sorted := []rune(ctx)

sort.SliceStable(sorted, func(i, j int) bool {
a := sorted[i]
b := sorted[j]

return a < b
})

return Word(sorted)
}

func (ctx Words) Filter(predicate func(x Word) bool) Words {
var filtered Words

for _, x := range ctx {
if predicate(Word(x)) {
filtered = append(filtered, x)
}
}

return filtered
}

1 минута