PHPでArcチャレンジしてみるテスト

今日は朝から秋葉原ダイビル2008年度下期未踏IT人材発掘・育成事業「未踏ユース」成果報告会に参加しています。

発表の中で Arc Challenge の話が出たので、とりあえずPHPで簡単に書いてみました。

said.php:

<?
if($_SERVER['QUERY_STRING'])echo'you said ',htmlspecialchars($_COOKIE['foo']);
elseif($_POST)setcookie('foo',$_POST['foo'])&&print'<a href=?click>click here</a>';
else echo'<form method=POST><input type=text name=foo><input type=submit></form>';
?>

この擬似コードをベースに標準のPHPだけで動くようにしてみました。
もっと短くなるかなぁ。。。

ということで、ちょっとだけゴルフして1行164byte:

<?echo$_GET?'you said '.htmlspecialchars($_COOKIE[1]):($_POST&setcookie(1,$_POST[1])
?'<a href=?1>click here':'<form method=POST><input name=1><input type=submit>');

(読みやすくするために改行を入れています)

Arcと同条件で比較するためのPHPトークンの定義が微妙ですが、$_POST[1]を1トークンとして数えて、<?や括弧()、セミコロン;、文字列内の変数展開を除外すると全部で11トークンとなります。三項演算子?:を含めると+4で15トークン。文字列連結.を加えると+1で16トークン。&演算子を含めると+1で17トークン。

今日の結論:PHPはゴルフしても読みやすい言語ですね。

【参考文献】

  1. Take the Arc Challenge
  2. http://d.hatena.ne.jp/lionfan/20080226
  3. http://web4r.org/ja/

anarchy golf の出題ミス?

いまさらの話題で恐縮なのですが、anarchy golf - Decompose integer into sum of squares の Sample output が手元の計算結果と違ってしまいました。

差分は以下の通り。

Sample output:
@@ -129 +129 @@
-129: 8 8 1
+129: 11 2 2
@@ -143 +143 @@
-143: 9 6 5 1
+143: 11 3 3 2
@@ -156 +156 @@
-156: 11 5 3 1
+156: 12 2 2 2
@@ -182,2 +182,2 @@
-182: 10 9 1
-183: 10 9 1 1
+182: 13 3 2
+183: 13 3 2 1
@@ -191 +191 @@
-191: 10 9 3 1
+191: 13 3 3 2
@@ -209 +209 @@
-209: 12 8 1
+209: 14 3 2
@@ -243 +243 @@
-243: 11 11 1
+243: 15 3 3
@@ -297 +297 @@
-297: 14 10 1
+297: 17 2 2

問題文では

If there is more than one way with the same amount of squares, use the one where a+b+c+d is least. ex:

"28: 5 1 1 1" instead of "28: 4 2 2 2"
(5+1+1+1 < 4+2+2+2)

とありますので、これって出題ミスの可能性があるのではないでしょうか?

■ 追記1:
Googleで検索したら過去に同様の指摘をしている人がいらっしゃいました。
http://twitter.com/yowa/status/2594198361

穴ゴルのDecompose integer into sum of squaresは、sample output が間違ってると思う。たとえば 129 は 8,8,1 じゃなくて 11,2,2 だよね?

■ 追記2:
RankingページのRuby欄でも既に指摘されていたみたい。

Perlで記号プログラミング

all your BASE32 are belong to us.

UTF-8

#!/usr/bin/perl
$^='-^\\\\%+"<&]\\$=/**:.](%_,//;<#)\\^_%$=]."\\&=\'?/:$?({/!_})(([=##!-^/\'%_#"]{"?~<]$\':$;#"&]`<#:?',
$^_='_~`||`]@^_`"./,))<%?%<"(?<_}+^.;#^^@@{`:,|[{_``__[]_;/@-<~<;^.[^~::<&""[_`}*.[?]+[?!|-_`@[*);//(]?",=_+?]{{#`,@@<*@[{|/`.@#@[""[+_}[?__(?.+[_}<.?_"{>|!{}@@^_,{<',
$^_^='{>][[[;/,{>/]_@@]((,^!_&+-{#%%@^[*~)&_>_][|@{>]!+)!~);_?|%.[%<%""/(`>>^`{?@_@+^>@|}.[<{>{(>:(<";&%_"){=+:@_}]@%.[^(`_<<]^!@+|`-|:{#}#`,]]]_){"-;.{|]@`>_"=%(>@_|',
$^_=~('(?{$^_=~'.('_^""'^'+,|/'."-".('$%'^';{'.'(-:^;'.('[)]@'^'>_<,').'$^_})')))

Shift_JIS

#!/usr/bin/perl
$^='-^\\\\%+"<&]\\$=/**:.](%_,//;<#)\\^_%#%\\|$\\{=}>)&>*!=`]=!-^/\'%_#"![&;+`]#;={.]<(_',
$^_='_~`||`]@^_`"./,))<%?%<"(?<_}+^.;#^^@@{`:,|[{_``__[]_;/@-<~<;^.[^~::<&""[_`}*.[?]+[?!|-_`@[*);//(]?",=_+?]{{#`,@@<*@[{|/`.@#@[""[+_}[?__(?.+[_}<.?_"{>|!{}@@^_,{<',
$^_^='{>][[[;/,{>/]_@@]((,^!_&+-{#%%@^[*~)&_>_][|@{>]!+)!~);_?|%.[%<%""/(`>>^`{?@_@+^>@|}.[<{>{(>:(<";&%_"){=+:@_}]@%.[^(`_<<]^!@+|`-|:{#}#`,]]]_){"-;.{|]@`>_"=%(>@_|',
$^=~('(?{$^_=~'.('_^""'^'+,|/'."-".('$%'^';{'.'(-:^;'.('[)]@'^'>_<,').'$^_})')))

実行結果

1: 円周率は 約 3.14 です。
2: 円周率は 約 3.14 です。
3: 円周率は 約 3.14 です。
4: 円周率は 約 3.14 です。
5: 円周率は 約 3.14 です。
6: 円周率は 約 3.14 です。
7: 円周率は 約 3.14 です。
8: 円周率は 約 3.14 です。
9: 円周率は 約 3.14 です。 
 :

danさんの lleval で実行結果を確認できます↓
Dan the pad - lleval - run codes from your browser

頑張って正規表現内で円周率を999桁計算するPerlプログラム

というのは嘘です。ごめんなさい。

#!/usr/bin/perl
'~!'!~('(?{'.('=&$;<(*/$&:?$+!$+"$&":!;$)(`~"*=#=)"&&$;&('^
'`):&])`<<`]{~@-+*-+{|,`+-#=,/`{)&|"`+@"="='^
'(|{=,`>{"|%-=-```{/,)>#``#.<#+?`%#{+%_??-.').'})')

実行結果

3.141592653589793238462643383279502884197169399375105820974944592307816406286208
99862803482534211706798214808651328230664709384460955058223172535940812848111745
02841027019385211055596446229489549303819644288109756659334461284756482337867831
65271201909145648566923460348610454326648213393607260249141273724587006606315588
17488152092096282925409171536436789259036001133053054882046652138414695194151160
94330572703657595919530921861173819326117931051185480744623799627495673518857527
24891227938183011949129833673362440656643086021394946395224737190702179860943702
77053921717629317675238467481846766940513200056812714526356082778577134275778960
91736371787214684409012249534301465495853710507922796892589235420199561121290219
60864034418159813629774771309960518707211349999998372978049951059731732816096318
59502445945534690830264252230825334468503526193118817101000313783875288658753320
83814206171776691473035982534904287554687311595628638823537875937519577818577805
3217122680661300192787661119590921642020