Schreiben Sie ein Programm oder eine Funktion, die eine Zeichenfolge enthält, die mit Ausnahme des Leerzeichens garantiert nur druckbare ASCII- Zeichen enthält und eine positive dreieckige Zahl (1, 3, 6, 10, 15, ...) ist.
Die gleiche Zeichenfolge drucken oder zurückgeben, jedoch mit Leerzeichen zu einem Dreieck geformt. Einige Beispiele zeigen am besten, was ich meine:
Wenn der Eingang ist, R
ist der Ausgang
R
Wenn der Eingang ist, cat
ist der Ausgang
c
a t
Wenn der Eingang ist, monk3y
ist der Ausgang
m
o n
k 3 y
Wenn der Eingang ist, meanIngfu1
ist der Ausgang
m
e a
n I n
g f u 1
Wenn der Eingang ist, ^/\/|\/[]\
ist der Ausgang
^
/ \
/ | \
/ [ ] \
Wenn der Eingang ist
Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?
dann wird die Ausgabe sein
T
h i
s r u
n o f c
h a r a c
t e r s i s
m e a n t t o
h a v e a l e n
g t h t h a t c a
n b e e x p r e s s
e d a s a t r i a n g
u l a r n u m b e r . D
i d i t w o r k ? Y o u t
e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?
Grundsätzlich werden zwischen den dreieckigen Teilzeichenfolgen Zeilenumbrüche eingefügt, zwischen allen Zeichen Leerzeichen eingefügt und jede Zeile mit Leerzeichen eingerückt, um der Dreieckform zu entsprechen.
Eine einzelne nachgestellte Zeile und Zeilen mit nachgestellten Leerzeichen sind optional zulässig, ansonsten sollte Ihre Ausgabe genau mit diesen Beispielen übereinstimmen. Die letzte Zeile des Dreiecks sollte keine führenden Leerzeichen enthalten.
Der kürzeste Code in Bytes gewinnt.
Antworten:
Pyth, 22 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
quelle
Python, 81 Bytes
Eine rekursive Funktion. Geht vom Ende ab
s
, hackt ab und druckt Zeichen. Die Anzahl der zu verwendenden Zeichen wird aus der Länge von berechnets
. Die Funktion ist so eingerichtet, dass in umgekehrter Reihenfolge der rekursiven Aufrufe gedruckt wird, die enden, wenn sies
leer sind, und dann die Sicherungskopie der Zeile auflösen. Für jede Ebene wird dem Präfixp
ein zusätzlicher Speicherplatz hinzugefügt.In Python 3
if
kann dies durch Kurzschließen geschehen, obwohl dies keine Zeichen zu sparen scheint:Eine ebenso lange Alternative mit Verkettung von Ungleichungen:
Beide
print
undf
zurückNone
, was schwer zu bedienen ist.quelle
Retina ,
1081029487826463 BytesVielen Dank an Sp3000, der mich dazu gebracht hat, meinen ursprünglichen Ansatz zu verfolgen, bei dem die Byteanzahl von 108 auf 82 gesenkt wurde.
Ein großes Dankeschön an Kobi, der eine viel elegantere Lösung gefunden hat, mit der ich zusätzlich noch 19 Bytes einsparen konnte.
Wobei
<space>
ein einzelnes Leerzeichen darstellt (das sonst von SE entfernt würde). Zu Zählzwecken wird jede Zeile in eine separate Datei geschrieben und\n
sollte durch ein tatsächliches Zeilenvorschubzeichen ersetzt werden. Der Einfachheit halber können Sie den Code so ausführen, wie er aus einer einzelnen Datei mit dem-s
Flag stammt.Probieren Sie es online aus.
Erläuterung
Naja ... wie immer kann ich hier keine vollständige Einführung in die Bilanzkreise geben. Für einen Primer siehe meine Stack Overflow Antwort .
Die erste Stufe ist eine
S
Plitstufe, die die Eingabe in Zeilen mit zunehmender Länge aufteilt. Das_
bedeutet, dass leere Chunks von der Aufteilung ausgeschlossen werden sollten (dies wirkt sich nur auf das Ende aus, da an der letzten Position eine Übereinstimmung vorliegt). Die Regex selbst ist vollständig in einem Look-Around enthalten, sodass keine Zeichen, sondern nur Positionen gefunden werden.Dieser Teil basiert auf der Lösung von Kobi mit einer zusätzlichen Golfstärke, die ich selbst gefunden habe. Beachten Sie, dass Lookbehinds in .NET von rechts nach links übereinstimmen. Daher sollte die folgende Erklärung am besten von unten nach oben gelesen werden. Ich habe
\G
der Klarheit halber auch eine andere in die Erklärung eingefügt , obwohl dies nicht erforderlich ist, damit das Muster funktioniert.Ich bewundere immer noch Kobis Arbeit hier. Dies ist noch eleganter als der Prime Testing Regex. :)
Fahren wir mit der nächsten Stufe fort:
Ganz einfach: Fügen Sie nach jedem Zeichen ohne Zeilenvorschub ein Leerzeichen ein.
In dieser letzten Phase werden alle Linien korrekt eingerückt, um das Dreieck zu bilden. Dies
m
ist nur der übliche mehrzeilige Modus, um eine^
Übereinstimmung mit dem Zeilenanfang herzustellen . Das+
weist Retina an, diesen Schritt zu wiederholen, bis sich die Zeichenfolge nicht mehr ändert (was in diesem Fall bedeutet, dass die Regex nicht mehr übereinstimmt).Dies entspricht also dem Anfang einer Zeile, die keinen größeren Einzug als die nächste hat. In einer solchen Position fügen wir ein Leerzeichen ein. Dieser Vorgang wird beendet, sobald die Zeilen in einem ordentlichen Dreieck angeordnet sind, da dies das minimale Layout ist, bei dem jede Zeile einen größeren Einzug als die nächste hat.
quelle
Candy ,
675957 Bytes&iZ1-=yZ1+Z*2/>{0g}0=z@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&1-8*1+r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&8*7-r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
oder:
lange Form:
quelle
CJam,
2726 BytesVielen Dank an Sp3000 für das Speichern von 1 Byte.
Überraschenderweise in der Nähe von Pyth, lassen Sie uns sehen, ob dies Golf spielen kann ...Teste es hier.
Erläuterung
quelle
'
zuS
???S
es sich um eine Zeichenfolge und nicht um ein Zeichen handelt,f
wird diese Zeichenfolge anstelle der Zeilenliste zugeordnet .Ruby,
847773 Bytes77 Bytes
Reduziert einige Bytes mehr durch Entfernen der Variablen,
r
wie von steveverrill vorgeschlagen.84 Bytes
Ungolfed:
Erste Berechnung der Dreieckszahl aus der Eingabezeichenfolge
dh zum Beispiel ist die Größe der Eingabezeichenfolge 120 und unsere Dreieckszahl n ist 15.
In der obigen Zeile werden Leerzeichen gefolgt von einer Reihe von Zeichenfolgen gedruckt, die anhand des folgenden Musters aus der Eingabezeichenfolge abgerufen werden
[[0,0],[1,2],[3,5],[6,9]]
Verwendungszweck:
quelle
upto
kein ganzzahliges Argument benötige (mittimes
Sicherheit auch). Ich habe einige Ihrer Syntaxangaben in eine Überarbeitung meiner Antwort einbezogen. Der größte Tipp, den ich für Sie habe, ist, dass Sie diese Variable nicht benötigenr
. Verwenden Sie einfach ein,
statt..
und die Zahl nach dem Komma ist die Gesamtzahl der zurückzugebenden Elemente und nicht das Ende des Bereichs.Pyth, 27 Bytes
Test Suite
Ein interessanter Ansatz - unerlässlich und nützlich
.I
. Wahrscheinlich golfen.quelle
C
138,136,134 BytesNimmt einen String als Eingabe:
quelle
printf(" ")
undprintf("\n")
durchputs(" ")
und ersetzenputs("\n")
. Jede Ersetzung spart Ihnen 2 Bytes. :)Ruby Ansatz 2 rev 1, 76 Bytes
Optimiert mit Syntax-Ideen aus Vasu Adaris Antwort und einigen eigenen Wendungen.
Ruby Ansatz 2 rev 0, 93 Bytes
Ganz andere Herangehensweise. Zuerst fügen wir Leerzeichen zwischen den Zeichen der Eingabe ein. Dann drucken wir die Zeilen zeilenweise aus.
Ruby-Ansatz 1, 94 Bytes
das endete viel länger als erwartet.
w
Enthält die Anzahl der druckbaren Zeichen in der unteren Zeile oder entsprechend die Anzahl der Zeilen.Jede Zeile enthält
w
Whitespace-Zeichen (die letzte Zeile ist die neue Zeile). Sie sollten diese Whitespace-Zeichen also drucken und die druckbaren Zeichen bei Bedarf einfügen.quelle
Minkolang 0,14 , 42 Bytes
Probieren Sie es hier aus.
Erläuterung
quelle
Python 2,
88-85BytesDanke xnor für das Speichern von 3 Bytes.
quelle
s
die Berechnung der Anzahl der Räume?S=s=raw_input()
?CJam, 50 Bytes
Probieren Sie es hier aus.
Erläuterung
quelle
JavaScript (ES6), 135 Byte
De-Golf + Demo:
quelle
for (s = j = 0; j < w.length; j += s++);
? Auch im Inneren ein<pre>
, können Sie\n
statt<br>
. Außerdem haben Sie vergessen zu erwähnen, dass es sich um ES6 handelt.Java,
258194Golf gespielt:
Ungolfed:
Programmausgabe:
quelle
import static System.out;
beträgt 25 Bytes undSystem.
7 Bytes. Es wird dreimal verwendet und 21 <25, sodass die Größe tatsächlich um 4 Byte erhöht wird. Gutes Blei, statische Importe können jedoch Platz sparen, und nicht jeder kennt sie.JavaScript (ES6), 106 Byte
Verwendet eine Rekursion anstelle einer for-Schleife, um die Zeichenfolge zu erstellen.
Um die Länge der längsten Zeile zu finden, verwendet die Formel für die n - te Dreieckszahl
T_n
istT_n = (n^2 + n)/2
.n
Für dieT_n
Verwendung der quadratischen Formel haben wir gegeben und gelöst :Es stellt sich heraus, dass das Hinzufügen von 1/4 innerhalb der Quadratwurzel nach dem Bodenbelag das Ergebnis nicht ändert, daher lautet die Formel für die längste Reihe
Math.sqrt(2*a.length)|0
.quelle
TeaScript , 44 Bytes
Dies verwendet die gleiche Methode wie meine JavaScript-Antwort , ist jedoch viel kürzer.
Ungolfed
quelle
Powershell, 69 Bytes
Weniger Golf-Testskript:
Ausgabe:
quelle
C # 202
Ich weiß nicht, ob dies im Code-Golf erlaubt ist, aber zählt das Übergeben einer Liste in der Funktion? Ich kann keine Möglichkeit finden, dies zu wiederholen, ohne eine List <string>, die außerhalb der Funktion deklariert ist. Deshalb habe ich sie als Parameter angegeben.
Verwendungszweck:
quelle
C 102 Bytes
quelle
Bash + Sed, 87
quelle
R, 142 Bytes
Ich bin mir ziemlich sicher, dass ich das noch besser hinbekomme. Ich arbeite aber immer noch daran. Ich habe das Gefühl, dass mir eine einfache Rekursion fehlt - aber ich konnte sie nicht richtig verkürzen.
ungolfed
quelle
05AB1E , 11 Bytes
Probieren Sie es online!
quelle