Program do układania słów z ciągu liter

0

Otóż próbowałem napisać program do układania słów z ciągu liter ale za każdym razem nie wychodzi. Zobaczcie co mi wyszło. Prosiłbym też o pomoc w napisaniu takiego programu,

Przypuśćmy. Mamy ciąg liter:
A K U Z I J F T Ó N T H W S A J D R Y A

I z tych liter mamy ułożyć słowa różnej długości

http://www.speedyshare.com/553228153.html

0

Przeleć bazę wyrazów w poszukiwaniu wyrazów, które zawierają wszystkie litery ze zbioru.

Do przeszukiwania bazy użyj pętli

for i:=0 to ilosc_wyrazow do
begin
{ sprawdzanie wyrazu }
end; 

Do sprawdzania wystąpienia litery możesz użyć funkcji Pos

if Pos(litera, wyraz) > 0 then // Litera wystąpuje
0

a da radę ktoś napisać cały kod bo ja jestem dopiero początkujący a program potrzebuje do gry

0

A ile płacisz? Za free nie będziemy za Ciebie lekcji odrabiać.

0

heh. Kumpel powiedział mi że tutaj pomogą mi za darmo. Widzie że wszyscy czyhają tylko na kasę. Zmieniam zdanie tego forum

0

Pomogą tak, Zrobią za - nie.

0

przecież taki program dla niektórych to jest 30min. roboty. Jeżeli nikt nie pomoże to będe próbował na innym forum

0

Jesteś po prostu smierdzącym leniuchem i tyle. Mamy dla ciebie [celowo z małej litery, brak szacunku dla
leni] marnować 30 minut czy więcej jakbyś sam nie mógł wygooglować. Otóż wyrazy z kombinacji rożnych
liter zwą się anagramy i googlując trafił byś na kod zadania numer 9 w postcie na innym forum, pod linkiem
http://peb.pl/programowanie/151031-delphi-spora-liczba-programow.html tylko ze ten kod nadaje sie raczej
z tego co testowałem do krotkich wyrazów, jak wklepałem Twoją kobminację to program za długo myśli, ale
to już sobie sam możesz wykobminować lepszy kod. A za darmo to pomóc możemy - jak masz coś już sam
napisane. Jest jeszcze inna metoda opisana na http://www.delphi3000.com/articles/article_3407.asp?SK=
i z tego co widzę, to dla ponad 10 liter jest tyle kombinacji że program będzie się wykonywał 100x bardzo
długo, u mnie kończyło się to błędem "Out of memory". Do powyższego kodu użyto także Worda, ktorego
należy mieć zainstalowanego, a który to sprawdza czy dany wyraz ułożony z liter istnieje w jego słowniku..

0

Ja powiem tak:
Ludzie tu pomagają innym sam dostałem pomoc i sam pomogłem innym były nawet takie sytuacje że ktoś wklejał niedziałający kod i mu go poprawiłem cały program również z błędami logicznymi.

à propos dla 20 liter Delphi będzie Ci to sprawdzało w pierwszej podanej metodzie ze 40 lat. Trzeba pomyśleć i dla tylu liter zastosować metodę odwrotną.
Musisz sprawdzić ile trwa przeszukiwanie całego słownika i wybrać od ilu liter przeszukuje słownik a od ilu sprawdza istnienie wszystkich kombinacji.

0

u góry jest napisany przeze mnie kod. I nie chce mi działać

0

a ile by kosztowało napisanie takiego prostego programu

0

Grzesiekkk: a gdzie ten kod? Poza tym już dostałeś gotowe rozwiązania - to je wykorzystaj, co do tego
drugiego kodu, to jak nie masz Worda lub nie chcesz nim sprawdzać słów to pomiń kod z obiektem OLE.

0

Zon to zalezy co chcesz konkretnie musisz sprecyzowac z czego ma program korzystac jak szybko ma sie wykonywac. W czym ma być napisany i czy chcesz kod, czy tylko plik exe. W każdym razie do kilkudziesięciu złotych. (Od kilkunastu.)

Grzesiekkk a gdzie jest ten kod? Nawet nie jesteś u nas zarejestrowany.

0

zrób zbiór zawierający podane litery ("alfabet") bez powtórzeń.
przejedź w pętli po słowniku, kopiując do innego słownika tylko słowa zawierające litery ze zbioru (in) i jednocześnie nie zawierające liter spoza niego (not in) i nie dłuższe niż liczba wszystkich liter (z powtórzeniami).
w ten sposób zawęzisz ilość wyrazów. a jeśli wyrazy mają się składać ze wszystkich liter (bez pominięcia żadnej), to odrzucaj nie tylko słowa dłuższe, ale też słowa krótsze, wtedy słownik wyjściowy jest jednocześnie rozwiązaniem problemu.
powyższa operacja ma złożoność O(m*n2), czyli dla typowego słownika jezyka polskiego ~16MB * np. cały alfabet (32 litery) jest to mniej niż 512MB danych do przetworzenia (przerywasz wewnętrzną pętlę, tj. odrzucasz niepasujące słowo po znalezieniu pierwszej, a nie ostatniej, niepasującej litery). znośnie. przy dobrze napisanej i zoptymalizowanej pętli jest to kilkanaście-kilkadziesiąt sekund. n2 <= n, bo określa liczbę liter bez powtórzeń, poza tym to pesymistyczny przypadek (wszystkie 32 litery).

w przeciwnym wypadku - pętla po nowym słowniku, dla każdego słowa: 1. tworzysz kopię tablicy zawierającą wymagane litery (z powtórzeniami); 2. usuwasz (albo szybciej - zamieniasz na np. #255) ze słowa litery znajdujące się w kopii tablicy, i jednocześnie usuwasz te litery z tej kopii tablicy; 3. jeśli słowo jest puste ('') lub składa się z samych znaków #255, to wrzucasz je do kolejnego słownika z wynikami.
na koniec pętli po kopii słownika ten "kolejny słownik" zawiera szukane wyrazy.
powyższa operacja ma również złożoność kwadratową O(m2*n), przy czym m2 <= m to liczba słów pozostałych po pierwszym odsianiu.

dla najbardziej pesymistycznego przypadku rozwiązanie powinno być wygenerowane najdalej po kilkudziesięciu sekundach (zakładając sensowny procesor).
obie operacje da się przyspieszyć, bo założyłem porównywanie każdej litery każdego wyrazu z każdą literą naszego "alfabetu", tymczasem można to zrobić wyszukiwaniem binarnym po "alfabecie", wtedy obie operacje można spróbować zdusić do O(m * log(n2)) i O(m * log(n)), jednak zysk nie będzie duży, bo samo "opakowanie" kodu wyszukiwania połówkowego zeżre trochę mocy procesora, do tego n2 i n są małymi liczbami, więc log(n) ~ n.

widzę też inne podejście warte zastanowienia: stworzyć tyle słowników, ile ma najdłuższe słowo, powiedzmy 30, w każdym posortować wyrazy po kolejnej literze. to umożliwiłoby wyszukiwanie binarne w zbiorze kilkudziesięciu tysięcy słów, więc by naprawdę znacznie przyspieszyło cały proces, poza tym takie posortowane tabele można wygenerować raz i korzystać z nich wielokrotnie. tylko jeszcze trzeba wymyślić, jak efektywnie korzystać z tych tabel - na razie nie mam konkretnego pomysłu, a nie mam czasu myśleć nad tym. niemniej problem bardzo ciekawy, jeśli chodzi o efektywne rozwiązanie. może by jakiś konkurs znowu? :>

a tak z innej bajki:

void dekodoj(char tablica1[100],int *tab2,char *tab3,int max)
  • jak można robić błędy ortograficzne w nazwach procedur? ku*wa, człowieku, ogarnij się, wstyd. i liczenie permutacji bez powtórzeń dla n liter to wiesz, O(n!*m)... przy 10 literach pójdziesz na kawę, przy 12 literach klękniesz, a przy 16 literach dzieci twoich dzieci będą nadal czekać na wynik. 15 liter to ponad bilion potencjalnych słów, a to jeszcze razy ~2M słów w słowniku, coś koło tryliona bajtów danych. nie tędy droga.

1 użytkowników online, w tym zalogowanych: 0, gości: 1