http://d.hatena.ne.jp/shinichiro_h/20061107#1162835826
>Perl 記号ゴルフと Acme::EyeDrops
自動化してみた。
$target_valueに変換したい値を入力。
出力は「@symbols」に存在する値のみ使用する。
(この場合記号だけを返す)
できるだけランダムな値返すよう努力する。
ちなみに、メールアドレスは無理(「.」が記号に変換できないので)
my $target_value = q[JAPH];
my @symbols = split //, q[ !"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~];
my ( %use, @result );
foreach my $target ( split //, q[print'].$target_value.q['] ) {
my ( %check, %xor );
foreach my $symbol ( @symbols ) {
next if $target eq $symbol;
my $item = $target ^ $symbol;
next if $check{$item}++ or $check{$symbol}++;
next if not grep { $item eq $_ } @symbols;
@xor{ $item, $symbol } = ( $symbol, $item );
}
if (not scalar %xor) {
warn qq[$target not match];
next;
}
my ($min) = sort { $use{$a} <=> $use{$b} } keys %xor;
my @mins = grep { $use{$min} == $use{$_} } keys %xor;
my $current = $mins[ rand( scalar @mins ) ];
$use{$current}++;
push @result, [ map { /'|\\/ ? q[\\].$_ : $_ } $current, $xor{$current} ];
}
print q[''=~('(?{'.('].
( join q[], map { $_->[0] } @result ).
q['^'].
( join q[], map { $_->[1] } @result ).q[').'})')];
コメントする