1

Тема: AHK: Составление анаграмм

Здравствуйте. Пытаюсь составить код для поиска анаграмм. Это слова, которые состоят из тех же букв, из которых состоит искомое слово-образец, например: колба — бокал, приказ — каприз. Ниже в переменной "word_search" выделил такое искомое слово-образец, анаграммы к которому должны быть найдены в списке "Wrd_Lst", но затрудняюсь с обработкой.

word_search := "каприз"

Wrd_Lst =
(
скрипт
колба
бокал
форум
приказ
каприз
анаграмма
)

Loop, Parse, Wrd_Lst, `n
{
   dict_word := A_LoopField

   msgbox % dict_word
}
return

2

Re: AHK: Составление анаграмм

Рассортируйте буквы в тестируемом слове в алфавитном порядке.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Составление анаграмм

Идея с сортировкой букв в слове гениальна . Пока искал как их сортировать, нашелся готовый скрипт

setbatchlines,-1
listlines,off
#noenv
dictionary=
(
скрипт
колба
бокал
форум
приказ
каприз
анаграмма
)
dict:=[]
Loop, Parse, dictionary, `n, `r        ; Put all words in an array dict, at dict[wordLength, wordLettersSorted, entryNumber]
{
 keyword:=A_LoopField
 len:=strlen(A_LoopField)
 keyword:=Ltrim(RegExReplace(keyword,"(.)",",$1"),",")
 Sort,keyword,D,           ; Make a keyword, eg, Dallas -> a,a,D,l,l,s
 if !IsObject(dict[len,keyword])
  dict[len,keyword]:=[]
 dict[len,keyword].push(A_LoopField)      ; Put the word in the keyword slot, all permutations will get the same keyword and end up in this slot
}
allAnagrams:=[]
for len, lengthGroup in dict {
 for keyword, anagrams in lengthGroup
  if (anagrams.length()>1)       ; For each keyword which has more than entry, there is anagrams, save those
   allAnagrams.push(anagrams)
}
str:="Anagram list:`n"          ; Print result
for k, anagrams in allAnagrams {
 str.= "Anagram set`t" k ":`t"
 for l, anagram in anagrams
  str.=anagram  "`t" 
 str.= "`n" 
}
gui, font,,courier new          ; Show result
gui,add,edit,w1000 r40, % str
gui,show

4

Re: AHK: Составление анаграмм

Больно мудрёно, я бы упростил:

StringCaseSense, locale
word_search := "каприз"

Wrd_Lst =
(
скрипт
колба
бокал
форум
приказ
каприз
анаграмма
)
length := StrLen(word_search)
sorted := SortLetters(word_search)
Loop, parse, Wrd_Lst, `n, `r
{
   if StrLen(A_LoopField) != length || A_LoopField = word_search
      continue
   if SortLetters(A_LoopField) = sorted
      MsgBox, Найдена анаграмма:`n%A_LoopField%
}

SortLetters(word) {
   sorted := RegExReplace(word, ".(?=.)", "$0`n")
   Sort, sorted
   Return sorted
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: svoboden, 2022-01-08 05:00:17)

Re: AHK: Составление анаграмм

А зачем составлять скрипт, когда просто:

WinHTTP := ComObjCreate("WinHTTP.WinHttpRequest.5.1")
WinHTTP.Open("POST", "https://cepia.ru/service/words/findbyanagram", 0)
WinHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:65.0) Gecko/20100101 Firefox/65.0")
WinHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
WinHTTP.SetRequestHeader("Pragma", "no-cache")
WinHTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
WinHTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
WinHTTP.Send("anagram=каприз")
MsgBox % WinHTTP.ResponseText

6

Re: AHK: Составление анаграмм

С графическим интерфейсом лучше будет.

Name = Анаграммы - Онлайн
Gui +AlwaysOnTop +ToolWindow
Gui Add, Edit, vText x8 y8 w200 h21
Gui Add, Text, vTS x8 y32 w200 h23, После ввода нажать 'Enter'
Gui Show, w214 h58, % Name
Return

Enter::
Gui, Submit, NoHide
WinHTTP := ComObjCreate("WinHTTP.WinHttpRequest.5.1")
WinHTTP.Open("POST", "https://cepia.ru/service/words/findbyanagram", 0)
WinHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:65.0) Gecko/20100101 Firefox/65.0")
WinHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
WinHTTP.SetRequestHeader("Pragma", "no-cache")
WinHTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
WinHTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
WinHTTP.Send("anagram=" Text)
GuiControl,,TS, % WinHTTP.ResponseText
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

7

Re: AHK: Составление анаграмм

__Михаил__, а как из такого окна скопировать результат?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Составление анаграмм

А разве это было нужно? Таких условий нет.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

9

Re: AHK: Составление анаграмм

Так и окно не нужно было, и с сайта получать тоже.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Составление анаграмм

Наоборот, в окне ввёл получил варианты. Захотелось другое слово - повторил.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

11

Re: AHK: Составление анаграмм

Что именно наоборот? И как варианты-то получить, переписывать вручную?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12 (изменено: __Михаил__, 2022-01-08 22:21:08)

Re: AHK: Составление анаграмм

А что мешает подправить код? Тот же 'MsgBox' не очень вариант как по мне. Хоть и позволит извлечь данные, но их нужно будет обрезать.

Gui +AlwaysOnTop +ToolWindow
Gui Add, Edit, vText x8 y8 w200 h21
Gui Add, Edit, vTS x8 y32 w200 h21 +ReadOnly, После ввода нажать 'Enter'
Gui Show, w214 h58, Анаграммы - Онлайн
Return

Enter::
Gui, Submit, NoHide
WinHTTP := ComObjCreate("WinHTTP.WinHttpRequest.5.1")
WinHTTP.Open("POST", "https://cepia.ru/service/words/findbyanagram", 0)
WinHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:65.0) Gecko/20100101 Firefox/65.0")
WinHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
WinHTTP.SetRequestHeader("Pragma", "no-cache")
WinHTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
WinHTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
WinHTTP.Send("anagram=" Text)
GuiControl,,TS, % WinHTTP.ResponseText
Return

GuiEscape:
GuiClose:
ExitApp
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

13

Re: AHK: Составление анаграмм

MsgBox не предназначен для пользователя, он просто показывает, что данные получены, осталось их как-то сохранить. А вот если сделано GUI, предполагается, что оно как раз для пользователя, и должно быть удобным. Вот сейчас у вас после закрытия окна скрипт остаётся висеть в трее — тоже не очень-то удобно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder