Herausforderungsbeschreibung
Wir hatten einige Probleme mit der Look-and-Say-Sequenz . Schnelle Erinnerung:
- Die Folge beginnt mit
1
, - Nachfolgende Terme dieser Sequenz werden erzeugt, indem jede Gruppe sich wiederholender Ziffern im vorhergehenden Term aufgezählt wird.
Die ersten Begriffe sind also:
1 "one"
11 "one one" (we look at the previous term)
21 "two ones"
1211 "one two, one one"
111221 "one one, one two, two ones"
312211 "three ones, two twos, one one"
Jetzt machen wir dasselbe, aber verwenden stattdessen römische Ziffern . Wir beginnen mit I
und folgen den gleichen Regeln (wir die Ziffer Zählung Regel Zeichen gelten statt, so lesen wir , IVX
wie one one, one five, one ten
anstelle von one four, one ten
oder eine andere Art und Weise):
I "one"
II "one one"
III "two ones" = "II" + "I"
IIII "three ones" = "III" + "I"
IVI "four ones" = "IV" + "I"
IIIVII "one one, one five, one one"
IIIIIVIII "three ones, one five, two ones" = ("III" + "I") + ("I" + "V") + ("II" + "I")
Bei einer positiven Ganzzahl N
entweder:
- Geben Sie die ersten
N
Ziffern dieser Sequenz aus (jedes sinnvolle Trennzeichen ist in Ordnung)["I", "II", "III", ...]
- Gibt den
N
Term dieser Sequenz aus (er kann 0-indiziert sein).
Denken Sie daran, Ihren Code so kurz wie möglich zu halten, da dies eine Code-Golf- Herausforderung ist!
EDIT: Ich glaube, dass es immer einen Standard / bevorzugten Weg gibt, Ganzzahlen als römische Ziffern auszudrücken (wie 95
-> XCV
statt VC
). Ein paar römische Umrechner, die ich online gefunden habe, bestätigen meine Meinung. Verwenden Sie im Zweifelsfall einen Online-Konverter , da die Auflistung aller möglichen Randfälle und spezifischen Regeln für das Schreiben von römischen Ziffern nicht der Punkt dieser Herausforderung ist.
EDIT2: @PeterTaylor und @GregMartin darauf hingewiesen , dass nur Zahlen kleiner oder gleich 5
in der Reihenfolge angezeigt, so dass Sie zu kümmern sich nicht um die Mehrdeutigkeit von römischen Ziffern (Zahlen 1
- 8
sind I
, II
, III
, IV
, V
, VI
, VII
, und VIII
)
quelle
4
/IV
/IIII
? Oder95
/XCV
/VC
? Es gibt möglicherweise nicht immer eine eindeutige Möglichkeit, eine Ganzzahl auszudrücken, aber ich bin mir ziemlich sicher, dass es immer eine bevorzugte (Standard-) gibt - korrigieren Sie mich, wenn ich falsch liege.Antworten:
Perl, 49 Bytes
Beinhaltet +1 für
-p
Mit dem 0-basierten Index für STDIN ausführen, z
ecce.pl
:Magische Formeln sind so magisch.
Normalerweise würde ich verwenden
($_=//)x$'
, um die Schleifensteuerung um ein Byte kürzer zu machen, aber die Bewertung auf dieser Seite ergibt ein Handicap von 2, so dass es 1 Byte länger endet. Auf älteren Perls können Sie das Leerzeichen vorher ablegenfor
. Einige Versionen von Perl erzwingen das Hinzufügen eines Finales;
, um die Transliteration zu schließen. Aber was oben angegeben ist, ist der Code, der auf meinem System funktioniert.Erläuterung
Rückwärts von der Lösung zum Code arbeiten:
Die String-Transformationen, die wir brauchen:
Jede Ersetzung endet mit dem wiederholten Zeichen. Ich werde eine Sequenz der gleichen Zeichen mit Regex erhalten
/(.)\1*/
, dies kann also durch Anhängen erfolgen$1
. Der Teil vor dem->
ist in$&
. Damit brauche ich noch:Schreiben Sie
I
als1
undV
als 9:Durch Teilen des Teils vor
->
durch die wiederholte Ziffer erhält man:Das wiederholte Original
V
ist also keine Ausnahme mehr. Deshalb möchte ich einen Ausdruck, der dies ermöglicht:Und dies kann mit einem einfachen Modulo 182 geschehen:
(das stimmt sogar
IIIIII
,VI
obwohl es hier nicht benötigt wird)Jetzt müssen Sie nur noch die Arbeitsvariable
1
für den Index 0 initialisieren , diese Transformation in einer Schleife wiederholen und am Ende1
durchI
und9
durch ersetzenV
1
,9
Und182
ist die einzige Parameter - Kombination , für die diese einfache Formel funktioniert.quelle
Mathematica,
1139083 BytesVielen Dank an Martin Ender für Vorschläge, die die Länge um über 25% reduziert haben!
Vorführen der übergeordneten Befehle in Mathematica.
Eine reine Funktion, die ein Argument N verwendet und das N-te Element dieser (0-indizierten) Sequenz als Liste von Zeichen ausgibt. Ein bisschen ausbreiten:
Die äußere
Nest
iteriert die mittlere Vierzeilenfunktion, beginnend am{"I"}
N-fachen. Zeile 4 teilt die Zeichenliste der eingegebenen römischen Zahl in Läufe gleicher Zeichen auf und zählt jeden Lauf mitTally
und setzt die Anzahl vor die Zeichen, die sie zählen. Zeile 3 rendert die Zählungen als römische Ziffern und teilt diese römischen Ziffern in Listen von Zeichen auf. DerFlatten
Befehl reduziert die gesamte Liste der Listen auf eine eindimensionale Liste.Hier ist die erste Version:
quelle
@@@
anstelle von verwenden/@
, können Sie#
und#2
anstelle von#[[1]]
und verwenden#[[2]]
. Außerdem sind Zeichenlisten akzeptable Zeichenfolgentypen, sodass Sie mit diesen arbeiten und die Verwendung vermeiden könnenCharacters@
.@@@
ähnliche Verknüpfung gegeben haben muss! In Bezug auf Listen von Zeichen, die zulässige Zeichenfolgentypen sind (was meiner Meinung nach den Code verkürzen würde): Gibt es auf dieser Website einen Beitrag, auf den Sie mich verweisen können, der die Community-Standards beschreibt?Characters
Threads, die Sie automatisch verwenden können@
,Reverse@#&
sind natürlich dasselbe wie PlainReverse
. In diesem Fall benötigen Sie diese Klammern auch nicht. Und Präfixnotation (im Fall vonFlatten
) speichert nichts, wenn Sie Klammern hinzufügen müssen, damit es funktioniert. Alles zusammen:Nest[Flatten[Characters@{RomanNumeral@#,#2}&@@@Reverse@@@Tally/@Split@#]&,{"I"},#]&
CJam (
33 -30 Byte)Online-Demo
Der Schlüssel zur Korrektheit der Implementierung ist der folgende Satz:
Bei der ersten Generation ist
I
keine Lauflänge größer als fünfLemma: Wenn die erste Generation ist
I
, enthält keine Zeichenfolge jemalsVVV
. Beweis ist durch Widerspruch. Angenommen, es gibt einen ersten Index,n
für den dien
dritte Generation enthältVVV
. Wenn das soVVV
ausfällt,(a)V VV
dann ist die Umstellung von der Vorgängergeneration schlecht: es hätte sein sollen(a+5)V
. So muss es seinVV V(d)
, und die Vorgängergeneration enthieltVVVVV
Widerspruch gegen die Wahl vonn
.Angenommen, es gibt einen ersten Index,
m
für den diem
dritte Generation enthält...IIIIII...
. Beachten Sie, dass es keine anderen Ziffern alsI
undV
in der Zeichenfolge geben kann, da keine frühere Generation einen Lauf von neunI
Sekunden oder neunV
Sekunden hatte. Allenfalls vier derI
s kommen aus einem Laufe vonI
s in der vorherige Zeichenfolge, so dass der entsprechende Abschnitt der vorherigen Zeichenfolge muss...IIIVV...
geben... IIII IIV ...
. Da dieVV
in-Generationm-1
nicht vonVVVVV
(siehe Lemma) stammt,V
muss die zweite eine Lauflänge von Ziffern seinI
, alsom-1
haben wir in der Generation...IIIVVI...
. Und da wollen wir die InitialenI
s gebenIIII
und nichtIVI
oderVI
wird entweder der Anfang der Zeichenkette oder ein vorangestelltV
.Wenn wir
(...V)?IIIVVI...
in der Generation habenm-1
, was haben wir in der Generationm-2
? Wir haben dasVV
von gen schon beobachtet .m-1
muss analysiert werden als(a)V V(I)
.Angenommen, wir nehmen
a=2
:(...V)?I IIV VI...
Eigentlich muss es sein...VI IIV VI...
, obwohl diese FührungV
ein Teil von sein könnteIV
; also in der vorigen generation haben wir entweder(...V)? IIII VV IIIII...
oder(...V)? IIIII VV IIIII
. InVVIIIII
beidenV
Fällen treten Probleme auf : Die zweite muss eine Lauflänge sein,...VI IIII...
erfordert dann jedoch ein nachfolgendes (Lauflänge, Ziffer) Paar mit derselben Ziffer.So muss es sein
a=1
:(...V)?II IV VI...
. Da die Erzeugungm
der erste mit einem Lauf von sechs istI
s, sein , dass muss(...V)? II IV VI...
, so dass die Erzeugungm-2
ist(...V)? I V IIIII...
....VIVIIIII...
ist unmöglich: Wir interpretieren jedoch die Sekunde, in derV
wir zwei aufeinanderfolgende (Lauflängen-, Ziffern-) Paare mit derselben Ziffer haben.Daher
m-2
muss die Generierung^IVIIIII...
als^IV IIII I(V)...
oder analysiert werden^IV III II(V)...
. Diese geben jeweils Erzeugungm-3
als^V III V ...
oder^V II VV...
.Wenn wir uns jedoch den Anfang der Zeichenfolgen ansehen, der mit der ersten beginnt
V
, erhalten wir einen Zyklus:und so beginnt keine Generation jemals mit entweder
VIIIV
oderVIIVV
. Wir müssen daraus schließen, dass es keine solche gibtm
.Präparation
quelle
Python 3, 195 Bytes
Die römischen Ziffern sind mit einer Menge Bytes belegt, so dass dort wahrscheinlich etwas Golf gespielt werden muss.
Vielen Dank an @ El'endiaStarman, @ Sherlock9 und @Shooqie
Ideone es!
quelle
for v,i in(5,"V"),(4,"IV"),(1,"I")
for v,i in(5,"V"),(4,"IV"),(1,"I"):a,x=divmod(x,v);r+=i*a
Speichert ein Byte.i
(wie infor i in range(...)
) nicht zu verwenden. Ich habe versucht, mich damit zu beschäftigen,exec
aber dies, das1
in der 'sub'-Methode ausgeblendet wurde, scheint den Code durcheinander zu bringen. Ich konnte keine Problemumgehung finden.range
R
110107 Bytesas.roman
kombiniert mitrle
macht dies einfach. Scoping-Missbrauch und eingebautes Katzenverhalten<<-
sparen ein paar Bytes.N wird von der Konsole eingezogen. Gibt die ersten 2 bis N Terme der Sequenz aus (von denen ich glaube, dass sie innerhalb der Spezifikation liegen ...)
quelle
JavaScript (ES6), 107
Rekursive Funktion, die den N-ten Term basierend auf 0 zurückgibt
Prüfung
quelle
Perl 6 , 62 Bytes
Anonyme Funktion, die einen nullbasierten Index akzeptiert.
Nutzt die Tatsache, dass römische Zahlen über 5 nicht benötigt werden, da nur folgende Gruppen von sich wiederholenden Ziffern vorkommen können:
( online ausprobieren )
quelle