/var/log/messages

Jan 31, 2019 - 1 minute read - Comments - programming

プログラミング Elixir (14)

StringsAndBinaries-4 は難問、とありますね。検討してみます。

以下ができるようになってくれ、とのこと。

calculate('123 + 27') # => 150

条件としては「数字 [+-*/] 数字」という形のシングルクオート文字列、なのか。パースできれば良いのかどうか。簡単げに言うてますがどうすりゃいいのかな。

ええと

もう少し時間があるらしいので検討。パースして以下なリストにして、で良いのかどうか。

[123, '+', 27]

一番目、二番目、三番目、で決めちゃって良いのかな。

かなり時間が経過して

取り組み再開。手順てきに以下なのかな。

  • head がスペースになるまで数値を組み立てる
  • スペースが出現したらスペース以外になるまで car を探索
  • スペース以外であれば演算子として取得
  • 再びスペース以外が出現するまで car を探索
  • リストが終わるまで数値を組み立て

パースまで、が何とかならんかな。

parse

以下なカンジ?

  def parse(str) do
    _parse(str, 0)
  end

  defp _parse([head | tail], top)
  when head == 32 do
    _parse2(tail, [top], '')
  end
  defp _parse([head | tail], top) do
    _parse(tail, top*10 + (head-48))
  end
  defp _parse2([head|tail], list, operator)
  when head == 32 do
    _parse3(tail, list ++ [operator], 0)
  end
  defp _parse2([head|tail], list, operator) do
    _parse2(tail, list, head)
  end
  defp _parse3([head|[]], list, value) do
    _parse_end(list ++ [value*10 + (head-48)])
  end
  defp _parse3([head|tail], list, value) do
    _parse3(tail, list, value*10+(head-48))
  end
  defp _parse_end(list) do
    list
  end

動作確認は以下なカンジなのかどうか。

iex(5)> Parse.parse('123 + 45')
'{+-'

ええと確認を。

iex(6)> [head|tail] = Parse.parse('123 + 45')
'{+-'
iex(7)> head
123
iex(8)> [head|tail] = tail
'+-'
iex(9)> head
43
iex(10)> [head|tail] = tail
'-'
iex(11)> head
45

10 進数 43 は ‘+’ です。これを eval すれば良いのかな。

買い物リスト Open Source Synthesizer

comments powered by Disqus