Już teraz wiemy, jak usunąć sznurek z jego przestrzeni.
Jednak jako właściwi panowie / panie powinniśmy raczej to rozebrać .
Rozebranie sznurka jest równoznaczne z rozebraniem go, tylko delikatniejsze. Zamiast usuwać wszystkie początkowe i końcowe spacje na raz, usuwamy je jeden po drugim . Zmieniamy też naprzemiennie na wiodące i końcowe, aby nie palić kroków.
Przykład, zaczynając od " codegolf "
(pięć początkowych i końcowych spacji):
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
Najpierw wyjście niezmienione. Następnie wypisz każdy krok. Zacznij od usunięcia wiodącej spacji (jeśli dotyczy - patrz reguła # 2).
Dane wejściowe mogą mieć inną liczbę początkowych i końcowych spacji. Jeśli zabraknie Ci miejsca po jednej stronie, rozbierasz się po drugiej, aż sznurek będzie pusty.
Dane wejściowe mogą nie mieć spacji początkowych ani końcowych. W takim przypadku wyślij go takim, jakim jest.
Użyj domyślnych metod We / Wy PPCG . PPCG Domyślne luki są zabronione.
Niezdefiniowane zachowanie przy pustych danych wejściowych lub danych zawierających tylko spacje jest OK.
Możesz założyć, że ciąg będzie zawierał tylko znaki z przestrzeni drukowalnej ASCII (
0x20
do0x7E
).
Przykłady - spacje są zastępowane kropkami .
dla lepszej czytelności:
4 leading spaces, 5 trailing: "....Yes, Sir!....."
....Yes, Sir!.....
...Yes, Sir!.....
...Yes, Sir!....
..Yes, Sir!....
..Yes, Sir!...
.Yes, Sir!...
.Yes, Sir!..
Yes, Sir!..
Yes, Sir!.
Yes, Sir!
6 leading, 3 trailing: "......Let's go golfing..."
......Let's go golfing...
.....Let's go golfing...
.....Let's go golfing..
....Let's go golfing..
....Let's go golfing.
...Let's go golfing.
...Let's go golfing
..Let's go golfing
.Let's go golfing
Let's go golfing
0 leading, 2 trailing: "Hello.."
Hello..
Hello.
Hello
0 leading, 0 trailing: "World"
World
21 leading, 5 trailing: ".....................a....."
.....................a.....
....................a.....
....................a....
...................a....
...................a...
..................a...
..................a..
.................a..
.................a.
................a.
................a
...............a
..............a
.............a
............a
...........a
..........a
.........a
........a
.......a
......a
.....a
....a
...a
..a
.a
a
Dżentelmen / dama jest zwięzły, więc wygrywa najkrótsza odpowiedź w bajtach .
0x20
do0x7E
) drukowania . Pozostałe są zachowaniem niezdefiniowanym." test\r "
lub" \v test"
znakami.".....................a....."
? Jeśli tak, proponuję go dodać, ponieważ niektóre odpowiedzi nie zdają tego rodzaju testu. (kropki są oczywiście dla lepszej czytelności)Odpowiedzi:
Siatkówka , 26 bajtów
Wypróbuj online! (Pakiet testowy używa okresów dla zachowania przejrzystości. Stopka i nagłówek konwertują je na spacje i od spacji dla kodu głównego).
Wyjaśnienie
Byłoby miło, gdybyśmy mogli po prostu naprzemiennie upuszczać miejsce na początku i na końcu i drukować wynik pośredni za każdym razem. Problem polega na tym, że obecnie Retina nie może drukować warunkowo, więc wydrukowałby nawet ten wynik pośredni, jeśli nie pozostałyby żadne początkowe lub końcowe spacje, generując duplikaty. (Retina 1.0 otrzyma opcję, która drukuje wynik tylko wtedy, gdy łańcuch został zmieniony przez operację, ale jeszcze nas nie ma ...)
Zamiast tego tworzymy pojedynczy ciąg zawierający wszystkie wyniki pośrednie i drukujemy to na końcu.
{
Owija obu etapów programu, w pętli, która powtarza się, aż przestanie się zmieniać ciąg (które pozostały oznacza, że nie są prowadzące / spacje). Sam etap dopasowuje spację wiodącą w ostatnim wierszu łańcucha i tej ostatniej linii, a następnie zapisuje dopasowanie, a także elementy po spacji w nowej linii (upuszczając w ten sposób spację wiodącą w kopii).Usunięcie końcowej spacji jest nieco łatwiejsze. Jeśli po prostu dopasujemy ostatnią spację, możemy uzyskać dostęp do rzeczy przed nią (w tym samym wierszu), z
$%`
którymi jest zależny od linii wariant podstawiania prefiksu$`
.źródło
Python 2 ,
12210710310298959391908887 bajtówWypróbuj online!
Python 3 ,
97959390 bajtówWypróbuj online!
źródło
s=input()
zamiast funkcji zajęłoby mniej bajtów.5. Undefined behaviour on empty input, or input that only contains spaces, is OK.
, 98 bajtów .a
go wbudowaną funkcją,id
aby zaoszczędzić konieczności definiowania go na początku. -2 bajty.Perl 6 , 55 bajtów
Zaoszczędź 3 bajty dzięki @nwellnhof.
Wypróbuj online!
Objaśnienie :
($_,{$++%2??S/" "$//!!S/^" "//}...*)
to rekurencyjna nieskończona sekwencja, która zaczyna się od oryginalnego ciągu ($_
), a następny element jest podawany przez blok wywołany na poprzednim elemencie.Sam blok dostaje ciąg znaków do
$_
zmiennej. OperatorS/(regex)/(string)/
wyszuka pierwsze wystąpienie(regex)
in$_
, zamieni je na(string)
i zwróci wynik. Jeśli nie ma dopasowania, zwraca zawartość$_
niezmienionej. Używamy operatora trójskładnikowego?? !!
z warunkiem$++%2
, który zmienia się na przemianFalse
iTrue
($
jest to zmienna bezpłatna, która zachowuje swoją zawartość podczas wywołań bloku).W najgorszym przypadku (wszystkie spacje po jednej stronie i 1 inna postać) usuwamy 1 spację co 2 kroki. Możemy więc być pewni, że w krokach 2 * (długość ciągu) wszystkie spacje zostaną usunięte. Bierzemy tyle elementów z sekwencji rekurencyjnej
[^.comb*2]
i ostatecznie odrzucamy duplikaty (które pojawiają się, gdy miejsce powinno zostać usunięte, ale go nie ma).unique
. Zwraca listę ciągów znaków, stopniowo usuwanych ze spacji.źródło
[^.comb*2]
oszczędza 2 bajty. Z jakiegoś powodu to działa, ale[^2*.comb]
nie działa. Nie mam pojęcia dlaczego. Użycie trójki?? !!
do wybrania wyrażenia regularnego zapisuje kolejny bajt.[^2*.comb]
i to nie działało, więc po prostu użyłem[0..2*.comb]
. I dzięki za trójkę, po prostu pomyślałem, że jest za droga i nie przyszło mi do głowy, że zastąpiłem ją czymś jeszcze droższym ...05AB1E ,
2115 bajtówWypróbuj online!
Wyjaśnienie ^
źródło
C (gcc) ,
8984 bajtówWersja rekurencyjna jest krótsza ;-)
Wypróbuj online!
C (gcc) ,
10710210110099 bajtówZaoszczędzono 2 bajty dzięki @Jonathan Frech używającej spacji i ~
Wypróbuj online!
źródło
==46
z<33
jak przestrzeń jest najmniejszym druku znaków i masz tylko do obsługi tych.++k+
zrobić?k
i dodaje jeden, który jest równoważny zk = k + 1; i = k + 1;
lubi = k + 2; k = k + 1
.i=k+++2
działa też, którego bym użył, ponieważ+++
wygląda dziwnie: PJavaScript (ES6) 92
@Upvoters: spójrz na drugą odpowiedź JS poniżej o długości 76 bajtów
Pętla szukająca miejsca z przodu lub na końcu. Jeśli znaleziono, usuń spację i ciąg wyjściowy. Jeśli 2 razy nie znaleziono miejsca, zatrzymaj się.
źródło
<'!'
. Aby Twój fragment kodu nadal działał, możeszreplace
okresowo wstawiać spacje przed przejściem do funkcji.Perl 5, 32 bajty
Zapisano 4 bajty dzięki @Abigail .
Wymaga
-pl
liczony jako 2, wywoływany z-E
.Przykładowe użycie
Wypróbuj online!
źródło
print;s/^ //&&print,s/ $//&&print while/^ | $/
działa z-n
flagą, również-l
nie jest potrzebnyC # (.NET Core) ,
192183182181179178 bajtów-3 bajty dzięki Kevin Cruijssen
Wypróbuj online!
źródło
var e=1;while(n.Trim()!=n)
->for(var e=1;n.Trim()!=n;)
;if(n[0]==' ')
->if(n[0]<33)
<33
jest to możliwe dzięki nowo dodanej regule OP: „ Możesz założyć, że ciąg będzie zawierał tylko znaki z przestrzeni wydruku (0x20
do0x7E
) ASCII . ”Java 8,
150146145137 bajtów-4 bajty dzięki zmianie @Nevay
(f<1&s.charAt(0)<33)
naf+s.charAt(0)<33
.-1 bajt przy użyciu lewy
!s.trim().equals(s)
z odpowiedzi C # .NET firmy @someone zamiasts.matches(" .*|.* ")
.-8 bajtów dzięki @Nevay ponownie, zmieniając
!s.trim().equals(s)
nas!=s.trim()
, ponieważString#trim
zwróci „ Kopię tego ciągu z usuniętymi początkowymi i końcowymi białymi spacjami lub ten ciąg, jeśli nie ma wiodących ani końcowych białych spacji ”, dlatego odniesienie pozostaje takie samo i!=
można użyć do sprawdzenia, czy są one tym samym odwołaniem, zamiast.equals
do sprawdzenia tej samej wartości.Wyjaśnienie:
Wypróbuj go tutaj (lub wypróbować wersję bardziej wizualny tutaj ze
#
zamiast spacji).źródło
s=f+s.charAt(0)<33
zamiast(f<1&s.charAt(0)<33)
(-4 bajtów).s!=s.trim()
zamiast!s.trim().equals(s);
(-8 bajtów).C,
9190 bajtówWypróbuj online!
źródło
Galaretka , 16 bajtów
Wypróbuj online!
-2 bajty dzięki Erikowi Outgolfer
-1 bajt dzięki milom
Wyjaśnienie
źródło
ḣ1Ḣ=⁶
->=⁶Ḣ
ƭ
potrzebuje tylko niladu, jeśli łańcuch jest dłuższy niż dwa.¹Ṛƭ
działa dobrze tutaj.Rubinowy , 63 bajty
Wypróbuj online!
źródło
Java (OpenJDK 8) ,
161 147146 bajtówWypróbuj online!
-1 bajt dzięki @Kevin Cruijssen !
źródło
(u=32-x.charAt(l)>>-1)
(u=32-x.charAt(l)>>k)
k
jest0
co sekundę iteracji.u
. To nie kiedy również zmieniać-1
sięk
dlav
. Jestem jednak zdezorientowany, dlaczego to działa, ponieważk
rzeczywiście stanie się0
pok=~k
...: Sk=0
scenariuszu: Jeśli pozostawiono spacje, tou
ma taką samą wartość jak przedtem (0
); jeśli pozostało, nie ma już żadnych spacji, wówczas(k=~k)&~v|u
ocenia na-1|u
(~0&-1|u
), dlatego niezdefiniowana (ujemna) wartośću
nie ma znaczenia (-1|x==-1
).05AB1E ,
2517 bajtów-8 bajtów, pożyczając od Emigny pomysł niepotrzebnego sprawdzania końca
Wypróbuj online!
Jestem pewien, że mniej proste podejście może łatwo pokonać to rozwiązanie. Na razie...
Objaśnienia:
źródło
S
zamiast#
(-1 bajtu). Pętla ... no cóż ... pozwala zaoszczędzić aż 1 bajt w porównaniu do prostego podejścia. Obecnie szukam krótszego sposobu na wykrycie końca zadania (5 bajtów to dużo), a także rozważam zupełnie inne podejście. Myślę, że istnieje bardziej sprytny sposób na rozwiązanie tego wyzwania.R ,
145133111 bajtów-12 bajtów dzięki @Giuseppe, przechowując wynik
sub
w nowej zmiennej i sprawdzając, czy się zmieniła-22 bajty, zwracając wektor ciągów zamiast ciągu z znakami nowej linii
Wypróbuj online!
Objaśnienie dotyczące częściowo nie golfowej wersji:
źródło
C(s<-sub(),\n)
zamiast osobnego wyciągu? Ach, nie, z powodusep=" "
sep=""
. W większości wyzwań dodatkowa przestrzeń końcowa nie miałaby znaczenia, ale tutaj niestety tak!sub
właśnie to sugerowało, dlaczego IDKL=s
i zwrócić wektor ciągów znaków?Java (OpenJDK 8) ,
137125121120124 bajtówWypróbuj online!
źródło
s->{for(int i=0;s!=s.trim();)System.out.println(s=s.substring(s.charAt(0)<33?1-i%2:0,s.length()-(s.endsWith(" ")?i++%2:0)));}
s->{int i=1;do System.out.println(s);while(s!=(s=s.substring(s.charAt(0)<33?i:(i=0),s.length()-(s.endsWith(" ")?i^=1:0))));}
(124 bajtów) (wydaje się być poprawny, ale nie testował wiele).MATL ,
2116 bajtówUżywa kropek zamiast spacji dla większej przejrzystości. Dla spacji zamień
46
na32
.Wypróbuj online!
Wyjaśnienie
źródło
Łuska ,
2322 bajtówDzięki Leo za -1 bajt.
Wypróbuj online!
Wyjaśnienie
Ta funkcja
`G`I
powinna być naprawdę wbudowanym ...źródło
?
wydaje się oczywiste z perspektywy czasu ...C ++,
196193189186183 bajtów-10 bajtów dzięki Jonathan Frech
-3 bajtów dzięki Zacharý
Kompilacja z MSVC wymaga dezaktywacji kontroli SDL
źródło
==32
z<33
.#include<string>
naprawdę jest to konieczne ?if(...){...;D;}
->if(...)...,D;
.#define R ...<33
,||R){
Iif(R){
->#define R ...<33)
,||R{
aif(R{
.C # (.NET Core) ,
176170 bajtówWypróbuj online!
Jest to alternatywa dla @ czyjejś odpowiedzi i po prostu wyprowadza ciągi bezpośrednio.
źródło
JavaScript (ES6), 76 bajtów
Wyjścia w postaci ciągu wielowierszowego.
Przypadki testowe
Używanie kropek zamiast spacji, jak robi większość odpowiedzi.
Pokaż fragment kodu
źródło
Sed, 24 bajty
Wypróbuj online!
źródło
Oktawa ,
8883 bajtów5 bajtów mniej dzięki Stewie Griffin!
Wypróbuj online!
źródło
min
jest potrzebna zs
powodu dynamicznego kurczenia sięKod maszynowy x86 dla systemu Linux, 60 bajtów
Jest to funkcja dla systemu Linux x86. Pobiera jako wskaźnik wejściowy do łańcucha
edi
i długości łańcucha webp
.Niegolfowane, z pewną infrastrukturą do przetestowania (kompilacja z FASM, uruchamianie z ciągiem jako argumentem programu; poszukaj
undress:
etykiety dla rzeczywistego kodu funkcji):źródło
sys_write()
robieax
niezerowe (konkretnie1
liczba napisanych znaków, zakładając, że nie jest-errno
), tak też będzie,print
jeślipop eax
na końcu tego nie zrobisz . Możesz tużxor eax,eax
przedcmp byte [edi], ' '
i zapisaćmov al,1
, a może niektóreeax
zapisać / przywrócić. Chociaż tak naprawdę nie zapisujesz go, dopóki nie zapełnisz się nimSYS_WRITE
. Hmm, zamiast0
, możesz użyćSYS_WRITE
vs.1
, ponieważcmp al, imm8
ma taki sam rozmiar jaktest al,al
.'\n'
tablicęmov byte [ecx + edx], '\n'
zamiast z drugąwrite()
? (Zmniejszając długość po wydrukowaniu?) Może zaoszczędzić kilka instrukcji.print()
obecnie odchodzi'\n'
weax
, który różni się odSYS_WRITE
, więc można jeszcze sprawdzić czy. Myślałem, że zapisujesz / przywracaszeax
, ale to było po prostu oszczędzanie bajtów kopiowania stałej wokół. W przypadku długich łańcuchówsys_write()
może pozostawić niezerowe wysokie bajty eax, co niestety wyklucza użyciemov al, SYS_WRITE
.mov al, 1
był obcy. -2 bajty teraz, dzięki.PHP , 117 bajtów
Na początku dodam dodatkowe miejsce, aby zabierało miejsce i wyświetlało oryginał bez dodatkowego kodu.
To całkiem nowe ... czy <? Php i spacja na początku pliku PHP dodają 6 dodatkowych bajtów, czy otrzymam to za darmo?
Wypróbuj online!
źródło
php -r "echo 1;"
Ale jeśli chcesz użyć czegoś takiego<?=1;
, musisz dołączyć znacznik do liczby bajtów.Pyth , 28 bajtów
Wypróbuj tutaj! lub Zweryfikuj wszystkie przypadki testowe!
Wyjaśnienie
źródło
Python 2 , 79 bajtów
-1 bajt dzięki @JonathanFrech
Wypróbuj online!
Do zastępuje suit Test
"."
z" "
przed wywołaniem funkcji i zastępuje" "
kopię do"."
przed wydrukowaniem wyniki dla jasności.źródło
'!'*i and
->i*'!'and
.C # - jeszcze raz 125 bajtów
Twoje zdrowie!
Wypróbuj online!
źródło
Oktawa , 89 bajtów
Wypróbuj online!
Wyjaśnię to później, kiedy będę miał czas. Mogę być w stanie odegrać trochę bajtów, jeśli całkowicie zmienię podejście, ale nie widzę, jak to niestety.
Ostatnie litery określają: „sendsendendend”. Chciałbym, aby istniał sposób przechowywania
end
i używania tej zmiennej, ale zgadnij, co ...źródło
s = ...
? (Wiem, że to zwykłe pytanie)Bash,
9894 bajtówZapisano 4 bajty za pomocą podpowłoki zamiast sekwencji (słaba wydajność)
Pierwsza odpowiedź
Uwaga:
!
należy uciekać w trybie interaktywnymźródło