![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 1 Dołączył: 3.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
Mam zbiór 3 liter: [abc]. Jak za pomocą wyrażeń regularnych opisać wszystkie możliwe kombinacje tych liter? Raz użyta litera jest już niedostępna. Ponadto użycie danej litery jest opcjonalne.
Dla lepszego zrozumienia problemu wypisze jeszcze co może być zbudowane z takiego zbioru: a b c ab ac ba bc ca cb abc acb bac bca cab cba |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Wyrażenia regularne nie są w stanie zrobić takich rzeczy bo do tego nie służą.
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 006 Pomógł: 111 Dołączył: 23.07.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Najlepiej będzie zapisać dane litery jako tablice a potem operować na danych indeksach.
-------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
PCRE się tutaj na wiele nie zda. IMO najłatwiej będzie Ci wybrać po prostu wszystkie możliwe kombinacje z powtórzeniami:
Kod ...[a-c]{1,3}... A dopiero w późniejszym kroku sprawdzić czy wyłapana kombinacja nie zawiera powtórzeń. Jeżeli zawiera powtórzenia pomiń ją.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 1 Dołączył: 3.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
Panowie, te 3 literki do operowania to pikuś. Pewnie, ze najprościej skorzystać z tego co piszecie, ale prawda jest bardziej skomplikowana. Próbuję pobawić się większą ilością literek. Przy 8 literach tak się zapętliło tworzenie anagramów, ze trwa to kilka sekund (3-6s). Jeśli dołożę jeszcze jedną literkę to już serwer nie wyrabia, nie mieści się w 30 sekundach. Z tego też powodu pomyślałem, że szybciej będzie za pomocą wyrażeń regularnych.
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Przecież tworzenie dużej ilości anagramow za każdym razem jest nierozsądne. Robisz je raz (tyle ile potrzebujesz) i przechowujesz w jakiejś tablicy albo nawet w bazie.
-------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Rozwiązanie, które podałem będzie Ci bez problemu działać nawet dla "wyrazu" złożonego z całej palety Unikodu.
Co Ty chcesz zrobić? Wygenerować wszystkie kombinacje i je gdzieś zapisać, czy po prostu z jakiegoś tam tekstu je wyszukać? |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 1 Dołączył: 3.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
No dobra, trzeba było od początku wyjaśnić do czego mi to potrzebne.
Jest to pomoc (niektórzy powiedzą, że oszukiwanie) do gier słownych typy scrabble czy literaki. Użytkownik podaje zestaw liter jakie ma, a strona pokazuje, jakie wyrazy można z tego ułożyć. Dopuszczalne wyrazy mam w bazie danych. Teraz już wiecie, dlaczego za każdym razem muszę generować anagramy od początku i dlaczego porównywanie anagramów z danymi z bazy jest zbyt zasobożerne. W tej chwili mam takie rozwiązanie, że robię listę wszystkich anagramów, a następnie w bazie dokonuję porównań za pomocą SELECT ... WHERE ... IN Gdyby kogoś ciekawiło jak się to sprawuje to zapraszam na http://krzyzowkowo.pl/scrabble. Niestety, ze względów wydajnościowych musiałem wprowadzić ograniczenie do 8 liter. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Było to już na forum. Sprawa jest wyjątkowo prosta - w bazie danych trzymasz wyraz i jego uporządkowaną, alfabetyczną formę, czyli coś na kształt:
Kod dom | dmo Przed wyszukiwaniem porządkujesz litery wpisane przez użytkownika (fwrppa -> afpprw) i takiego właśnie "wyrazu" wyszukujesz.forum | fmour dzień | deińz Problem zaczyna się przy blankach, ale jak już wspomniałem - przeszukaj forum pod frazą "anagram" bo już było. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 25.07.2025 - 01:07 |