🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.ruby
6 messages
6 total messages Started by lukaszj Tue, 24 Jul 2007 14:16
Wyrażenia regularne: używanie zmiennych, ilość i kolejność znaków - pytania początkującego
#551
Author: lukaszj
Date: Tue, 24 Jul 2007 14:16
39 lines
2925 bytes
Witam!

Ruby'ego uczę się od tygodnia. Stwierdziłem że pisząc program będzie
szybciej niż mozolne czytanie książek, więc wiedzę nie mam za dużą.

Mam taki problem: piszę program który pobiera od użytkownika pewien
zestaw znaków i przechowuje w zmiennej (powiedzmy "pobrane").
Następnie posiadam tablicę strignów. Program ma porównywać te stringi
i wypisać te które zgadzają się z zestawem podanych wcześniej znaków,
np.

pobrane = "kot"

a tablica = ["kot", "kto", "kotek", "ktokolwiek"]

i wypisać ma TYLKO "kot" i "kto"

Nie mam pojęcia jak to zrobić. Używanie wyrażeń regularnych np /
#{pobrane}/ po uprzednim poprawieniu (np. uzyskując /[kot]/) nie
rozwiązuje sprawy. Wypisywać powinno tylko słowa które składają się z
liter ze zmiennej pobrane - każdy znak może być użyty tylko raz!.
Litery w zmiennej pobrane mogą się powtarzać (przy czym słowo z
tablicy może być krótsze i nie używać wszystkich znaków ze zmiennej
pobrane). Kolejność w badanym elemencie tablicy jest dowolna (jak w
przykładzie "kot" i "kto") byleby słowo z tablicy składało się po
jednym maksymalnie znaku z "pobrane".

Mam nadzieję że wyraziłem się dostatecznie jasno. Nie oczekuję
gotowego programu (chociaż nim nie pogardzę :D) i będę wdzięczny za
każdą uwagę pomocną przy rozwiązaniu.

Same wyrażenia regularne są czymś nowym, nieznanym mi wcześniej.
Problem mam właśnie z uzyskaniem takiego formatu który nie określa z
góry kolejności znaków i nie zakłada użycia wszystkich z zestawu ale
zakłada nie użycie więcej niż z danego zestawu.

Z góry dziękuję za odpowiedzi.
Pozdrawiam,
Łukasz
Re: Wyrażenia regularne: używanie zmiennych, ilość i kolejnośćznaków - pytania początkującego
#552
Author: Mariusz Kruk
Date: Tue, 24 Jul 2007 16:07
54 lines
3466 bytes
epsilon$ while read LINE; do echo ">$LINE"; done < lukaszj
>Mam taki problem: piszę program który pobiera od użytkownika pewien
>zestaw znaków i przechowuje w zmiennej (powiedzmy "pobrane").
>Następnie posiadam tablicę strignów. Program ma porównywać te stringi
>i wypisać te które zgadzają się z zestawem podanych wcześniej znaków,
>np.
>
>pobrane = "kot"
>
>a tablica = ["kot", "kto", "kotek", "ktokolwiek"]
>
>i wypisać ma TYLKO "kot" i "kto"
>
>Nie mam pojęcia jak to zrobić. Używanie wyrażeń regularnych np /
>#{pobrane}/ po uprzednim poprawieniu (np. uzyskując /[kot]/) nie
>rozwiązuje sprawy. Wypisywać powinno tylko słowa które składają się z
>liter ze zmiennej pobrane - każdy znak może być użyty tylko raz!.

Co to znaczy "każdy znak może być użyty tylko raz"?
Użytkownikowi nie wolno wpisać "rabarbar"?

>Litery w zmiennej pobrane mogą się powtarzać (przy czym słowo z
>tablicy może być krótsze i nie używać wszystkich znaków ze zmiennej
>pobrane). Kolejność w badanym elemencie tablicy jest dowolna (jak w
>przykładzie "kot" i "kto") byleby słowo z tablicy składało się po
>jednym maksymalnie znaku z "pobrane".

To po co Ci w tablicy "kotek" albo "ktokolwiek", skoro litery mają być
parami różne?

>Mam nadzieję że wyraziłem się dostatecznie jasno.

Nie do końca.

>Nie oczekuję
>gotowego programu (chociaż nim nie pogardzę :D) i będę wdzięczny za
>każdą uwagę pomocną przy rozwiązaniu.
>
>Same wyrażenia regularne są czymś nowym, nieznanym mi wcześniej.
>Problem mam właśnie z uzyskaniem takiego formatu który nie określa z
>góry kolejności znaków i nie zakłada użycia wszystkich z zestawu ale
>zakłada nie użycie więcej niż z danego zestawu.

Regexpami tego nie załatwisz. (tu się przydaje poczytanie o tym czym są
regexpy i jak się mają do automatów)

Najpierw sprecyzuj pytanie, bo na razie przedstawiłeś problem trochę
mętnie. A potem pomyśl nad zliczaniem liter.

-- 
d'`'`'`'`'`'`'`'`'`'`'`'`'Yb Leaders not followed by proper glue(TeX)
`b  Kruk@epsilon.eu.org   d' 
d' http://epsilon.eu.org/ Yb 
`b,-,.,-,.,-,.,-,.,-,.,-,.d' 
Re: Wyrażenia regularne: używanie zmiennych, ilość i kolejnośćznaków - pytania początkującego
#553
Author: lukaszj
Date: Tue, 24 Jul 2007 17:20
41 lines
3280 bytes
On 24 Lip, 18:07, Mariusz Kruk <Mariusz.K...@epsilon.eu.org> wrote:
> Co to znaczy "każdy znak może być użyty tylko raz"?
> Użytkownikowi nie wolno wpisać "rabarbar"?

Oczywiście może. Pisałem o tym dalej.
Bardziej precyzyjny przykład (mam nadzieję)
pobrane = "aabbbc"  -> czyli 2*a, 3*b i 1*c

tablica = ["ab", "aaabc", "cab", "bbcc", "abba"]

i tak:
"ab" -> OK
"aaabc" -> ZLE, zawiera 3*a a w podanym schemacie padło 2*a - użyto za
wiele liter
"cab" -> OK, nie przekracza ilości poszczególnych liter z "pobrane",
chociaż są w innej kolejności (tego właśnie nie potrafię zapisać z
wyrażenia regularnego i, jak mniemam, chyba się nie da...)
"bbcc" -> ZLE - są tu użyte dwa 'c' a w "pobrane" jest tylko jedno
"abba" -> OK, nie przekracza ilości poszczególnych liter w "pobrane"

Problem można opisać jako granie w scrable: mam ileś kostek z literami
i dostępny słownik, szukam słów które da się ułożyć z danego zestawu
kostek (przy czym nie wszystkie kostki muszą zostać użyte).

Problem mam z tym żeby litery nie musiały być w kolejności
wprowadzania. Jak zapiszę /ab/ to zawsze znajdzie takie przypadki żeby
przed 'b' wystąpiło 'a'. Z kolei jak zapiszę /[ab]/ to wystarczy żeby
znalazło się tylko 'a lub tylko 'b' i już dany string odpowiada.

Jak patrzę na wyrażenia regularne to faktycznie chyba nie taki ich cel
chociaż na początku bardzo kusiły żeby ich użyć. Bardziej przypominają
informatyczne sprawdzanie składni, chociaż liczyłem że da się je tutaj
wykorzystać (znacznie skracając pisanie odpowiednich funkcji).

Mam nadzieję że teraz trochę rozjaśniłem. Z góry dziękuję za wszelkie
uwagi. Jeżeli problem ten nie jest do rozwiązania na wyrażeniach
regularnych to proszę nie zawracać sobie głowy, wracam do Ruby i
wybiorę inną drogę :)

Pozdrawiam,
Łukasz
Re: Wyrażenia regularne: używanie zmiennych, ilość i kolejnośćznaków - pytania początkującego
#554
Author: Grzegorz Staniak
Date: Tue, 24 Jul 2007 17:50
21 lines
1634 bytes
On 24.07.2007, lukaszj <lukaszj86@gmail.com> wroted:

>> Co to znaczy "każdy znak może być użyty tylko raz"?
>> Użytkownikowi nie wolno wpisać "rabarbar"?
>
> Oczywiście może. Pisałem o tym dalej.
> Bardziej precyzyjny przykład (mam nadzieję)
> pobrane = "aabbbc"  -> czyli 2*a, 3*b i 1*c
>
> tablica = ["ab", "aaabc", "cab", "bbcc", "abba"]
>
> i tak:
> "ab" -> OK
> "aaabc" -> ZLE, zawiera 3*a a w podanym schemacie padło 2*a - użyto za
> wiele liter

Czekaj, to Ty jakiegoś scrabble'a piszesz? 

GS
-- 
Grzegorz Staniak <gstaniak _at_ wp [dot] pl>
Re: Wyrażenia regularne: używanie zmiennych, ilość i kolejnośćznaków - pytania początkującego
#555
Author: Mariusz Kruk
Date: Wed, 25 Jul 2007 05:08
15 lines
2015 bytes
epsilon$ while read LINE; do echo ">$LINE"; done < lukaszj
>> Co to znaczy "każdy znak może być użyty tylko raz"?
>> Użytkownikowi nie wolno wpisać "rabarbar"?
>Oczywiście może. Pisałem o tym dalej.

Innemi słowy - chcesz stwierdzić czy sprawdzany wyraz daje się ułożyć z
liter zawartych w danym ciągu?
No to, jak na mój gust, tablica, zliczanie i jedziesz.
Prościej się nie da. (za to da się skomplikowaniej *grin*)

-- 
/\-\/\-\/\-\/\-\/\-\/\-\/\ The `$' that I just saw supposedly matches a
\  Kruk@epsilon.eu.org   / previous `$$'.  So I shall assume  that  you
/ http://epsilon.eu.org/ \ typed `$$' both times.(TeX)
\/-/\/-/\/-/\/-/\/-/\/-/\/ 
Re: Wyrażenia regularne: używanie zmiennych, ilość i kolejnośćznaków - pytania początkującego
#556
Author: lukaszj
Date: Wed, 25 Jul 2007 11:15
13 lines
1948 bytes
On 25 Lip, 07:08, Mariusz Kruk <Mariusz.K...@epsilon.eu.org> wrote:
> Innemi słowy - chcesz stwierdzić czy sprawdzany wyraz daje się ułożyć z
> liter zawartych w danym ciągu?
> No to, jak na mój gust, tablica, zliczanie i jedziesz.
> Prościej się nie da. (za to da się skomplikowaniej *grin*)

I tak zrobię. I tak już sporo czasu straciłem próbując to zrobić
inaczej...

Dzięki za pomoc.

Pozdrawiam,
Łukasz
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads