Schreiben Sie ein Programm, das in römischen Ziffern von 1 bis 100 zählt, und drucken Sie diese Zahlen als Standardausgabe. Jede der Zahlen muss durch ein Leerzeichen getrennt werden.
Sie können keine eingebaute Funktion zum Umwandeln in römische Ziffern oder eine externe Anwendung oder Bibliothek verwenden, um dies zu tun.
Das gewünschte Ergebnis ist
I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII XXXIII XXXIV XXXV XXXVI XXXVII XXXVIII XXXIX XL XLI XLII XLIII XLIV XLV XLVI XLVII XLVIII XLIX L LI LII LIII LIV LV LVI LVII LVIII LIX LX LXI LXII LXIII LXIV LXV LXVI LXVII LXVIII LXIX LXX LXXI LXXII LXXIII LXXIV LXXV LXXVI LXXVII LXXVIII LXXIX LXXX LXXXI LXXXII LXXXIII LXXXIV LXXXV LXXXVI LXXXVII LXXXVIII LXXXIX XC XCI XCII XCIII XCIV XCV XCVI XCVII XCVIII XCIX C
Da es sich um eine Code-Golf-Herausforderung handelt, gewinnt der kürzeste Code .
Antworten:
Perl 69 Bytes
Arbeitet nach einer magischen Formel. Der Ausdruck
"32e$&"%72726
transformiert jede Ziffer auf folgende Weise:0⇒32, 1⇒320, 2⇒3200, 3⇒32000, 4⇒29096, 5⇒56, 6⇒560, 7⇒5600, 8⇒56000, 9⇒50918
Nach Anwenden der Übersetzung
y/016/IXV/
haben wir stattdessen Folgendes :0⇒32, 1⇒32 I , 2⇒32 II , 3⇒32 III , 4⇒29 I 9 V , 5⇒5 V , 6⇒5 VI , 7⇒5 VII , 8 ⇒ 5 VIII , 9 ⇒ 5 I 9 X 8
Die restlichen Ziffern (
2-57-9
) werden entfernt. Beachten Sie, dass diese durch einen Byte verbessert werden könnte eine Formel unter Verwendung der übersetzt012
statt016
, die Vereinfachung/XVI60-9/
zu/XVI0-9/
. Ich konnte keinen finden, aber vielleicht hast du mehr Glück.Sobald eine Ziffer auf diese Weise transformiert wurde, wird der Vorgang für die nächste Ziffer wiederholt, wobei das Ergebnis angehängt und die vorherigen
XVI
s zurCLX
gleichen Zeit übersetzt werden, zu der die Übersetzung für die neue Ziffer erfolgt.Update Die
ausführliche Suche ergab keine kürzeren Ergebnisse. Ich habe jedoch eine alternative 69-Byte-Lösung gefunden:
Dieser verwendet eine
0-2
Substitution fürIXV
, hat aber ein Modulo, das eine Ziffer länger ist.Update:
6665 BytesDiese Version unterscheidet sich erheblich, daher sollte ich wahrscheinlich ein paar Worte dazu sagen. Die verwendete Formel ist tatsächlich ein Byte länger!
Da ich die Formel nicht mehr verkürzen konnte, entschied ich mich, das, was ich hatte, herunterzuspielen. Es dauerte nicht lange, bis ich mich an meinen alten Freund erinnerte
$\
. Wenn eineprint
Anweisung ausgegeben wird,$\
wird sie automatisch an das Ende der Ausgabe angehängt. Ich konnte die umständliche$a[$_]
Konstruktion für eine Zwei-Byte-Verbesserung loswerden :Viel besser, aber das
$\=!print$"
sah immer noch ein bisschen wortreich aus. Ich erinnerte mich dann an eine alternative Formel gleicher Länge, die ich gefunden hatte und die die Zahl3
in keiner ihrer Zifferntransformationen enthielt . Daher sollte es möglich sein,$\=2+print
stattdessen Folgendes zu verwenden und das Ergebnis3
durch ein Leerzeichen zu ersetzen :Auch 67 Bytes, aufgrund des notwendigen Leerzeichens zwischen
print
undfor
.Aber wenn es eine Formel gäbe, die
1
nirgendwo eine verwendet, würden$\=2+print
sich$\=print
für weitere zwei Bytes Einsparungen ergeben. Selbst wenn es ein Byte länger wäre, wäre es immer noch eine Verbesserung.Wie sich herausstellt, gibt es eine solche Formel, die jedoch ein Byte länger ist als das Original, was zu einer Endbewertung von 65 Bytes führt :
Methodik
Die Frage wurde gestellt, wie man eine solche Formel finden könnte. Im Allgemeinen ist es eine Frage der Wahrscheinlichkeit, eine Zauberformel zur Verallgemeinerung eines beliebigen Datensatzes zu finden. Das heißt, Sie möchten eine Form auswählen, die mit größter Wahrscheinlichkeit zu einem ähnlichen Ergebnis wie das gewünschte führt.
Prüfung der ersten römischen Ziffern:
Es gibt eine gewisse Regelmäßigkeit zu sehen. Insbesondere von 0 bis 3 und dann wieder von 5 bis 8 wird jeder aufeinanderfolgende Term um eine Ziffer länger. Wenn wir eine Zuordnung von Ziffern zu Zahlen schaffen wollten, würden wir einen Ausdruck haben , die auch durch eine Ziffer für jeden folgenden Ausdruck in der Länge zunimmt. Eine logische Wahl ist k · 10 d, wobei d die entsprechende Ziffer ist und k eine beliebige Ganzzahlkonstante ist.
Dies funktioniert für 0-3 , aber 4 muss das Muster brechen. Was wir hier tun können, ist ein Modulo anzuheften:
k · 10 d % m , wobei m irgendwo zwischen k · 10 3 und k · 10 4 liegt . Dadurch bleibt der Bereich 0-3 unverändert, und 4 wird so geändert, dass er keine vier
I
Sekunden enthält. Wenn wir unseren Suchalgorithmus zusätzlich so einschränken, dass der modulare Rest von 5 , nennen wir es j , kleiner als m / 1000 ist , wird sichergestellt, dass wir auch eine Regelmäßigkeit von 5-8 haben . Das Ergebnis ist ungefähr so:Wie Sie sehen können, wenn wir ersetzen
0
mitI
, 0-3 und 5-8 sind alle garantiert korrekt abgebildet werden! Die Werte für 4 und 9 müssen allerdings brachial erzwungen werden. Insbesondere muss 4 eins0
und einsj
(in dieser Reihenfolge) enthalten, und 9 muss eins enthalten0
, gefolgt von einer anderen Ziffer, die an keiner anderen Stelle erscheint. Sicher gibt es eine Reihe anderer Formeln, die durch einen Zufall das gewünschte Ergebnis erzielen könnten. Einige von ihnen können sogar kürzer sein. Aber ich glaube nicht, dass es welche gibt, die genauso erfolgreich sind wie diese.Ich experimentierte auch mit mehrfachem Ersatz für
I
und / oderV
mit einigem Erfolg. Aber leider nichts kürzer als das, was ich schon hatte. Hier ist eine Liste der kürzesten Lösungen, die ich gefunden habe (die Anzahl der 1-2 Bytes schwereren Lösungen ist zu groß, um sie aufzulisten):quelle
HTML + JavaScript + CSS (137)
HTML (9)
JavaScript (101)
CSS (27)
Ausgabe
...
Demo auf JSBin
quelle
document.write('<ol>'+"<li style='list-style:upper-roman'/>".repeat(100)+'</ol>')
(ES6)document.write("<li style='list-style:upper-roman'/>".repeat(100))
Python 116
Besserer Golf-Code für die Antwort von Scleaver:
quelle
Python, 139
quelle
C
177160147 ZeichenEs gibt kürzere Lösungen, aber keine in C, also hier ist mein Versuch.
Neue Lösung, völlig anders als meine vorherige:
Vorherige Lösung (160 Zeichen):
Logik:
1.
f
Gibt eine Zahl von 1 bis 10 aus.c
Die verwendeten Ziffern könnenIVX
oder seinXLC
. Einmal für die Zehn, einmal für die Einen.2. Wenn
n%5==0
- print nichts oderc[n/5]
die istI
oderV
(oderL
oderC
).3. Wenn
n%4==4
-4
oder9
-I
(oderX
) drucken , durchn+1
.4. Wenn
n>4
- dann drucken5
(dhV
oderL
)n-5
.5. Wenn
n<4
-I
dann druckenn-1
(dhn
malI
).quelle
f(c,n){printf("%.*s",n%5>3?2:n%5+n/5,"XLXXXCIVIIIX "+c+(n%5>3?n%4*4:2-n/5));}main(i){for(;i<100;f(12,4))f(0,i/10),f(6,i++%10);puts("C");}
JavaScript, 123
Inspiriert von einer längeren Version bin ich in einer polnischen Newsgroup auf etwas gestoßen (zumindest meinte Chrome, es sei polnisch).
quelle
Q (
8180)2. Schnitt:
1. Schnitt:
quelle
Python, 168
Erläuterung
Nehmen Sie mit diesen Werten den größten Wert, der nicht größer als n ist, und subtrahieren Sie ihn von n. Wiederholen, bis n 0 ist.
quelle
r=lambda n,l,v:n and(n<v[0]and r(n,l[1:],v[1:])or l[0]+r(n-v[0],l,v))or""
speichert zwei Zeichen. Ansonsten sehr nett.Ruby 1.9,
140132Dies zählt buchstäblich von 1 bis 100 in römischen Ziffern. Beginnt mit einer leeren Zeichenfolge, fügt in einer Schleife ein "I" hinzu und wendet dann wiederholt eine Reihe von Substitutionsregeln an, wobei effektiv 1 hinzugefügt wird.
Bearbeiten: Versionsnummer hinzugefügt, da
?I
nur in 1.9 funktioniert und @ Howards Änderungen zum Trimmen einiger Zeichen verwendet wurden.quelle
r while
->0while
,r.sub!(*q)
->r.sub! *q
. Sie können den Ausdruck auch in die Schleife ziehen und100.times{...}
anstelle der Kartenanweisung verwenden.(%w[IIII VIV XXXX LXL]<</(.)((?!\1)[^I])\1/).zip(%w(IV IX XL XC)<<'\2')
Spart 7 Zeichen.Ruby 112 Zeichen
Grundsätzlich wird die hier erläuterte
to_roman
Methode verwendet , der Kürze halber wird jedoch ein gezipptes Array verwendet.quelle
Mathematica
159 150142Eingebaute Lösung :
IntegerString
38 Zeichenquelle
Perl 205
Golf gespielt:
quelle
MUMPS 184
Gleicher Algorithmus wie @cardboard_box, von dem ich die Erklärung wörtlich genommen habe -
Erläuterung
Nehmen Sie mit diesen Werten den größten Wert, der nicht größer als n ist, und subtrahieren Sie ihn von n. Wiederholen, bis n 0 ist.
quelle
R , 85 Bytes
Probieren Sie es online!
Verwendet die zufällige
utils
Paketvariable.romans
, um die Werte der römischen Ziffern abzurufen, führt jedoch die Konvertierung selbst durch. Der eingebaute Ansatz wäre 20 Bytes:cat(as.roman(1:100))
quelle
cat(paste(as.roman(1:100)))
oder einfachas.roman(1:100)
. Seltsam.cat
zeigen an, dass es weniger Konvertierung ausführt alsprint
und nur aufatomic
Vektoren funktioniert - das erklärt das!APL 128
Ich habe eine Indizierungslösung in APL ausprobiert:
Sie kann im Indexursprung 0 4 Bytes kürzer sein als in 1, aber das reale Space-Hog ist die Erzeugung der Indexmatrix über:
Bisher konnte ich die Indizes nicht on the fly generieren!
quelle
LaTeX (138)
quelle
Python, 125
quelle
PHP,
3837 Bytes<ol type=I><?=str_repeat("<li>",100);
-1 Byte dank @manatwork
Dieselbe Idee wie Patricks Antwort, jedoch in einer kompakteren Sprache. Schlägt Mathematica !
Probieren Sie es online!
quelle
;
, dann ist dies nicht erforderlich?>
.VBA (Excel), 245 Byte
Funktion für Wiederholung und Ersetzen erstellt - 91 Bytes
Function s(a,b):s=String(a,b):End Function Function b(x,y,z):b=Replace(x,y,z):End Function
mit sofortigem Fenster ( 154 Bytes )
p="I":for x=1to 100:?b(b(b(b(b(b(b(b(s(x,p),s(100,p),"C"),s(90,p),"XC"),s(50,p),"L"),s(40,p),"XL"),s(10,p),"X"),s(9,p),"IX"),s(5,p),"V"),s(4,p),"IV"):next
quelle
Java (OpenJDK 8) , 152 Byte
Probieren Sie es online!
Erläuterung:
quelle
TeX, 354 Bytes
Einige Erklärungen: TeX bietet einen eingebauten Befehl
\romannumeral
zum Konvertieren von Zahlen in römische Ziffern. Da die Frage die Verwendung integrierter Funktionen nicht zulässt, handelt es sich bei dem obigen Code um eine Golf-Version desselben Algorithmus, für den Knuths ursprünglicher TeX-Compiler verwendet\romannumeral
(siehe TeX: Das Programm , § 69,print_roman_int
) in TeX erneut implementiert hat.Da er die Freude, herauszufinden, wie dieser Code funktioniert, dem Leser überlassen möchte, weigert sich Knuth, diesen Teil des Codes zu erklären. Also folge ich dem Beispiel und gebe nur eine ungolfed und leicht modifizierte Version, die näher am Original liegt als der obige Code:
quelle