2015年5月15日金曜日

R-99 リスト - Prolog-99 Ruby版 日本語訳

R-99: 99 の Ruby の問題 - 1. 配列

  • 訳注1:問題番号の後のアスタリスクはPrologで解くときの難易度の目安。

配列の操作

1.01 (*) 配列の最後の要素を取得せよ

1.02 (*) 配列の最後から2番目の要素を取得せよ

1.03 (*) 配列のK番目の要素を取得せよ

1.04 (*) 配列の要素数を取得せよ

1.05 (*) 配列を逆順にせよ

1.06 (*) 配列が回文であるかどうか調べよ

回文であるリストの例)
["x","a","m","a","x"]、["し","ん","ぶ","ん","し"]

1.07 (**) 配列されたリスト構造を平坦化せよ

例)
["a", ["b", ["c", "d"], "e"]] => ["a", "b", "c", "d", "e"]

1.08 (**) 配列の要素の連続した重複を排除せよ

例)
compress(["a","a","a","a","b","c","c","c","c","c","d","e","e","e","e"]) => 
["a","b","c","d","e"]

1.09 (**) 配列の中の連続して重複する要素を配列にして、それらを一つの配列にまとめよ

例)
pack(["a","a","a","a","b","c","c","c","c","c","d","e","e","e","e"]) => 
[["a","a","a","a"],["b"],["c","c","c","c","c"],["d"],["e","e","e","e"]]

1.10 (*) 配列のランレングス符号化(連続して重複する要素の名前と数を取り出す)せよ

例)
encode(["a","a","a","a","b","c","c","c","c","c","d","e","e","e","e"]) =>
[[4,"a"],[1,"b"],[5,"c"],[1,"d"],[4,"e"]]

1.11 (*) 連続して重複しない要素の場合は符号化しないよう、1.10を修正せよ

例)
encode_modified(["a","a","a","a","b","c","c","c","c","c","d","e","e","e","e"]) =>
[[4,"a"],"b",[5,"c"],"d",[4,"e"]]

1.12 (**) ランレングス符号化された配列をデコード(元に戻す)せよ。 1.11の出力形式をデコードするものとする

例)
decode([[4,"a"],"b",[5,"c"],"d",[4,"e"]]) => ["a","a","a","a","b","c","c","c","c","c","d","e","e","e","e"]

1.13 (**) 1.11と同様のランレングス符号化を行う関数を作成せよ

1.14 (*) 配列の要素を連続して重複させよ

例)
dupli(["a","b","c","d"]) => ["a","a","b","b","c","c","d","d"]

1.15 (**) 配列の要素を連続する重複させる数を与え、その数だけ重複させよ

例)
dupli(["a","b","c"],3) => ["a","a","a","b","b","b","c","c","c"]

1.16 (**) 配列からNの倍数番目にある要素を全て削除せよ。ただし、配列の先頭の要素を1番目とする

例)
drop(["a","b","c","d","e","f","g","h","i","k"],3) => 
["a","b","d","e","g","h","k"]

1.17 (*) 配列を二つにわけよ。このとき、一つ目の配列の長さを与えられるようにせよ

例)
split(["a","b","c","d","e","f","g","h","i","k"],3) =>
[["a","b","c"],["d","e","f","g","h","i","k"]]

1.18 (**) 配列の部分配列を取得せよ。このとき、開始要素と終了要素の2つの インデックスを与える。部分配列には開始要素と終了要素も含まれるものとする

例)
slice(["a","b","c","d","e","f","g","h","i","k"],3,7) => ["c","d","e","f","g"]

1.19 (**) 配列要素を左に回転させよ。あふれた要素は配列の最後尾に追加するものとする。負の数を入力したときは右に回転するものとする

例1)
rotate(["a","b","c","d","e","f","g","h"],3) => ["d","e","f","g","h","a","b","c"]

例2)
rotate(["a","b","c","d","e","f","g","h"],-2) => ["g","h","a","b","c","d","e","f"]  # 負の数を入力すると右に回転

1.20 (*) 配列からK番目の要素を削除せよ

例)
remove_at(["a","b","c","d"],2) => ["a","b","d"]

1.21 (*) 配列の指定された位置に任意の要素を挿入せよ

例)
insert_at(alfa,["a","b","c","d"],2) => ["a","b","alfa","c","d"]

1.22 (*) 与えられた範囲内の全ての整数を含む配列を作成せよ

例)
range(4,9) => [4,5,6,7,8,9]

1.23 (**) 配列からランダムに選択された指定の要素数分を抽出する。このとき、同じ要素を2度抽出してはならない

例1)
rnd_select(["a","b","c","d","e","f","g","h"],3) => ["e","d","a"]

例2)
rnd_select(["a","b","c","d","e","f","g","h"],3) => ["g","b","h"]

1.24 (*) ロト(番号くじ):集合1..MからN個の異なる乱数を抽出する。このとき、同じ要素を2度抽出してはならない

例)
rnd_select(6,49) => [23,1,17,33,21,37]

ヒント: 1.22 と 1.23 の回答を組み合わせている。

1.25 (*) 配列要素のランダムな順列を生成せよ

例)
rnd_permu(["a","b","c","d","e","f"]) => ["b","a","d","c","e","f"]

ヒント: 1.23の回答が使える。

1.26 (**) 配列のN個の要素から選択されたK個の異なるオブジェクトの組み合わせを表示せよ

例)
combination(3,["a","b","c","d","e","f"]) => ["a","b","c"], ["a","b","d"], ... , ["c","e","f"], ["d","e","f"]

1.27 (**) 配列要素を重複しないようにグループにわけよ

  1. 9つのグループが、2、3、4つの3互いに重複のないサブグループにせよ。すべての組み合わせを生成できるようにせよ。
例)
group3(["あか","いし","うら","えび","おじ","かみ","きり","くじ","けん"],G1,G2,G3)
=> G1 = ["あか","いし"], G2 = ["うら","えび","おじ"], G3 = ["かみ","きり","くじ","けん"]
  1. 上記の引数を変更し一般化する。グループサイズの配列を指定し、グループの配列を返すようにせよ。
例)
group(["あか","いし","うら","えび","おじ","かみ","きり","くじ","けん"],[2,2,5])
=> [["あか","いし"],["うら","えび"],["おじ","かみ","きり","くじ","けん"]]

注意: 同じ要素の順番違いは同じものであるとする。

離散数学の「多項定理」という用語で、この組み合わせの問題の詳細を見つけることができる。

1.28 (**) 要素配列の長さに応じて配列の配列のソートせよ

  1. 短い配列から長い配列の順にソートせよ。
例)
lsort([["a","b","c"],["d","e"],["f","g","h"],["d","e"],["i","j","k","l"],["m","n"],["o"])
=> [["o"],["d","e"],["d","e"],["m","n"],["a","b","c"],["f","g","h"],["i","j","k","l"]]
  1. 「同じ配列の長さ」が出てくる回数で昇順(小さい順)にソートせよ。
例)
lsort([["a","b","c"],["d","e"],["f","g","h",],["d","e"],["i","j","k","l"],["m","n"],["o"])
=> [["i","j","k","l"],["o"],["a","b","c"],["f","g","h"],["d","e"],["d","e"],["m","n"]]

注意: 上記の例では、結果の最初の2つの配列が長さ4と1を持っていることに注意せよ。 両方の長さは一度だけ表示される。第3及び第4の配列は、長さ3を持っている。 この長さの2つの配列がある。そして最後に、残りの3つの配列は、これは最も たくさんある長さの長さ2を持っている。

0 件のコメント:

コメントを投稿