Perl (111 110 122 karakter)
use Regexp::Assemble;@ARGV=shift;my$r=new Regexp::Assemble;chomp,add$r "^\Q$_\E\$"while<>;$_=as_string$r;s/\(\?:/(/g;print
Bu Regexp::Assemble
, normal ifadeleri optimize etmek için çağrılan CPAN modülünü kullanır . Çünkü normal ifadeler için Perl'den daha iyi olan dil hangisidir?
Ayrıca, sadece eğlence için okunabilir versiyonu, (yardımı ile yapılır -MO=Deparse
).
use Regexp::Assemble;
my $r = Regexp::Assemble->new;
while (<>) {
chomp($_);
$r->add("^\Q$_\E\$");
}
$_ = $r->as_string;
# Replace wasteful (?:, even if it's technically correct.
s/\(\?:/(/g;
print $_;
Örnek çıktı (sonra CTRL-D yaptım item4
).
$ perl assemble.pl
item1
atem2
item3
item4
^(item[134]|atem2)$
Ayrıca, bonus olarak, sorudaki her kelimenin regex'ini yazıyorum.
^(a((ttemp)?t|llowed\.|rbitrary)?|\/\^item1\|atem2\|item3\|item4\$\/|s(ho(rt,|uld)|imilar)|p((air|lay)s|rogram)|(Writ|mak|Th)e|l(ists\.|east)|o([fr]|utputs)|t(h(at|e)|o)|(jus|no)t|regex|golf|with|is)$
Ayrıca, başkanların listesi (262 bayt).
^(((J(effer|ack|ohn)s|W(ashingt|ils)|Nix)o|Van Bure|Lincol)n|C(l(eveland|inton)|oolidge|arter)|H(a(r(rison|ding)|yes)|oover)|M(cKinley|adison|onroe)|T(a(ylor|ft)|ruman)|R(oosevelt|eagan)|G(arfield|rant)|Bu(chanan|sh)|P(ierce|olk)|Eisenhower|Kennedy|Adams|Obama)$
/^item1|atem2|item3|item4$/
büyük olasılıkla istenmeyen bir önceliğe sahip (dize ile başlamalıitem1
, içermeliatem2
, içermeliitem3
veya bitmeliitem4
).