🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.perl
Article #52110

Re: rozmaite kombinacjo/permutacje

#52110
From: Maciej Misiak
Date: Thu, 09 Dec 2010 09:09
63 lines
3518 bytes
W dniu 2010-12-09 08:29, Stachu 'Dozzie' K. pisze:
> On 2010-12-09, Maciej Misiak<grizzley@poczta.onet.pl>  wrote:
>> Nie będę pokazywał palcem kto mnie zaraził project Eulerem
>> (www.projecteuler.net), ale wdrożyłem się z racji takiej, że wymagana
>> jest tylko odpowiedź, a nie sposób rozwiązania. Zważywszy na to,
>> postanowiłem trochę się zaznajomić z różnorodnymi pakietami, które
>> dopomogłyby w rozwiązaniu zadań bez wynajdywania koła na nowo.
>> Piękne jest chociażby to, że można do woli używać 'use bigint' i nikt
>> złego słowa nie powie :)
>> Anyway, jest kilka zadań z kombinatoryki, np.
>> http://projecteuler.net/index.php?section=problems&id=307
>>
>> Pytanie brzmi czy ktoś natknął się na moduł CPANa, który potrafiłby
>> poiterować po wszystkich możliwych "kombinacjach"?
>>
>> Jedyne, co znam i znalazłem, to Algorithm::Permute, ale tam tylko umiem
>> podać listę elementów i permutowana jest ta lista i tyle. A tu trzeba
>> wrzucić w n kubków m kulek na wszystkie sposoby.
>
> A szukałeś pod hasłem "combinatorics"? Choćby to wygląda ciekawie:
> http://search.cpan.org/~fxn/Algorithm-Combinatorics-0.25/

Ooo, fajne! Popróbujemy...

>> Albo: http://projecteuler.net/index.php?section=problems&id=105
>> czyli z listy liczb (zbiór Q) wybieramy część do zbioru A, pozostała to
>> zbiór B.
>> Sumujemy zbiór A i zbiór B i coś tam robimy z tymi sumami, czyli
>> potrzebna jest iteracja po wszystkich możliwych podzbiorach A zbioru Q.
>
> Tych będzie 2^|Q|, wystarczy coś do dodawania jedynki na bitach. Ino
> tego będzie w pytę dużo dla zbioru Q więcej niż 20-elementowego
> i wykonanie będzie zabierać lata.

Właściwie 3^|Q|, bo mogą być jeszcze elementy nienależące do A i 
nienależące do B. Więc ja to robiłem generując wszystkie liczby w 
systemie trójkowym.
Oczywiście, że zestarzałbym się za bardzo zanim bym zobaczył choćby 
ułamek rozwiązania :) Mi chodzi o sprawdzanie na mniejszej ilości danych 
jak dany problem się zachowuje.

#!perl -l

use Algorithm::Combinatorics qw/partitions/;

@data = (1,2,3,4);

my $iter = partitions(\@data, 2);
while(my $p = $iter->next)
	{ print join ", ", map { "[@$_]" } @$p }

my $iter = partitions(\@data, 3);
while(my $p = $iter->next)
{
	print join ", ", map { "[@$_]" } @$p[0,1];
	print join ", ", map { "[@$_]" } @$p[0,2];
	print join ", ", map { "[@$_]" } @$p[1,2]
}

wygląda obiecująco.

-- 
grizzley
Technical Details
Message-ID: <idq6bk$3hl$1@news.onet.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!.POSTED!not-for-mail
References: <idp866$gql$1@news.onet.pl> <idq0hg$3ab$1@solani.org>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!.POSTED!not-for-mail
From: Maciej Misiak <grizzley@poczta.onet.pl>
Newsgroups: pl.comp.lang.perl
Subject: Re: rozmaite kombinacjo/permutacje
Date: Thu, 09 Dec 2010 10:09:03 +0100
Organization: http://onet.pl
Lines: 63
Message-ID: <idq6bk$3hl$1@news.onet.pl>
References: <idp866$gql$1@news.onet.pl> <idq0hg$3ab$1@solani.org>
NNTP-Posting-Host: ip-62-69-199-251.globalconnect.pl
Mime-Version: 1.0
X-Trace: news.onet.pl 1291885748 3637 62.69.199.251 (9 Dec 2010 09:09:08 GMT)
X-Complaints-To: niusy@onet.pl
NNTP-Posting-Date: Thu, 9 Dec 2010 09:09:08 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.13) Gecko/20101203 Thunderbird/3.1.7 ThunderBrowse/3.3.4
In-Reply-To: <idq0hg$3ab$1@solani.org>
X-Antivirus: avast! (VPS 101208-1, 2010-12-08), Outbound message
X-Antivirus-Status: Clean
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit