App-digitdemog
view release on metacpan or search on metacpan
next if $freq{$_} ++ && $o{1} ; # && ã®åå¾ã®é åºã«æ³¨æ
my $len = length $_ ;
$Lfrq{$len} ++ ;
$M{$len}[0] = $_ if ! defined $M{$len}[0] || $M{$len}[0] gt $_ ;
$M{$len}[1] = $_ if ! defined $M{$len}[1] || $M{$len}[1] lt $_ ;
next unless $oL4 ;
$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] ; # 使¡ç®ãè¦ãããããã¦ãåªå
çã«ã©ãããè¦ããã
my @example = $take2 -> ( $o{g} , map { my $way = $_ ; [ map{ @{$Gs{$v}{$_}[ $way ]} } @{$pv[$way]} ] } 0,1 ) if $o{g} ;
@example = map{ backslash $_ , q['] } @example unless 0 eq ($o{b}//'') ; # -b0ã®æå®ãç¡ããã°ãæ¹è¡ãªã©ã®æåãã¨ã¹ã±ã¼ãããã
my $subtotal = sum0 @out ; # ãã®æåã®åºç¾åæ° -- @out ãããã«å å·¥ããåã«ããã§åå¾ã
next until y_filter ( $subtotal ) ;
do { $out[$_] .= $mark{ $S2{$v}{$_} // '' } // '' if $out[$_] } for 0 .. $#out ; # æ°åã®å¾ãã«ããªãªãä»å
@out = map { $_ eq 0 ? $o{0} : $_ } @out if defined $o{0} ; # é »åº¦å¤ãã¼ãã®å ´åã®ç½®æ
my $code = do { my $c = substr $v,1,1 ; $v eq "$eol\$" ? 'end' : $vcate{$v} ? '---' : $ucd -> ($c) } ; # æåã³ã¼ãåå¾ã$vã®å å·¥åã«ããã§å¦çã
$v = $o{'$'} if $v eq "$eol\$" ;
$v = backslash $v , q["] ;
push @out , (YELLOW BOLD $v) , $code , (YELLOW $subtotal) ;
push @out, join $sep , @example ;
say join "\t" , @out ;
}
}
## ãã«ãã®æ±ã
sub VERSION_MESSAGE { } # --version ã§ãã®é¢æ°ã使ãããã
sub HELP_MESSAGE {
use FindBin qw[ $Script ] ;
$ARGV[1] //= '' ;
open my $FH , '<' , $0 ;
while(<$FH>){
s/\$0/$Script/g ;
print $_ if s/^=head1// .. s/^=cut// and $ARGV[1] =~ /^o(p(t(i(o(ns?)?)?)?)?)?$/i ? m/^\s+\-/ : 1;
}
close $FH ;
$o{v} = 0 ;
exit 0 ;
}
=encoding utf8
=begin JapaneseManual
=head1
digitdist
å
¥åã®åè¡ã«å¯¾ãã¦ï¼å
é ãã(0å§ã¾ã) n æ¡ç®ã«ã©ããªæåãç¾ããããã¯ãã¹éè¨ããã
-L ãæå®ãããã¨ãæååé·ãã¨ã®ãæååã®æå°å¤ã¨æå¤§å¤ãåºåãããã
æ³å®ããã¦ããä½¿ãæ¹ :
1. ä½ãåãããªãæååéåã«ã¤ãã¦ãå
·ä½çãªå¤ã®æ§åã確ãããæåã®1æ©ã§ããã
2. ã«ã¼ã«ãçºè¦ãããæ¥µãã¦å°æ°ã®ä¾ããããã¼ã¿ã®å¤ã®ç ´æããã¹ãå¤ãè¦ã¤ããã
3. ç¹ç°ãªå¤ã«ã¤ãã¦ãæ´ã«æ·±ã調ã¹ã対象ã¨ããã
ãªãã·ã§ã³ :
--help : ãã®ãªã³ã©ã¤ã³ãã«ãã表示ããã
å
¥åã®æ±ãæ¹ : 以ä¸ã§ N ã¯æ°å¤ã示ããstr ã¯æååã示ãã
-= : å
é è¡(1è¡ç®)ãèªã¿é£ã°ã
-1 : ãã¼ã¿ã§å
¨ãåãè¡ã2å以䏿¥ãããèªã¿é£ã°ãã(-L2ã¨-L4ã¨-.ã®æå®æã¯é©ç¨ãããªãã)
-n 0 : æ¹è¡æåãé¤å»ãã(åè¡ãèªã¿åã£ã¦ãé常ãªãè¡æ«ã®æ¹è¡æåã®æ§åãåºåãã)ã
-u 0 : ãã¤ããªã§å¦çãã(é常㯠UTF-8ã§å¦çããã)
-w 0 ; é常ã¯ãWindowså½¢å¼ã®æ¹è¡æåãæ¥ããUNIXå½¢å¼ã®æ¹è¡æåã«å¤æãã¦ãããããã®åä½ãè§£é¤ããã
åä½ã¢ã¼ãã®å¤æ´ :
-L2 ; æååé·æ¯ã«ãæååã®æå°å¤ã¨æå¤§å¤ãåãåºãã両è
ãä¸è´ããå ´åã¯ãå¾è
ã空æååã«ããã
-L4 ; æååé·æ¯ã«ãæååã®æå°å¤ã¨æå¤§å¤ã®ä»ã«ãæåã«ç¾ãããã®ãæå¾ã«ç¾ãããã®ã表示ããã
å®è³ªçãªå¦çã«ä¸ãããªãã·ã§ã³ :
-. 0 : é常åºå表ã®å¤ã§ "åãæ°." ã¨è¡¨ç¤ºãããå¤ã¯ãå
¨ãå
±éããè¡ã«ç±æ¥ãããã¨ã示ããããã®åºåã®ä»æ¹ãæå¶ã
-. N : åºå表ã®ç°ãªãé »åº¦ã®å¤ãã¨ã«ãã©ããå
¨ãå
±éããè¡ã«ç±æ¥ããã®ãNåã¾ã§è¡¨ç¤ºãæªæå®ãªã1ãé »åº¦ã®å¾ã«ããªãªããä»ããããã«0ãæå¤§N-1åä»ãã
-e str : ãã®ãªãã·ã§ã³ã¯ä½åãæå®ã§ãããstrã¯æ£è¦è¡¨ç¾ã§ãããæåã®ãã¿ã¼ã³ã«ããããããã®ãè¨æ°å¯¾è±¡ã«ããã
--width N : åºå表ã®é »åº¦ã®å¤ã®é¨åãæå¤§Nåã«å¶éãããããã®æå®ã¯ããä¾ãã«ã¯å½±é¿ããªãã
åºåã¸å½±é¿ãããªãã·ã§ã³ :
-0 str : åºåã®ã¼ããå¥ã®æååstrã«ç½®æããã
-2 0 : æ¨æºã¨ã©ã¼åºåã«åºåããäºæ¬¡æ
å ±ãæå¶ããã
( run in 2.122 seconds using v1.01-cache-2.11-cpan-5b529ec07f3 )