Eine Zeichenfolge, deren Länge eine positive Dreieckszahl ist (1, 3, 6, 10, 15 ...), kann zu einem "gleichseitigen Textdreieck" angeordnet werden, indem Leerzeichen und Zeilenumbrüche hinzugefügt werden (und die Lesereihenfolge beibehalten wird).
Beispielsweise wird die Zeichenfolge mit der Länge 10 ABCDEFGHIJ
zu:
A
B C
D E F
G H I J
Schreiben Sie ein Programm oder eine Funktion, die eine solche Zeichenfolge akzeptiert, mit der Ausnahme, dass sie nur die Zeichen 0
und enthält 1
. (Sie können davon ausgehen, dass die Eingabe gültig ist.)
Geben Sie für das resultierende "gleichseitige Textdreieck" eine der vier Zahlen aus (Drucken oder Zurückgeben), die den Typ der gezeigten Symmetrie angibt:
Ausgabe,
2
wenn das Dreieck bilateral symmetrisch ist. dh es hat eine Symmetrielinie von einer Ecke zum Mittelpunkt der gegenüberliegenden Seite.Beispiele:
0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1 1 1
Ausgabe,
3
wenn das Dreieck rotationssymmetrisch ist. dh es könnte ohne optische Veränderung um 120 ° gedreht werden.Beispiele:
0 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1
Ausgabe,
6
wenn das Dreieck sowohl bilateral als auch rotationssymmetrisch ist. dh es entspricht den Bedingungen für die Ausgabe von sowohl2
und3
.Beispiele:
0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0
Ausgabe,
1
wenn das Dreieck weder bilateral noch rotationssymmetrisch ist.Beispiele:
1 1 0 0 0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist frühere Antwort.
Abgesehen von einer optionalen nachgestellten Newline darf die Eingabezeichenfolge keine Leerzeichen / Newline-Auffüllung oder -Struktur aufweisen - es sollte sich um ein einfaches 0
und ein einfaches Zeichen handeln 1
.
Falls gewünscht, können Sie anstelle von und zwei verschiedene druckbare ASCII- Zeichen verwenden .0
1
Testfälle
Direkt aus Beispielen entnommen.
011 -> 2
101 -> 2
001010 -> 2
1111010111 -> 2
0100110100 -> 3
0011000010 -> 3
101111111010111 -> 3
101001100010000100111 -> 3
0 -> 6
1 -> 6
000 -> 6
100101 -> 6
0000100000 -> 6
110000 -> 1
001101 -> 1
1101111111 -> 1
111111000111111 -> 1
Wenn Sie einen Eingang um 120 ° drehen, erhalten Sie natürlich den gleichen Ausgang.
Antworten:
CJam,
37292827 BytesDanke an Sp3000 für das Speichern von 3 Bytes.
Testsuite.
Dadurch werden einige Tricks der Dreiecksrotation aus dieser Herausforderung wiederverwendet .
Dies funktioniert auch für die gleiche Byteanzahl:
Erläuterung
Zuerst ein kurzer Rückblick auf den Dreieckspfosten, den ich oben verlinkt habe. Wir stellen ein Dreieck als zweidimensionale (zerlumpte) Liste dar, z
Die Symmetriegruppe des Dreiecks besteht aus 6 Elementen. Es gibt Zyklen der Länge 3 durch Drehen des Dreiecks und Zyklen der Länge 2 durch Spiegeln entlang einer Achse. Zweckmäßigerweise entsprechen die Drehungen zwei unterschiedlichen Reflexionen. Wir werden dazu folgende Überlegungen anstellen:
Transponieren Sie die Liste, indem Sie sie entlang der Hauptdiagonale spiegeln. So erhalten Sie:
Das Umkehren jeder Reihe stellt eine Reflexion dar, die die oberen beiden Ecken vertauscht. Wenn wir dies auf das Ergebnis der Umsetzung anwenden, erhalten wir:
Mit diesen beiden Transformationen und unter Beibehaltung des Zwischenergebnisses können wir alle sechs Symmetrien der Eingabe erzeugen.
Ein weiterer wichtiger Punkt ist das Umsetzungsverhalten auf einer Liste wie dieser:
Denn das ist, was wir am Ende haben, nachdem wir die Eingabe aufgeteilt haben. Praktischerweise werden nach dem Transponieren von CJam alle Zeilen nach links gespült, was bedeutet, dass das Fremde tatsächlich entfernt
[]
und in eine Form gebracht wird, die für die obigen beiden Transformationen nützlich ist (alles ohne das tatsächliche Layout des Dreiecks über die Reflexionssymmetrie hinaus zu ändern):Nach alledem ist hier der Code:
quelle