Strings are easy to
handle: we can just represent them as lists of numbers, as
long as we agree on an encoding that determines which number represents
which character.
We can choose any encoding we want, so instead of using a general-purpose one like
ASCII, let’s design a new one that’s more convenient for FizzBuzz. We only need to encode
digits and the strings'FizzBuzz'
,'Fizz'
, and'Buzz'
, so we can
use the numbers0
to9
to represent the characters'0'
to'9'
, and the numbers from10
to14
to encode the characters'B'
,'F'
,'i'
,'u'
, and'z'
.
This already gives us a way to represent the string literals we
need (being careful not to clobber the Z combinator):
TEN
=
MULTIPLY
[
TWO
][
FIVE
]
B
=
TEN
F
=
INCREMENT
[
B
]
I
=
INCREMENT
[
F
]
U
=
INCREMENT
[
I
]
ZED
=
INCREMENT
[
U
]
FIZZ
=
UNSHIFT
[
UNSHIFT
[
UNSHIFT
[
UNSHIFT
[
EMPTY
][
ZED
]][
ZED
]][
I
]][
F
]
BUZZ
=
UNSHIFT
[
UNSHIFT
[
UNSHIFT
[
UNSHIFT
[
EMPTY
][
ZED
]][
ZED
]][
U
]][
B
]
FIZZBUZZ
=
UNSHIFT
[
UNSHIFT
[
UNSHIFT
[
UNSHIFT
[
BUZZ
][
ZED
]][
ZED
]][
I
]][
F
]
To check that these work, we can write some external methods to
convert them into Ruby strings:
def
to_char
(
c
)
'0123456789BFiuz'
.
slice
(
to_integer
(
c
))
end
def
to_string
(
s
)
to_array
(
s
)
.
map
{
|
c
|
to_char
(
c
)
}
.
join
end
Alright, do the strings work?
>>
to_char
(
ZED
)
=> "z"
>>
to_string
(
FIZZBUZZ
)
=> "FizzBuzz"
Great. So we can use them in FizzBuzz:
MAP
[
RANGE
[
ONE
][
HUNDRED
]][->
n
{
IF
[
IS_ZERO
[
MOD
[
n
][
FIFTEEN
]]][
FIZZBUZZ
][
IF
[
IS_ZERO
[
MOD
[
n
][
THREE
]]][
FIZZ
][
IF
[
IS_ZERO
[
MOD
[
n
][
FIVE
]]][
BUZZ
][
n
.
to_s
]]]
}
]
The very last thing to implement isFixnum#to_s
. For
that, we need to be able to split a number into its component digits, and here’s one way to
do that in Ruby:
def
to_digits
(
n
)
previous_digits
=
if
n
<
10
[]
else
to_digits
(
n
/
10
)
end
previous_digits
.
push
(
n
%
10
)
end
We haven’t implemented<
, but we can dodge that
problem by usingn <= 9
instead ofn < 10
. Unfortunately, we can’t dodge implementingFixnum#/
andArray#push
, so here they are:
DIV
=
Z
[->
f
{
->
m
{
->
n
{
IF
[
IS_LESS_OR_EQUAL
[
n
][
m
]][
->
x
{
INCREMENT
[
f
[
SUBTRACT
[
m
][
n
]][
n
]][
x
]
}
][
ZERO
]
}
}
}
]
PUSH
=
->
l
{
->
x
{
FOLD
[
l
][
UNSHIFT
[
EMPTY
][
x
]][
UNSHIFT
]
}
}
Now we can translate#to_digits
into a proc:
TO_DIGITS
=
Z
[->
f
{
->
n
{
PUSH
[
IF
[
IS_LESS_OR_EQUAL
[
n
][
DECREMENT
[
TEN
]]][
EMPTY
][
->
x
{
f
[
DIV
[
n
][
TEN
]][
x
]
}
]
][
MOD
[
n
][
TEN
]]
}
}
]
Does it work?
>>
to_array
(
TO_DIGITS
[
FIVE
]
)
.
map
{
|
p
|
to_integer
(
p
)
}
=> [5]
>>
to_array
(
TO_DIGITS
[
POWER
[
FIVE
][
THREE
]]
)
.
map
{
|
p
|
to_integer
(
p
)
}
=> [1, 2, 5]
Yes. And because we had the foresight to design a string encoding
where1
represents'1'
and so on, the arrays produced byTO_DIGITS
are already valid strings:
>>
to_string
(
TO_DIGITS
[
FIVE
]
)
=> "5"
>>
to_string
(
TO_DIGITS
[
POWER
[
FIVE
][
THREE
]]
)
=> "125"
So we can replace#to_s
withTO_DIGITS
in FizzBuzz:
MAP
[
RANGE
[
ONE
][
HUNDRED
]][->
n
{
IF
[
IS_ZERO
[
MOD
[
n
][
FIFTEEN
]]][
FIZZBUZZ
][
IF
[
IS_ZERO
[
MOD
[
n
][
THREE
]]][
FIZZ
][
IF
[
IS_ZERO
[
MOD
[
n
][
FIVE
]]][
BUZZ
][
TO_DIGITS
[
n
]
]]]
}
]
We’ve finally
finished! (This would’ve been the longest, most awkward job interview ever.) We
now have an implementation of FizzBuzz written entirely with procs. Let’s run it to make
sure it works properly:
>>
solution
=
MAP
[
RANGE
[
ONE
][
HUNDRED
]][->
n
{
IF
[
IS_ZERO
[
MOD
[
n
][
FIFTEEN
]]][
FIZZBUZZ
][
IF
[
IS_ZERO
[
MOD
[
n
][
THREE
]]][
FIZZ
][
IF
[
IS_ZERO
[
MOD
[
n
][
FIVE
]]][
BUZZ
][
TO_DIGITS
[
n
]
]]]
}
]
=> #
>>
to_array
(
solution
)
.
each
do
|
p
|
puts
to_string
(
p
)
end
;
nil
1
2
Fizz
4
Buzz
Fizz
7
⋮94
Buzz
Fizz
97
98
Fizz
Buzz
=> nil
Having gone to so much trouble to make sure that every constant is
just an abbreviation of some longer expression, we owe it to ourselves
to replace each constant with its definition so we can see the complete
program:
-> k { -> f { -> f { -> x {
f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f {
-> l { -> x { -> g { -> b { b }[-> p { p[-> x { ->
y { x } }] }[l]][x][-> y { g[f[-> l { -> p { p[-> x { ->
y { y } }] }[-> p { p[-> x { -> y { y } }] }[l]]
}[l]][x][g]][-> l { -> p { p[-> x { -> y { x } }] }[-> p
{ p[-> x { -> y { y } }] }[l]] }[l]][y] }] } } } }][k][-> x {
-> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x {
-> y { x } }]][-> l { -> x { -> l { -> x { -> x {
-> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x {
-> y { -> f { f[x][y] } } }[x][l]] } }[l][f[x]] } }] } }[-> f {
-> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }]
}[-> f { -> m { -> n { -> b { b }[-> m { -> n { ->
n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }]
}[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }]
}[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p {
p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x {
p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][->
x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p
{ -> x { x } }]]] }][m] } }[m][n]] } }[m][n]][-> x { -> l {
-> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y
{ y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[f[->
n { -> p { -> x { p[n[p][x]] } } }[m]][n]][m][x] }][-> x {
-> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x {
-> y { x } }]] } } }][-> p { -> x { p[x] } }][-> p { -> x
{
p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[x]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
} }]][-> n { -> b { b }[-> n { n[-> x { -> x { -> y {
y } } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y {
x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m {
-> n { -> b { b }[-> m { -> n { -> n { n[-> x { ->
x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n {
n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x
{ -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y }
}] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p {
p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f {
f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]]
}][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n {
-> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y {
-> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }]
}[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x
{ -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } }
}[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] }
}[m][n]][n][x] }][m] } } }][n][-> p { -> x {
p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[x]]]]]]]]]]]]]]] } }]]][-> l { -> x
{ -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y }
}][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l {
-> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y
{ y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l
{ -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { ->
y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[->
l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x {
-> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] }
}[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[->
x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]]
} }[-> l { -> x { -> x { -> y { -> f { f[x][y] } }
}[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }
}[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] }
} }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }
}[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] }
} }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }
}[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { ->
y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x {
p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n
{ -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x {
p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n {
-> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x }
}] } }[-> p { -> x { p[p[x]] } }][-> p { -> x {
p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } }
}[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p {
-> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }
}[-> m { -> n { n[-> m { -> n { n[-> n { -> p { ->
x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p
{ -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] }
}]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { ->
p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]]
} } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p {
-> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] }
}[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]]
} }]]]]]][-> m { -> n { n[-> m { -> n { n[-> n { -> p
{ -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] }
}[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]]
} }]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p
{ -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] }
} }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n {
n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } }
}][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]]
} }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p {
-> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }
}[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p {
-> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n {
n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p {
-> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x
{ p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] }
} }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n {
n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } }
}][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]]
} }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]][-> n { -> p {
-> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n {
n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p {
-> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x
{ p[p[p[p[p[x]]]]] } }]]]][-> b { b }[-> n { n[-> x { -> x {
-> y { y } } }][-> x { -> y { x } }] }[-> f { -> x {
f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f {
-> m { -> n { -> b { b }[-> m { -> n { -> n { n[->
x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m {
-> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p
{ -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x {
-> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } }
}[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y {
-> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x
} }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n {
n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x
{ -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y }
}] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p {
p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f {
f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]]
}][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[x]]] }
}]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } }
}[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }
}[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] }
} }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }
}[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] }
} }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }
}[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] }
} }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }
}[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { ->
y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x {
p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n
{ -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x {
p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n {
-> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x }
}] } }[-> p { -> x { p[p[x]] } }][-> p { -> x {
p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } }
}[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p {
-> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }
}[-> m { -> n { n[-> m { -> n { n[-> n { -> p { ->
x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p
{ -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] }
}]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { ->
p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n {
n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p {
-> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x
{ p[p[p[p[p[x]]]]] } }]]]]][-> n { -> p { -> x { p[n[p][x]] } }
}[-> m { -> n { n[-> m { -> n { n[-> n { -> p { ->
x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p
{ -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] }
}]]]][-> b { b }[-> n { n[-> x { -> x { -> y { y } }
}][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y]
}] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n {
-> b { b }[-> m { -> n { -> n { n[-> x { -> x { ->
y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n
{ -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y
{ -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }]
}[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x
{ -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } }
}[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] }
}[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p
{ p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f
{ f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n {
-> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y }
}] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { ->
x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } }
}][n][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> l { -> x {
-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y }
}][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l {
-> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y
{ y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l
{ -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { ->
y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[->
l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x {
-> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] }
}[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x }
}][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]]
} } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p {
-> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }
}[-> m { -> n { n[-> m { -> n { n[-> n { -> p { ->
x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p
{ -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] }
}]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { ->
p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]]
} } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n {
n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } }
}][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]]
} }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p {
-> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }
}[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n {
n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } }
}][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]]
} }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]][-> m { -> n {
n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } }
}][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]]
} }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> f { -> x {
f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f {
-> n { -> l { -> x { -> f { -> x { f[-> y { x[x][y] }]
}[-> x { f[-> y { x[x][y] }] }] }[-> f { -> l { -> x {
-> g { -> b { b }[-> p { p[-> x { -> y { x } }]
}[l]][x][-> y { g[f[-> l { -> p { p[-> x { -> y { y } }]
}[-> p { p[-> x { -> y { y } }] }[l]] }[l]][x][g]][-> l {
-> p { p[-> x { -> y { y } }] }[-> p { p[-> x { -> y {
y } }] }[l]] }[l]][y] }] } } } }][l][-> l { -> x { -> x { ->
y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y
{ -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f {
f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x }
}]][x]][-> l { -> x { -> x { -> y { -> f { f[x][y] } }
}[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }
}[x][l]] } }] } }[-> b { b }[-> m { -> n { -> n { n[-> x
{ -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m {
-> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p
{ -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x {
-> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } }
}[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y {
-> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x
} }]]] }][m] } }[m][n]] } }[n][-> n { -> p { p[-> x { -> y {
x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p
{ p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x {
p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][->
x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p
{ -> x { x } }]]] }[-> m { -> n { n[-> m { -> n { n[->
n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x {
x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x {
p[p[p[p[p[x]]]]] } }]]]][-> x { -> y { -> f { f[x][y] } }
}[-> x { -> y { x } }][-> x { -> y { x } }]][-> x {
f[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y {
x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m {
-> n { -> n { n[-> x { -> x { -> y { y } } }][-> x {
-> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x {
-> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } }
}[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { ->
x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]]
}][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x }
}][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x {
-> n { -> p { -> x { p[n[p][x]] } } }[f[-> m { -> n {
n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x
{ -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y }
}] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p {
p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f {
f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]]
}][m] } }[m][n]][n]][x] }][-> p { -> x { x } }] } } }][n][-> m
{ -> n { n[-> m { -> n { n[-> n { -> p { -> x {
p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p {
-> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][x]
}]][-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y {
x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m {
-> n { -> n { n[-> x { -> x { -> y { y } } }][-> x {
-> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x {
-> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } }
}[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { ->
x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]]
}][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x }
}][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x {
f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }]
}[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p {
p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x {
p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][->
x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p
{ -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> m {
-> n { n[-> m { -> n { n[-> n { -> p { -> x {
p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p {
-> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]] }
}][n]]]] }]