Diese Herausforderung ähnelt der alten , jedoch mit einigen unklaren Teilen der Spezifikation und weniger strengen E / A-Anforderungen.
Wenn Sie eine Zeichenfolge eingeben, die nur aus druckbarem ASCII und Zeilenumbrüchen besteht, geben Sie die verschiedenen Metriken (Byte, Wort, Zeilenzahl) aus.
Die Metriken, die Sie ausgeben müssen, lauten wie folgt:
Byteanzahl. Da die Eingabezeichenfolge innerhalb von ASCII bleibt, ist dies auch die Zeichenanzahl.
Wortzahl. Dies ist
wc
die Definition eines "Wortes": jede Folge von Nicht-Leerzeichen. Zum Beispielabc,def"ghi"
ist ein "Wort".Zeilenanzahl. Das ist selbsterklärend. Die Eingabe enthält immer einen nachgestellten Zeilenumbruch, was bedeutet, dass Zeilenanzahl gleichbedeutend mit "Zeilenumbruch" ist. Es wird nie mehr als eine einzige nachgestellte Zeile geben.
Die Ausgabe muss genau der Standardausgabe entsprechen wc
(mit Ausnahme des Dateinamens):
llama@llama:~$ cat /dev/urandom | tr -cd 'A-Za-z \n' | head -90 > example.txt
llama@llama:~$ wc example.txt
90 165 5501 example.txt
Beachten Sie, dass die Zeilenanzahl zuerst kommt, dann die Wortanzahl und schließlich die Byteanzahl. Darüber hinaus muss jeder Zählwert mit Leerzeichen aufgefüllt werden, damit sie alle die gleiche Breite haben. Im obigen Beispiel 5501
ist die "längste" Zahl 4-stellig, wird also 165
mit einem Leerzeichen und 90
mit zwei aufgefüllt . Schließlich müssen alle Zahlen zu einer einzigen Zeichenfolge mit einem Leerzeichen zwischen den Zahlen zusammengefügt werden.
Da es sich um Code-Golf , wird der kürzeste Code in Bytes gewinnen.
(Oh, und übrigens ... Sie können den wc
Befehl nicht in Ihrer Antwort verwenden. Falls das noch nicht klar war.)
Testfälle ( \n
stellt eine neue Zeile dar; optional können Sie auch eine zusätzliche nachgestellte Zeile benötigen):
"a b c d\n" -> "1 4 8"
"a b c d e f\n" -> " 1 6 12"
" a b c d e f \n" -> " 1 6 16"
"a\nb\nc\nd\n" -> "4 4 8"
"a\n\n\nb\nc\nd\n" -> " 6 4 10"
"abc123{}[]()...\n" -> " 1 1 16
"\n" -> "1 0 1"
" \n" -> "1 0 4"
"\n\n\n\n\n" -> "5 0 5"
"\n\n\na\nb\n" -> "5 2 7"
Antworten:
Perl, 49 Bytes
+3 für hinzugefügt
-an0
Eingabe in STDIN oder 1 oder mehr Dateinamen als Argumente. Rennen wie
perl -an0 wc.pl
wc.pl
:Erläuterung:
quelle
Python 2,
10077 BytesDiese Lösung ist eine Python-Funktion, die eine mehrzeilige Zeichenfolge akzeptiert und die erforderlichen Zählungen an stdout ausgibt. Beachten Sie, dass ich eine Formatzeichenfolge verwende, um eine Formatzeichenfolge zu erstellen (die ein erfordert
%%
, um den ersten Formatplatzhalter zu maskieren).Bearbeiten: 23 Byte aufgrund von Druckoptimierungen von Dennis gespeichert.
Vor dem Minifier sieht es so aus:
quelle
Pyth, 21 Bytes
Testsuite
Pyth hat hier einige sehr schöne eingebaute.
[
Zunächst erstellen wir eine Liste ( ) der Zeilenumbrüche in der Zeichenfolge (@bQ
), der Wörter in der Zeichenfolge (cQ)
) und der Zeichenfolge selbst (Q
). Dann füllen wir (.[
) die Länge jedes Strings (ld
) mit Leerzeichen (;
in diesem Kontext) auf, die der Länge der Anzahl der Zeichen (l`lQ
) entsprechen. Zum Schluss setzen Sie Leerzeichen (jd
).quelle
POSIX awk,
79756765 BytesBearbeiten: 4 Bytes gespart, da POSIX ein Bare zulässt
length
, 7 Bytes durch Abzinsung des Aufrufteils gespart und zwei Bytes dank Doorknobs Tipp für das Hinzufügend %
zu gespartd
.Dies war ursprünglich für GNU awk, aber soweit ich das beurteilen kann, werden nur POSIX awk-Funktionen verwendet.
Besser formatiert:
quelle
d
zulength(c)"d %"
sollten Sie ermöglichen , die Änderungenprintf
zu"%"d d"d\n"
, die zwei Bytes speichern.Im Ernst , 39 Bytes
Probieren Sie es online!
Erklärung (Zeilenumbrüche werden durch ersetzt
\n
):quelle
AppleScript, 253 Byte
Dies setzt voraus, dass die Trennzeichen für AppleScript-Textelemente auf Leerzeichen gesetzt sind (wenn ich das Zeug zählen muss, um diese Annahme zu erzwingen, füge ich es hinzu).
quelle
CJam,
3126 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Julia,
11281 BytesDies ist eine Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt.
Wir speichern als Funktionsargumente:
n = endof
Funktion, die den letzten Index einer indexierbaren Sammlung abruft (in diesem Fall die Länge des Strings)l = "$(n(s))
Die Länge der Eingabe, die mithilfe von Interpolation in eine Zeichenfolge konvertiert wurdeg
, die einen regulären Ausdruck akzeptiert und die Länge - 1 der auf diese Regex aufgeteilten Eingabe zurückgibt, wobei die Länge mit Leerzeichen aufgefüllt bleibtl
.Wir ermitteln die Anzahl der verwendeten Zeilen
g(r"\n")
und die Anzahl der verwendeten Wörterg(r"\S+")
und fügen diese mitl
durch Leerzeichen begrenzten zusammen.31 Bytes gespart dank Dennis!
quelle
MATL, 38 Bytes
Sie können es online ausprobieren! Das sollte aber nicht so lange dauern ...
Erklärung zur Berechnung
Der letzte Teil übernimmt die Ausgabeformatierung
quelle
!3Z"vX:!
durchZ{Zc
(cellstr
gefolgt vonstrjoin
) ersetzenJavaScript (ES6), 115 Byte
Benötigt keine Eingabe. Das Formatieren war schmerzhaft. Wenn es eine Obergrenze für die Polstermenge gäbe, könnte ich sie
(' '.repeat(99)+n)
auf etwas kürzeres reduzieren , z` ${n}`
.quelle
/[^]/g
mit/./g
zu speichern zwei BytesPowerShell, 140 Byte
(Zeilenumbruch aus Gründen der Übersichtlichkeit: D)
Die erste Zeile nimmt Eingaben entgegen
$a
, und der nächste Teil besteht aus einer einzigen Anweisung. Wir setzen$c
gleich einige Zeichenfolgen.length
. Dies wird unsere erforderliche Polsterung bilden. In der Zeichenfolge befindet sich ein sofortiger Codeblock$(...)
, sodass der Code ausgeführt wird, bevor er in der Zeichenfolge ausgewertet wird.Im Codeblock senden wir drei Elemente über den
|sort
Befehl und nehmen dann das größte(...)[-1]
. Hier stellen wir sicher, dass die Spalten die richtige Breite haben. Die drei Elemente sind$l
die Zeilenanzahl, bei der wir uns-split
in Zeilenumbrüchen befinden, die Wortanzahl, bei der$w
wir uns-split
in Leerzeichen befinden und$b
die Länge.Die zweite Zeile ist unsere Ausgabe mit dem
-f
Operator (eine Pseudokurzform fürString.Format()
). Es ist eine andere Möglichkeit, erweiterte Variablen in Zeichenfolgen einzufügen. Hier möchten wir, dass die gesamte Ausgabe nach links aufgefüllt wird, damit jede Spalte$c
breit ist. Das Auffüllen erfolgt über Leerzeichen. Das0
,,1
und2
entsprechen dem$l
,$w
und$b
das sind Argumente für den Formatoperator, sodass die Zeilenanzahl, die Wortanzahl und die Byteanzahl entsprechend aufgefüllt und ausgegeben werden.Beachten Sie, dass hierfür entweder die Zeichenfolge bereits erweiterte Zeilenumbrüche aufweisen muss (z. B.
Get-Content
eine Textdatei oder etwas anderes bearbeiten und diese dann entweder weiterleiten oder in einer Variablen speichern und dann diesen Code für diese Eingabe aufrufen), oder die PowerShell verwenden. gestaltete Escape-Zeichen mit Backticks (Bedeutung`n
statt\n
).Beispiel
quelle
Gelee , 14 Bytes
Probieren Sie es online!
-1 danke an Dennis .
quelle
Rubin, 108 Bytes
quelle
Perl,
716261 Bytesbeinhaltet +1 für
-n
Kommentiert:
quelle
y///c
als kürzere Länge$_
.split$"
im skalaren Kontext gibt die Anzahl der Wörter in an$_
. Wenn Sie eine Interpunktionsvariable wie$;
anstelle von verwenden$W
, können Sie eined
direkt nach der Interpolation in die Formatzeichenfolge einfügen. Dann können Sie die Drop -d
in$W
und die Klammer fallen. Und-p
gewinnt nichts über-n
, lassen Sieprintf
einfach den Druck (fügen Sie eine neue Zeile nach Geschmack)$a=foo;$b=bar$a
kann normalerweise so geschrieben werden$b=bar($a=foo)
, dass ein Byte gespart wird. Anwendbar hier auf$;
und$b
. Es ist dir egal, ob$;
es jedes Mal neu berechnet wirdLua,
7466 BytesGolf gespielt:
Ungolfed:
Erhält Eingaben über Befehlszeilenargumente.
Wir benennen das erste Argument (
arg[1]
) um, um Bytes zu sparen.string.gsub
gibt die Anzahl der Ersetzungen sowie die geänderte Zeichenfolge zurück, sodass wir diese zuerst'\n'
(Zeilenumbrüche) und dann'%S+'
(Instanzen eines oder mehrerer Nicht-Leerzeichen, so viele wie möglich, dh Wörter) zählen. Wir können für die Ersetzungszeichenfolge alles verwenden, was wir wollen, also verwenden wir die leere Zeichenfolge (''
), um Bytes zu speichern. Dann ermitteln wir einfachstring.len
die Länge des Strings, dh die Anzahl der Bytes. Dann drucken wir endlich alles.quelle
Netzhaut, 65
Probieren Sie es online!
Die erste Stufe ist das eigentliche WC-Programm, der Rest ist zum Auffüllen. Das
a
Platzhalter-Ding ist wahrscheinlich unnötig und einige der Gruppen können wahrscheinlich ein bisschen vereinfacht werden.quelle
Haskell, 140 Bytes
Es folgt die ungolfed Version mit erweiterten Variablen- und Funktionsnamen:
Dies ist eine Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Es werden nur die
Prelude
Funktionenwords
(bzw.lines
) verwendet, um die Anzahl der Wörter (bzw. Zeilen) zu erhalten, vorausgesetzt, sie scheinen dieselbe Definition zu verwenden wiewc
, und dann wird der längste Wert (als Zeichenfolge) unter den Zählwerten abgerufen und das printf-Format verwendet die Breite unter den Argumenten für die Formatierung.quelle
C
180178 Bytesquelle
05AB1E ,
2423 Bytesj
ist derzeit fehlerhaft, könnte also 21 Bytes ohne die sein§
und sein könnenJ
.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Pip
-s
, 25 BytesNimmt die mehrzeilige Zeichenfolge als Befehlszeilenargument. Probieren Sie es online!
Danke an Dennis's CJam Antwort mir klar, dass die längste Zahl immer die Anzahl der Zeichen ist.
Erläuterung
Hier ist eine 29-Byte-Lösung mit Flags
-rs
, die Eingaben von stdin akzeptieren:Probieren Sie es online!
quelle
Powershell,
123115 BytesTestskript:
Ausgabe:
Erläuterung:
$args|% t*y
Teilt Zeichenketten in Zeichen aufswitch -r($args|% t*y)
bewerte alle übereinstimmenden Fälle'\s'
case for any whitespace'\S'
case for any non-whitespace'(?s).'
case for any char (newline enthalten)'\n'
case for newline char (newline repräsentiert sich selbst)$c="$b".Length
Berechnen Sie eine Länge von Bytes Anzahl. $ b ist standardmäßig immer maximal ($ l, $ w, $ b)"{0,$c} {1,$c} $b"-f$l,+$w
Zahlen mit gleicher Länge formatieren. Die Variable $ w wird in int konvertiert. Es braucht Zeichenfolgen ohne Worte. Andere Variablenformate 'wie sie sind', da 'die Eingabe immer einen abschließenden Zeilenumbruch enthält' und $ l und $ b nicht 0 sein können.quelle