Podczas kodowania w Pythonie czasami potrzebujesz ciągu wielowierszowego w funkcji, np
def f():
s = """\
Line 1
Line 2
Line 3"""
(Ukośnik odwrotny polega na usunięciu wiodącej nowej linii)
Jeśli jednak spróbujesz wydrukować s
, otrzymasz
Line 1
Line 2
Line 3
Wcale nie tego chcemy! Zbyt wiele wiodących białych znaków!
Wyzwanie
Biorąc pod uwagę ciąg wielowierszowy składający się wyłącznie ze znaków alfanumerycznych, spacji i nowych linii, usuń wszystkie wspólne spacje na początku każdej linii. Każda linia ma co najmniej jeden znak spacji i nie będzie zawierać spacji końcowych. Wyjście może nie mieć obcych białych znaków, niezależnie od tego, czy będzie to przed, czy po całym wyjściu lub pojedynczym wierszu (z wyjątkiem jednej opcjonalnej końcowej nowej linii).
Dane wejściowe mogą być przesyłane za pośrednictwem argumentu STDIN lub funkcji, a dane wyjściowe mogą być przekazywane za pośrednictwem parametru STDOUT lub zwracanej wartości funkcji. Nie można używać żadnych wbudowanych funkcji, które są przeznaczone do dedentycznego ciągów wielowierszowych lub wykonywania dokładnie tego zadania, np. Pythonatextwrap.dedent
.
To jest golf golfowy , więc wygrywa rozwiązanie w najmniejszej liczbie bajtów. Standardowe luki .
Przypadki testowe
"a" -> "a"
" abc" -> "abc"
" abc\n def\n ghi" -> " abc\ndef\n ghi"
" a\n b\n c" -> "a\nb\nc"
" a\n b\n c\nd" -> " a\n b\n c\nd"
" a b\n c d\n e f" -> "a b\n c d\n e f"
Na przykład ostatni przypadek testowy to
a b
c d
e f
i powinien wyglądać tak po usunięciu wiodących spacji:
a b
c d
e f
źródło
Odpowiedzi:
CJam,
2014 bajtówAlgorytm :
qN/_
)z{S-}#
)f>
)N*
)Rozszerzenie kodu
Wypróbuj online tutaj
źródło
Pyth,
19181714 bajtówImplementacja jest całkiem fajna.
u .z
pobiera wszystkie linie stdin w tablicy, umieszcza jeG
. Następnie ocenia ciało wewnętrzne, umieszcza wynikG
i robi to do momentu, aż przestanie się zmieniać (punkt stały).!rhCG6
transponujeG
, pobiera pierwszy element transponowanej tablicy (pierwsza kolumna), usuwa go z dowolnej białej spacji i sprawdza, czy pozostały jakieś znaki spoza białej spacji.Wartość z 2 jest wartością logiczną, którą można postrzegać jako liczbę całkowitą 0 lub 1.
>R G
chwyta tę liczbę i odcina tyle znaków z lewej strony każdego wierszaG
. Połączone kroki 1, 2 i 3 w zasadzie oznaczają, że będzie nadal usuwał kolumny białych znaków, dopóki nie pozostanie czysta kolumna białych znaków.jb
łączy tablicę wierszy znakiem nowej linii i drukuje ją.źródło
sed - 26 bajtów
Biegnij z
-rz
Całkiem proste:
-r
opcja włącza rozszerzone wyrażenia regularne,-z
odczytuje całe dane wejściowe jako pojedynczy ciąg (faktycznie używa NUL-bajtu jako separatora linii)źródło
:;N;$!b
na początku czegoś podobnego do zebrania linii wejściowych w jedną przestrzeń wzorów? Edycja: nie, nie; po to-z
jest flaga.:;/^\S/M!s/^ //mg;t
-r
SWI-Prolog,
233223217 bajtówEdytować : całkowicie zmieniłem moją odpowiedź. Teraz używa kodów znaków zamiast ciągów znaków.
Przykładem takiego nazwania byłyby
a(` a b\n c d\n e f`).
cudzysłowy. Może być konieczne użycie podwójnych cudzysłowów,"
jeśli masz starą dystrybucję SWI-Prolog.źródło
Julia,
939281 bajtówOszczędność 10 bajtów dzięki Glenowi O.
To tworzy nienazwaną funkcję, która akceptuje ciąg i wypisuje na standardowe wyjście.
Niegolfowane + wyjaśnienie:
źródło
minimum([length(search(j, r"^ +")) for j in p])+1
użyjminimum([search(j,r"[^ ]")[1]for j=p])
. Ponieważ wyzwanie stwierdza, że wszystkie wiersze będą zawierały tekst spacji, jest bezpieczny i oszczędza 9 bajtów (w tym 3 zapisane przy użyciu=
zamiast `w). Still looking to see if more can be saved. (I wish I could drop the
[1]`), ale wyszukiwanie tworzy tablicę wyliczającą typu Dowolne, podczas gdy minimum wymaga typu Int)s->for i=(p=split(s,"\n")) println(i[minimum([search(j,r"[^ ]")[1]for j=p]):end])end
minimum(x)
kiedyx
jest tablica, użyjmin(x...)
, aby zaoszczędzić jeden dodatkowy bajt (dodam ten do mojej listy wskazówek golfowych Julii).\S
zamiast[^ ]
, co oszczędza bajt.\S
jest to również przydatne w moim rozwiązaniu.Java, 159
Ponieważ widoczny jest brak Java ...
To tylko pętle porównujące długość z przyciętą długością, a następnie wypluwające podciągi. Nic nadzwyczajnego. W przypadku osób z zaburzeniami paska przewijania:
źródło
Perl,
4733Dzięki @ThisSuitIsBlackNot za sugestię użycia niejawnej pętli Perla
Powyższe jest oceniane jako 30 bajtów dla linii kodu + 3 dla
00p
flag.Oryginalna wersja, jako funkcja:
Spowoduje to wstawienie argumentu
$_
, a następnie spróbuje łapczywie dopasować białe znaki występujące we wszystkich liniach z/^( +).*(\n\1.*)*$/
- jeśli się powiedzie,$1
zawiera teraz najdłuższy wspólny przedrostek i wykonujemy zamianęs/^$1//mgr
aby usunąć go z początku każdej linii i zwrócić wynikowy ciąg.Test
źródło
perl -00pe '/^( +).*(\n\1.*)*$/&&s/^$1//mg'
(30 bajtów + 3 za00p
)./me
idzie do góry-00p
; dzięki @ThisSuitPython 2,
867975 bajtówNiemal na pewno można to trochę skrócić, ale w tej chwili nie jest źle.
Dzięki xnor za zapisanie 4 bajtów!
źródło
x.find(x.strip())
.input()
w Python 2 dusiłby te dane.):
Rubinowy:
7773706665585740 znakówPrzykładowy przebieg:
źródło
f=->t{t.gsub /^#{t.scan(/^ */).min}/,""}
?C #, 18 + 145 = 163 bajty
Wymaga (18 bajtów):
Metoda (145 bajtów):
Metoda oblicza najmniejszą liczbę początkowych spacji na liniach i tworzy nowy ciąg znaków zbudowany ze wszystkich linii, z pominiętymi N znakami (gdzie N jest poprzednio obliczoną liczbą).
źródło
C #, 149 bajtów ogółem
Praktycznie takie samo rozwiązanie jak ProgramFOX, chociaż liczba znaków do przycięcia jest obliczana ręcznie.
A sama funkcja:
źródło
Python 3, 100
źródło
JavaScript, ES6,
8986 bajtówTen używa wyłącznie dopasowania RegEx i podstawień.
Jak zawsze Firefox tylko od ES6. Dodaje wersję ES5 później.
źródło
K, 31 bajtów
Pobiera wprowadzoną listę ciągów i wypisuje wynik na standardowe wyjście.
źródło
Haskell, 52 bajty
Przykład użycia:
unlines.until(any(/=' ').map head)(map tail).lines $ " abc\n def\n ghi"
->" abc\ndef\n ghi\n"
Jak to działa:
źródło
Python, 94/95
lambda (94 bajty):
def (95 bajtów)
źródło
bash + sed + coreutils,
74,56, 55Dane testowe
Odpowiedź
Wynik
źródło
cut -c$[`grep -o '^ *'<<<"$s"|sort|sed q|wc -c`]-<<<"$s"
$[]
arithmetic. Usingcut
for column selection is much better. I have never seensed q
as an alternative tohead -n1
, it is a good golfing trick. Thanks!head -n1
vssed q
,line
w pakiecie util-linux znajduje się narzędzie.R
118111 bytesKorzystanie ze wspaniałych funkcji łańcucha R :) Jest to podobne / takie samo jak w przypadku innych opublikowanych już rozwiązań. Wejście odbywa się poprzez STDIN, a koty do STDOUT.
Test i wyjaśnienie
źródło
Julia,
726261575449 bytesUngolfed:
Older solution (57 bytes):
Original solution (72 bytes):
źródło
k (24 bytes)
Takes a string as an argument and returns a string (with trailing new-line).
Example:
źródło
05AB1E, 10 bytes
Try it online!
źródło
*
repeats the string b a amount of times?.. Didn't knew about that feature of*
. I usually dos∍
(swap and lengthen) when I want to repeat a certain character.и
yields a list of characters.Gawk,
101100For example...
Output...
źródło
/^( +)/
→/^ +/
(then you will have the needed value int[0]
instead oft[1]
); changes==""
→!s
; remove the{
and}
around the code afterif
; remove the;
before}
; using Gawk-specific function to be able to remove the{
and}
around the code afterfor
:{sub(s,"",z[r]);print z[r]}
→print gensub(s,"",1,z[r])
.C GCC, 74 Bytes
Only removes all whitespace, not relating to previous lines, requesting help to finish. ALSO, in terms of common whitespaces, does the OP mean that which line has the fewest leading spaces, that is the number of spaces that is to be removed from each line?
źródło
Stacked, noncompeting, 43 bytes
Try it online!
This works by finding the amount of spaces at the beginning of each line (
'^ +'match$#'"!
), getting the minimum, repeat a space that many times, and replacing that with nothing on each line.źródło
Vim,
33, 31 bytesTry it online!
Old version:
źródło
Stax, 9 bytes
Run and debug it
źródło
CoffeeScript, 112 bytes
źródło
JavaScript (ES6),
10698 bytesThe newlines are necessary and are counted as 1 byte each:
Demo
As with other ES6 answers, they only work in Firefox at the moment.
źródło
JavaScript ES6, 85 bytes
The new lines are significant
ES5 Demo:
źródło
JavaScript (ES6) 56
Recursive, trying to remove one space at a time from each row until a non-space is found.
Test running the snippet below - being ES6, Firefox only
źródło