键盘快捷键

使用 跳转章节

使用 S/ 在本书内搜索

使用 ? 显示帮助页面

使用 Esc 隐藏帮助页面

Working with lists

For list operations, only the Head, Prepend and Tail functions, as well as the functions implemented in previous problems, are allowed, and no other functions are permitted.

Find the number of elements of a list.

Example:

Eq[MyLength[{#a, #b, #c, #d}], 4];
Solution
Let[MyLength, Fun[{list},
  Block[
    Let[MyLength', Fun[{sub, n},
      If[Eq[Length[sub], 0], n,
        MyLength'[Tail[sub], Add[n, 1]]]]],
    MyLength'[list, 0]]]];

Find the last box of a list.

Example:

Eq[MyLast[{#a, #b, #c, #d}], #d];
Solution
Let[MyLast, Fun[{list},
  If[Eq[MyLength[list], 0], {#err, "empty list"},
    If[Eq[MyLength[list], 1], Head[list], MyLast[Tail[list]]]]]];

Find the last but one box of a list.

Example:

Eq[MyButLast[{#a, #b, #c, #d}], {#c, #d}];
Solution
Let[MyButLast, Fun[{list},
  If[Less[MyLength[list], 2], {#err, "short list"},
    If[Eq[MyLength[list], 2], list, MyButLast[Tail[list]]]]]];

Find the K’th element of a list.

The first element in the list is number 1.

Example:

Eq[MyIndex[{#a, #b, #c, #d}, 3], #c];
Solution
Let[MyIndex, Fun[{list, n},
  If[Less[n, 1], {#err, "invalid index"},
    If[Eq[n, 1], Head[list], MyIndex[Tail[list], Sub[n, 1]]]]]];

Reverse a list.

Example:

Eq[MyReverse[{#a, #b, #c, #d, #e}], {#e, #d, #c, #b, #a}];
Solution
Let[MyReverse, Fun[{list},
  Block[
    Let[MyReverse', Fun[{sub, acc},
      If[Eq[Length[sub], 0], acc,
        MyReverse'[Tail[sub], Prepend[acc, Head[sub]]]]]],
    MyReverse'[list, {}]]]];

Find out whether a list is a palindrome.

Example:

IsPalindrome[{#a, #c, #b, #c, #a}];
Solution
Let[IsPalindrome, Fun[{list}, Eq[MyReverse[list], list]]];

Flatten a nested list structure.

Example:

Eq[MyFlatten[{#a, {#b, {#c, #d}, #e}}], {#a, #b, #c, #d, #e}];
Solution
Let[MyListConcat, Fun[{list1, list2},
  Block[
    Let[MyListConcat', Fun[{list1, list2},
      If[Eq[MyLength[list2], 0], list1,
        MyListConcat'[Prepend[list1, Head[list2]], Tail[list2]]]]],
    MyReverse[MyListConcat'[MyReverse[list1], list2]]]]];

Let[MyFlatten, Fun[{list},
  Block[
    Let[MyFlatten', Fun[{sub, acc},
      If[Eq[Length[sub], 0], acc,
        MyFlatten'[Tail[sub],
          If[IsList[Head[sub]],
            MyListConcat[MyFlatten'[Head[sub], {}], acc],
            Prepend[acc, Head[sub]]]]]]],
    MyReverse[MyFlatten'[list, {}]]]]];

Eliminate consecutive duplicates of list elements.

Example:

Eq[Compress[{#a, #a, #a, #a, #b, #c, #c, #a, #a, #d, #e, #e, #e, #e}],
  {#a, #b, #c, #a, #d, #e}];
Solution
Let[Compress, Fun[{list},
  Block[
    Let[Compress', Fun[{list, acc},
      If[Eq[Length[list], 0], acc,
        Compress'[Tail[list],
          If[Eq[Head[list], Head[acc]],
            acc, Prepend[acc, Head[list]]]]]]],
    MyReverse[Compress'[Tail[list], { Head[list] }]]]]];