App-digitdemog
view release on metacpan or search on metacpan
$M{$len}[2] = $_ if ! defined $M{$len}[2] ;
$M{$len}[3] = $_ ;
}
print join ( "\t", map {UNDERLINE $_} qw[length freq minstr maxstr] , $oL4 ? qw[first_str last_str ]:() ) , "\n" ;
for ( sort { $a <=> $b } keys %M ) { # æ°å¤ (æååã®é·ãã表ã)ã§ã½ã¼ã
my @str = @{ $M{$_} } ;
my @prt = $optq0 ? @str : map { defined $_ ? qq['$_'] : undef } @str ;
$prt[1] = DARK '<-- same' if $str[1] eq $str[0] ;
$prt[3] = DARK '<-- same' if $oL4 and defined $str[3] and $str[3] eq $str[2] ; #|| $str[3] eq $str[1];
for my $p ($oL4? 0..3 : 0..1 ) {
$prt[$p] = $prt[$p] . DARK "(" . $freq{ $str[$p] } . ")" if $freq{ $str[$p] } != $Lfrq{$_} ;
}
print join ( "\t" , $_ , $Lfrq{$_}, @prt ) , "\n" ;
}
}
sub d3 ($) { $_[0] =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr } ; # æ°ã3æ¡åºåãã«å¤æããã
sub majority2 ( @ ) {
# ããããªå¤ãé
åã§åãåããé »åº¦2以ä¸ã®ãã®ã«ã¤ãã¦ãå¤ãé çªã«è¿ãã# åä¸ã®å
¥åã§ããåãé »åº¦ãªãã©ã£ã¡ãåªå
ããããã¯ä¸æã
my %h ; # ãã¹ãã°ã©ã
++ $h { $_ } for ( @_ ) ;
my $m = max values %h ;
$h{$_} == 1 and delete $h{$_} for keys %h ; #++ $m if $m == 1; # é »åº¦ã®æå¤§å¤ã1ãªããæ¬¡ã®å¦çã§ç©ºåãè¿ãããã«ããã
my %h2 ;
my @out ;
for ( keys %h ) { push @{ $h2{ $h{$_} } } , $_ }
for ( sort { $b <=> $a } keys %h2 ) { push @out , @{ $h2{$_} } }
return @out ;#first { $h {$_} == $m } keys %h
} # ãªã¹ãããæãæåã®å¤ããã®ãããã«ã²ã¨ã¤ã ãé¸ã¶.
sub backslash ($$) { # å¶å¾¡æåãä¸é¨ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã«å¤åãããã arg2 㯠ã·ã³ã°ã«ã¯ã©ã¼ãã¼ã·ã§ã³ãä½ã«å¤åããããã
do{ my $c = eval qq["$_"] ; $_[0] =~ s/$c/$_/g and $_[0] =~ s/'/$_[1]/g } for qw[\a \n \r \f \t \e] ;
return $_[0] ; #
}
sub stock ($$$$) { # arg2ãåç
§ããé
åã§ arg1 åèããããarg3ã®å¤ãå¾ãã«è¿½å ãããã«ãarg4ã®0/1ã«å¿ãã¦ãpop/shift(å¾ãåºã/ååºã)ããã
my @ary = uniq @{ ${$_[1]} }, $_[2] ;
@{ ${$_[1]} } = splice @ary, ( $_[3] ? max 0,scalar @ary - $_[0] : 0 ) , $_[0] ;
} ; # åè¡ã®ä¾ãã¹ããã¯ããããã®é¢æ°
##
## æ®éã®ã¢ã¼ãã®main颿°
##
sub main_normal ( ) {
my %freq ; # åãè¡ãæ¥ããã©ããã®å¤å®ã«ä½¿ããæ°ãéè¨ãããã
my %S1 ; # $S1{$v}{$pos} ã®ããã«ä½¿ãã åºç¾åæ°ã®éè¨è¡¨ ; # ããã® $v 㯠æåã¨è¨ããããã¿ã¼ã³ã示ãã'a'ã¨ã [1-3]ã¨ããããã§ã¯ãæåãã¨å¼ã¶ã
my %S2 ; # $S2{$v}{$pos} = "è¡çªå·+è¡çªå·+...è¡çªå·+" (Lã¨ãã); $vãåºç¾ããæ¡$posã«å¯¾å¿ããè¡çªå·ãèããã
my %S3 ; # @ { $S3{ F } } ã«ãã£ã¦ãåå²è¡¨ã§é »åº¦ F åç¾ãã è¡çªå·éåã®å¤ L (%S2ã®æã¤å¤)ãåç
§ã§ããããã«ããã
my %mark ; # $mark{ L } ãããªãªããããªãªãä»ããã ( -. ã§ä½¿ãã)
my %Gs ; # @{ $G { $v } { $pos } [ 0 or 1 ] } ã§ è¡ã®å
·ä½ä¾ãæ ¼ç´ã ( -g ã§ä½¿ãã)
my $maxlen = 0 ; # æååã®æå¤§é·
my $eol = "EOL" . int rand 8 ; # åè¡ã®çµããã示ãã## saikoro -g10,3 ã§ãããã試ããã
@e = map { decode_utf8 $_ } @e unless $optu0 ;
unshift @e , "$eol\$" ; # æ£è¦è¡¨ç¾ãã¿ã¼ã³ç¾¤ã« $eol ã æå㫠追å ã # ãè¡æ«ãã¯é »åº¦ãå¤ãã®ã§æåã«æã£ã¦ããã
#push @e , "$eol\$" ; # æ£è¦è¡¨ç¾ãã¿ã¼ã³ç¾¤ã« $eol ã æå¾ã« 追å ã# ããã¯ãunshift ã§ã push ã§ãè¯ãã
my @eqr ; # ãe ãqrããã ãã«ããåä»ããã
my @exu ; # ãeã«ããã¦ãã¨ã¹ã±ã¼ã(escape)ãã¦ã¦ãã³ã¼ã(unicode)ã§è¡¨ããé¨åããããã«ããåä»ãã
for ( 0 .. $#e ) {
my $eout = $e[$_] =~ s/#.*$//r ; # æ£è¦è¡¨ç¾ã§ãã³ã¡ã³ã#ã®é¨åã¯é¤å»ããã
my @F = split /([[:^ascii:]])/o , $eout , 0 ; # ãã¿ã¼ã³ã§åã£ãæå¾ã¯ç©ºæååãªãåãè½ã¨ãããã®0
grep { $_ = (sprintf '\x{%02X}', ord $_ ) if m/[[:^ascii:]]/ } @F ;
my $p = join '' , @F ;
$eqr [ $_ ] = qr/$p/ ; # ãããããæ£è¦è¡¨ç¾ã¨ãã¦å
ã«ã³ã³ãã¤ã«ãããã¨ã§é«éåã
push @exu , $p ;
}
# split ã§å²ãããã®ãã¿ã¼ã³ã®è¨å®ã
my $piecePattern = @e ? do{ my$t=join'|',@exu,'.','\n';qr/$t/o} : qr//o ; # @exuã«1æå(.)ã¨æ¹è¡æåã追å ããã
$header = <> if $o{'='} ;
while ( <> ) {
chomp if 0 eq ($o{n}//'') ; #-n0 ã§æ¹è¡æåãé¤å»ã
next if $freq{$_} ++ && $o{1} ; # && ã®åå¾ã®é åºã«æ³¨æ
s/\r$// unless $optw0 ;
$_ = decode_utf8 $_ unless $optu0 ;
# â½ ãã¿ã¼ã³ã«æååãåè§£ã
my @vvec = m/$piecePattern/go ;
push @vvec , $eol ; # åè¡ããã©ãã©ã«ããå¾ã«ã$eolãæå¾ã«è¿½å ã
splice @vvec , $width, if defined $width ;
$maxlen = @vvec if $maxlen < @vvec ; # æå¤§é·ã®ä¿ç®¡
for my $pos ( 0 .. $#vvec ) {
my $char = $vvec [ $pos ] ; # å®éã®æå(å)ã (ãã¿ã¼ã³ã«ã¯ã¾ã åé¡ãã¦ããªãã)
my $v ; # ã©ã®ãã¿ã¼ã³ã¾ãã¯æåã¨ãã¦èªèãããã(åé¡ããããã¿ã¼ã³ãªã®ã§ããã)
# â½ ã©ã®ãã¿ã¼ã³ã«ããããããã$vã«æ ¼ç´ãããæ¬¡ã®2è¡ã®ã³ã¼ãã§ã
$char =~ $eqr[$_] and do { $v = $e[$_] ; last } for 0 .. $#e ; # æå®ãããã¿ã¼ã³ã®æ°ãå¤ãã¨é
ããªãã§ããããé »åº¦ã®é«ããã¿ã¼ã³ãå
ã«ç½®ãã¨æ©ããªãã
$v //= "'$vvec[$pos]'" ; # åè¡ã®å¦çã§å½ã¦ã¯ã¾ããªãå ´åãã¯ã©ã¼ãã¼ã·ã§ã³ãä»å ããããã«ããã
$S1 { $v } { $pos } ++ ;
$S2 { $v } { $pos } .= "$.+" if $o{'.'} ; # <-- $S2{..}ã§ããã®ãæåãããã®æ¡ã§ç¾ããããè¡çªå·éåãL ãçµæçã«çæãããã
do { for my $way (0,1) { & stock ( $o{g} , \$Gs{$v}{$pos}[$way] , $_ , $way ) } } if $o{g} ; # æ¹è¡æåã¯ããã§ã¯é¤å»ãã
}
} # â å
¥åèªã¿åãå¦çã®çµãã
if ( $o{'.'} ) { ## è¤éãªå¦çã§ããâ # $S1{ .. }ãã§ ãã®ãæåãããåæ¡ãã§ãä½å (bå) ç¾ããã®ãã... # ãã® ; ãbåãç¾ãã L ã S3ã«ä¿ç®¡ã
for my $v ( keys %S1 ){
push @{ $S3 { $S1{$v}{$_} } }, $S2{$v}{$_} for keys %{ $S1{$v} } ;
}
for( keys %S3 ){ # åãæåããåæ¡ã§ä½åç¾ããã(é »åº¦) ã® æ° ããããã«å¯¾ãã¦
my @pcand = majority2 @{ $S3{$_} } ; # è¡çªå·éåL ãèãã¦ãããããLã§æãé »åº¦ã®é«ããã®ãåãåºãã
grep { $mark { $pcand [$_] } = '.' . ( '0' x $_ ) } 0 .. min $#pcand , $o{'.'} - 1 if @pcand ;
}
}
# åºå
my $ex = "example${sep}..${sep}example" ; # å
·ä½ä¾ã表ãåã®è¡¨é ãã©ãããã?
say join "\t" , map { UNDERLINE YELLOW $_ } (0+$o{o}) .. ($maxlen+$o{o}-1) , 'char' , 'code' , 'freq' , $o{g} ? $ex :() ; # è¡é ã®åºå
my %vcate ; $vcate{$_} = 2 for @e ; # omit ãã
my @vset ; # 表示ããå¤ã®é
åãé çªã¯ã (1). 弿°ã«æ¸¡ãããæ£è¦è¡¨ç¾ããã¤ã (2). écntrlæå (3). cntrlæå(4). åè¡ã®çµãã
push @vset , @e[ 1 .. $#e ] ; # (1).
push @vset , sort {length $a <=> length $b or $a cmp $b } grep { ! $vcate { $_ } and ! /[[:cntrl:]]/ } keys %S1 ; # (2)
push @vset , sort {length $a <=> length $b or $a cmp $b } grep { ! $vcate { $_ } and /[[:cntrl:]]/ } keys %S1 ; #(3)
push @vset , $e[ 0 ] ;
my $take = sub ($$) { splice @{$_[1]} , 0, $_[0] } ; # é
ååç
§arg2ãããã®é
åã®å
é arg1ååã£ã¦ããã
my $take2 = sub ($$$) { uniq $take->($_[0],$_[1]) , $take->($_[0],$_[2]) } ;# é
ååç
§2å(arg2,arg3)ãããããããarg1ååã£ã¦ãuniq ããã
my $ucd = sub ($){ ( sprintf 'U+%06X', ord $_[0] ) =~ s/(00)+((..)+$)/$2/r } ; # Unicode ã®ç¬¦å·ä½ç½®ãè¿ãã2æ¡ä»¥ä¸ã®å¶æ°æ¡ã«ãªãããã«ã
for my $v ( @vset ){ # <-- ã½ã¼ãé ã«ã¯æ³¨æããã
my @out = map { $S1{$v}{$_} // 0 } 0 .. ( $maxlen - 1 ) ;
my @pvec = grep { $out[$_] } $o{g}=~/\.$/o ? reverse 0..$#out : 0..$#out ; # 使¡ç®ãè¦ãããããã¦ãåªå
çã«ã©ãããè¦ããã
my @pv = map { [ grep { $out[$_] } @{$_} ] } [0..$#out] , [reverse 0..$#out] ; # 使¡ç®ãè¦ãããããã¦ãåªå
çã«ã©ãããè¦ããã
( run in 1.002 second using v1.01-cache-2.11-cpan-56fb94df46f )