Make10

#73 Make 10を攻略する

皆さんは"Make 10"というゲームを知っているでしょうか?
4つの数字を「+」「−」「×」「÷」だけを使って10にするという、アレです。

このMake 10を、どんな問題が出されても攻略するプログラムをF#で作るのが、今回のモチベーションです。


その前に、今回使った機能を1つ紹介します。

【内包表記 (Comprehensions)】
Pythonなんかにある、リストなどを「定義」によって作成する方法です。
内包表記、内包的表現、内包式とか言われます。
リスト、配列、シークエンスの作成には使えますが、タプルには使えないようですね。

以下にサンプルを示します。

まずはリストの内包表記。
> let ls = [for x in 1..20 -> x * x];;

val ls : int list =
  [1; 4; 9; 16; 25; 36; 49; 64; 81; 100; 121; 144; 169; 196; 225; 256; 289;
   324; 361; 400]

配列の内包表記。
> let arr = [|for x in 1..20 -> 3 * x|];;

val arr : int [] =
  [|3; 6; 9; 12; 15; 18; 21; 24; 27; 30; 33; 36; 39; 42; 45; 48; 51; 54; 57;
    60|]

シークエンスの内包表記。
> let sq = seq {for x in 1..20 -> 2 * x + 1};;

val sq : seq<int>

> sq;;
val it : seq<int> = seq [3; 5; 7; 9; ...]
以前、シークエンスについて取り上げたエントリーでは、"seq"キーワードを指定しなくてもこの手法が使えましたが、今では必須のようです。


タプルを要素に持たせることもできます。
> let tpls = [for x in 1..20 -> x, 3 * x - 2];;

val tpls : (int * int) list =
  [(1, 1); (2, 4); (3, 7); (4, 10); (5, 13); (6, 16); (7, 19); (8, 22);
   (9, 25); (10, 28); (11, 31); (12, 34); (13, 37); (14, 40); (15, 43);
   (16, 46); (17, 49); (18, 52); (19, 55); (20, 58)]

if式でフィルタリングすることもできます。
> let fls = [for x in 1..20 do if x % 2 = 1 then yield(x)];;

val fls : int list = [1; 3; 5; 7; 9; 11; 13; 15; 17; 19]
yieldキーワードを使うところがポイントでしょうか。



では、今回のトピックをみていきましょう。

続きを読む »

プロフィール
あわせて読みたい
あわせて読みたい
記事検索
Project Euler
なかのひと
アクセス解析
Coderwall
  • ライブドアブログ

トップに戻る