Schreiben Sie ein Programm oder eine Funktion, die eine Ganzzahl im Bereich 1..3999 als Eingabe akzeptiert und die Anzahl der Liniensegmente zurückgibt, die erforderlich sind, um diese Ganzzahl in römischen Standardzahlen auszudrücken (Sie würden also XL, aber keine VM verwenden). Beispiele:
1 -> 1
4 -> 3
5 -> 2
9 -> 3
10 -> 2
40 -> 4
50 -> 2
90 -> 3
100 -> 1
400 -> 3
500 -> 2
900 -> 5
1000 -> 4
Integrierte römische Zahlenkonvertierungen sind zulässig, aber Sie können das Problem ohne sie lösen, indem Sie wiederholt die größte verbleibende Zahl von der obigen Liste abziehen. Beispiel: 1234 = 4 + 1 + 1 + 2 + 2 + 2 + 3 = 15.
Dies ist Code-Golf , also gewinnt das kürzeste Programm.
Antworten:
Pyth,
927670 BytesProbieren Sie es hier aus!
Vielen Dank an @FryAmTheEggman für einige Vorschläge zum Packen von Strings, die mir einige Bytes erspart haben!
Ich frage mich immer noch, ob es eine mathematische Möglichkeit gibt, diese Liste zu codieren. Ich werde versuchen, etwas herauszufinden.
Erläuterung
Dies verwendet den angegebenen Algorithmus.
K
enthält die angegebene Liste mit den Nummern und der entsprechenden Anzahl von Liniensegmenten im Wechsel. Diese Liste wird erstellt, indem eine gepackte Zeichenfolge aufgeteilt wird, die dekodiert wird0/0/1/1/4/3/5/2/9/3/10/2/40/4/50/2/90/3/100/1/400/3/500/2/900/5/1000/4
,/
und jedes Element einer Ganzzahl zugeordnet wird.quelle
C
148129 ZeichenMein erster Code-Golf: ^). Da die Frage besagt, dass ich eine Funktion verwenden kann, habe ich main in eine Funktion geändert, um einige Zeichen zu trimmen (am wichtigsten: Übergeben Sie c als Parameter, anstatt scanf).
unverpackt
quelle
Mathematica,
8072 BytesAnonyme Funktion, die nur Zahlen in römische Zahlen umwandelt, jedes Zeichen durch die Anzahl der Segmente ersetzt und die Summe berechnet.
quelle
Netzhaut, 128 Bytes
Einfaches Ersetzen, bis nichts mehr zu ersetzen ist. Dann werden die Apostrophe gezählt und das ist unsere Anzahl von Liniensegmenten.
Wenn die Eingabe und Ausgabe in unary zulässig ist, sind es 115 Bytes (obwohl wer 1234 eingeben möchte?).
Probieren Sie es online aus!
Probieren Sie es online aus! (unäre IO)
quelle
Python 3, 95 Bytes
Die Unicode-Zeichenfolge besteht aus den Codepunkten:
quelle
e=ord(e);
Java, 152 Bytes
Weil, weißt du, Java.
Einfache wörtliche Implementierung des gegebenen Algorithmus. Das Array packt die Transformationsinformationen: Gerade Indizes sind eins weniger als die römische Zahl, und ungerade Indizes sind die Anzahl für diese Zahl.
Dies ist ein Lambda, das ein
int
/ nimmt und zurückgibtInteger
. Dies beinhaltetIntUnaryOperator
oderUnaryOperator<Integer>
.quelle
JavaScript (ES6), 79 Byte
Die Zeichenfolgen repräsentieren die Anzahl der Liniensegmente für die Einheiten, Zehner- und Hunderterstellen. (Tausend ist einfach viermal so groß wie die Tausenderstelle.) Diese Methode scheint kürzer zu sein als andere Optionen wie der in der Frage vorgeschlagene Algorithmus.
Bearbeiten: 2 Bytes dank @ user81655 gespeichert.
quelle
n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
+
s in-
s ändere, kann ich das führende entfernen+
, aber dann speichert die Gruppierung ein weiteres Byte.