Nella notazione con prefisso, l'operatore precede gli argomenti, quindi è possibile immaginare che l'operatore chiami next()
che viene chiamato ricorsivamente. Nella notazione infissa, l'operatore passa tra gli argomenti, quindi puoi immaginarlo semplicemente come un albero di analisi. Nella notazione postfix, l'operatore segue gli argomenti, quindi puoi solo immaginarlo come basato sullo stack.
In ogni notazione di correzione, l'operatore può andare ovunque * . Se un operatore si presenta e non ci sono abbastanza argomenti, allora l'operatore attende fino a quando non ci sono abbastanza argomenti. Per questa sfida, devi implementare un valutatore anyfix di base. (Nota che anyfix è un linguaggio ricreativo che ho abbandonato e che puoi giocare qui o controllare qui )
Dovrai supportare i seguenti comandi:
(Arity 1)
- duplicare
- negativo
(Arity 2)
- aggiunta
- moltiplicazione
- uguaglianza: restituisce
0
o1
.
È possibile scegliere di utilizzare cinque simboli diversi dagli spazi bianchi per questi comandi. A scopo dimostrativo, userò "
come duplicato, ×
come moltiplicazione e +
come aggiunta.
Per i letterali, devi solo supportare numeri interi non negativi, ma l'interprete deve essere in grado di contenere tutti i numeri interi (all'interno dell'intervallo (ragionevole) di numeri interi della tua lingua).
Diamo un'occhiata a un esempio: 10+5
. La memoria dovrebbe comportarsi come uno stack, non una coda. Quindi, per prima cosa, lo stack inizia alle []
e l'elenco degli operatori in coda inizia alle []
. Quindi, 10
viene valutato il valore letterale che rende lo stack [10]
. Successivamente, +
viene valutato l'operatore , che richiede due argomenti. Tuttavia, esiste solo un argomento nello stack, quindi l'elenco degli operatori in coda diventa ['+']
. Quindi, 5
viene valutato il valore letterale che rende lo stack [10, 5]
. A questo punto, l'operatore '+'
può essere valutato così com'è, creando lo stack [15]
e la coda []
.
Il risultato finale dovrebbe essere [15]
per + 10 5
, 10 + 5
e 10 5 +
.
Diamo un'occhiata a un esempio più difficile: 10+"
. Lo stack e la coda iniziano come []
e []
. 10
viene valutato per primo il che rende lo stack [10]
. Successivamente, +
viene valutato, che non modifica lo stack (perché non ci sono argomenti sufficienti) e rende la coda ['+']
. Quindi, "
viene valutato. Questo può essere eseguito immediatamente così com'è, facendo lo stack [10, 10]
. +
ora può essere valutato in modo che lo stack diventi [20]
e la coda []
. Il risultato finale è [20]
.
Che dire dell'ordine delle operazioni?
Diamo un'occhiata a ×+"10 10
. Lo stack e la coda iniziano entrambi come []
:
×
: Lo stack rimane invariato e la coda diventa['×']
.+
: Lo stack rimane invariato e la coda diventa['×', '+']
."
: Lo stack rimane invariato e la coda diventa['×', '+', '"']
.10
: Lo stack diventa[10]
. Anche se×
dovrebbe essere il primo operatore a essere valutato in quanto appare per primo,"
può essere eseguito immediatamente e nessuno degli operatori prima di esso può, quindi viene valutato. Lo stack diventa[10, 10]
e la coda['×', '+']
.×
ora può essere valutato, il che rende lo stack[100]
e la coda['+']
.10
: Lo stack diventa[100, 10]
, il che consente+
di essere valutato. Lo stack diventa[110]
e la coda[]
.
Il risultato finale è [110]
.
I comandi utilizzati in queste dimostrazioni sono coerenti con quelli del linguaggio anyfix; tuttavia, l'ultimo esempio non funzionerà a causa di un bug nel mio interprete. (Dichiarazione di non responsabilità: i tuoi invii non verranno utilizzati nell'interprete anyfix)
Sfida
Seleziona un set di 5 caratteri non numerici non bianchi e crea un interprete anyfix secondo le specifiche sopra. Il tuo programma può emettere l'array singolare o il valore da esso contenuto; è garantito che la pila di valori conterrà un solo valore alla fine dell'esecuzione e che la coda degli operatori sarà vuota alla fine dell'esecuzione.
Questo è code-golf quindi vince il codice più breve in byte.
Casi test
Per questi casi di test, il duplicato è "
, il negativo è -
, l'addizione è +
, la moltiplicazione è ×
e l'uguaglianza è =
.
Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)
Regole
- Si applicano scappatoie standard
- Puoi prendere l'interprete ufficiale anyfix e giocarlo a golf se lo desideri. Aspettati di perdere orribilmente.
L'input verrà dato come una stringa e l'output come una matrice, un singolo intero, fuori dalla rappresentazione di stringa di entrambi. Si può presumere che l'input conterrà solo spazi, cifre e i 5 caratteri scelti.
* Non attualmente
0
e 1
?
×+"10 10
nei casi di test, o qualsiasi altro esempio che sia 1) usando uno spazio bianco e 2) ritardando l'uso dell'operatore duplicato (due cose che mi sono perso del tutto).