Quindi voglio essere in grado di analizzare e valutare "espressioni di dadi" in C#. Un'espressione di dadi è definita in questo modo:Espressione di dadi di analisi (ad esempio 3d6 + 5) in C#: da dove iniziare?
<expr> := <expr> + <expr>
| <expr> - <expr>
| [<number>]d(<number>|%)
| <number>
<number> := positive integer
Così ad es. d6+20-2d3
sarebbe stato permesso, e dovrebbe valutare come
rand.Next(1, 7) + 20 - (rand.Next(1, 4) + rand.Next(1, 4))
anche d%
dovrebbe essere equivalente a d100
.
So che potrei mettere insieme qualche soluzione, ma so anche che questo sembra un tipico problema di tipo informatico, quindi ci deve essere una soluzione super elegante che dovrei esaminare.
mi piacerebbe il risultato della mia analisi di avere queste capacità:
- dovrei essere in grado di emettere una forma normalizzata dell'espressione; Prima sto pensando ai dadi, ordinati per dimensione dei dadi e sempre con un prefisso. Quindi ad es. il campione precedente diventerebbe
1d6-2d3+20
. Anche le istanze did%
diventerebberod100
nel formato normalizzato. - Dovrei essere in grado di valutare l'espressione a volontà, facendo ruotare diversi numeri casuali ogni volta.
- Dovrei essere in grado di valutare l'espressione con tutti i rulli del dado massimizzati, quindi ad es. l'esempio sopra darebbe (in modo deterministico)
1*6+20+2*3 = 32
.
So che questo è esattamente il tipo di cosa che Haskell e probabilmente altri linguaggi di tipo funzionale sarebbero fantastici, ma mi piacerebbe rimanere in C# se possibile.
I miei pensieri iniziali tendono verso la ricorsione, le liste e forse qualche LINQ, ma ancora una volta, se provassi senza alcune indicazioni da persone che sanno cose, sono sicuro che finirebbe per essere un disastro inelegante.
Un'altra tattica che potrebbe funzionare sarebbe una sostituzione di stringa basata su espressioni regex per trasformare le espressioni di dadi nelle chiamate rand.Next
e quindi la valutazione o la compilazione al volo ... funzionerebbe davvero? Come evitare di creare ogni volta un nuovo oggetto rand
?
di random.Next è comprensivo, ed è secondo parametro è esclusivo. http://msdn.microsoft.com/en-us/library/2dx6wyd4%28VS.95%29.aspx – Domenic
abbastanza giusto :) – annakata
Immagino tu intenda: rand.Next (1, 7) + 20 - (rand. Successivo (1, 4) + rand.Next (1, 4)) –