Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wyrazenia regularne - anagramy
Forum PHP.pl > Forum > PHP
endrju15575
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
wookieb
Wyrażenia regularne nie są w stanie zrobić takich rzeczy bo do tego nie służą.
IceManSpy
Najlepiej będzie zapisać dane litery jako tablice a potem operować na danych indeksach.
Crozin
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. }
endrju15575
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.
wookieb
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.
Crozin
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ć?
endrju15575
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.
Crozin
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.