Subscribed unsubscribe Subscribe Subscribe

あらゆるPerlスクリプトは10種類の記号と改行だけで表現できるか?

''!~('(?{'.('?
?{..!?
}
.{.(!???.~(!}{!
^^
?.){{?})'^'{!){~(?)?.!?{!}}!~{!}?}}!{^(^
!???(.)~'^'
~~.(~?)^}^~^){}(.{
?!^)
^!?!?(()(}?^!'^'!
!}!)(({!){!({)~(.
^..({?.{)~){)(!(^
'^'
)(?{!{~~{{^
}!())~{
}^!{^)^()~!}!}!^^').'})')


元来、プログラマというのは怠惰なヒトたちであり、少しでも自分の作業がラクになるように色々なプログラムを開発してきたわけでして。
プログラムを書くにしてもできるだけラクに(タイプ数を少なく)、ということで「Code Golf」なんてのが考え出されたのだと思います。
Code Golf


ところで、Acme::EyeDropsという変態モジュールは「記号だけ」でプログラムを書けてしまいます。
http://search.cpan.org/~asavige/Acme-EyeDrops-1.55/lib/Acme/EyeDrops.pm
このAcme::EyeDropsのsightlyメソッドではプログラムを記号に変換できるわけですが、これを使うと記号がたくさん出てきてしまってワケが分かりません。
例:

$ perl -MAcme::EyeDrops=sightly -le 'print sightly({SourceString => "hoge", Regex => 1, Print => 1})'
''=~('('.'?'.'{'.('['^'+').('['^')').('`'|')').('`'|'.').('['^'/').'"'.('`'|'(').('`'|'/').('`'|"'").('`'|'%').'"'.'}'.')')
$ perl -MAcme::EyeDrops=sightly -le 'print sightly({SourceString => "hoge", Regex => 1, Print => 1})' | perl -l
hoge

つまり、ちょっと記号の種類が多すぎるんですよね。


というわけで、もっと少ない種類の記号たちでプログラムが書けるように変換スクリプトを書いてみました。
コレを使うと、"(", ")", "{", "}", "!", "?", "~", ".", "^", "'"の10種類の記号と、改行コードのみでプログラムが書けてしまいます。無駄にアルファベットとかスペースとか"$"とか"@"とか"%"とか使わなくて済むので、とってもラクですね!



基本的な考え方はワンライナー記号化スクリプトを書いた - すぎゃーんメモと同じです!


例:hoge.pl

#!/usr/bin/perl
use strict;
use warnings;

print "hoge\n";
$ ./symbolize.pl hoge.pl
''!~('(?{'.(')^}}!..}{~.!?({.?~{({.(?!.?
((?)~!!~.?.!~~
)(
)!{~)~).~~(.}'^'~
^?.!)!.()}}
).}~!))(!??.^~)!..!~}{}.~!.
~~
(.))}...!!?~?}'^'.^
?}}{?}?(~!{?~!)!!!}?(!(
^{.}.^?(
~(?{^~~!!
(){~~}!}!{.~^'^'{
{!)
((~)^{}
(
){?~^.??}}~^.
((^(.?{~!!
!^}
??{(!???(
){}}'^'!!})(
{)?.^){!)~?!!~^!{~!!.~!^!!()(^?)))?!^{{~~.!~.}~?(}!))').'})')
$ ./symbolize.pl hoge.pl | perl
hoge


日本語とかでも問題なく変換できます。

$ echo 'print "ほげ\n"' | ./symbolize.pl
''!~('(?{'.('{{~{(.{'^'~?}~{!~'^'!?(}!
{'^'}(})(^!'^')!??.{}').~('{}.^}
'^'.~
}~^'^'((!^}?'^'^.??(.'^'?{~^((').('^
)'^'}!~'^'}~}'^'
}^'^'^
~').'})')
$ echo 'print "ほげ\n"' | ./symbolize.pl | perl
ほげ


この記号化スクリプト自体を記号化してみたらこんなカンジになりました。

このスクリプトを実行することによってもスクリプトの記号化をすることができます。お試しください!

追記

Windowsだと改行コードってCRLFになるんだっけ。。試してないのでWindowsで動くかどうかは分かりません ><

追記2

10種類に収まるのならそれぞれの記号を数字に変換して暗号っぽくしてみるのも面白いかも。

$ ./symbolize.pl japh.pl | perl -pe 'tr/'\''(){}!?.~^/0-9/' > number.txt
$ cat number.txt
005810163071081861
655126175645372931654216520909388839245152877675
3942
15633470905163421
7151863757975345884316
90903512898
2398693877
5616
42446133090
1845544179279321473251
966355
102704202
$ cat number.txt | perl -pe 'tr/0-9/'\''(){}!?.~^/'
''!~('(?{'.('~(~?(
?!!()?(.!?}!{.)^{(?!})(?!)'^'^{~~~{^)}!(!)~..?.!
{^})
(!?{{}.'^'!(?{})(
.(!(~?{.!.^.!{}!~~}{(?
^'^'{!()~^~
){^~?^{~..
!?(?
})}}?({{'^'
(~}!!}}(.^).^{)(}.{)!(
^??{!!
(').'})')
$ cat number.txt | perl -pe 'tr/0-9/'\''(){}!?.~^/' | perl
Just another Perl hacker