Maneira mais eficiente de processar argumentos da linha de comando na notação de prefixo

StackOverflow https://stackoverflow.com/questions/1991672

Pergunta

Nossa lição de casa é escrever um script de rubi que calcule um subconjunto da lista de palavras, dependendo da expressão.

Operações binárias regulares são

&& And operator
|| Or operator
++ Concatenate operator
! Negation operator

Uma chamada válida seria como

./eval.rb wordlist && a c
or
./eval.rb wordlist && || a b c

Primeira chamada significa gerar uma nova lista de palavras que todas as palavras têm pelo menos um 'a' e 'c'. Então, minha pergunta é como processe os argumentos de uma maneira eficaz? Talvez Recursiv? Estou preso...

Desde já, obrigado.

Foi útil?

Solução

Parece uma gramática com notação de prefixo. Uma pilha é realmente sua amiga, e a pilha mais fácil de usar é a pilha de chamadas. Por exemplo, dada esta gramática:

expression ::= number | operand number number
operand ::= '+' | '-'

Este é o código para avaliá -lo:

#!/usr/bin/ruby1.8

@tokens = ['*', 2, '+', 3, 4]

def evaluate
  token = @tokens.shift    # Remove first token from @tokens
  case token
  when '*'
    return evaluate * evaluate
  when '+'
    return evaluate + evaluate
  else
    return token
  end
end

puts evaluate    # => 14

Embora seja Ruby, está perto o suficiente do pseudo-código. Eu coloquei retornos explícitos, embora Ruby não os exija, porque pode ser mais claro para alguém que não conhece Ruby.

Outras dicas

Use uma pilha. O tamanho máximo seria o número de argumentos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top