Zentrieren Sie den Text!
In dieser Herausforderung werden Sie verschiedene Linien zentrieren.
Beispiele
Foo
barbaz
Foo
barbaz
Hello
World
Hello
World
Programming Puzzles
&
Code Golf
Programming Puzzles
&
Code Golf
Spezifikationen
Jede Eingabezeile enthält immer mindestens ein Nicht-Leerzeichen. Sie können davon ausgehen, dass Leerzeichen ( ) und Zeilenumbrüche das einzige Leerzeichen sind . Jede Eingabezeile enthält kein nachgestelltes und / oder führendes Leerzeichen (mit Ausnahme der neuen Zeile). Ein nachgestelltes Leerzeichen in der Ausgabe ist nicht zulässig.
Sie sollten sich auf der längsten Zeile in der Eingabe befinden. Wenn diese Linie gerade ist, sollte Ihr Programm / Ihre Funktion es vorziehen, nach links zu zentrieren. Die maximale Zeilenlänge hängt davon ab, mit welcher Sprache Sie umgehen können, Ihr Programm sollte jedoch für Zeilen mit einer Länge von mindestens 500 funktionieren.
Bestenliste
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes!
quelle
foo(space)(space)(space)bar
ist eine völlig akzeptable EingabeAntworten:
Pyth,
1917 Bytes2 Bytes dank Jakube
Demonstration
Ich denke, dies ist das erste Mal, dass die Center-Pad-Funktion von
.[
nützlich ist. Die Länge der längsten Zeile wird mit transponiert (.T
) ohne Kürzung ermittelt .Nachgestellte Leerzeichen werden entfernt, indem ein Nicht-Leerzeichen an der Vorderseite eingefügt, Leerzeichen entfernt und das hinzugefügte Zeichen entfernt wird.
quelle
vim,
433635 BytesZu gut um nicht zu posten. Beachten Sie den nachgestellten Zeilenumbruch. es ist bedeutend.
Vielen Dank an @Marth für das Speichern eines Charakters!
vim-freundliches Format:
Erläuterung:
quelle
sor!
zum Umkehren der Sortierreihenfolge verwenden, können Siecol("$")
die Länge der ersten Zeile (jetzt die längste seit der Umkehrung der Reihenfolge) ermitteln, anstatt zu verwendenG$
, wodurch insgesamt 1 Byte gespart wird! edit : oder Sie können die Sortierreihenfolge beibehalten undG:let &tw=col("$")
stattdessen verwenden.:h :sort
ich gerade herausgefunden, dass Sie einen regulären Ausdruck verwenden können, um den übereinstimmenden Text in der Sortierung zu überspringen, sodass Sie:sor /./
nach Länge (+4 Byte) sortieren können , wodurch Sie dieVGrx
(-4 Byte) und die zweite Rückgängigmachung entfernen können ( -1 Bytes). Sie können auch|
Trennzeichen verwenden, anstatt<cr>
die Befehle zu verketten, wodurch Sie das:
Vorherlet
(-1 Byte) überspringen können (beachten Sie, dass Sie diesor!
Lösung dann verwenden müssen,G
kein Ex-Befehl ist). Also:sor! /./|let &tw=col("$")|u|%ce
(mit einem Trailing<CR>
) sollten 2 Bytes gespart werden.Mathematica, 96 Bytes
Fragen Sie mich nicht, wie es funktioniert, ich habe nur herumgespielt, bis es die richtige Ausgabe lieferte.
quelle
Funktion , nicht wettbewerbsfähig
Diese Herausforderung hat das schmerzhafte Fehlen einer "Maximalwert" - (und Minimalwert-) Funktion für Lazy Sequences hervorgehoben, also ... habe ich sie der Kernbibliothek hinzugefügt (sie heißen ⊤ bzw. ⊥). Daher habe ich mir nicht die Mühe gemacht, diese Antwort als Golf- Antwort einzureichen (sie müsste die ⊤-Funktionserklärung enthalten, um gültig zu sein). Hier ist also nur das Hauptprogramm.
Führen Sie dies
(function(){$('pre,code').css({lineHeight:5/4,fontFamily:'DejaVu Sans Mono'});})()
in Ihrer Browser-Konsole aus, um ein besseres Rendering zu erhalten.Erläuterung
Ich glaube, dies ist möglicherweise die erste Antwort von Funciton auf dieser Website, die Lambda-Ausdrücke verwendet.
ǁ
teilen wir die Eingabezeichenfolge an den Zeilenumbrüchen auf (ASCII 10). Dies gibt eine verzögerte Sequenz zurück.ɱ
(map), geben ihr ein Lambda, das die Länge jeder Zeichenkette berechnet, und übergeben dann die endgültige Sequenz⊤
, um die Länge der längsten Linie zu ermitteln.ɱ
, eine Lambda - geben, die die Länge jeder Zeichenfolge berechnet, subtrahiert von der maximalen Zeilenlänge früher berechnet, dividieren , dass um 2 (tatsächlich shift-rechts 1) erzeugt , die viele Zwischenräume (ASCII 32) und verkettet dann die Zeichenfolge auf diese Leerzeichen. (Aus geometrischen Gründen habe ich eine‡
Funktion deklariert , die‼
(String-Verkettung) mit umgekehrten Parametern aufruft .)ʝ
alle Zeichenfolgen wieder zusammen und verwenden als Trennzeichen Zeilenumbrüche (ASCII 10).quelle
Netzhaut ,
5452 BytesDas
\t
s kann durch aktuelle Tabs ersetzt werden, habe ich aber\t
hier verwendet, da sonst SE die Tabs in Leerzeichen konvertiert. Beachten Sie, dass in der zweiten Zeile ein vorangestelltes Leerzeichen steht.Probieren Sie es online aus.
Erläuterung
Die Grundidee besteht darin, eine Zeile abzugleichen, die mindestens zwei Zeichen kürzer als die längste Zeile ist (oder technisch gesehen zwei Zeichen kürzer als jede andere Zeile), und sie in zwei Leerzeichen zu umgeben. Dies wird so oft wiederholt, bis wir eine solche Zeile nicht mehr finden. Dies bedeutet, dass sich alle Zeilen innerhalb eines Zeichens der maximalen Länge befinden (wobei das eine Zeichen für Paritätsinkongruenzen verantwortlich ist und gewährleistet, dass diese Zeilen nach links verschoben werden). Center).
Wie für die eigentliche Regex:
Stimmt nur mit einer Zeile überein, während
1
für jeden Charakter eine Aufnahme in die Gruppe verschoben wird.Ist ein Lookbehind, der von rechts nach links abgeglichen wird und den Cursor an den Anfang der Zeichenfolge bewegt, sodass der Lookahead innerhalb der Zeichenfolge die gesamte Zeichenfolge überprüfen kann. Beachten Sie, dass der Lookahead aufgrund des Fehlens eines Ankers von einer anderen Stelle aus angewendet werden kann, jedoch keine zusätzlichen Übereinstimmungen erstellt werden. Wir wissen, dass
[^\t]
immer jedes Zeichen in der Zeichenfolge übereinstimmt , da die Eingabe in Bezug auf Leerzeichen und Zeilenvorschübe garantiert nur Leerzeichen und Zeilenvorschübe enthält.Dieser Lookahead versucht, eine Zeile zu finden, die mindestens zwei Zeichen länger ist als die, zu der wir gerade eine Übereinstimmung finden.
[^\t]*
Bewegt sich durch die Zeichenfolge, um mit einer beliebigen Zeile übereinstimmen zu können.^
stellt sicher, dass wir am Anfang der Zeile beginnen...
Dann stimmen die beiden zusätzlichen Zeichen überein, die wir für die längere Zeile benötigen. Stimmt jetzt(?<-1>.)+
mit einzelnen Zeichen in dieser Zeile überein, während Sie aus der Gruppe springen1
(Anmerkung,.
die keinem Zeilenvorschub entsprechen, daher ist dies auf eine Zeile beschränkt). Schließlich wird(?(1)^)
behauptet, dass es uns gelungen ist, die gesamte Gruppe zu leeren1
. Wenn die Zeile kürzer als erforderlich ist, ist dies nicht möglich, da nicht genügend Zeichen in der Zeile vorhanden sind, um aus Gruppe 1 häufig genug einzufügen, um sie zu leeren.quelle
Jolf , 3 Bytes
Nicht konkurrierende Frage nach Datum aktualisieren.
Probieren Sie es hier aus! .
¯ \ _ (ツ) _ / ¯ Ich dachte, es wäre eine nützliche Funktion.
quelle
JavaScript (ES6),
93 bis91 Byte2 Bytes gespart dank @ edc65 !
Erläuterung
Prüfung
Code-Snippet anzeigen
quelle
.repeat
Akzeptiert und schneidet nicht ganzzahlige Werte ab, sodass Sie sie nicht benötigen|0
CJam,
262319 BytesMein erstes Mal mit CJam! Vier Bytes gespart dank Martin Büttner. Probieren Sie es online aus.
Erläuterung
quelle
qN/_z,f{1$,m2/S*\N}
LabVIEW, 3 oder 35 LabVIEW-Grundelemente
Findet Linien, bis keine mehr übrig sind, berechnet dann die Anzahl der hinzuzufügenden Leerzeichen und fügt alles zusammen.
Alternativ können Sie die eingebaute Mittenausrichtung für die Saitenanzeigen verwenden, es fühlt sich jedoch irgendwie nach Schummeln an.
quelle
Python 2,
83-81BytesVielen Dank an @xnor für das Speichern von 2 Zeichen
Beispiel Eingabe:
Beispielausgabe:
Und auf dem zweiten Platz mit 84 Bytes mit str.center () und str.rstrip (danke @JF).
quelle
len
sie einer Variablen zuzuweisen , die Sie zweimal verwenden - das entspricht einer Gewinnschwelle von 5 Zeichen (wierange
). Sie können auchmap
für die Liste comp verwenden.str.rstrip()
nach dem Aufruf verwendencenter
, um den abschließenden Raum loszuwerden.len(max(a,key=len))
, siehe dies .TeaScript , 24 Bytes
Durchläuft Linien und fügt
floor((max line length - line length) / 2)
Leerzeichen am Anfang ein.Ungolfed
Probieren Sie es online aus
quelle
PowerShell, 58
67Bytedurch @ mazzy Kommentare auf 58 Bytes reduziert:
$a
, die mit jedem String durchlaufen werden|%{...}
.string.padleft()
Methode für jede Zeichenfolge über eine% -member
Verknüpfung auf, die die gewünschte endgültige Zeilenlänge als Parameter verwendet.array_longest_line_length/2 + current_line_length/2
current_line_length/2
->$_.length/2
quelle
Emacs Lisp, 203 Bytes
Ungolfed:
Zentriert:
quelle
HTML, 40 Bytes
Code-Snippet anzeigen
Snippet enthält
</xmp>
Tag, da der Code-Snippet-Viewer möchte, dass meine Tags ausgeglichen sind.quelle
MATL , 22
31BytesJede Zeile wird mit einer abschließenden Zeile ( enterdh einem Tastendruck) eingegeben . Eine leere Zeile (zwei enterTastenanschläge) markiert das Ende der Eingabe.
Beispiel
Erläuterung
quelle
Ruby,
766861 BytesProbelauf:
quelle
->t{(s=t.split$/).map{|l|l.center s.map(&:size).max}}
center
Weg zuerst ausprobiert , aber wie ich verstehe, würde das allein die Regel "Hinteres Leerzeichen in der Ausgabe ist nicht zulässig" brechen. Vielen Dank für den&:size
Teil - das habe ich auch versucht, aber ich habe auf jeden Fall etwas an der Syntax herumgeschubst.Haskell,
1118177 BytesEingabe in die f-Funktion, die Ausgabe wird nicht gedruckt.
Verwendung: Lade in den Interpreter
ghci center.hs
und dann, wenn du die Ausgabe von f auf einen gegebenen String drucken willstputStr$f"Programming Puzzles\n&\nCode Golf"
Edit: Danke an nimi für 34 Bytes, tolle Arbeit! : D
quelle
map
:<$>
.replicate(...)' '
kann durch ersetzt werden[1.. ...]>>" "
. Alles in allem:unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q]
.l1 >> l2
erstellt (Länge l1) Kopien von l2 und verkettet sie. ZB"abcd" >> [1,2]
->[1,2,1,2,1,2,1,2]
(<- 4 Kopien von 1,2 in einer einzigen Liste). In unserem Fall sind es[1..n]>>" "
n Kopien eines Raums, die mit dem identisch sind, was erreplicate
tut.R, 126 Bytes
Code
ungolfed
Wahrscheinlich gibt es bessere Möglichkeiten, dies zu tun, und wir arbeiten noch daran.
quelle
Gema, 160 Bytes
Geschrieben hauptsächlich aus Neugier, um zu sehen, was in einer Sprache ohne die richtige Array-Struktur und die richtige Schleifenanweisung möglich ist.
Probelauf:
quelle
Perl 6 , 61 Bytes
Verwendungszweck:
quelle
for @l {
, Rasieren 2 Bytes, und Änderungenput " "
zuput" "
, ein weiteres Byte rasieren. Gilt das für Perl 6? (Ich kenne Perl 6 nicht.) Außerdem stimmt Ihre Ausgabe, wie sie hier angezeigt wird, nicht mit der erforderlichen Ausgabe überein. ist das ein Tippfehler?Japt,
2825Probieren Sie es online!
Wie es funktioniert
quelle
PHP , 98 Bytes
Probieren Sie es online!
Ungolfed:
Ausgabe:
quelle
05AB1E , 2 Bytes
Builtins ftw \ _ (ツ) _ /
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
(Bevorzugung rechts wäre stattdessen mit einem Großbuchstaben
.C
: siehe die Unterschiede .)quelle
Japt , 1 Byte
Probieren Sie es aus oder führen Sie alle Testfälle aus
quelle