Maneira mais eficiente de processar argumentos da linha de comando na notação de prefixo
-
22-09-2019 - |
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.
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.