[Vienna-pm] pseudo-bitmask to ints

Josef e9427749 at stud4.tuwien.ac.at
Wed Oct 24 11:13:30 PDT 2007


Nochmals, hai!

Josef schrieb:
> Neben glob gebt's da das Regexp::Genex Modul.

Zu glob() fällt mir noch ein das dies - falls der
Eingabestring von ausserhalb abgeleitet wird -
dann "pseudobitmask2int" zum Ausspionieren des
Dateisystems (auf älteren Perls auch Ausführen von
beliebigen Systembefehlen) verwendet werden kann.
Also Eingabe prüfen.

Hier eine Variante für die die Windoof™ nicht mögen,
dafür Gefahr umso mehr. >:->

sub pseudobitmask2int ($)
{ my ($bm)=@_;
   open (my $fh, '-|',
   qq{eval echo "ibase=2\;"`echo '$bm\;'|sed 's/\?/{0,1}/g'`|bc});
   return <$fh>
}

> (Ansonsten fielen mir noch *::Combinatorics und

use strict;
use warnings;
use Algorithm::Combinatorics qw(variations_with_repetition);

sub _fillin ($@)
{ my $template=shift;
   $template=~s/\?/ shift /ge;
   return oct("0b$template");
}

sub pseudobitmask2ints ($)
{ my ($bm)=@_;
   return map { _fillin($bm,@$_) }
          variations_with_repetition([0,1], $bm=~tr/?/?/);
}

Gefällt mir so eigentlich ganz gut...


>   Quantum::Superpositions ein ;-)

> Aber aus sportlichen Gründen noch eine Variante
> ohne glob und Co.
> 
> use strict;
> use warnings;
> 
> sub pseudobitmask2bitmasks (@);
> sub binstr2num (@);
> 
> sub pseudobitmasks2ints (@)
>    { return binstr2num pseudobitmask2bitmasks @_ }
> 
> sub pseudobitmask2bitmasks (@)
> { return map {
>     /^([01]*)\?(.*)$/ ? pseudobitmask2bitmasks("${1}0$2","${1}1$2") : $_;
>    } @_;
> }
> 
> sub binstr2num (@) { return map { oct("0b$_") } @_ }
> 
> # test
> print join ', ',pseudobitmasks2ints('1??1');
> 9, 11, 13, 15
> 
> ----------
> Und für die die einem Quanten-Computer ihr eigen nennen:
> 
> use strict;
> use warnings;
> 
> use Quantum::Superpositions qw(any eigenstates);
> 
> sub pseudobitmask2superint ($)
> { my @maskbits=split '',$_[0];
>    my $ret=0;
>    my $cat=any(1,0); # 1=lebt, 0=tot
>    for (my $f=1,my $bit;defined($bit=pop @maskbits);$f<<=1)
>      { $ret+= ($bit eq '?' ? $cat : $bit) * $f }
>    return $ret
> }
> 
> # test
> print "passt!\n" if pseudobitmask2superint('1??1')==11;
> print join ', ',eigenstates pseudobitmask2superint('1??1');

obwohl·wohl·keinem·mehr·interessieren·wird-lichst,
   Jo "kurzzeitig verschickfreudig" sef



More information about the Vienna-pm mailing list