#!/usr/bin/perl

$uklad_pokera = wybierz(52,5);

# pokaz_uklad ( $nazwa, $licznik )
#    Wyswietla opis prawdopodobienstwa ukladu (opisanego przez $nazwa),
#    ktory moze wystapic na $licznik roznych sposobow.
sub pokaz_uklad {
    my ($opis, $sposoby) = @_;
    my $prawd = $sposoby*100/$uklad_pokera;
    sprintf "%15d %7.4f%% %s\n", $sposoby, $prawd, $opis;
}

# pokaz_wiele_ukladow ( $nazwa, $licznik [, $nazwa, $licznik]... )
#    Wyswietla sekwencje prawdopodobienstw dla roznych ukladow.
sub pokaz_wiele_ukladow {
    my ( %lista ) = @_;
    my ( $klucz );

    foreach $klucz (sort {$lista{$a} <=> $lista{$b}} keys( %lista ) ) {
        print pokaz_uklad( $klucz, $lista{$klucz} );
    }
}

pokaz_wiele_ukladow(
  "jedna para"        => wybierz(13,1) * wybierz(4,2) * wybierz(12,3) *
                           (wybierz(4,1)**3),
  "dwie pary"         => wybierz(13,2) * wybierz(4,2)**2 * wybierz(11,1) *
                           wybierz(4,1),
  "trojka"            => wybierz(13,1) * wybierz(4,3) * wybierz(12,2) *
                           wybierz(4,1)**2,
  "full"              => wybierz(13,1) * wybierz(4,3) * wybierz(12,1) *
                           wybierz(4,2),
  "czworka"           => wybierz(13,1) * wybierz(4,4) * wybierz(12,1) *
                           wybierz(4,1),
  "dowolny strit"     => $dowolny_strit   = ( wybierz(10,1) * wybierz(4,1)**5 ),
  "dowolny kolor"     => $dowolny_kolor  = ( wybierz(4,1)  * wybierz(13,5) ),
  "poker"             => $poker = ( wybierz(10,1) * wybierz(4,1) ),
  "poker krolewski"   => wybierz(4,1),
  "tylko strit"       => $tylko_strit = $dowolny_strit - $poker,
  "tylko kolor"       => $tylko_kolor = $dowolny_kolor - $poker,
  "brak ukladu"       => wybierz(13,5) * wybierz(4,1)**5 - $tylko_strit
                           - $tylko_kolor - $poker
);

# wybierz($n, $k) to liczba sposobow, na jakie mozna wybrac $k elementow
# ze zbioru n-elementowego, gdzie kolejnosc wyboru nie ma znaczenia.
#
sub wybierz {
    my ($n, $k) = @_;
    my ($wynik, $j) = (1, 1);

    return 0 if $k > $n || $k < 0;
    $k = ($n - $k) if ($n - $k) < $k;

    while ( $j <= $k ) {
        $wynik *= $n--;
        $wynik /= $j++;
    }
    return $wynik;
}

