Anerkennung
Mein Dank geht an Rand Al'Thor's Brief-basierte Frage für die Inspiration für diese Code-Golf-Herausforderung.
Hintergrund
Die Art dieser Herausforderung basiert auf dem Algorithmus, den Rand in seinem "Ein aus drei Buchstaben gebildetes Dreieck" erwähnt hat:
- Beginnen Sie mit einer Folge von 10 Buchstaben, von denen jeder X, Y oder Z ist.
- Konstruieren Sie unter jeder Zeile die nächste Zeile wie folgt. Wenn zwei benachbarte Buchstaben gleich sind, schreiben Sie denselben Buchstaben darunter. Wenn sie unterschiedlich sind, schreiben Sie den dritten Buchstaben darunter.
Sie würden dann den vorherigen Schritt wiederholen, bis Sie einen Buchstaben in Ihrer zehnten Zeile haben.
Herausforderung
Wir werden dem obigen Algorithmus eine mathematische Wendung geben:
- Beginnen wir mit einer Folge von 10 Ziffern, die jeweils durch ein Leerzeichen getrennt sind und jeweils 1, 2 oder 3 sind.
- Konstruieren Sie unter jeder Zeile die nächste Zeile wie folgt. Wenn zwei benachbarte Ziffern identisch sind, schreiben Sie dieselbe Ziffer darunter. Wenn sie unterschiedlich sind, schreiben Sie die dritte Ziffer darunter.
- Wiederholen Sie den vorherigen Schritt, bis Sie eine endgültige Nummer haben.
Wenn Sie also nach diesem Algorithmus mit der Zeile beginnen 1 2 3 3 1 3 1 3 1 2
, wird beispielsweise das folgende Dreieck generiert:
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1 2 3 3 1 3 1 3 1 2
3 1 3 2 2 2 2 2 3
2 2 1 2 2 2 2 1
2 3 3 2 2 2 3
1 3 1 2 2 1
2 2 3 2 3
2 1 1 1
3 1 1
2 1
3
Ich bin auch neugierig, die Summe aller Ziffern im Zahlendreieck zu kennen. Addieren Sie also alle diese Ziffern und setzen Sie diese Summe in eine elfte Zeile, rechtsbündig zur letzten Ziffer in der ersten Zeile. Unser Zahlendreieck sieht also ungefähr so aus (Leerzeichen in meinem Beispiel werden unten durch das .
Zeichen dargestellt, um die Formatierung anzuzeigen.)
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109
Ihre Herausforderung besteht darin, Code zu schreiben, der mit einem eingegebenen String / Array / etc. Beginnen kann. aus zehn Ziffern gemäß meinem Beispiel, und wenden Sie dann den Algorithmus an, um die zehn Zeilen zu generieren, die das Zahlendreieck erstellen würden, gefolgt von einer elften Zeile, in der die Summe aller Ziffern mit der richtigen Begründung angezeigt wird.
Testen
Das Testen dieser Zeichenfolge kann mit einer zufällig generierten Zeichenfolge mit zehn Ziffern Ihrer Wahl oder einer aus dem folgenden Snippet generierten Zeichenfolge durchgeführt werden ...
c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");
$("#btn").click(function(){
$("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.
Regeln
- Es gelten die Code-Golf-Regeln, sodass die niedrigste Anzahl von Bytes die Herausforderung gewinnt. Bei zwei Einsendungen mit derselben niedrigen Punktzahl wird der Gewinner anhand der Anzahl der Up-Votes vergeben.
- Was wir im Grunde suchen, sind 11 Zeilen, 19 Zeichen lang ... Wie Sie Ihre endgültige Ausgabe rendern, liegt ganz bei Ihnen: Array, Konsole, Dateiausgabe, STDOUT usw. Verwenden Sie also bitte eine beliebige Ausgabemethode arbeiten zu Ihrem Vorteil. Die einzige Regel in der Ausgabe ist, dass wir 11 Zeilen mit 19 Zeichen in jeder Zeile in einem ähnlichen Format wie oben haben ...
- Wenn es Ihrem Code hilft, verwenden Sie ein beliebiges Trennzeichen für die Ziffern ... Denken Sie daran, dass die Lesbarkeit möglicherweise einen Beitrag dazu leistet.
- Keine dummen Lücken .
- Eine Hardcodierung der Eingabe ist nicht zulässig. Der Zweck dieses Codes besteht darin, dass er verwendet werden kann, um jedes Mal unterschiedliche Ergebnisse mit unterschiedlichen Eingaben zu erzielen. Die Hardcodierung von
1 1 1 1 1 1 1 1 1 1
beispielsweise negiert den gesamten Punkt des Algorithmus vollständig.
Freuen Sie sich darauf zu sehen, was Sie sich alles einfallen lassen können!
Antworten:
05AB1E ,
3226 BytesErläuterung
Probieren Sie es online aus!
quelle
Mathematica,
104979094 BytesErläuterung
Partitioniert die Eingabe in Partitionen der Länge 2 und versetzt 1.
Nimmt jede Partition und berechnet die entsprechende Ausgabe.
Ein Trick, um den es hier geht. Ich addierte die beiden Zahlen, nahm Mod 3 und subtrahierte das Ergebnis von 3. Das ergibt die gewünschte Zahl. (zB 3 - ((2 + 1) mod 3) = 3)
Wiederholt den obigen Vorgang neunmal und gibt alle Iterationen als Ausgabe an.
Formatieren Sie jede Iteration in Zeilen und platzieren Sie das gesamte Objekt in einer Spalte (mittig ausgerichtet), um ein Dreieck zu erstellen.
Nehmen Sie die Summe aller Zahlen.
Kombinieren Sie das Dreieck und die Summe und richten Sie das gesamte Objekt nach rechts aus (das Dreieck ist bereits ausgerichtet, sodass seine Ausrichtung nicht beeinträchtigt wird).
quelle
JavaScript (ES6),
143142 Byte1 Byte dank @Neil gespeichert
Ich habe versucht, verschiedene Teile zu kombinieren, aber es dauerte 5 Bytes länger:
quelle
3-((x+y)%3)
hilfreich sein, diesen Code zu reduzieren?p^c||p
ist schon ein bisschen kürzer :-)i?p^(p=c)||p:c
können Sie verwendeni&&p^(p=c)||c
?Ruby,
134101 BytesMit dem Modulo-Trick von JHM.
Siehe es auf eval.in: https://eval.in/649993
quelle
CJam ,
4440 BytesProbieren Sie es online aus!
Erläuterung
quelle
Python 2, 164 Bytes
Eine relativ einfache iterative Lösung.
Probieren Sie es online aus
quelle
PHP, 143 Bytes
quelle
JavaScript (ES6),
11210096 ByteNimmt ein Array als Eingabe und erstellt rekursiv ein durch Kommas getrenntes Dreieck.
quelle