🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
18 messages
18 total messages Started by Sync Thu, 16 Jul 2009 17:34
Sprawdzanie elementow tablicy - zagmatwane
#51523
Author: Sync
Date: Thu, 16 Jul 2009 17:34
39 lines
1935 bytes
Witam,

Mecze sie juz pol dnia z ponizszym problemem i blagam Was o pomoc!

Mam taka oto przykladowa liste produktow zapisana jako anonimowe hasze w 
tablicy:

@produkty = (

  { produkt => "Monitor Acer x543 Bialy", cena = "1000" },
  { produkt => "Monitor Acer x543 Niebieski", cena = "950" },
  { produkt => "Dysk Twardy Seagate 250GB", cena = "150" },
  { produkt => "Dysk Twardy Seagate 500GB", cena = "350" },

);


Chce przefiltrowac te tablice w taki sposob, azeby pozostaly w niej 
produkty wylacznie *mocno rozniace sie* od siebie nazwa. Do tego celu 
uzyje modulu Text::LevenshteinXS

I tak na przyklad ustale, ze dystans Levenshteina musi wynosic ponad 30, 
aby nazwa produktu zostala uznana za wystarczajaco rozna.

Obierajac dosc wysoki wskaznik dystansu, chce zeby w mojej powyzszej 
tablicy pozostaly jedynie produkty:

Monitor Acer x543 Bialy
Dysk Twardy Seagate 250GB

poniewaz Monitor Acer x543 Niebieski i Dysk Twardy Seagate 500GB zbyt 
malo roznia sie od tych pozostajacych w tablicy.

Probowalem uzyc modulu Quantum::Superpositions, ktory dobrze sprawdzal 
sie przy porownywaniu tablic, ale nie potrafie go zastosowac w 
polaczeniu z obliczaniem dystansu.


Bardzo prosze o wszelkie sugestie jak tego dokonac. Uff, i z gory dzieki!
Re: Sprawdzanie elementow tablicy - zagmatwane
#51524
Author: Szymon Sokół
Date: Thu, 16 Jul 2009 18:00
42 lines
2946 bytes
On Thu, 16 Jul 2009 19:34:39 +0200, Sync wrote:

> @produkty = (
> 
>   { produkt => "Monitor Acer x543 Bialy", cena = "1000" },

Uwaga drobna: czy widzisz błąd składniowy powyżej?

> Obierajac dosc wysoki wskaznik dystansu, chce zeby w mojej powyzszej 
> tablicy pozostaly jedynie produkty:
> 
> Monitor Acer x543 Bialy
> Dysk Twardy Seagate 250GB
> 
> poniewaz Monitor Acer x543 Niebieski i Dysk Twardy Seagate 500GB zbyt 
> malo roznia sie od tych pozostajacych w tablicy.

Uwaga zasadnicza nr 1: a dlaczego akurat dysk 250 i biały monitor zostają, a
nie dysk 500 i niebieski monitor? Bo były wcześniej alfabetycznie, czy jest
jakiś inny powód?

Uwaga zasadnicza nr 2: zdajesz sobie sprawę, że w zależności od odpowiedzi
na powyższe pytanie może się okazać, że dostajesz drastycznie różne wyniki w
zależności od sposobu posortowania danych wejściowych? I nie chodzi mi tu
tylko o to, że z N podobnych rekordów pozostanie ten jeden lub inny jeden -
może się zdarzyć tak, że zostanie inna liczba, np. jeśli masz rekordy A,B,C,
przy czym A i C są wystarczająco odległe od siebie, ale B jest blisko
zarówno A, jak C, to może wyjść tak, że zostanie tylko B, a może tak, że
zostaną A i C. 

> Probowalem uzyc modulu Quantum::Superpositions, ktory dobrze sprawdzal 
> sie przy porownywaniu tablic, ale nie potrafie go zastosowac w 
> polaczeniu z obliczaniem dystansu.

Uwaga zasadnicza nr 3: to, że dany moduł się do czegoś nadaje, nie oznacza,
że nadaje się również do czegoś zupełnie innego. 

-- 
Szymon Sokół (SS316-RIPE) -- Network Manager                                 B
Computer Center, AGH - University of Science and Technology, Cracow, Poland  O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982  F
Free speech includes the right not to listen, if not interested -- Heinlein  H
Re: Sprawdzanie elementow tablicy - zagmatwane
#51525
Author: Sync
Date: Thu, 16 Jul 2009 19:08
69 lines
3622 bytes
Szymon Sokół wrote:
> On Thu, 16 Jul 2009 19:34:39 +0200, Sync wrote:
> 
>> @produkty = (
>>
>>   { produkt => "Monitor Acer x543 Bialy", cena = "1000" },
> 
> Uwaga drobna: czy widzisz błąd składniowy powyżej?

Oczywiscie, pisalem to napredce w kliencie. Sorki za moj blad. Mam 
jednak nadzieje, ze zrozumieliscie o co chodzi.

> 
>> Obierajac dosc wysoki wskaznik dystansu, chce zeby w mojej powyzszej 
>> tablicy pozostaly jedynie produkty:
>>
>> Monitor Acer x543 Bialy
>> Dysk Twardy Seagate 250GB
>>
>> poniewaz Monitor Acer x543 Niebieski i Dysk Twardy Seagate 500GB zbyt 
>> malo roznia sie od tych pozostajacych w tablicy.
> 
> Uwaga zasadnicza nr 1: a dlaczego akurat dysk 250 i biały monitor zostają, a
> nie dysk 500 i niebieski monitor? Bo były wcześniej alfabetycznie, czy jest
> jakiś inny powód?

Zostaja, poniewaz pojawily sie jako pierwsze alfabetycznie, lub z 
dowolnego innego powodu. Tj. jesli w tablicy pozostanie produkt o danej 
nazwie, to chce, aby pozniej pojawiajace sie produkty o podobnej nazwie 
byly odfiltrowywane. I nie ma znaczenia kolejnosc ich pojawiania sie.


> Uwaga zasadnicza nr 2: zdajesz sobie sprawę, że w zależności od odpowiedzi
> na powyższe pytanie może się okazać, że dostajesz drastycznie różne wyniki w
> zależności od sposobu posortowania danych wejściowych? I nie chodzi mi tu
> tylko o to, że z N podobnych rekordów pozostanie ten jeden lub inny jeden -
> może się zdarzyć tak, że zostanie inna liczba, np. jeśli masz rekordy A,B,C,
> przy czym A i C są wystarczająco odległe od siebie, ale B jest blisko
> zarówno A, jak C, to może wyjść tak, że zostanie tylko B, a może tak, że
> zostaną A i C. 

Nie potrafie wyobrazic sobie takiej sytuacji. Bo na przyklad nastepujace 
produkty A,B,C:

A) Monitor Acer CX544
B) Monitor Acer GX540
C) Dysk twardy Seagate 500GB Barracuda

sa jednakowoz od siebie odlegle, niezaleznie od tego ile z tych 
produktow do siebie porownasz, tj. niezaleznie od tego ile w bazie 
pozostanie.

A zatem, jezeli usuniesz A, to B i C nadal sa tak samo od siebie 
odlegle. Jezeli usuniesz B to A i C nadal sa tak samo od siebie odlegle. 
I jezeli usuniesz C to A i B nadal sa od siebie tak samo odlegle.

Ja po prostu chce zadac dodatkowe kryterium, np. jezeli odleglosc danego 
rekordu jest < 50 od kolejnego rekordu to nalezy usunac ten kolejny rekord.

Chyba, ze gdzies w tym zalozeniu tkwi blad?

>> Probowalem uzyc modulu Quantum::Superpositions, ktory dobrze sprawdzal 
>> sie przy porownywaniu tablic, ale nie potrafie go zastosowac w 
>> polaczeniu z obliczaniem dystansu.
> 
> Uwaga zasadnicza nr 3: to, że dany moduł się do czegoś nadaje, nie oznacza,
> że nadaje się również do czegoś zupełnie innego. 

Zgoda. Stad moje pytanie.
Re: Sprawdzanie elementow tablicy - zagmatwane
#51526
Author: Szymon Sokół
Date: Thu, 16 Jul 2009 19:29
30 lines
2576 bytes
On Thu, 16 Jul 2009 21:08:21 +0200, Sync wrote:

> Nie potrafie wyobrazic sobie takiej sytuacji. Bo na przyklad nastepujace 
> produkty A,B,C:
> 
> A) Monitor Acer CX544
> B) Monitor Acer GX540
> C) Dysk twardy Seagate 500GB Barracuda
> 
> sa jednakowoz od siebie odlegle, niezaleznie od tego ile z tych 
> produktow do siebie porownasz, tj. niezaleznie od tego ile w bazie 
> pozostanie.
> 
> A zatem, jezeli usuniesz A, to B i C nadal sa tak samo od siebie 
> odlegle. Jezeli usuniesz B to A i C nadal sa tak samo od siebie odlegle. 
> I jezeli usuniesz C to A i B nadal sa od siebie tak samo odlegle.

Nie w tym rzecz. Jeśli np. A i B byłyby odległe o 20, B i C też o 20, a A i
C o 40, to kolejność usuwania zależy od kolejności wejściowej. Jeśli na
wejściu idą A,B,C, to najpierw porównane będą A z B, B zostanie usunięty,
potem A będzie porównany z C i C *nie* zostanie usunięty. Pozostaną A i C.
Gdybyś jednak miał kolejność B, A, C, to najpierw B jest porównywany z A, A
zostanie usunięty, potem B zostanie porównany z C, C zostanie usunięty,
pozostanie samotny B. Teraz jasne?
  
-- 
Szymon Sokół (SS316-RIPE) -- Network Manager                                 B
Computer Center, AGH - University of Science and Technology, Cracow, Poland  O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982  F
Free speech includes the right not to listen, if not interested -- Heinlein  H
Re: Sprawdzanie elementow tablicy - zagmatwane
#51528
Author: hubert depesz lubaczewski
Date: Thu, 16 Jul 2009 20:40
13 lines
1345 bytes
On 2009-07-16, Sync <sync@sync.com> wrote:
> Chce przefiltrowac te tablice w taki sposob, azeby pozostaly w niej 
> produkty wylacznie *mocno rozniace sie* od siebie nazwa. Do tego celu 

ile (tak mniej więcej) będzie rekordów na wyjściu? bo jak odpowiednio
mało, to zrób to brute force'em - każdy nowy element porównując po kolei
(ale od końca) z wszystkimi które już się zakwalifikowały.

depesz

-- 
Linkedin: http://www.linkedin.com/in/depesz  /  blog: http://www.depesz.com/
jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007
Re: Sprawdzanie elementow tablicy - zagmatwane
#51527
Author: Sync
Date: Fri, 17 Jul 2009 04:52
14 lines
1725 bytes
Szymon Sokół wrote:
> On Thu, 16 Jul 2009 21:08:21 +0200, Sync wrote:
> Nie w tym rzecz. Jeśli np. A i B byłyby odległe o 20, B i C też o 20, a A i
> C o 40, to kolejność usuwania zależy od kolejności wejściowej. Jeśli na
> wejściu idą A,B,C, to najpierw porównane będą A z B, B zostanie usunięty,
> potem A będzie porównany z C i C *nie* zostanie usunięty. Pozostaną A i C.
> Gdybyś jednak miał kolejność B, A, C, to najpierw B jest porównywany z A, A
> zostanie usunięty, potem B zostanie porównany z C, C zostanie usunięty,
> pozostanie samotny B. Teraz jasne?

Ale ja sie z tym zgadzam i jest to dla mnie jasne od poczatku. Zauwaz 
jednak, ze zaznaczylem w poprzednim poscie, ze *kolejnosc nie ma 
znaczenia*. Po prostu w liscie pozostanie jeden produkt najmocniej 
rozniacy sie nazwa od innych.
Re: Sprawdzanie elementow tablicy - zagmatwane
#51529
Author: Sync
Date: Fri, 17 Jul 2009 04:56
31 lines
1650 bytes
hubert depesz lubaczewski wrote:
> On 2009-07-16, Sync <sync@sync.com> wrote:
>> Chce przefiltrowac te tablice w taki sposob, azeby pozostaly w niej 
>> produkty wylacznie *mocno rozniace sie* od siebie nazwa. Do tego celu 
> 
> ile (tak mniej więcej) będzie rekordów na wyjściu? bo jak odpowiednio
> mało, to zrób to brute force'em - każdy nowy element porównując po kolei
> (ale od końca) z wszystkimi które już się zakwalifikowały.

Zdaje sie, ze znalazlem rozwiazanie tego problemu, jednak potrzebuje 
jeszcze szybkiej podpowiedzi.

Mam w liscie nastepujace elementy:

Janek
Krysia
Bronek
Janek
Tadek

W jaki sposob usunac z tej listy powtarzajace sie imiona, nie uzywajac 
zadnego modulu w stylu Array::Unique, a jedynie zwyklej petli?

W tym wypadku chcialbym, zeby pozostaly:

Janek
Krysia
Bronek
Tadek

Dzieki z gory za wszelkie sugestie.
Re: Sprawdzanie elementow tablicy - zagmatwane
#51531
Author: hubert depesz lubaczewski
Date: Fri, 17 Jul 2009 07:19
18 lines
1580 bytes
On 2009-07-17, Sync <sync@sync.com> wrote:
> W jaki sposob usunac z tej listy powtarzajace sie imiona, nie uzywajac 
> zadnego modulu w stylu Array::Unique, a jedynie zwyklej petli?

odpowiem, ale napierw powiedz czemu nie używając żadnego modułu.

w ramach przygotowania do odpowiedzi przeczytaj
http://www.shadowcat.co.uk/blog/matt-s-trout/but-i-cant-use-cpan/

bo prośba "zróbmy coś, ale nie używając żadnych modułów" jest jak coś w
stylu "zawiążmy buty, ale nie używając rąk ani nóg". pewnie się da,
będzie upierdliwe, i zasadniczo bezsensowne.

depesz

-- 
Linkedin: http://www.linkedin.com/in/depesz  /  blog: http://www.depesz.com/
jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007
Re: Sprawdzanie elementow tablicy - zagmatwane
#51530
Author: Adam Osuchowski
Date: Fri, 17 Jul 2009 09:06
18 lines
1885 bytes
hubert depesz lubaczewski wrote:
> odpowiem, ale napierw powiedz czemu nie używając żadnego modułu.
> 
> w ramach przygotowania do odpowiedzi przeczytaj
> http://www.shadowcat.co.uk/blog/matt-s-trout/but-i-cant-use-cpan/
> 
> bo prośba "zróbmy coś, ale nie używając żadnych modułów" jest jak coś w
> stylu "zawiążmy buty, ale nie używając rąk ani nóg". pewnie się da,
> będzie upierdliwe, i zasadniczo bezsensowne.

Bo są zagadnienia na tyle proste, że używanie do tego zewnętrznych
modułów jest przerostem formy nad treścią. Na CPANie aż roi się od
modułów-śmieci w wersji 0.01, lub niewiele większej, które służą do
rozwiązywania problemów, z którymi można się uporać za pomocą pure Perla,
a istnieją chyba tylko dlatego, że ich autorzy chcieli jakoś zaistnieć
w środowisku. Nie jestem przeciwnikiem używania zewnętrznych modułów,
ale trzeba znaleźć rozsądną granicę złożoności zagadnienia, która
kwalifikuje wydelegowanie rozwiązania do osobnego modułu.
Re: Sprawdzanie elementow tablicy - zagmatwane
#51532
Author: Adam Osuchowski
Date: Fri, 17 Jul 2009 09:12
32 lines
1499 bytes
Sync wrote:
> Mam w liscie nastepujace elementy:
>
> Janek
> Krysia
> Bronek
> Janek
> Tadek
>
> W jaki sposob usunac z tej listy powtarzajace sie imiona, nie uzywajac 
> zadnego modulu w stylu Array::Unique, a jedynie zwyklej petli?
>
> W tym wypadku chcialbym, zeby pozostaly:
>
> Janek
> Krysia
> Bronek
> Tadek

#v+
my @in = qw(Janek Krysia Bronek Janek Tadek);
my %x;
my @uniq = grep { !$x{$_}++ } @in;
undef %x;
#v-

Jeśli nie jest istotna kolejność listy wynikowej to można to uprościć do:

#v+
my @in = qw(Janek Krysia Bronek Janek Tadek);
my @uniq = keys %{{ map { $_ => 1 } @in }};
#v-
Re: Sprawdzanie elementow tablicy - zagmatwane
#51533
Author: hubert depesz lubaczewski
Date: Fri, 17 Jul 2009 12:14
41 lines
2400 bytes
On 2009-07-17, Adam Osuchowski <someone@somewhere.com> wrote:
> Bo są zagadnienia na tyle proste, że używanie do tego zewnętrznych
> modułów jest przerostem formy nad treścią. Na CPANie aż roi się od
> modułów-śmieci w wersji 0.01, lub niewiele większej, które służą do
> rozwiązywania problemów, z którymi można się uporać za pomocą pure Perla,
> a istnieją chyba tylko dlatego, że ich autorzy chcieli jakoś zaistnieć
> w środowisku. Nie jestem przeciwnikiem używania zewnętrznych modułów,
> ale trzeba znaleźć rozsądną granicę złożoności zagadnienia, która
> kwalifikuje wydelegowanie rozwiązania do osobnego modułu.

Argument relatywnie niezły, ale jednak:

use List::MoreUtils qw( uniq );

i potem:

@lista = uniq( @lista );

dlaczego jednak proponuję modułem (widziałem już twój post w którym
znalazłeś rozwiązanie z haszem)? 2 powody:

1. List::MoreUtils trzeba znać. nie przychodzi jeszcze razem z perlem,
ale używam go baaaaaaardzo często. Na przykład do tego by sprawdzić czy
coś jest w arrayu. Zrobienie tego samego samemu jest teoretycznie
trywialne, ale i tak zazwyczaj kończy się na absurdalnym:
if (grep { $_ eq 'wartosc' } @lista) {

2. Czytelność.

my %x;
@lista = grep { !$x{$_}++ } @lista;

vs.

@lista = uniq( @lista );

depesz

-- 
Linkedin: http://www.linkedin.com/in/depesz  /  blog: http://www.depesz.com/
jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007
Re: Sprawdzanie elementow tablicy - zagmatwane
#51534
Author: Sync
Date: Sat, 18 Jul 2009 14:07
49 lines
2173 bytes
Adam Osuchowski wrote:
> Jeśli nie jest istotna kolejność listy wynikowej to można to uprościć do:
> 
> #v+
> my @in = qw(Janek Krysia Bronek Janek Tadek);
> my @uniq = keys %{{ map { $_ => 1 } @in }};
> #v-

Dobra, a teraz trudniejsza czesc tego zagadnienia: chce, aby nie tylko 
imiona identyczle, ale *rowniez czesciowo podobne* byly takze usuwane z 
listy (stopien podobienstwa okreslam za pomoca modulu 
Text::LevenshteinXS). Dodatkowo elementy tablicy to referencje do 
anonimowych haszy, tak, zeby bylo ciekawiej:

@ludzie = (

  { imie => "Kajtek", nazwisko => "Brzeczyszczykiewicz" },
  { imie => "Zenek", nazwisko => "Chrzaszczkiewicz" },
  { imie => "Benek", nazwisko => "Brzerzeczynski" },
  { imie => "Zosia", nazwisko => "Chrabaszczynska" },
  { imie => "Zenek", nazwisko => "Ksiazkiewicz" },
  { imie => "Krysia", nazwisko => "Nowak" },

);


A zatem chce, zeby w liscie pozostali wylacznie (sprawdzam tylko imiona):

Kajtek
Zenek
Zosia
Krysia


Usunieto:

Benek, bo bardzo podobny do Zenek
Zenek (2), bo identyczny z Zenek (1)


Gdyby nie byly to anonimowe hasze to juz dawno poradzilbym sobie z tym 
uzywajac Quantum::Superpositions.

W tej sytuacji musze skorzystac z jakies standardowej petli, zeby 
zdekodowac referencje.

Bede bardzo wdzieczny za pomoc.

Pozdrawiam.
Re: Sprawdzanie elementow tablicy - zagmatwane
#51535
Author: Adam Osuchowski
Date: Sat, 18 Jul 2009 19:30
10 lines
1291 bytes
Sync wrote:
> Gdyby nie byly to anonimowe hasze to juz dawno poradzilbym sobie z tym 
> uzywajac Quantum::Superpositions.

A dlaczego nie możesz stworzyć, na podstawie danych z @ludzie, tymczasowej
struktury, odpowiadającej temu co potrzebuje na wejściu ten moduł?

Jeśli to miałaby być prosta lista zawierająca wyłącznie imiona to wystarczy:

my @ludzie2 = map { $_->{imie} } @ludzie;
Re: Sprawdzanie elementow tablicy - zagmatwane
#51536
Author: Szymon Sokół
Date: Sat, 18 Jul 2009 22:25
29 lines
2556 bytes
On Sat, 18 Jul 2009 19:30:37 +0000 (UTC), Adam Osuchowski wrote:

> Sync wrote:
>> Gdyby nie byly to anonimowe hasze to juz dawno poradzilbym sobie z tym 
>> uzywajac Quantum::Superpositions.
> 
> A dlaczego nie możesz stworzyć, na podstawie danych z @ludzie, tymczasowej
> struktury, odpowiadającej temu co potrzebuje na wejściu ten moduł?
> 
> Jeśli to miałaby być prosta lista zawierająca wyłącznie imiona to wystarczy:
> 
> my @ludzie2 = map { $_->{imie} } @ludzie;

Tylko potem może być problemem powiązanie wyników z pierwotnymi danymi
(przykładowo, czy ten Zenek, który został, to Chrzaszczkiewicz czy
Ksiazkiewicz?)

Ale ja w ogóle nie bardzo rozumiem sens użycia Quantum::Superpositions do
tego zadania. I nie bardzo rozumiem, dlaczego fakt występowania anonimowych
hashy coś tu komplikuje. Sync, czy możesz zademonstrować, jak chcesz użyć
tego modułu przy założeniu, że masz prostą listę typu:
@ludzie = ("Kajtek", "Zenek", "Benek", "Zosia", "Zenek", "Krysia"); 
?
 
-- 
Szymon Sokół (SS316-RIPE) -- Network Manager                                 B
Computer Center, AGH - University of Science and Technology, Cracow, Poland  O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982  F
Free speech includes the right not to listen, if not interested -- Heinlein  H
Re: Sprawdzanie elementow tablicy - zagmatwane
#51538
Author: Maciej Misiak
Date: Sun, 19 Jul 2009 09:21
81 lines
3102 bytes
Sync pisze:
> Adam Osuchowski wrote:
>> Jeśli nie jest istotna kolejność listy wynikowej to można to uprościć do:
>>
>> #v+
>> my @in = qw(Janek Krysia Bronek Janek Tadek);
>> my @uniq = keys %{{ map { $_ => 1 } @in }};
>> #v-
> 
> Dobra, a teraz trudniejsza czesc tego zagadnienia: chce, aby nie tylko 
> imiona identyczle, ale *rowniez czesciowo podobne* byly takze usuwane z 
> listy (stopien podobienstwa okreslam za pomoca modulu 
> Text::LevenshteinXS). Dodatkowo elementy tablicy to referencje do 
> anonimowych haszy, tak, zeby bylo ciekawiej:
> 
> @ludzie = (
> 
>  { imie => "Kajtek", nazwisko => "Brzeczyszczykiewicz" },
>  { imie => "Zenek", nazwisko => "Chrzaszczkiewicz" },
>  { imie => "Benek", nazwisko => "Brzerzeczynski" },
>  { imie => "Zosia", nazwisko => "Chrabaszczynska" },
>  { imie => "Zenek", nazwisko => "Ksiazkiewicz" },
>  { imie => "Krysia", nazwisko => "Nowak" },
> 
> );
> 
> 
> A zatem chce, zeby w liscie pozostali wylacznie (sprawdzam tylko imiona):
> 
> Kajtek
> Zenek
> Zosia
> Krysia
> 
> 
> Usunieto:
> 
> Benek, bo bardzo podobny do Zenek
> Zenek (2), bo identyczny z Zenek (1)
> 
> 
> Gdyby nie byly to anonimowe hasze to juz dawno poradzilbym sobie z tym 
> uzywajac Quantum::Superpositions.
> 
> W tej sytuacji musze skorzystac z jakies standardowej petli, zeby 
> zdekodowac referencje.
> 
> Bede bardzo wdzieczny za pomoc.
> 
> Pozdrawiam.

To może Ty tak po prostu napisz dwie funkcje pomocnicze i podwójną pętlę?

sub similar
{
	my ($elem1, $elem2) = @_;
	return 1 if $elem1->{imie} eq $elem2->{imie} albo jakis inny warunek;
	return 0;
}

sub already
{
	my($elem, $refRetList) = @_;
	for(@$refRetList)
	{
		return 1 if similar($elem, $_);
	}
	return 0;
}

for (@ludzie)
{
	if(!already($_, \@retList)
		{ push @retList, $_ }
}

Przychodzi do głowy jeszcze transformacja Schwartza, ale podwójnej pętli 
na moje oko nie ominiesz.

-- 
grizzley
Re: Sprawdzanie elementow tablicy - zagmatwane
#51539
Author: Szymon Sokół
Date: Sun, 19 Jul 2009 13:07
31 lines
2144 bytes
On Sun, 19 Jul 2009 11:21:09 +0200, Maciej Misiak wrote:

> sub similar
> {
> 	my ($elem1, $elem2) = @_;
> 	return 1 if $elem1->{imie} eq $elem2->{imie} albo jakis inny warunek;
> 	return 0;
> }

Prościej:
sub similar {
  $_[0]->{imie} eq $_[1]->{imie};
}
 
A raczej, w tym przypadku:
sub similar {
  $_[0]->{imie} eq $_[1]->{imie} or 
    Text:Levenshtein::distance($_[0]->{imie}, $_[1]->{imie}) > 30;
}

> Przychodzi do głowy jeszcze transformacja Schwartza, ale podwójnej pętli 
> na moje oko nie ominiesz.

Nawet na pewno nie, chyba żeby zrobić ukrytą (za pomocą map albo rekurencji)
;-)

-- 
Szymon Sokół (SS316-RIPE) -- Network Manager                                 B
Computer Center, AGH - University of Science and Technology, Cracow, Poland  O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982  F
Free speech includes the right not to listen, if not interested -- Heinlein  H
Re: Levenshtein - gdybanie
#51540
Author: Maciej Misiak
Date: Sun, 19 Jul 2009 14:10
45 lines
2489 bytes
Szymon Sokół pisze:
>> Przychodzi do głowy jeszcze transformacja Schwartza, ale podwójnej pętli 
>> na moje oko nie ominiesz.
> 
> Nawet na pewno nie, chyba żeby zrobić ukrytą (za pomocą map albo rekurencji)
> ;-)

Chyba, że...

<przypomnienie>
#v+
my @in = qw(Janek Krysia Bronek Janek Tadek);
my %x;
my @uniq = grep { !$x{$_}++ } @in;
undef %x;
#v-
</przypomnienie>

udałoby się znaleźć taką funkcję, że zadziałałoby

my @uniq = grep { !$x{fukcja($_)}++ } @in;

czyli funkcja musiałaby generować wspólny unikalny identyfikator dla
wszystkich wyrazów odległych 'levenshteinowo' mniej niż na 30 jednostek
od, np. 'Janek'. Noo, to załamać ręce wystarczy i koniec tematu :)

No ale pytanie co w wypadku, gdyby takoważ funkcja mierzyła dystans od
jakiegoś stałego wyrazu:
sub funkcja
{
	Text:Levenshtein::distance($_[0], 'dowolnecostam');
}

?
Wtedy w hashu pod pozycją n przechowywalibyśmy listę wyrazów odległych o
n. Czy to cokolwiek daje? Pytanie czy dwa słowa odległe o n i m od tego 
consta, są związane jakąkolwiek zależnością (nie wiem, tylko dla 
odległości Hamminga coś takiego znalazłem). Bo jeśli tak, to byłoby to 
pole do optymalizacji przynajmniej.

Ot, takie tam gdybanie nad wydumanym problemem jak człowiek kombinuje ze 
wszech miar jak się nie zabrać do swojej pracy...

-- 
grizzley
Re: Levenshtein - gdybanie
#51541
Author: Szymon Sokół
Date: Sun, 19 Jul 2009 14:24
13 lines
1925 bytes
On Sun, 19 Jul 2009 16:10:37 +0200, Maciej Misiak wrote:

> Wtedy w hashu pod pozycją n przechowywalibyśmy listę wyrazów odległych o
> n. Czy to cokolwiek daje? Pytanie czy dwa słowa odległe o n i m od tego 
> consta, są związane jakąkolwiek zależnością 
Tak, są odległe od siebie o co najwyżej n+m :-) (nie, to raczej nic nie
daje).

-- 
Szymon Sokół (SS316-RIPE) -- Network Manager                                 B
Computer Center, AGH - University of Science and Technology, Cracow, Poland  O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982  F
Free speech includes the right not to listen, if not interested -- Heinlein  H
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