Fassen Sie es wirklich zusammen.
Schreiben Sie ein Programm oder eine Funktion, die eine nicht leere Liste von Dezimalzahlen (0-9) aufnimmt und ein nach unten zeigendes "Dreieck" von Ziffern mit der Eingabeliste oben ausgibt, wobei jede Ziffer nach der ersten Zeile die Summe der beiden Ziffern ist darüber modulo 10.
Beispielsweise hat die Eingabe [7, 5, 0, 9]
eine Ausgabe
7 5 0 9
2 5 9
7 4
1
denn 2
ist (7 + 5) mod 10
, 5
ist (5 + 0) mod 10
, 9
ist (0 + 9) mod 10
, etc. bis zum 1
Sein (7 + 4) mod 10
.
Wenn die Liste nur einen Eintrag enthält, stimmt die Ausgabe mit der Eingabe überein. zB eine Eingabe von [4]
wird ergeben
4
Hier sind einige zusätzliche Beispiele:
[0]
0
[1, 2]
1 2
3
[8, 7]
8 7
5
[0, 0]
0 0
0
[1, 4, 2]
1 4 2
5 6
1
[0, 1, 0]
0 1 0
1 1
2
[1, 0, 0, 0]
1 0 0 0
1 0 0
1 0
1
[1, 2, 3, 4]
1 2 3 4
3 5 7
8 2
0
[1, 2, 3, 5, 8]
1 2 3 5 8
3 5 8 3
8 3 1
1 4
5
[9, 2, 4, 5, 3, 2, 2]
9 2 4 5 3 2 2
1 6 9 8 5 4
7 5 7 3 9
2 2 0 2
4 2 2
6 4
0
Beachten Sie, dass in der Ausgabe:
- Die erste Zeile enthält keine führenden Leerzeichen.
- Jede nachfolgende Zeile enthält ein Leerzeichen mehr als die vorherige Zeile.
- Ziffern werden durch ein einzelnes Leerzeichen getrennt.
- Jede Zeile darf maximal ein Leerzeichen enthalten.
- Es kann eine einzelne optionale nachgestellte Newline geben.
- Sie müssen die Zeichen für normale Dezimalstellen (0 bis 9) verwenden.
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist frühere Antwort.
Antworten:
BrainF ** k,
396391 BytesIch konnte der Versuchung nicht widerstehen, dies zu tun. Zumindest ist das Dreieck spitz nach unten.
Die Eingabe erfolgt in Form einer Folge von numerischen Zeichen, gefolgt von einer einzelnen neuen Zeile.
Die Ausgabe enthält in jeder Zeile ein einzelnes Leerzeichen.
Beispiele:
Erläuterung
Da es ziemlich schwierig ist, den Code aus funktionaler Sicht zu erklären, können wir ihn stattdessen zu verschiedenen Zeiten aus der Perspektive des Bandzustands betrachten. Die Kernidee dabei ist, dass das von uns ausgegebene Dreieck als dicht gepacktes Array (jedenfalls für BF) initialisiert wird, dessen Größe bei jeder Iteration einer Schleife um 1 verringert wird. Ein weiterer wichtiger Gedanke ist, dass wir
255
einen "Platzhalter" angeben, nach dem wir auf dem Band suchen können.Initialisierung
Dies ist der einfachste Schritt. Zu Beginn des Programms führen wir Folgendes aus:
Dadurch wird das Band in den folgenden Zustand versetzt (wobei
>N<
die Position des Zeigers auf dem Band angegeben wird).Die erste Zahl ist hier ein "Puffer" -Standort. Wir werden es nicht langfristig verwenden, aber es ist nützlich, um kleine Operationen zu vereinfachen und Daten zu kopieren.
Die zweite Zahl gibt die Anzahl der Leerzeichen an, die am Anfang jeder Zeile ausgegeben werden, beginnend nach der ersten Zeile. Die erste Zeile enthält keine führenden Leerzeichen.
Die dritte Zahl ist das von uns ausgegebene Leerzeichen.
Die vierte Zahl ist ein Platzhalter 255, so dass wir relativ leicht zu dieser Position zurückkehren können.
Eingang
Von dieser Position aus werden wir alle Zeichen einlesen. Am Ende dieses Schritts hoffen wir, in der folgenden Situation zu sein:
Wobei
a b c d e f ...
die eingegebene numerische Zeichenfolge angibt (nicht die Newline).Dies erreichen wir mit:
Das hat einige Nuancen. Zunächst geben wir jedes Zeichen so aus, wie wir es erhalten, und geben danach ein Leerzeichen aus. Zweitens möchten wir den ASCII-Wert nicht auf das Band kopieren, sondern die tatsächliche numerische Ziffer. Drittens möchten wir aufhören, wenn wir eine neue Zeile treffen, und uns zu dieser Zeit an einem guten Ort zurücklassen.
Sagen wir, unser Input ist
6723
. Beim ersten Lesen6
sieht unser Band dann so aus:Wir überprüfen, dass dieser Wert nicht gleich
10
(eine ASCII-Newline) mit ist,----------[++++++++++
. Wir drucken dann den Wert aus und fahren fort, indem wir gleichzeitig 48 vom Eingabewert subtrahieren und 32 zum Wert daneben addieren (>>++++++++[-<++++<------>>]<
). So bleiben wir hier:Beachten Sie, dass wir während dieses Vorgangs davon ausgehen können, dass alle Ziffern rechts von unserer Eingabe 0 sind. Dies bedeutet, dass wir nicht in Gefahr sind, einen vorherigen Zustand zu ruinieren, wenn wir Werte rechts von
6 * 8
und verwenden4 * 8
.Jetzt geben wir das soeben erzeugte Leerzeichen aus und nehmen eine neue Eingabe vor, wobei wir das dort berechnete Leerzeichen löschen. Schließlich wird die Eingabe durch eine neue Zeile beendet und die Schleife wird beendet, wobei eine Stelle verbleibt,
255
an der sich die neue Zeile befunden hätte (,----------]-
). Dies ist das zweite Platzhalterzeichen, mit dem wir durch das Band navigieren. An diesem Punkt in unserem Szenario ist unser Band genau das:Berechnung
Auf diese Weise wird die Liste der Ziffern zwischen unseren
255
Platzhaltern bei jeder Wiederholung der Schleife um eins verkleinert. Wenn nur noch eine Ziffer übrig ist, sind wir fertig und sollten sofort anhalten. (Beachten Sie, dass zu diesem Zeitpunkt jede Ziffer in dieser Liste bereits ausgegeben wurde, sodass wir uns nicht mehr darum kümmern müssen, sie erneut auszugeben.)Wir verwenden nun diesen Trick navigate auf den ersten
255
Platzhalter:<+[-<+]-
. Dadurch wird das Band auf der linken Seite effektiv nach a durchsucht255
und nichts dazwischen geändert. Nachdem wir den Zeiger bewegt haben, können wir unsere Ausgangsbedingung überprüfen: Wenn die Liste nur eine Ziffer enthält, wird die Zelle mit den zwei Leerzeichen rechts angezeigt255
. Also prüfen wir das und starten eine Schleife:>>+[-<<
Der erste Schritt in unserer Schleife ist die Ausgabe einer neuen Zeile. Also gehen wir zur ersten Zelle (unserer Pufferzelle), addieren 10 und geben sie aus. Der nächste Schritt ist die Ausgabe aller führenden Leerzeichen. Nach der Ausgabe erhöhen wir unsere Anzahl für die Anzahl der führenden Leerzeichen. Diese Schritte werden folgendermaßen ausgeführt:
Was uns in diesem Zustand lässt:
Der nächste Schritt besteht darin, den ersten Wert in der Liste nach dem zweiten Platzhalter zu kopieren
255
:Wir tun dies im Wesentlichen
255
, indem wir zwischen unseren Platzhaltern hin und her springen und uns hier zurücklassen:Wir starten jetzt eine Schleife, die den Rest der Liste durchläuft und anhält, wenn wir Folgendes erreichen
255
:>+[-<
Zu diesem Zeitpunkt ist die Ziffer links von uns immer 0. Da wir sie also lieben, fügen wir dort einen Platzhalter
255
ein, damit wir zu unserem Platz in der Liste zurückkehren können. Der nächste Schritt besteht darin, den zweiten Platz in der Liste hinter den zweiten Platzhalter zu verschieben255
. Diese Schritte werden folgendermaßen ausgeführt:Lassen Sie uns hier:
[ 0 2 32 255 255 >0< 2 3 255 7 6 7 0 ]
Nun wurden sowohl das6
als7
auch an einen Ort verschoben, an dem die Berechnung erfolgen kann. Wir benötigen zwei Kopien der,7
da die nächste Nummer in der Liste diese ebenfalls benötigt. Das7
unmittelbar nach dem255
dient diesem Zweck, während das andere7
von der Berechnung verbraucht wird.Zuerst addieren wir die beiden Ziffern:
Verlassen uns hier:
Die nächste Kombination von Schritten ist die komplizierteste. Wir müssen sehen, ob die Zahl, auf die wir zeigen, größer als 10 ist, und wenn ja, subtrahieren wir
10
. In Wirklichkeit subtrahieren wir 10 davon und sehen, ob es0
an einem beliebigen Punkt der Subtraktion anschlägt. In diesem Fall werden wir10
später darauf zurückkommen. Am Ende sollten wir die Summe modulo 10 haben.Zu diesem Zeitpunkt haben wir das Ziel erreicht. Wir haben die Summe Modulo 10! Unabhängig davon, ob die Zahl größer als 10 war oder nicht, landen wir hier:
Unser nächstes Ziel ist es, diese neue Summe auszugeben, mit einem Leerzeichen zu versehen und sie wieder in unsere Liste aufzunehmen. Wir machen das alles mit unseren bisherigen Techniken des
255
-Hoppens und Addierens48
zu unserer Summe, deshalb werde ich nicht im Detail darauf eingehen.Und wir sind hier:
[ 0 2 32 255 3 255 2 3 255 7 0 0 51 >32< ]
Beachten Sie, wie wir nach dem Einfügen einen zusätzlichen255
Platzhalter einfügen,3
damit wir keinen Platz in der Liste verlieren. Zu diesem Zeitpunkt haben wir unsere Summe und ihren Platz ausgegeben, daher müssen wir aufräumen und zu einem Zustand zurückkehren, in dem die nächste Iteration dieser Schleife funktionieren wird. Wir müssen unsere Zellen51
und löschen32
, die eine7
nach rechts bewegen und zu unserem Listenplatzhalter navigieren, damit wir von vorne beginnen können.Jetzt sind wir hier:
[ 0 2 32 255 3 >0< 2 3 255 0 7 0 ... ]
Welches ist genau das, wo wir für unsere nächste Iteration sein wollen. Also nach 255 suchen und weitermachen! (
>+]
)Wenn wir von der Schleife genommen werden, haben wir eine ganz neue Liste - bestehend aus den Summen der vorherigen Liste. Das erste Mal sieht es so aus:
Jetzt wollen wir diesen ganzen Vorgang auf unserer neuen Liste wiederholen, also werfen wir einen Schritt
255
nach links und beginnen von vorne ! Wir müssen ein bisschen aufräumen>>[-]<<
und dann unseren Platzhalter mit löschen<-
. Danach befinden wir uns genau an der gleichen Stelle wie nach der Eingabe, sodass wir die gleichen Überprüfungen durchführen können:,<+[-<+]->>+
und boom! Wir haben unsere volle Schleife! Alles , was wir brauchen , ist der Schließbügel und wann es endet wir haben schon alles ausgeben, so sind wir fertig:]
.quelle
Jelly ,
201918 BytesProbieren Sie es online!
Hintergrund
Das Generieren der Zahlen ist in Jelly ganz einfach. Die Ausgabe ist etwas komplizierter.
Jelly verfügt über ein eingebautes
G
Gitteratom ( ), das eine 2D-Liste mit Zeilenumbrüchen und Spaltenabständen anzeigt. Wir nehmen das 2D-Array von Zahlen (generiert mit jeder Zeile umgekehrt) und transponieren es mit dem Füllwert@
. Wenn Sie das resultierende Array verehren und erneut transponieren, erhalten Sie bei der AnwendungG
die folgenden Ergebnisse .Um die gewünschte Dreiecksform zu erhalten, müssen wir nur den Füllwert entfernen.
Wie es funktioniert
quelle
Pyth - 18 Bytes
Test Suite .
quelle
Python 3.5,
747271 BytesDie Eingabe ist eine Liste von ganzen Zahlen (z. B.
f([1,2,3,5,8])
), die Ausgabe erfolgt nach STDOUT. Das%10
und die Tatsache, dassmap
einmap
Objekt in Python 3 zurückgegeben wird, ist ein bisschen ärgerlich, was bedeutet, dass wir es nicht könnenmap(lambda*x:sum(x)%10,L,L[1:])
oder ähnliches.Die Funktion ist fehlerfrei, aber bis dahin wäre die Ausgabe abgeschlossen. Vielen Dank an @xsot für -1 Byte
print
.quelle
f=lambda L,*S:f([sum(x)%10for x in zip(L,L[1:print(*S,*L)]or 1)],'',*S)
None
!print
etwas zurück? Ich kenne dieprint
zurückkommende Funktion nicht.print
Funktion kehrt zurück - ja, sie kehrtNone
nach Abschluss zurückNone
Schneiden?05AB1E ,
201917 BytesCode:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
MATL,
3230292827262524 Bytes1 Byte gespart dank @Luis
Probieren Sie es online!
Geänderte Version für alle Testfälle
Erläuterung
quelle
V
erlaubt Formatangabe. Sie können 1 Byte speichern mitZ"
anstelle vonO
: siehe diesen Link (ich habe Probleme mit dem Format im Kommentar)D
der standardmäßig ein Leerzeichen zwischen Zahlen verwendet wird.Eigentlich 43 Bytes
Probieren Sie es online!
Dieses Programm gibt nach der Ausgabe eine einzelne nachgestellte Zeile aus.
Erläuterung:
quelle
Mathematica, 67 Bytes
Beispiel:
quelle
CJam, 25 Bytes
Probieren Sie es online!
Erläuterung
Dies verwendet einen ziemlich ordentlichen Trick, um das Dreieckslayout zu erzeugen.
quelle
JavaScript (ES6) 147 Byte
quelle
Julia,
6059 BytesBasierend auf der Antwort von @ Sp3000 . Die Funktion
\
akzeptiert ein Array als Eingabe und gibt eine Zeichenfolge zurück.Probieren Sie es online!
quelle
Pyke, 21 Bytes
Probieren Sie es hier aus!
Ich würde gerne denken, dass diese Methode ein bisschen anders ist.
quelle
Perl 6 ,
65 63 6261 BytesErläuterung:
Beispiel:
quelle
TSQL,
198,194191 BytesDurch die Verwendung von GOTO anstelle von WHILE konnte ich 3 Charaktere spielen
Golf gespielt
Probieren Sie es online aus (mit altem Skript mit 2 * WHILE)
quelle
Java 7,
230215213 BytesDies endete ein bisschen länger als ich dachte. Vielleicht kann es ein bisschen mehr golfen werden, da ich ein bisschen durcheinander bin, denke ich.
Einige Bytes gespeichert dank @GiacomoGarabello gespeichert .
Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
void p(String s){System.out.print(s);}
und ersetzen Sie den Standarddruck. Für dieprintln
Verwendungp("\n")
. Bewegen Sie dasint i
undint j
in die Nähe desint c=0;
(int c=0,i,j;
) und bewegen Sie dasprint(a[i]+" ")
Innere desfor
Zustands, so dass Sie die Halterungen für insgesamt -11 entfernen können.<T>void p(T s){System.out.print(s);}
stattvoid p(String s){System.out.print(s);}
.C # 6,
125 + 31125 + 18 = 143 BytesDie +18 ist für
using System.Linq;
Vielen Dank an @TheLethalCoder für die Einsparung von 13 Bytes, indem auf eine unnötige using-Anweisung hingewiesen wird
quelle
JavaScript (ES6), 77 Byte
quelle
C 138 Bytes
Golf gespielt
Ungolfed
quelle
C #, 167 Bytes
Ich bin eigentlich ziemlich stolz auf diese Lösung, Lambda-Ausdrücke machen so viel Spaß, wenn man sie erst einmal verstanden hat
Hier ungolfed für weitere Verbesserungen:
Probieren Sie es hier aus
quelle
List<int> a
->int[] a
,int x=a.Count
->int x=a.Length
,.ToList()
->ToArray()
Haskell, 139 Bytes
Nimmt Eingaben als Argument und gibt sie an STDOUT aus.
Ungolfed-Version:
quelle
Python 3, 97 Bytes
Gibt eine einzelne nachgestellte Zeile aus.
Wie es funktioniert
Probieren Sie es auf Ideone
quelle
J, 44 Bytes
Basierend auf dieser Lösung .
quelle
Javascript (mit externer Bibliothek) (198 Bytes)
Link zu lib: https://github.com/mvegh1/Enumerable/
Code Erklärung: Dies war einfach mit der Bibliothek! Gewinnt nicht in Bytes, aber der Code ist nicht zu ausführlich und leicht zu lesen. Die Eingabe "n" ist also ein Array von Ganzzahlen. Laden Sie sie in die Bibliothek, gespeichert in der Variablen "a". "B" ist die Rückgabezeichenfolge. Speichern Sie die verknüpfte Zeichenfolge mit "" als Trennzeichen in b. C ist die Aktuelle Iteration: Verwenden Sie diese Option, um die Anzahl der einzufügenden Leerzeichen zu bestimmen. HINWEIS: Dies scheint nur dann gut zu funktionieren, wenn die Eingabe von 0 bis 9 erfolgt. Wiederholen Sie dann, während true, einen bestimmten Satz von Code Mengen der aktuellen Aufzählung "a", dh wenn wir [1,2,3,4,5,6] haben, erhalten wir [1,2], [2,3], [3,4], ... [ 6] ... dann filtern wir das so, dass wir nur die Chargen der Größe 2 haben. Dann ordnen wir das einer Sammlung der Summen der Chargen% 10 zu. Wenn a leer ist, sind wir fertig, Ansonsten fügen wir die neue Zeile unserer Rückkehr hinzu. Endlich zurück ...
Bild kommt in ein paar min.
quelle