dc -f infile -e '[+z1<r]srz1<rp'
Notez que les nombres négatifs précédés du signe moins doivent être traduits par dc
puisqu'il utilise _
plutôt que le préfixe -
pour cela. Par exemple, via tr '-' '_' | dc -f- -e '...'
.
Edit : Puisque cette réponse a reçu tant de votes "pour l'obscurité", voici une explication détaillée :
L'expression [+z1<r]srz1<rp
fait ce qui suit :
[ interpret everything to the next ] as a string
+ push two values off the stack, add them and push the result
z push the current stack depth
1 push one
<r pop two values and execute register r if the original top-of-stack (1)
is smaller
] end of the string, will push the whole thing to the stack
sr pop a value (the string above) and store it in register r
z push the current stack depth again
1 push 1
<r pop two values and execute register r if the original top-of-stack (1)
is smaller
p print the current top-of-stack
Sous forme de pseudo-code :
- Définir "add_top_of_stack" comme :
- Retirer les deux valeurs supérieures de la pile et ajouter le résultat.
- Si la pile comporte deux valeurs ou plus, exécuter "add_top_of_stack" de manière récursive.
- Si la pile comporte deux valeurs ou plus, exécuter "add_top_of_stack"
- Imprimer le résultat, qui est maintenant le seul élément restant dans la pile.
Pour bien comprendre la simplicité et la puissance de dc
Voici un script Python fonctionnel qui met en œuvre certaines des commandes de la rubrique dc
et exécute une version Python de la commande ci-dessus :
### Implement some commands from dc
registers = {'r': None}
stack = []
def add():
stack.append(stack.pop() + stack.pop())
def z():
stack.append(len(stack))
def less(reg):
if stack.pop() < stack.pop():
registers[reg]()
def store(reg):
registers[reg] = stack.pop()
def p():
print stack[-1]
### Python version of the dc command above
# The equivalent to -f: read a file and push every line to the stack
import fileinput
for line in fileinput.input():
stack.append(int(line.strip()))
def cmd():
add()
z()
stack.append(1)
less('r')
stack.append(cmd)
store('r')
z()
stack.append(1)
less('r')
p()
2 votes
Cette question est très proche de celle que j'ai posée il y a quelque temps : stackoverflow.com/questions/295781/
5 votes
J'aime beaucoup cette question parce qu'elle offre de nombreuses possibilités de réponses correctes (ou du moins valables).
0 votes
Cette question ressemble à un problème de golf codé. codegolf.stackexchange.com :)