W tym wyzwaniu usuniesz zduplikowane słowa z każdego zdania .
Przykłady
Hello Hello, World!
Hello, World!
Code Code! Golf Code
Code! Golf Code
Hello hello World
Hello World
Programming Golf Programming!
Programming Golf!
Specyfikacja
- Dane wejściowe będą ciągiem znaków ASCII.
- Zdanie jest definiowane jako cokolwiek do końca łańcucha, linefeed (
\n
) lub interpunkcji (.!?
). - Słowo jest zdefiniowane jako ciąg
A-Za-z
. - W słowach nie jest rozróżniana wielkość liter (
Hello
==heLlO
).
- Zachowywane jest tylko pierwsze wystąpienie słowa w zdaniu.
- Jeśli słowo zostanie usunięte, spacje przed usuniętym słowem powinny zostać usunięte. (np.
A A B
->A B
).
- Jak zawsze standardowe luki są niedozwolone.
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach!
a b a.
idzie do czego?a b.
ponieważ litera „a” została usunięta.a__b_b_a
dostajesza_b_a
(pierwszyb
usunięty) czya__b_a
(drugib
usunięty)?a__b__
ponieważ powtarzaneb
jest usuwane, a powtarzanea
jest usuwaneOdpowiedzi:
Vim, 27 bajtów
Zauważ, że 27 bajtów zawiera znak końca karetki na końcu.
Wypróbuj online! Uwaga dodatkowa: To jest link do innego języka, który piszę, o nazwie „V”. V jest w większości kompatybilny wstecz z vimem, więc dla wszystkich celów i celów może być liczony jako tłumacz vim. Dodałem również jeden bajt
%
, abyś mógł zweryfikować wszystkie przypadki testowe jednocześnie.Wyjaśnienie:
źródło
JavaScript (ES6), 98
Zauważ , że chociaż sam go znalazłem, jest irytująco podobny do @ Neila, tylko z dodatkową logiką dzielącą cały ciąg wejściowy na zdania.
Test
źródło
Siatkówka ,
6646 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Wyjaśnienie
Ponieważ tylko litery powinny być traktowane jako znaki słowne (ale regex traktuje cyfry i znaki podkreślenia również jako znaki słowne), musimy stworzyć własne granice słów. Ponieważ gwarantowane jest, że dane wejściowe zawierają tylko znaki ASCII, wstawiam
·
(poza ASCII, ale wewnątrz ISO 8859-1) wokół wszystkich słów i usuwam je ponownie z duplikatami. Pozwala to zaoszczędzić 20 bajtów w porównaniu z używaniem lookaroundów do implementacji ogólnych granic słów.To pasuje do każdego słowa i otacza je
·
.To dwa kroki skompresowane w jeden.
<sp>*(·[a-z]+·)(?<=\1[^.!?¶]+)
dopasowuje pełne słowo (zapewnione przez uwzględnienie·
w dopasowaniu), wraz ze spacjami poprzedzającymi go, pod warunkiem, że (jak zapewnia lookbehind) możemy znaleźć to samo słowo gdzieś wcześniej w zdaniu. (¶
Pasuje do linii).Druga część to po prostu ta
·
, która odpowiada wszystkim sztucznym granicom słów, które nie zostały dopasowane w pierwszej połowie. W obu przypadkach dopasowanie jest po prostu usuwane z łańcucha.źródło
C, 326 bajtów
Kto potrzebuje wyrażeń regularnych?
źródło
Perl 6 , 104 bajtów
Stosowanie:
Wyjaśnienie
źródło
Perl 5, 57 bajtów
Kod 56 bajtów + 1 dla
-p
Stosowanie:
Może być +1, obecnie zakładam, że na wejściu będą tylko spacje, bez tabulatorów.
źródło
\s
zamiast ... Nadal nigdzie w pobliżu odpowiedzi siatkówki!