אתגר php - מחשבון

מחשבון

עליכם לבנות קוד לפתרון מחרוזת תרגיל מתמטי.

  • התווים המורשים - מספרים שלמים, סימנים: + - * / ( חיבור, חיסור, כפל, חילוק).
  • מותר להכניס רווחים ביון התווים.
  • אם המחרוזת מכילה תווים אחרים תודפס הודעת שגיאה.
  • אסור להשתמש בפונקציות eval, create_function או regular expressions כמו preg_match_all או preg_replace.

לתצוגה של התרגיל ולקבצי עבודה עברו ללינק הבא: http://learn-php.me/index.php?task=14-calculator

לייק 1

פתרתי ב Elixir כי לא יודע php. (וגם כי תכל׳ס אין על אליקסיר לתרגילים כאלה):

defmodule Calc do

  def build([item]) do
    item
  end
  
  def build([a, op, b | tail]) do
    case op do
      "*" ->
        build([{&(&1 * &2), a, b} | tail])
      "/" ->
        build([{&(&1 / &2), a, b} | tail])
      "+" ->
        build([{&(&1 + &2), a, build([b | tail])}])
      "-" ->
        build([{&(&1 - &2), a, build([b | tail])}])
    end
  end

  def solve(val) when is_integer(val) do
    val
  end

  def solve({op, a, b}) do
    op.(solve(a), solve(b))
  end

  def calc(line) do
    line
    |> String.split
    |> Enum.map(&to_i_if_possible/1)
    |> build
    |> solve
    |> IO.inspect
  end

  def to_i_if_possible(val) do
    case val do
      x when x in ["*", "/", "+", "-"] -> x
      x -> String.to_integer(x)
    end
  end
end

System.argv
|> Enum.at(0)
|> Calc.calc

נראה אם תצליחו לתרגם את זה לשפות אחרות :slight_smile: