Descrizione
Il linguaggio di programmazione immaginario (IPL) utilizza la notazione inversa polacca. Ha i seguenti comandi:
- i - inserisci il numero e spingilo nello stack
- o - uscita non distruttiva in cima allo stack (il numero rimane nello stack)
- d - scarta la parte superiore dello stack
- numero intero : spingere questo numero nello stack
- + - * - estrae due numeri dallo stack, esegue l'operazione corrispondente e respinge il risultato. Non esiste alcuna divisione in IPL.
IPL funziona solo con numeri interi e viene utilizzato per calcoli semplici. Un programma IPL è scritto su una riga e separato da spazi. La stringa vuota è un programma IPL valido.
Programma IPL:
i i + o
Inserisce due numeri, li somma e genera il risultato.
I numeri di input e i numeri interi che possono essere inseriti nello stack sono compresi nell'intervallo [-999, 999], tuttavia l'output può essere qualsiasi. Se la tua lingua non supporta numeri grandi, va bene comunque.
Formato di input / output
Puoi scegliere qualsiasi formato di input / output purché sia chiaro per capire e leggere / scrivere: stringa, elenco, token ecc.
Compito
Ti viene dato un programma IPL, devi ottimizzarlo (riduci la lunghezza):
i 12 + 3 + o d 2 3 + d
Dopo l'ottimizzazione diventerà
i 15 + o
Non è necessario preservare lo stato dello stack, ma la quantità di input e output e il loro ordine devono corrispondere per il programma originale e ottimizzato.
Quindi programma IPL:
-40 i * 2 * o i + 3 1 + o i 2 *
Dopo l'ottimizzazione diventerà
i -80 * o i 4 o i
o
-80 i * o i 4 o i
(nota che devi salvare tutti gli input, anche se sono irrilevanti).
Non ci dovrebbe essere hardcoding per casi di test, il codice dovrebbe funzionare su qualsiasi programma IPL arbitrario e produrre il programma IPL più breve possibile che soddisfi i requisiti.
punteggio
Punteggio di golf di codice predefinito.
AGGIORNAMENTO: modificato il punteggio in punteggio di puro codice golf, come suggerito da @Sanchises.
Casi test:
Ingresso:
(empty string)
Uscita possibile:
(empty string)
Ingresso:
i 4 * 2 + 3 * 6 - o
Uscita possibile:
i 12 * o
Ingresso:
1 1 + o
Uscita possibile:
2 o
Ingresso:
i 2 + 3 + o d 2 3 + d
Uscita possibile:
i 5 + o
Ingresso:
-40 i * 2 * o i + 3 1 + o i 2 *
Uscita possibile:
-80 i * o i 4 o i
Ingresso:
i i 1 + i 1 + i 1 + i 1 + d d d d o
Uscita possibile:
i i i i i d d d d o
Ingresso:
i i i 0 * * * o
Uscita possibile:
i i i 0 o
Ingresso:
i i i 1 * * * o
Uscita possibile:
i i i * * o
Ingresso:
i 222 + i 222 - + o
Uscita possibile:
i i + o
Ingresso:
i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Uscita possibile:
i i i i i o 1 o
Ingresso:
i 1 + 2 * 1 + o
Uscita possibile:
i 2 * 3 + o
Ingresso:
1 1 + o i 2 + 3 + o d 2 3 + d 4 i * 2 * o i + 3 1 + o i 2 * i i 1 + i 1 + i 1 + i 1 + d d d d o i i i 0 * * * o i i i 1 * * * o i 2 + i 2 - + o i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Uscita possibile:
2 o i 5 + o 8 i * o i 4 o i i i i i i d d d d o i i i 0 o i i i * * * o i i + o i i i i i o 1 o
i i d o
ali o i
(l'ingresso è in ordine e l'uscita è in ordine) o non si dovrebbe semplificare? (l'insieme di input e output dovrebbe essere in ordine)