Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них) / 18 сообщений из 18, страница 1 из 1
09.09.2004, 17:08:37
    #32688119
artem_ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
есть у нас набор букв, есть табличка, содержащая словарик. Как нам сделать так, чтобы по этому набору выбирались все слова, получаемые из них?
...
Рейтинг: 0 / 0
09.09.2004, 17:11:58
    #32688128
Hummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
Простым перебором порядка следования символов - получаем набор (можно назвать словом) - по нему прямой запрос к таблице (т.е. можно по лайку можно на полное совпадение), найдено вхождение - записываем в коллекцию или в другую таблицу.

Цикл перебора позиций букв писать не буду:)
...
Рейтинг: 0 / 0
09.09.2004, 17:13:22
    #32688131
sasha_1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
есть такая чудная функция InStr
пишешь условие:
InStr(перваяИзБукв,Слово) and InStr(втораяИзБукв,Слово) and ... and InStr(последняяИзБукв,Слово) and Len(Слово)=КоличествоБукв
все слова удовлетворяющие этому условию - твои
...
Рейтинг: 0 / 0
09.09.2004, 17:15:19
    #32688139
sasha_1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
правда с длинной можно подумать по другому, чтобы включались слова с повторами букв.
...
Рейтинг: 0 / 0
09.09.2004, 17:17:28
    #32688145
Hummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
2 sasha_1
Вот у меня набор букв: мамаздапа. Слова (некоторые) - мама, мазда, дам и т.п.

Так что тут нужно сначала получить все возможные наборы, включая и наборы из одной буквы.
...
Рейтинг: 0 / 0
09.09.2004, 17:19:21
    #32688151
sasha_1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
я понял немножко по другому вопрос.
но функция все равно полезная :)
...
Рейтинг: 0 / 0
09.09.2004, 20:03:36
    #32688475
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
случаем не Т9 для мобил?
...
Рейтинг: 0 / 0
09.09.2004, 23:30:08
    #32688584
lobodava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
Это, кажется, для игры "Эрудит" или "Scramble"

Предлагаю так...

Разложить набор букв в таблицу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
мамаздапа

tblНаборБукв:

БукваНабора  БуквВНаборе
м                   2 
а                   4 
з                   1 
д                   1 
п                   1 

Словарик на две таблицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
tblСловарик:

СловоID   Слово   УникальныхБукв
---------------------------------
 1             мама      2 
 2             мазда     4 
 3             дам       3 
 4             кара      3 

tblБуквыСлова:

СловоID  БукваСлова  БуквВСлове 
 1            м               2 
 1            а               2 
 2            м               1 
 2            а               2 
 2            з               1 
 2            д               1 
 3            д               1 
 3            а               1 
 3            м               1 
 4            к               1 
 4            а               2 
 4            р               1 

Подзапросом найти все буквы в словарике встречающиеся нужное колличество раз.
Код: plaintext
1.
2.
3.
4.
5.
qrySub:

SELECT tblБуквыСлова.СловоID
FROM tblБуквыСлова INNER JOIN tblНаборБукв ON tblБуквыСлова.БукваСлова = tblНаборБукв.БукваНабора
WHERE (((tblБуквыСлова.БуквВСлове)<=[tblНаборБукв].[БуквВНаборе]));

А теперь найти нужные слова
Код: plaintext
1.
2.
3.
SELECT tblСловарик.Слово
FROM qrySub INNER JOIN tblСловарик ON qrySub.СловоID = tblСловарик.СловоID
GROUP BY tblСловарик.Слово, tblСловарик.УникальныхБукв
HAVING (((Count(tblСловарик.СловоID))=[tblСловарик].[УникальныхБукв]));

В прикрепленном файле база с этими таблицами и запросами.
...
Рейтинг: 0 / 0
10.09.2004, 10:58:46
    #32689083
artem_ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
спасибо
последнее решение интересное
...
Рейтинг: 0 / 0
10.09.2004, 12:03:45
    #32689291
маяк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
Не проще ли генерить len(string)! (в смысле факториал) штук выражений типа like "*м*а*м*а*з*д*а*л*а*"?
...
Рейтинг: 0 / 0
10.09.2004, 13:59:02
    #32689665
artem_ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
не проще
слов в словарике 18 тыщ
а комбинаций могут быть миллионы...
...
Рейтинг: 0 / 0
10.09.2004, 15:21:36
    #32689900
ппп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
На этот счет гдето я видел готовое решение.Однако тест показал серьезные иормоза после 1000 записей. если интересно еому могу поискать.
...
Рейтинг: 0 / 0
10.09.2004, 18:40:33
    #32690357
lobodava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
artem_kaслов в словарике 18 тыщ
а комбинаций могут быть миллионы...

Это уже интереснее... :)

Если не влом, можно ли выложить тестовые данные куда-нибудь? Например на am.rusimport.ru .
Не все конечно, хотя бы кил 100.

Мы бы дальше порешали бы
...
Рейтинг: 0 / 0
10.09.2004, 18:51:47
    #32690371
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
Предлагаю решение, хотя оно и не привязано к Аксессу.

1. В обоих словах (в том, которое надо проверить, и в разрешенном наборе букв) сортируем буквы по алфавиту при помощи любого алгоритма сортировки массива:

мазда -> аадзм
мамаздапа -> аааадзммп

2. В слове, которое надо проверить, вставляем звездочки между группами разных букв и пишем условие:

"аааадзммп" like "*аа*д*з*м*"

Если в слове есть какая-то лишняя буква (даже из разрешенных, но с превышением количества, например второе "д" или пятое "а"), то условие будет ложно.
...
Рейтинг: 0 / 0
10.09.2004, 19:44:34
    #32690428
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
От нечего делать попробовал еще вариант. Сделал упрощенно, чтоб не возиться.

Итак, считаю, что набор символов в словах ограничен (для себя взял знаки "0"-"9"). Считаю, что количество повторов в знаков в "слове" не важно, важно лишь их наличие.

Сделал таблицу "Слова"
слово - varchar(50) - Primary key
[0] - boolean
[1] - boolean
[2] - boolean
[3] - boolean
[4] - boolean
[5] - boolean
[6] - boolean
[7] - boolean
[8] - boolean
[9] - boolean

В случае, если кол-во повторов важно, вместо boolean используем byte, например, и в поля кладем именно количество вхождений символов в слово, а не признак вхождения. Делал все в a97. В таблице создал второй индекс из полей [0]-[9].

Сделал запрос "разбить":
Код: plaintext
1.
2.
3.
4.
5.
UPDATE Слова SET 
Слова.[ 0 ] = InStr([Слово],'0')<> 0 , Слова.[ 1 ] = InStr([Слово],'1')<> 0 , 
Слова.[ 2 ] = InStr([Слово],'2')<> 0 , Слова.[ 3 ] = InStr([Слово],'3')<> 0 , 
Слова.[ 4 ] = InStr([Слово],'4')<> 0 , Слова.[ 5 ] = InStr([Слово],'5')<> 0 , 
Слова.[ 6 ] = InStr([Слово],'6')<> 0 , Слова.[ 7 ] = InStr([Слово],'7')<> 0 , 
Слова.[ 8 ] = InStr([Слово],'8')<> 0 , Слова.[ 9 ] = InStr([Слово],'9')<> 0 ;

Сделал форму с тремя кнопками:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Option Compare Database
Option Explicit

Private Sub Заполнить_Click()
  Dim t As Long
  
  For t =  1  To  100000   '(сто тысяч) 
    CurrentDb.Execute "insert into Слова (слово) values(" & Abs(Int(Rnd *  1000000 )) & ")"
  Next
  MsgBox "Готово"
End Sub

Private Sub Разбить_Click()
  Dim i As Double
  
  i = Now
  CurrentDb.Execute "разбить"
  Debug.Print Now - i
  MsgBox "Готово"
End Sub

Private Sub Найти_Click()
  Dim s As String
  Dim rs As DAO.Recordset
  Dim i As Double
  
  s = "000000"
  i = Now
  Set rs = CurrentDb.OpenRecordset("select слово from слова where " & _
               "[0]=" & IIf(InStr(s, "0") <>  0 , "True", "False") & " And " & _
               "[1]=" & IIf(InStr(s, "1") <>  0 , "True", "False") & " And " & _
               "[2]=" & IIf(InStr(s, "2") <>  0 , "True", "False") & " And " & _
               "[3]=" & IIf(InStr(s, "3") <>  0 , "True", "False") & " And " & _
               "[4]=" & IIf(InStr(s, "4") <>  0 , "True", "False") & " And " & _
               "[5]=" & IIf(InStr(s, "5") <>  0 , "True", "False") & " And " & _
               "[6]=" & IIf(InStr(s, "6") <>  0 , "True", "False") & " And " & _
               "[7]=" & IIf(InStr(s, "7") <>  0 , "True", "False") & " And " & _
               "[8]=" & IIf(InStr(s, "8") <>  0 , "True", "False") & " And " & _
               "[9]=" & IIf(InStr(s, "9") <>  0 , "True", "False"))
  On Error Resume Next
  rs.MoveLast
  Debug.Print "word:'" & s & "', records:" & rs.RecordCount & ", time:" & (Now - i)
  MsgBox "Готово"
End Sub

Результат работы: создалось ок. 95 000 записей, создавалось минут 15 (celeron 633). Остальное вот:
Код: plaintext
1.
2.
3.
 0 : 00 : 37  
word:'001122', records: 49 , time: 0 : 00 : 00 
word:'000000', records: 0 , time: 0 : 00 : 00 
word:'123456', records: 70 , time: 0 : 00 : 00 
...
Рейтинг: 0 / 0
10.09.2004, 20:00:19
    #32690439
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
Гео, ты же вроде сейчас водку пьянствуешь сотоварищи :)
...
Рейтинг: 0 / 0
10.09.2004, 20:20:30
    #32690448
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
Не - я завтра водку пьянствую :))
...
Рейтинг: 0 / 0
10.09.2004, 20:35:13
    #32690453
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)
Тоди-ой! :))
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них) / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]