Obiettivo:
scrivere una funzione che accetta un numero come input e restituisce un numero romano abbreviato per quel numero come output.
Simboli numerici romani:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
Per un esempio di cosa intendo quando dico "numeri romani a mano corta", consideriamo di trovare un numero romano che rappresenti il 1983, perché quello è l'anno in cui sono nato. Un'opzione è di farlo normalmente (10 lettere):
1983 = MCMLXXXIII = ( 1000-100 + 1000 + 50 + 30 + 3)
L'altra opzione è di farlo nel modo breve (6 caratteri):
1983 = MXVIIM = (1000 - (10 + 10) + 1000 + 3)
Sai cosa significa questo?!?!!?? Se fossi stato romano avrei potuto salvare 4 caratteri ogni volta che ho scritto la mia data di nascita! Woot Woot !!
Tuttavia, prima di superare l'eccitazione, ho una domanda da scrivere, quindi dovrei probabilmente definire le regole numeriche romane a breve termine in modo da essere tutti sulla stessa pagina:
Regole numeriche romane di breve durata:
- Considera sempre i simboli da sinistra a destra fino a quando non ci sono più caratteri da considerare.
- Se non ci sono simboli di valore superiore a destra del simbolo corrente:
- Aggiungi il valore del simbolo corrente al totale parziale di questo numero romano.
- Se ci sono simboli di valore più alto a destra del simbolo che stai considerando:
- Individua il simbolo più alto più a destra alla destra del simbolo corrente
- Considera tutti i caratteri fino a quel simbolo come un numero romano
- Calcola il valore di quel numero romano usando questi passaggi
- Sottrai il valore di quel numero romano dal totale parziale di questo numero romano.
- Passa al simbolo successivo dopo il gruppo che hai appena considerato
- Ogni numero romano deve contenere almeno 1 simbolo.
- Questo è tutto! Tutto ciò che segue queste regole sarà accettato!
Esempi:
IIIIV = (-(1+1+1+1)+5) = 1 //Don't ask me why you'd want to do this!
VVX = (-(5+5) + 10) = 0 //Who said you couldn't represent 0 with roman numerals?!!?
VVXM = (-(-(5+5) + 10) + 1000) = 1000 //Again...don't ask me why you'd want to do this!
MXIIXMI = (1000-(10-(1+1)+10)+1000+1) = 1983 //Ahhh...such a great year :)
Regole delle domande:
Crea una funzione che accetta un singolo numero come input e restituisce un numero romano per quel numero come output utilizzando le regole precedenti. Calcola il codeGolfScore di questa funzione.
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
Usando la tua funzione dalla regola 1, genera i numeri romani tra -1000 (esatto, NEGATIVO mille) e 3000. Quindi riassumi la lunghezza dei caratteri di questi numeri romani per ottenere totalCharacterCount . Ecco alcuni pseudocodici per chiarire:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = codeGolfScore + totalCharacterCount
- Vince il FinalScore più basso !
Nota: poiché il conteggio di totalCharacter sarà compreso tra le diecimila +, l'algoritmo di lunghezza dei caratteri dovrebbe avere la massima priorità. I punteggi di code-golf sono solo il pareggio nel caso in cui più utenti trovino l'algoritmo o gli algoritmi ottimali vicini l'uno all'altro.
Buona fortuna e divertiti alle tue celebrazioni MMXII domani sera !!!
""
consentito per zero o dobbiamo usare VVX
o qualcosa di equivalente?
IXV = -(-1 + 10) + 5 = -4
(vittorie più a destra) o IXV = -1 + 10 + 5 = 14
(vittorie con il punteggio più alto)?
DDDDM
per-1000
?