module Matsuya

Constants

松屋の商品。価格は、牛めしなら並盛など、標準の量と思われるものを入れておく

Morning

松屋の朝定食

NETWORK

松屋ネットワークを構築し、始点を返す。

NetworkNode

松屋ネットワーク

Sample

松屋に実際にあるメニュー。 牛めしのようにプレミアムとそうでないものがある場合は、プレミアムだけを書く オリジナルカレギュウ(プレミアム牛肉使用)も、プレミアムとして扱い、プレミアム牛肉使用と書いていないほうは書かない

VERSION

Public Class Methods

generate(okano: 0.1, current: NETWORK.find { |n| n.node == :begin }) click to toggle source

お客様に提供する商品を作る。私は接客は不得意なので、ランダムなものが出てくる。 おかの値が1に近づくほど狂った商品が出てくる。

Args

okano:

Float おかの値。おかの値が高いと商品が変異する確率が上がる。0-1の範囲の値。

current:

Matsuya::NetworkNode 再帰呼出し用。省略する。

Return

Array 材料を並べた配列

# File lib/matsuya.rb, line 107
def generate(okano: 0.1, current: NETWORK.find { |n| n.node == :begin })
  if current.is_a? NetworkNode
    nex = current.follow.sample
    if nex.is_a?(NetworkNode) && (rand < okano)
      [current.node, *generate(okano: okano, current: NETWORK.sample)]
    else
      [current.node, *generate(okano: okano, current: nex)]
    end
  end
end
network(= NETWORK) click to toggle source

互換性のため

# File lib/matsuya.rb, line 96
  def network = NETWORK

  # お客様に提供する商品を作る。私は接客は不得意なので、ランダムなものが出てくる。
  # おかの値が1に近づくほど狂った商品が出てくる。
  # ==== Args
  # [okano:]
  #   Float おかの値。おかの値が高いと商品が変異する確率が上がる。0-1の範囲の値。
  # [current:]
  #   Matsuya::NetworkNode 再帰呼出し用。省略する。
  # ==== Return
  # Array 材料を並べた配列
  def generate(okano: 0.1, current: NETWORK.find { |n| n.node == :begin })
    if current.is_a? NetworkNode
      nex = current.follow.sample
      if nex.is_a?(NetworkNode) && (rand < okano)
        [current.node, *generate(okano: okano, current: NETWORK.sample)]
      else
        [current.node, *generate(okano: okano, current: nex)]
      end
    end
  end

  # 材料を選択したら釜に入れてぐーるぐーる。
  # キムカル丼のように、『キムチ+カルビ』がキムカルに変化するなど、松屋活用を考慮して
  # Matsuya.generate の戻り値を加工する
  # ==== Args
  # [dish] Array 現在の皿の状態
  # ==== Return
  # Array<String> できたー!どの特性を残そう?
  def preparation(dish)
    case dish
        in *head, :+, *tail
        [head, :' ', tail, :セット]
        in *head, :キムチ, :カルビ, *tail
        [head, :キムカル, tail]
        in *head, :創業, :牛, *tail
        [head, :創業ビーフ, tail]
        in *head, :創業, :プレミアム, :牛, *tail
        [head, :創業プレミアムビーフ, tail]
        in *head, :牛, :カレー, *tail
        [head, :ビーフカレー, tail]
        in *head, :ビビンバ, :丼, *tail
        [head, :ビビン丼, tail]
        in *head, :海老, :チリ, *tail
        [head, :海老のチリ, tail]
        in *head, :豚, :肩ロース, :豚, :焼肉定食, *tail
        [head, :豚, :肩ロース, :の, :豚, :焼肉定食, tail]
        in *head, :豚, :肩ロース, :生姜焼, :定食, *tail
        [head, :豚, :肩ロース, :の, :生姜焼, :定食, tail]
        in *head, :玉子, :ハンバーグ, *tail
        [head, :エッグ, :ハンバーグ, tail]
        in *head, :ネギ, :玉子, *tail
        [head, :ネギたま, tail]
        in *head, :とろろ, :玉子, *tail
        [head, :とろたま, tail]
        in *head, :カレー, :牛, *tail
        [head, :カレギュウ, tail]
        in *head, :ハンバーグ, :皿, *tail
        [head, :バーグディッシュ, tail]
        else
        dish
    end.flat_map do |node|
      if node.is_a? Array then preparation(node) else node end
    end
  end

  # 商品を注文し、商品を受け取る
  # ==== Args
  # [okano]
  #   Float おかの値。おかの値が高いと商品が変異する確率が上がる。0-1の範囲の値。
  # ==== Return
  # String 商品名
  def order(okano: 0.1)
    preparation(generate(okano: okano).reject { _1 == :begin }).join
  end
end
order(okano: 0.1) click to toggle source

商品を注文し、商品を受け取る

Args

okano

Float おかの値。おかの値が高いと商品が変異する確率が上がる。0-1の範囲の値。

Return

String 商品名

# File lib/matsuya.rb, line 168
def order(okano: 0.1)
  preparation(generate(okano: okano).reject { _1 == :begin }).join
end
preparation(dish) click to toggle source

材料を選択したら釜に入れてぐーるぐーる。 キムカル丼のように、『キムチ+カルビ』がキムカルに変化するなど、松屋活用を考慮して Matsuya.generate の戻り値を加工する

Args

dish

Array 現在の皿の状態

Return

Array<String> できたー!どの特性を残そう?

# File lib/matsuya.rb, line 125
def preparation(dish)
  case dish
      in *head, :+, *tail
      [head, :' ', tail, :セット]
      in *head, :キムチ, :カルビ, *tail
      [head, :キムカル, tail]
      in *head, :創業, :牛, *tail
      [head, :創業ビーフ, tail]
      in *head, :創業, :プレミアム, :牛, *tail
      [head, :創業プレミアムビーフ, tail]
      in *head, :牛, :カレー, *tail
      [head, :ビーフカレー, tail]
      in *head, :ビビンバ, :丼, *tail
      [head, :ビビン丼, tail]
      in *head, :海老, :チリ, *tail
      [head, :海老のチリ, tail]
      in *head, :豚, :肩ロース, :豚, :焼肉定食, *tail
      [head, :豚, :肩ロース, :の, :豚, :焼肉定食, tail]
      in *head, :豚, :肩ロース, :生姜焼, :定食, *tail
      [head, :豚, :肩ロース, :の, :生姜焼, :定食, tail]
      in *head, :玉子, :ハンバーグ, *tail
      [head, :エッグ, :ハンバーグ, tail]
      in *head, :ネギ, :玉子, *tail
      [head, :ネギたま, tail]
      in *head, :とろろ, :玉子, *tail
      [head, :とろたま, tail]
      in *head, :カレー, :牛, *tail
      [head, :カレギュウ, tail]
      in *head, :ハンバーグ, :皿, *tail
      [head, :バーグディッシュ, tail]
      else
      dish
  end.flat_map do |node|
    if node.is_a? Array then preparation(node) else node end
  end
end