Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> wyrazenia regularne - anagramy
endrju15575
post 30.12.2010, 11:03:03
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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
wookieb
post 30.12.2010, 11:21:10
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żą.


--------------------
Go to the top of the page
+Quote Post
IceManSpy
post 30.12.2010, 13:58:37
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.


--------------------
Go to the top of the page
+Quote Post
Crozin
post 30.12.2010, 14:05:00
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ą.

  1. preg_match_all('...', $data, $matches);
  2.  
  3. foreach ($matches[...] as $match) {
  4. if (/* $match zawiera powtorzenia */) {
  5. continue;
  6. }
  7.  
  8. /* Zrób coś tam z danymi */
  9. }
Go to the top of the page
+Quote Post
endrju15575
post 30.12.2010, 15:40:03
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.
Go to the top of the page
+Quote Post
wookieb
post 30.12.2010, 15:44:13
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.


--------------------
Go to the top of the page
+Quote Post
Crozin
post 30.12.2010, 16:05:26
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ć?
Go to the top of the page
+Quote Post
endrju15575
post 31.12.2010, 07:48:29
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.
Go to the top of the page
+Quote Post
Crozin
post 31.12.2010, 13:49:34
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
forum | fmour
dzień | deińz
Przed wyszukiwaniem porządkujesz litery wpisane przez użytkownika (fwrppa -> afpprw) i takiego właśnie "wyrazu" wyszukujesz.

Problem zaczyna się przy blankach, ale jak już wspomniałem - przeszukaj forum pod frazą "anagram" bo już było.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.07.2025 - 01:07