Lub „Zamień pierwszą i ostatnią literę każdego słowa”
Twoim wyzwaniem jest, biorąc pod uwagę ciąg znaków alfabetycznych ASCII, a także jeden inny znak, który będzie używany jako separator (do oddzielenia każdego słowa), zamień pierwszą i ostatnią literę każdego słowa. Jeśli istnieje słowo składające się z jednego znaku, zostaw je w spokoju.
Przykłady / przypadki testowe używają małych liter i spacji jako separatora.
Nie musisz obsługiwać interpunkcji; wszystkie dane wejściowe będą składały się wyłącznie z liter od a do z, oddzielonych separatorem, wszystkie w jednolitej wielkości.
Na przykład ciąg „hello world”:
Input string: "hello world"
Identify each word: "[hello] [world]"
Identify the first and last letters of each word: "[[h]ell[o]] [[w]orl[d]]"
Swap the first letters of each word: "[[o]ell[h]] [[d]orl[w]]"
Final string: "oellh dorlw"
UWAGA: separatora nie trzeba wprowadzać osobno. Separator to po prostu znak używany do oddzielania słów. To może być wszystko. Chciałem pozostawić otwarte opcje dla kreatywnych golfistów, więc nie chciałem ograniczać go do samych spacji lub nowych linii. Separator to tylko znak, który oddziela słowa w ciągu wejściowym.
Przypadki testowe:
"swap the first and last letters of each word" -> "pwas eht tirsf dna tasl setterl fo hace dorw"
"hello world" -> "oellh dorlw"
"test cases" -> "test sasec"
"programming puzzles and code golf" -> "grogramminp suzzlep dna eodc folg"
"in a green meadow" -> "ni a nreeg weadom"
"yay racecar" -> "yay racecar"
Hello, world!
staje się,elloH !orldw
(zamiana interpunkcji na literę) luboellH, dorlw!
(utrzymanie interpunkcji na miejscu)?Odpowiedzi:
TeX, 216 bajtów (4 linie, po 54 znaki każda)
Ponieważ nie chodzi o liczbę bajtów, chodzi o jakość wydruku składu :-)
Wypróbuj online! (Na odwrocie; nie jestem pewien, jak to działa)
Pełny plik testowy:
Wydajność:
Do LaTeX potrzebujesz tylko płyty grzewczej:
Wyjaśnienie
TeX to dziwna bestia. Czytanie normalnego kodu i rozumienie go jest wyczynem samym w sobie. Zrozumienie zaciemnionego kodu TeX idzie o kilka kroków dalej. Spróbuję uczynić to zrozumiałym dla osób, które również nie znają TeXa, więc zanim zaczniemy, oto kilka pomysłów na temat TeXa, aby ułatwić śledzenie:
Dla (nie) absolutnych początkujących TeX-ów
Pierwszy i najważniejszy element tej listy: kod ma nie być w kształcie prostokąta, choć popkultura może prowadzić cię tak myśleć .
TeX to język rozwijania makr. Możesz na przykład zdefiniować,
\def\sayhello#1{Hello, #1!}
a następnie napisać,\sayhello{Code Golfists}
aby TeX wydrukowałHello, Code Golfists!
. Nazywa się to „nieelimitowanym makrem” i aby podać mu pierwszy (i tylko w tym przypadku) parametr, umieść go w nawiasach klamrowych. TeX usuwa te nawiasy klamrowe, gdy makro pobiera argument. Możesz użyć do 9 parametrów:\def\say#1#2{#1, #2!}
wtedy\say{Good news}{everyone}
.Odpowiednikiem undelimited makra są, nic dziwnego, rozdzielany te :) Można zrobić poprzednia definicja odrobinę bardziej semantyczne :
\def\say #1 to #2.{#1, #2!}
. W takim przypadku po parametrach następuje tak zwany tekst parametru . Taki tekst parametru ogranicza argument makra (#1
jest ograniczony przez␣to␣
spacje i#2
jest ograniczony przez.
). Po tej definicji możesz napisać\say Good news to everyone.
, która rozwinie się doGood news, everyone!
. Fajnie, prawda? :) Jednak ograniczonym argumentem jest (cytując TeXbooka ) „najkrótszą (być może pustą) sekwencję tokenów z odpowiednio zagnieżdżonymi{...}
grupami, po której następuje na wejściu ta konkretna lista tokenów nieparametrycznych”. Oznacza to, że rozszerzenie\say Let's go to the mall to Martin
wyda dziwne zdanie. W tym przypadku trzeba by „ukryć” Pierwszy␣to␣
z{...}
:\say {Let's go to the mall} to Martin
.Jak na razie dobrze. Teraz zaczyna się robić dziwnie. Kiedy TeX odczytuje znak (który jest zdefiniowany przez „kod znaku”), przypisuje temu znakowi „kod kategorii” (catcode, dla znajomych :), który określa, co ten znak będzie oznaczał. Ta kombinacja znaków i kod kategorii sprawia tokena (więcej na ten temat tutaj , na przykład). Te, które są dla nas tutaj interesujące, to w zasadzie:
catcode 11 , który definiuje tokeny, które mogą tworzyć sekwencję kontrolną (szykowna nazwa makra). Domyślnie wszystkie litery [a-zA-Z] są kodem kat. 11, więc mogę napisać
\hello
, że jest to jedna pojedyncza sekwencja kontrolna, podczas\he11o
gdy sekwencja kontrolna,\he
po której następują dwa znaki1
, a następnie literao
, ponieważ1
nie jest to kod kat. 11. Jeśli I tak\catcode`1=11
, od tego momentu\he11o
będzie jedna sekwencja kontrolna. Jedną ważną rzeczą jest to, że kody te są ustawiane, gdy TeX po raz pierwszy widzi postać pod ręką, a taki kod jest zamrożony ... NA ZAWSZE! (mogą obowiązywać warunki)catcode 12 , które są większością innych znaków, takich jak
0"!@*(?,.-+/
i tak dalej. Są najmniej specjalnym typem kodu, ponieważ służą tylko do pisania rzeczy na papierze. Ale hej, kto używa TeXa do pisania?!? (ponownie mogą obowiązywać warunki)catcode 13 , co jest piekłem :) Naprawdę. Przestań czytać i zrób coś ze swojego życia. Nie chcesz wiedzieć, co to jest catcode 13. Słyszałeś kiedyś o piątku, 13? Zgadnij, skąd wzięła się jego nazwa! Kontynuuj na własne ryzyko! Znak catcode 13, zwany również „aktywnym” znakiem, nie jest już tylko znakiem, to samo makro! Możesz to zdefiniować, aby mieć parametry i rozwinąć do czegoś takiego, jak widzieliśmy powyżej. Po tym
\catcode`e=13
, jak myślisz, że możesz\def e{I am the letter e!}
, ALE. TY. NIE MOŻE!e
nie jest już listem, więc\def
nie\def
wiesz, to jest\d e f
! Och, wybierz inny list, który mówisz? W porządku!\catcode`R=13 \def R{I am an ARRR!}
. Bardzo dobrze, Jimmy, spróbuj! Odważę się to zrobić i napisaćR
w kodzie! To właśnie jest catcode 13. JESTEM SPOKOJNY! Przejdźmy dalej.OK, teraz do grupowania. Jest to dość proste. Jakiekolwiek przypisania (
\def
jest to operacja przypisania\let
(przejdziemy do niej)) jest inna) wykonywane w grupie, są przywracane do stanu sprzed rozpoczęcia grupy, chyba że przypisanie ma charakter globalny. Istnieje kilka sposobów zakładania grup, jeden z nich zawiera kod 1 i 2 znaki (och, znowu kody). Domyślnie{
jest to catcode 1 lub grupa}
początkowa , a catcode 2 lub grupa końcowa. Przykład:\def\a{1} \a{\def\a{2} \a} \a
to drukuje1 2 1
. Na zewnątrz\a
była grupa1
, potem wewnątrz została na nowo zdefiniowana2
, a kiedy grupa się zakończyła, została przywrócona1
.Ta
\let
operacja jest kolejną operacją przypisania\def
, ale raczej inną. Z\def
ty definiować makra, które rozwinie się rzeczy, o\let
utworzeniu kopii już istniejących rzeczy. Po\let\blub=\def
(=
opcja jest opcjonalna) możesz zmienić począteke
przykładu z powyższego elementu catcode 13 na\blub e{...
i bawić się z nim. Albo lepiej, zamiast zerwania rzeczy można naprawić (by spojrzeć na to!) NaR
przykład:\let\newr=R \catcode`R=13 \def R{I am an A\newr\newr\newr!}
. Szybkie pytanie: czy możesz zmienić nazwę\newR
?Wreszcie tak zwane „przestrzenie fałszywe”. Jest to rodzaj tematu tabu, ponieważ są ludzie, którzy twierdzą, że reputacja zdobyta w TeX - LaTeX Stack Exchange , odpowiadając na pytania „fałszywych spacji”, nie powinna być brana pod uwagę, podczas gdy inni całkowicie się nie zgadzają. Z kim się zgadzasz? Postaw zakłady! Tymczasem: TeX rozumie podział linii jako spację. Spróbuj napisać kilka słów z podziałem linii (nie pustą linią ) między nimi. Teraz dodaj
%
na końcu tych wierszy. To tak, jakbyś „komentował” te przestrzenie na końcu linii. To jest to :)(Trochę) odhaczanie kodu
Zróbmy z tego prostokąta coś (prawdopodobnie) łatwiejszego do naśladowania:
Objaśnienie każdego kroku
każda linia zawiera jedną instrukcję. Chodźmy jeden po drugim, analizując je:
{
Najpierw zakładamy grupę, aby niektóre zmiany (mianowicie zmiany kodu źródłowego) były lokalne, aby nie zakłócały tekstu wejściowego.
\let~\catcode
Zasadniczo wszystkie kody zaciemniania TeX-a zaczynają się od tej instrukcji. Domyślnie, zarówno w zwykłym TeX-ie, jak i LaTeX-u,
~
znak jest jedną aktywną postacią, którą można przekształcić w makro do dalszego wykorzystania. A najlepszym narzędziem do dziwnego kodowania TeXa są zmiany kodu cat, więc ogólnie jest to najlepszy wybór. Teraz zamiast\catcode`A=13
możemy napisać~`A13
(=
jest opcjonalne):~`A13
Teraz litera
A
jest aktywną postacią i możemy ją zdefiniować, aby coś zrobić:\defA#1{~`#113\gdef}
A
jest teraz makrem, które przyjmuje jeden argument (który powinien być innym znakiem). Najpierw kotokodu argumentu zostaje zmieniona na 13, aby ją uaktywnić:~`#113
(zastąpienie~
przez\catcode
i dodaj=
i masz:\catcode`#1=13
). Wreszcie pozostawia\gdef
(globalny\def
) w strumieniu wejściowym. Krótko mówiąc,A
aktywuje inną postać i rozpoczyna jej definicję. Spróbujmy:AGG#1{~`#113\global\let}
AG
pierwsza „aktywuje”G
i robi\gdef
, a następnie następnaG
rozpoczyna definicję. DefinicjaG
jest bardzo podobna do tejA
, z tą różnicą, że zamiast\gdef
niej robi\global\let
(nie ma takiej\glet
jak\gdef
). Krótko mówiąc,G
aktywuje postać i sprawia, że staje się czymś innym. Zróbmy skróty do dwóch poleceń, których użyjemy później:GFF\else
GHH\fi
Teraz zamiast
\else
i\fi
możemy po prostu użyćF
iH
. Znacznie krótszy :)AQQ{Q}
Teraz używamy
A
ponownie zdefiniować inny makraQ
. Powyższe stwierdzenie w zasadzie ma (w mniej zaciemnionym języku)\def\Q{\Q}
. To nie jest strasznie interesująca definicja, ale ma ciekawą funkcję. Jeśli nie chcesz złamać jakiegoś kodu, jedynym makrem, które się rozwija,Q
jestQ
samo, więc działa jak unikalny znacznik (nazywa się kwark ). Możesz użyć\ifx
warunkowego do sprawdzenia, czy argumentem makra jest taki kwark z\ifx Q#1
:AII{\ifxQ}
więc możesz być całkiem pewien, że znalazłeś taki znacznik. Zauważ, że w tej definicji usunąłem spację między
\ifx
iQ
. Zwykle prowadziłoby to do błędu (zwróć uwagę, że podświetlanie składni uważa, że\ifxQ
to jedno), ale ponieważ terazQ
jest catcode 13, nie może utworzyć sekwencji kontrolnej. Uważaj jednak, aby nie rozwinąć tego kwarka, w przeciwnym razie utkniesz w nieskończonej pętli, ponieważQ
rozwija się doQ
którego rozwija się doQ
którego ...Po zakończeniu wstępnych przygotowań możemy przejść do właściwego algorytmu pwas eht setterl. Z powodu tokenizacji TeX-a algorytm musi być zapisany wstecz. Wynika to z tego, że w momencie tworzenia definicji TeX będzie tokenizował (przypisywał kody) do znaków w definicji przy użyciu bieżących ustawień, na przykład, jeśli:
dane wyjściowe są
E1
, natomiast jeśli zmienię kolejność definicji:wyjście jest
11
. Jest tak, ponieważ w pierwszym przykładzieE
definicja była tokenizowana jako litera (kod 11) przed zmianą kodu, więc zawsze będzie to literaE
. W drugim przykładzieE
został jednak najpierw uaktywniony, a dopiero potem\one
został zdefiniowany, a teraz definicja zawiera kod kat. 13,E
który rozwija się1
.Przeoczę jednak ten fakt i zmienię kolejność definicji, aby uzyskać logiczną (ale nie działającą) kolejność. W poniższych akapitach można założyć, że litery
B
,C
,D
, iE
są aktywne.\gdef\S#1{\iftrueBH#1 Q }
(zauważ, że w poprzedniej wersji był mały błąd, nie zawierał on końcowego miejsca w powyższej definicji. Zauważyłem to tylko podczas pisania tego. Czytaj dalej, a zobaczysz, dlaczego potrzebujemy tego, aby poprawnie zakończyć makro. )
Najpierw musimy zdefiniować makro poziomie użytkownika
\S
. Ten nie powinien być aktywną postacią, aby mieć przyjazną (?) Składnię, więc makro dla gwappins eht setterl to\S
. Makro zaczyna się od zawsze prawdziwego warunku\iftrue
(wkrótce będzie jasne, dlaczego), a następnie wywołujeB
makro, poH
którym następuje (które wcześniej zdefiniowaliśmy\fi
) w celu dopasowania do\iftrue
. Następnie pozostawiamy argument makra,#1
po którym następuje spacja i kwarkQ
. Załóżmy, że używamy\S{hello world}
, a następnie strumienia wejściowegopowinien wyglądać tak:\iftrue BHhello world Q␣
(ostatnie miejsce zastąpiłem␣
tak, aby renderowanie strony go nie zjadło, tak jak w poprzedniej wersji kodu).\iftrue
jest prawdą, więc się rozszerza i zostajemy z tymBHhello world Q␣
. TeX czy nie usunąć\fi
(H
) po warunkowe ocenia się, zamiast tego pozostawia go tam, dopóki\fi
jest faktycznie rozszerzony. TerazB
makro jest rozwinięte:ABBH#1 {HI#1FC#1|BH}
B
jest ograniczonym makrem, którego tekstem parametru jestH#1␣
, więc argumentem jest cokolwiek pomiędzyH
spacją. Kontynuując przykład powyżej strumienia wejściowego przed rozszerzeniemB
jestBHhello world Q␣
.B
po nim następujeH
, tak jak powinien (w przeciwnym razie TeX spowodowałby błąd), następnie następna spacja znajduje się pomiędzyhello
iworld
, podobnie#1
jak słowohello
. I tutaj musimy podzielić tekst wejściowy na spacje. Yay: D EkspansjaB
usuwa wszystko aż do pierwszego miejsca ze strumienia wejściowego i zastępuje przezHI#1FC#1|BH
z#1
byciahello
:HIhelloFChello|BHworld Q␣
. Zauważ, żeBH
w strumieniu wejściowym pojawiło się nowe , aby wykonać rekursję ogonaB
i przetwarzaj późniejsze słowa. Po przetworzeniu tego słowa przetwarzaB
następne słowo, dopóki słowem do przetworzenia nie będzie kwarkQ
.Q
Potrzebna jest ostatnia spacja po , ponieważ rozdzielane makroB
wymaga jednego na końcu argumentu. W poprzedniej wersji (patrz historia edycji) kod byłby źle zachowany, gdyby go używałeś\S{hello world}abc abc
(odstęp międzyabc
literami zniknąłby).OK, z powrotem do strumienia wejściowego:
HIhelloFChello|BHworld Q␣
. Najpierw jestH
(\fi
), który kończy inicjał\iftrue
. Teraz mamy to (pseudokodowane):I...F...H
Zdaniem jest rzeczywiście\ifx Q...\else...\fi
struktura. Na\ifx
test sprawdza, czy (pierwszy znak w słowie) chwycił jestQ
twaróg. Jeśli to nie ma nic innego do roboty, a kończy wykonanie, w przeciwnym razie, co pozostaje, to:Chello|BHworld Q␣
. TerazC
jest rozwinięty:ACC#1#2|{D#2Q|#1 }
Pierwszy argument
C
jest undelimited, więc jeśli usztywnione będzie pojedynczy element drugi argument jest ograniczona|
, więc po rozszerzeniuC
(z#1=h
a#2=ello
) strumień wejściowy:DelloQ|h BHworld Q␣
. Zauważ, że inny|
jest tam umieścić, ah
odhello
kładzie się po tym. Połowa zamiany jest zakończona; pierwsza litera jest na końcu. W TeX łatwo jest zdobyć pierwszy token z listy tokenów. Proste makro\def\first#1#2|{#1}
otrzymuje pierwszą literę, gdy używasz\first hello|
. Ten ostatni stanowi problem, ponieważ TeX zawsze pobiera jako argument argument „najmniejszą, być może pustą” listę tokenów, dlatego potrzebujemy kilku obejść. Kolejnym elementem na liście tokenów jestD
:ADD#1#2|{I#1FE{}#1#2|H}
To
D
makro jest jednym z obejść i jest przydatne w jedynym przypadku, gdy słowo ma jedną literę. Załóżmy, że zamiast tegohello
mieliśmyx
. W takim przypadku strumień wejściowy byłbyDQ|x
wtedyD
rozszerzy (z#1=Q
i#2
opróżniania) i:IQFE{}Q|Hx
. Jest to podobne do blokuI...F...H
(\ifx Q...\else...\fi
) wB
, który zobaczy, że argumentem jest kwark i przerwie wykonywanie pozostawiając tylkox
do składu. W innych przypadkach (powracających nahello
przykład),D
by poszerzyć (z#1=e
a#2=lloQ
) na adres:IeFE{}elloQ|Hh BHworld Q␣
. Ponownie,I...F...H
będzie sprawdzałQ
, ale nie powiedzie się i podjąć\else
oddział:E{}elloQ|Hh BHworld Q␣
. Teraz ostatni kawałek tej rzeczy,E
makro rozwinąłoby się:AEE#1#2#3|{I#3#2#1FE{#1#2}#3|H}
Tekst parametru tutaj jest dość podobny do
C
iD
; pierwszy i drugi argument są nieograniczone, a ostatni jest ograniczony przez|
. Wygląda jak ten strumień wejściowy:E{}elloQ|Hh BHworld Q␣
, a następnieE
rozszerza się (z#1
pusta#2=e
, i#3=lloQ
):IlloQeFE{e}lloQ|HHh BHworld Q␣
. KolejnyI...F...H
blok sprawdza kwark (który widzil
i zwracafalse
):E{e}lloQ|HHh BHworld Q␣
. TerazE
ponownie się rozszerza (z#1=e
puste,#2=l
i#3=loQ
)IloQleFE{el}loQ|HHHh BHworld Q␣
. I znowuI...F...H
. Makro wykonuje jeszcze kilka iteracji, aż wQ
końcu zostanie znalezione itrue
brana jest gałąź:E{el}loQ|HHHh BHworld Q␣
->IoQlelFE{ell}oQ|HHHHh BHworld Q␣
->E{ell}oQ|HHHHh BHworld Q␣
->IQoellFE{ello}Q|HHHHHh BHworld Q␣
. Teraz kwark został odnaleziony i warunkowe rozszerza się do:oellHHHHh BHworld Q␣
. UffOch, czekaj, co to jest? NORMALNE LITERY? O chłopie! Litery są w końcu znaleźć i TeX spisuje
oell
, to bandaH
(\fi
) znajdują i rozszerzony (do zera), pozostawiając strumień wejściowy z:oellh BHworld Q␣
. Teraz pierwsze słowo zamienia pierwszą i ostatnią literę, a TeX znajduje następne,B
aby powtórzyć cały proces dla następnego słowa.}
W końcu kończymy grupę, która zaczęła się tam ponownie, aby wszystkie zadania lokalne zostały cofnięte. Lokalne zadania są zmiany kotokodu liter
A
,B
,C
, ..., które zostały wykonane makra tak, że wracają do normalnego literę znaczenia i może być bezpiecznie stosowany w tekście. I to wszystko. Teraz\S
zdefiniowane tam makro uruchomi przetwarzanie tekstu jak wyżej.Jedną interesującą rzeczą w tym kodzie jest to, że można go w pełni rozbudowywać. Oznacza to, że możesz bezpiecznie używać go do przenoszenia argumentów bez obawy, że wybuchnie. Możesz nawet użyć kodu, aby sprawdzić, czy ostatnia litera słowa jest taka sama jak druga (z dowolnego powodu, którego byś potrzebował) w
\if
teście:Przepraszam za (prawdopodobnie zdecydowanie zbyt) mylące wyjaśnienie. Starałem się, aby było to tak jasne, jak to możliwe, również dla TeXies :)
Podsumowanie dla niecierpliwych
Makro
\S
uzupełnia dane wejściowe aktywną postacią,B
która chwyta listy tokenów rozdzielonych spacją i przekazuje je doC
.C
bierze pierwszy token z tej listy i przenosi go na koniec listy tokenów i rozwijaD
wraz z resztą.D
sprawdza, czy „to, co pozostaje” jest puste, w którym to przypadku znaleziono jedno literowe słowo, a następnie nic nie rób; w przeciwnym razie rozszerza sięE
.E
zapętla listę tokenów, aż znajdzie ostatnią literę w słowie, po znalezieniu pozostawia ostatnią literę, a następnie środek słowa, a następnie pierwszą literę pozostawioną na końcu strumienia tokenu przezC
.źródło
JavaScript (ES6),
3936 bajtówZaoszczędź 3 bajty dzięki @FryAmTheEggman
Używa kanału jako separatora.
Wypróbuj online!
źródło
(.)(.*)(.)
czy to jest emotikon Total Recall?Siatkówka ,
85 bajtówWypróbuj online!
Zaoszczędzono 3 bajty dzięki Kevin Cruijssen !
Używa nowej linii jako separatora. Korzystamy z odwrotnego etapu Retiny i niektórych ograniczeń. Pierwszym limitem jest to, do którego dopasowania zostanie zastosowane odwrócenie, więc wybieramy je wszystkie
,
. Następnie chcemy, aby pierwsza i ostatnia litera każdego dopasowania została zamieniona, więc bierzemy każdą literę z zakresu,,,
który przekłada się na zakres od początku do końca z krokiem wielkości zero.źródło
V
, ale nie wiedziałem, że można go używać z1,-2
takimi wskaźnikami . Niezłe!Pepe ,
107105 bajtówWypróbuj online!
Wyjaśnienie:
Notacja na komentarzach:
command-explanation -> (stack) // explanation
źródło
Python 3 ,
7258 bajtówWypróbuj online!
źródło
a
)laskelH , 71 bajtów
Wypróbuj online!
Przykład wejścia / wyjścia:
źródło
where
klauzuli można przenieść do wiązania na straży, aby zaoszczędzić 5 bajtów: Wypróbuj online!05AB1E , 10 bajtów
Wypróbuj online!
-3 Dzięki @Kevin Cruijssen .
źródło
|ʒRćsRćJ,
loop_as_long_as_there_are_inputs
, wtedy wiedziałbym, że 8-bajtowy:[RćsRćJ,
Ten 8-bajtowy używa[
nigdy wyjść w teorii, tylko wtedy, gdy brakuje Ci pamięci lub masz czas, jak na TIO (i wymaga to końca nowa linia w danych wejściowych, w przeciwnym razie będzie używać ostatniego słowa) ..ð¡
tylko jednego słowa, aleð¡εćsÁì}ðý
działa również z 10 bajtami.J ,
2317 bajtówWypróbuj online!
źródło
1 A.
!1&A.&.(1&|.)
->,({:,1|.}:)
a następnie możesz usunąć::]
Rubin z
-p
,424129 bajtówWypróbuj online!
źródło
\w
s literą.
s.Haskell, 54 bajty
Wypróbuj online!
źródło
Japt
-S
, 7 bajtówSpróbuj
źródło
PowerShell , 37 bajtów
Wypróbuj online!
źródło
Stax , 8 bajtów
Uruchom i debuguj
Wykorzystuje znaki nowej linii jako separatory słów.
źródło
Biała spacja , 179 bajtów
Litery
S
(spacja),T
(tab) iN
(nowa linia) dodane tylko jako wyróżnienia.[..._some_action]
dodano tylko jako wyjaśnienie.Tab jako separator. Dane wejściowe powinny zawierać końcowy znak nowej linii (lub tabulatora), w przeciwnym razie program nie będzie wiedział, kiedy zatrzymać, ponieważ wprowadzanie danych w spacji może być wykonywane tylko jeden znak na raz.
Wypróbuj online (tylko z surowymi spacjami, tabulatorami i nowymi wierszami).
Objaśnienie w pseudo-kodzie:
Program kończy się z błędem, gdy próbuje odczytać znak, gdy żaden nie jest podany w TIO (lub zawiesza się, czekając na dane wejściowe w niektórych kompilatorach Whitespace, takich jak vii5ard ).
źródło
Wolfram Language (Mathematica) , 58 bajtów
Wypróbuj online!
-22 bajty od @attinat
-12 bajtów od @ M.Stern
źródło
StringReplace
zStringExpression
SStringTake
zamiastStringReplace
:StringRiffle[StringSplit@##~StringTake~{{-1},{2,-2},{1}},#2,""]&
StringReplace[#, a : u ~~ w : u .. ~~ b : u :> b <> w <> a /. {u -> Except@#2}] &
QuadR , 20 bajtów
Po prostu utwórz trzy grupy przechwytywania składające się z 1, 0 lub więcej i 1 znaków słów, a następnie odwróci ich kolejność.
Wypróbuj online!
źródło
APL + WIN, 50 bajtów
Monituje o ciąg znaków i używa spacji jako separatora.
Wypróbuj online! Dzięki uprzejmości Dyalog Classic
źródło
Japt
-S
, 10 bajtówPrzekonany, że musi być krótsze podejście (i miałem rację ), ale na razie to wystarczy .
Spróbuj
źródło
¸®Ì+Zs1J +Zg
¸®ÎiZÌ+Zs1J
.sed, 64 bajty
źródło
.
zamiast[[:alpha:]]
, ale tak naprawdę musiałoby być[^ ]
, co zmniejsza go do 43, ale psuje interpunkcję i tak dalej. Używanie[a-zA-Z]
zwiększa go do 55, w którym momencie po prostu tęsknię za tymi słodkimi, słodkimi, czytelnymi dla człowieka istotami ...You do not need to handle punctuation; all of the inputs will only consist of the letters a through z, separated by a delimiter, all of a uniform case.
Innymi słowy, nie musisz martwić się o to, że interpunkcja „zepsuje” Twój kod i możesz po prostu bezpiecznie iść[^ ]
;)[^ ]
powinno być,[^[:space:]]
co prowadzi do 67 znaków.sed , 34 bajty
I prawdopodobnie koncepcja wzorca będzie działać z większością narzędzi RE (i wiem, że istnieją różnice między standardową RE a rozszerzoną RE).
Wypróbuj online!
źródło
\b
od dopasowania: Wypróbuj online!\b
prowadzi do 30 bajtów..
do zamiany znaków, a możesz stracić kolejne dwa znaki. To sprowadza twoje do 26 bajtów; jedno z najmniejszych czytelnych rozwiązań.s,\b(.)(\w*)(.)\b,\3\2\1,g
\w
s na końcach.s,\b(\w)(\w*)(\w)\b,\3\2\1,g
28 znaków.Rubin, 53 bajty
Próbowałem bez wyrażenia regularnego. Wyjście wypisuje każde słowo w nowym wierszu. Jeśli jest to niezgodne z zasadami, daj mi znać, a ja to naprawię.
Nie golfowany:
źródło
p
nie było dobre, ponieważ dodawało to cudzysłowy do wyniku. Zawsze możesz użyćputs
zamiast tego, ponieważ ten automatycznie dołącza nowy wiersz i jest krótszy niżprint
! Ponadto, jeśli wywołujeszsplit
bez argumentów, automatycznie dzieli się na spacje.8088 Montaż, IBM PC DOS,
3938 bajtówNiezmontowane:
Samodzielny plik wykonywalny DOS dla komputera PC. Wejście za pomocą argumentów wiersza poleceń, wyjście na ekran.
Pobierz i przetestuj PWAS.COM .
źródło
Perl 5
-p
, 24 bajtówWypróbuj online!
źródło
Partia, 141 bajtów
Pobiera dane wejściowe jako parametry wiersza polecenia. Manipulowanie ciągami jest w najlepszym wypadku tragiczne w Batch, a konieczność stosowania pojedynczych liter w szczególnych przypadkach nie pomaga.
źródło
C # (interaktywny kompilator Visual C #) , 90 bajtów
Używa znaku nowej linii jako separatora, chociaż tak naprawdę można użyć dowolnej białej spacji.
Wypróbuj online!
źródło
Ikona , 76 bajtów
Wypróbuj online!
źródło
Java,
110109 bajtów-1 bajtów przy użyciu nowego wiersza dla ogranicznika
TIO
źródło
Haskell ,
7574 bajtówNaprawiono błąd wskazywany przez Cubic, a także zmniejszany o 1 bajt.
Wypróbuj online!
źródło
map g
jest krótszy niż(g<$>)
a
waa
Scala, 100 bajtów
źródło
T-SQL, 126 bajtów
Dane wejściowe pochodzą z wcześniej istniejącej tabeli t z polem varchar v , zgodnie z naszymi standardami IO .
Czytanie od tyłu do przodu,
STRING_SPLIT
dzieli ciąg na pojedyncze rzędy za pomocą separatora,STUFF
modyfikuje znaki w określonych pozycjach, a następnieSTRING_AGG
ponownie je łączy.źródło