Article View: pl.comp.lang.perl
Article #52110Re: rozmaite kombinacjo/permutacje
From: Maciej Misiak
Date: Thu, 09 Dec 2010 09:09
Date: Thu, 09 Dec 2010 09:09
63 lines
3518 bytes
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-mailReferences:
<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