トラック
/
Julia
Julia
/
演習
/
ラザニア
ラザニア

ラザニア

学習演習

はじめに

Juliaのトラック全体を通して、解答は小さなライブラリのように扱うことが求められます。つまり、関数や型などを定義し、それをテストスイートで実行することになります。 そのため、最初の概念として名前付き関数を紹介します。

Juliaは動的で、型付けの強いプログラミング言語です。 プログラミングのスタイルは主に関数型ですが、Haskellなどの言語よりも柔軟です。

変数と代入

変数は事前に宣言する必要はありません。 適切な名前を決めて、値を代入するだけです。

julia> myvar = 42  # an integer
42

julia> name = "Maria"  # strings are surrounded by double-quotes ""
"Maria"

定数

プログラム全体で使いたい値がある一方、その値が変わる予定がない場合は、定数として扱うのがよいでしょう。

代入の前にconstキーワードを付けると、コンパイラーは変数の場合よりも効率のよいコードを生成できます。

定数は、プログラミングのミスを防ぐのにも役立ちます。 うっかりconstの値を変更しようとすると、警告が出ます。

julia> const answer = 42
42

julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24

constは関数の外側でしか宣言できないことに注意してください。 ふつうは*.jlファイルの先頭付近、関数定義の前に置きます。

算術演算子

これらは多くの言語と同じです。

2 + 3  # 5 (addition)
2 - 3  # -1 (subtraction)
2 * 3  # 6 (multiplication)
8 / 2  # 4.0 (division with floating-point result)
8 % 3  # 2 (remainder)

関数

Juliaで名前付き関数を定義する方法は、よく使われるものが2つあります。

  1. functionキーワードを使う方法

    function muladd(x, y, z)
        x * y + z
    end
    

    読みやすさのために4スペースのインデントが慣例ですが、コンパイラーはこれを無視します。 endキーワードは必須です。

    return x * y + zと書くこともできたことに注意してください。 ただし、Juliaの関数は常に最後に評価された式を返すので、returnキーワードは省略できます。 意図をより明確にするために、あえて書くプログラマーも多くいます。

  2. 「代入形式」を使う方法

    muladd(x, y, z) = x * y + z
    

    これは、式1つの簡潔な関数を書くときによく使われます。

    代入形式ではreturnキーワードを決して使いません。

2つの形式は等価で、まったく同じように使えるので、読みやすいほうを選んでください。

関数を呼び出すには、その名前を指定し、関数のそれぞれの入力に値を渡します。

# invoking a function
muladd(10, 5, 1)

# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)

命名規則

多くの言語と同じく、Juliaでは(変数、関数、その他さまざまなものの)名前は文字で始まり、そのあとに文字、数字、アンダースコアを好きなだけ続けられます。

慣例として、変数、定数、関数の名前は小文字で書き、アンダースコアはほどほどに抑えます。

説明

この演習では、お気に入りの料理本を見ながら絶品ラザニアを作るためのコードを書いていきます。

4つのタスクがあり、どれもラザニアを作るのにかかる時間に関するものです。

1. 焼き時間の目安を定数に保存する

ラザニアをオーブンで何分焼けばよいかを返すexpected_bake_time定数を定義します。

料理本によると、ラザニアはオーブンで合計60分焼く必要があります。

julia> expected_bake_time
60

2. 準備にかかる時間を分単位で計算する

preparation_time関数を定義します。この関数は、ラザニアに重ねた層の数を入力として受け取り、ラザニアの準備に何分かかったかを返します。1層につき2分かけて準備するものとします。

julia> preparation_time(4)
8

3. 残りの焼き時間を分単位で計算する

remaining_time関数を定義します。この関数は、ラザニアがすでにオーブンに入っていた実際の分数を入力として受け取り、ラザニアをあと何分オーブンに入れておく必要があるかを返します。

julia> remaining_time(50)
10

4. 合計の作業時間を分単位で計算する

total_working_time関数を定義します。この関数は2つの入力を受け取ります。1つ目の入力は、ラザニアに重ねた層の数です。2つ目の入力は、ラザニアがオーブンに入っていた分数です。

この関数は、ラザニアの調理に合計で何分取り組んだかを返します。これは、準備にかかった分数と、その時点でラザニアがオーブンに入っていた分数を足したものです。

julia> total_working_time(3, 20)
26
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Julia Exercism

ラザニアを始める準備はできましたか?

Exercismに登録すれば、35個のコンセプト128個の演習、そして本物の人間によるメンタリングとともに、Juliaを学んでマスターできます。すべて無料です。