To wyzwanie jest podobne do tego starego , ale z pewnymi niejasnymi częściami specyfikacji i mniej surowymi wymaganiami wejścia / wyjścia.
Biorąc pod uwagę ciąg znaków składający się tylko z drukowalnego kodu ASCII i nowego wiersza, wypisz jego różne metryki (bajt, słowo, liczba wierszy).
Dane, które należy wygenerować, są następujące:
Liczba bajtów. Ponieważ ciąg wejściowy pozostaje w obrębie ASCII, jest to również liczba znaków.
Liczba słów. To jest
wc
definicja „słowa:” dowolnej sekwencji spacji. Na przykładabc,def"ghi"
to jedno „słowo”.Liczba linii To jest oczywiste. Dane wejściowe zawsze będą zawierać końcowy znak nowej linii, co oznacza, że liczba wierszy jest równoznaczna z „liczbą nowych wierszy”. Nigdy nie będzie więcej niż jedna nowa linia końcowa.
Dane wyjściowe muszą dokładnie replikować dane wc
wyjściowe (z wyjątkiem nazwy pliku):
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
Zauważ, że najpierw pojawia się liczba wierszy, potem liczba słów, a na końcu liczba bajtów. Ponadto każda liczba musi być wypełniona lewą spacją, tak aby wszystkie miały tę samą szerokość. W powyższym przykładzie 5501
„najdłuższa” liczba składa się z 4 cyfr, więc 165
jest uzupełniona jedną spacją i 90
dwiema. Na koniec wszystkie liczby muszą być połączone w jeden ciąg ze spacją między każdą liczbą.
Ponieważ jest to code-golf , wygra najkrótszy kod w bajtach.
(A tak przy okazji ... nie możesz użyć wc
polecenia w swojej odpowiedzi. W przypadku, gdy nie było to już oczywiste).
Przypadki testowe ( \n
reprezentuje znak nowej linii; opcjonalnie możesz również wymagać wprowadzenia nowej linii końcowej):
"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"
Odpowiedzi:
Perl, 49 bajtów
Dodano +3 do
-an0
Wprowadź jako STDIN lub 1 lub więcej nazw plików jako argumenty. Uruchom jako
perl -an0 wc.pl
wc.pl
:Wyjaśnienie:
źródło
Python 2,
10077 bajtówTo rozwiązanie jest funkcją Pythona, która akceptuje wieloliniowy ciąg znaków i drukuje wymagane liczby na standardowe wyjście. Zauważ, że używam ciągu formatu do zbudowania ciągu formatu (który wymaga
%%
zmiany znaku zastępczego pierwszego formatu).Edycja: Zapisano 23 bajty dzięki optymalizacji drukowania przez Dennisa.
Przed minizatorem wygląda to tak:
źródło
Pyth, 21 bajtów
Zestaw testowy
Pyth ma tutaj kilka bardzo fajnych wbudowanych funkcji. Zaczynamy od utworzenia listy (
[
) nowych wierszy w ciągu (@bQ
), słów w ciągu (cQ)
) i samego ciągu (Q
). Następnie dopełniamy (.[
) długość każdego łańcucha (ld
) spacjami (;
w tym kontekście) do długości liczby znaków (l`lQ
). Na koniec dołącz do spacji (jd
).źródło
POSIX awk,
79756765 bajtówEdit: zapamiętanych 4 bajty od POSIX pozwala nagie
length
, zapisywane 7 bajtów poprzez zdyskontowanie część wywołania, a zapisane dwa bajty dzięki końcówce klamce za dodanied %
dod
.To było pierwotnie dla GNU awk, ale co mogę powiedzieć, wykorzystuje tylko funkcjonalność POSIX awk.
Lepiej sformatowany:
źródło
d
sięlength(c)"d %"
powinno pozwolić na zmianęprintf
celu"%"d d"d\n"
, co pozwala zaoszczędzić dwa bajty.Poważnie , 39 bajtów
Wypróbuj online!
Objaśnienie (nowe znaki są zastępowane przez
\n
):źródło
AppleScript, 253 bajty
Zakłada się, że ograniczniki elementów tekstowych AppleScript są ustawione na spację (jeśli muszę policzyć rzeczy, aby wymusić to założenie, dodam je).
źródło
CJam,
3126 bajtówWypróbuj online!
Jak to działa
źródło
Julia,
11281 bajtówTa funkcja przyjmuje łańcuch i zwraca łańcuch.
Zapisujemy następujące jako argumenty funkcji:
n = endof
funkcja, która pobiera ostatni indeks kolekcji indeksowalnej (w tym przypadku jest to długość łańcucha)l = "$(n(s))
, długość danych wejściowych konwertowanych na ciąg przy użyciu interpolacjig
która akceptuje wyrażenie regularne i zwraca długość - 1 wartości wejściowej podzielonej w tym wyrażeniu regularnym, po lewej stronie jest wypełniona spacjami, aby dopasować długośćl
.Otrzymujemy liczbę używanych wierszy
g(r"\n")
i liczbę używanych słówg(r"\S+")
, a następnie łączymy je razem zel
znakami spacji.Zaoszczędzono 31 bajtów dzięki Dennisowi!
źródło
MATL, 38 bajtów
Możesz spróbować online! To nie powinno tak długo trwać ...
Wyjaśnienie do obliczeń
Ostatnia część wykonuje formatowanie wyjściowe
źródło
!3Z"vX:!
przezZ{Zc
(cellstr
następniestrjoin
)JavaScript (ES6), 115 bajtów
Nie wymaga żadnych danych wejściowych. Formatowanie było bolesne. Gdyby istniała górna granica ilości wypełnienia, mogłabym zredukować ją
(' '.repeat(99)+n)
do czegoś krótszego np` ${n}`
.źródło
/[^]/g
z/./g
aby zapisać dwa bajtyPowerShell, 140 bajtów
(dla jasności pozostawiono nowy wiersz: D)
Pierwszy wiersz pobiera dane wejściowe
$a
, a następnie kolejna część to jedna instrukcja. Ustawiamy wartość$c
równą niektórym strunom.length
. To stworzy nasze wymagane wypełnienie. Wewnątrz ciągu znajduje się natychmiastowy blok kodu$(...)
, dzięki czemu kod zostanie wykonany przed przetworzeniem na ciąg.W bloku kodu wysyłamy trzy
|sort
polecenia za pomocą polecenia, a następnie przyjmujemy największy(...)[-1]
. Zapewniamy, aby kolumny miały odpowiednią szerokość. Te trzy elementy to$l
liczba wierszy, gdzie jesteśmy-split
na znakach nowej linii,$w
liczba słów, gdzie jesteśmy-split
na białych znakach i$b
długość.Drugi wiersz to nasze dane wyjściowe przy użyciu
-f
operatora (który jest pseudo-skrótem dlaString.Format()
). Jest to inny sposób wstawiania rozszerzonych zmiennych do ciągów. Mówimy tutaj, że chcemy, aby wszystkie dane wyjściowe były wypełnione w lewo, aby każda kolumna była$c
szeroka. Wypełnienie odbywa się za pomocą spacji.0
,1
I2
odpowiadają$l
,$w
i$b
że są argumenty do operatora formatu, więc liczba linii, liczba słów, a liczba bajtów są wyściełane i wyjście odpowiednio.Zauważ, że wymaga to, aby ciąg miał już rozwinięte znaki nowej linii (np. Robienie
Get-Content
na pliku tekstowym lub coś, a następnie albo przesyłanie potokowe lub zapisywanie do zmiennej, a następnie wywoływanie tego kodu na tym wejściu), lub użycie PowerShell- stylowe znaki ucieczki z backtickami (czyli`n
zamiast\n
).Przykład
źródło
Galaretka , 14 bajtów
Wypróbuj online!
-1 dzięki Dennisowi .
źródło
Rubinowy, 108 bajtów
źródło
Perl,
716261 bajtówzawiera +1 dla
-n
Skomentowano:
źródło
y///c
jako krótszej długości$_
.split$"
w kontekście skalarnym podaje liczbę słów w$_
. Używając zmiennej interpunkcyjnej, takiej jak$;
zamiast$W
, możesz wstawićd
tuż po interpolacji w ciągu formatu. Następnie można upuścićd
in$W
i upuść nawias. I-p
nic nie zyskuje-n
, po prostu pozwólprintf
drukować (dodaj nową linię do smaku)$a=foo;$b=bar$a
zwykle można zapisać jako$b=bar($a=foo)
, oszczędzając jeden bajt. Dotyczy tutaj$;
i$b
. Nie obchodzi Cię, czy$;
jest przeliczane za każdym razemLua,
7466 bajtówGra w golfa:
Nie golfowany:
Odbiera dane wejściowe za pomocą argumentów wiersza poleceń.
Zmieniamy nazwę pierwszego argumentu (
arg[1]
), aby zapisać bajty.string.gsub
zwraca liczbę zamienników, a także zmodyfikowany ciąg, więc używamy go do liczenia najpierw'\n'
(nowych linii), a następnie'%S+'
(wystąpień jednego lub więcej znaków spacji, jak największej liczby, tj. słów). Możemy użyć wszystkiego, co chcemy, do zastąpienia ciągu, więc używamy pustego ciągu (''
), aby zapisać bajty. Następnie używamy tylkostring.len
do znalezienia długości ciągu, tj. Liczby bajtów. Następnie drukujemy wszystko.źródło
Retina, 65
Wypróbuj online!
Pierwszym etapem jest aktualny program wc, reszta służy do wypełnienia. Symbol
a
zastępczy jest prawdopodobnie niepotrzebny, a niektóre grupy prawdopodobnie można nieco uprościć.źródło
Haskell, 140 bajtów
Wersja bez golfa jest poniżej, z rozszerzonymi nazwami zmiennych i funkcji:
Ta funkcja przyjmuje łańcuch i zwraca łańcuch. Po prostu używa
Prelude
funkcjiwords
(odpowiednio.lines
), Aby uzyskać liczbę słów (względnie linii), biorąc pod uwagę, że wydają się używać tej samej definicji cowc
, a następnie pobiera najdłuższą wartość (jako ciąg) spośród zliczeń i używa formatu printf biorąc szerokość wśród argumentów za formatowaniem.źródło
C,
180178 bajtówźródło
05AB1E ,
2423 bajtyj
jest obecnie błędny, więc mogło być 21 bajtów bez§
iJ
…Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Pip
-s
, 25 bajtówBierze ciąg multilinii jako argument wiersza poleceń. Wypróbuj online!
Dzięki odpowiedzi Dennisa na CJam za uświadomienie mi, że najdłuższa liczba jest zawsze liczbą znaków.
Wyjaśnienie
Oto 29-bajtowe rozwiązanie z flagami,
-rs
które pobierają dane wejściowe ze standardowego wejścia:Wypróbuj online!
źródło
PowerShell,
123115 bajtówSkrypt testowy:
Wydajność:
Wyjaśnienie:
$args|% t*y
dzieli ciągi argumentów na znakiswitch -r($args|% t*y)
oceń wszystkie dopasowane przypadki'\s'
skrzynka na dowolne białe znaki'\S'
przypadek dla dowolnej spacji'(?s).'
skrzynka na dowolny znak (zawiera nową linię)'\n'
przypadek znaku nowej linii (nowa linia reprezentuje się)$c="$b".Length
obliczyć długość liczby bajtów. $ b jest zawsze maksymalne ($ l, $ w, $ b) według projektu"{0,$c} {1,$c} $b"-f$l,+$w
formatuj liczby o tej samej długości. Zmienna $ w konwertuje na int. Potrzebuje ciągów bez słów. Inne zmienne mają format „taki jaki jest”, ponieważ „Dane wejściowe zawsze będą zawierały znak nowej linii”, a $ l i $ b nie mogą wynosić 0.źródło