Rule 式の評価順
HerbertOnlineJudgeの場合、式の内側、つまりカッコの内側から評価されて行きます。
例を追いながら見ていきましょう。
a(X):XXXX // プロシージャ定義部分 b(X):XXr // プロシージャ定義部分 c(X):X // プロシージャ定義部分 a(b(c(sss))) // 式実行部分
*式の下線部が現在評価している評価部分になります。
- まずは式の内側"a(b(c(sss)))"が評価されます
- これはc(X):Xですので、
- "a(b(sss))"となります。
- 次にカッコの内側"a(b(sss)))"が評価されて
- b(X):XXrなので
- "a(ssssssr)"となります
- 最後に一番外側、最後のカッコを評価するので
- "a(ssssssr)"となって
- a(X):XXXXなので
- "ssssssrssssssrssssssrssssssr"となり、
- 無事全部の式が評価され終わりました。
式部分だけ抜き出して羅列するとこうなります。
a(b(c(sss))) a(b(sss)) a(ssssssr) ssssssrssssssrssssssrssssssr
Rule 式の評価順 その2
その2です。
HerbertOnlineJudgeの場合、式の内側、つまりカッコの内側から評価されて行きます。
今回は前回の記事に少しのプラスアルファを加えます。
b(c(X)r)
となったとき、
"r"はどう評価されるのか、例を追いながら見ていきましょう。
a(X):XXXX // プロシージャ定義部分 b(X):XX c(X):X a(b(c(sss)r)lll) // 式実行部分
*式の下線部が現在評価している評価部分になります。
- まずは式の内側"a(b(c(sss)r)lll)"が評価され
- これはc(X):Xなので、
- "a(b(sssr)lll)"となり
- 次にカッコの内側"a(b(sssr)lll)"が評価されて
- b(X):XXなので
- "a(sssrsssrlll)"となります
- 最後に一番外側、最後のカッコを評価するので
- "a(sssrsssrlll)"となって
- a(X):XXXXなので
- "sssrsssrlllsssrsssrlllsssrsssrlllsssrsssrlll"となり、
- 無事全部の式が評価され終わりました。
式部分だけ抜き出して羅列するとこうなります。
a(b(c(sss)r)lll) a(b(sssr)lll) a(sssrsssrlll) sssrsssrlllsssrsssrlllsssrsssrlllsssrsssrlll
実行可能なレシピ その2
id:quolcさんのSomething worthless to be written formallyからの引用です。
8Bytes
a(X):Xa(sX)
a(r)
17Byets
a(X):XXXX b:srsl a(a(a(b)r)r)
25Byets
a(X):XXXX b(X):sb(X-1) c(X):a(a(b(X)r)r)c(X+2) c(1)
う〜ん…、すごい。
この2日間頭をひねってもこんなコード出てこなかった。
とてもシンプル。プログラマーとしてLispを学べと言われる所以を垣間見ました。
実行可能なレシピ
4Bytes
- 再帰処理
a:sa
a
8Bytes
- 命令引き数プロシージャ(Procedure Command Arguments) 引数2の場合
a(X,Y):XY a(s,r)
11Bytes
- 再帰処理とPCA2の組み合わせ
a(X,Y):XY b:a(s,r)b b
- 1Bytesの圧縮
11Bytes
- 命令引き数プロシージャ(Procedure Command Arguments) 引数3の場合
a(X,Y,Z):XYZ a(s,r,s)
8Bytes
- 数値引数プロシージャ(Procedure number argument)
a(X):sa(X-1) f:a(8) f
11Bytes
- 再帰処理とPNAの組み合わせ
a(X):sa(X-1) f:a(1)f f