Biorąc pod uwagę niepusty ciąg składający się wyłącznie z małych i wielkich liter alfabetu i spacji ( [a-zA-Z ]
), zmniejsz go do fragmentu alfabetu, zaczynając od pierwszego znaku.
Aby zmniejszyć ciąg, zacznij od pierwszego znaku alfabetu, a następnie usuń każdy znak po nim, który nie jest kolejną literą alfabetu. Kontynuuj robienie tego, aż dojdziesz do końca łańcucha.
Na przykład codegolf
:
Rozpocznij od c
, usuń, o
ponieważ nie jest to kolejna litera alfabetu.
Zachowaj, d
ponieważ jest to kolejna litera alfabetu, i zachowaj, e
ponieważ jest to kolejna litera.
Usunąć g
, o
i l
, i zachować f
.
Twój końcowy fragment byłby wtedy cdef
Zasady
- Kapitalizacja powinna być zachowana, więc
CodEgolF
spowodowałoby toCdEF
- Spacja nie jest literą alfabetu, dlatego należy ją zawsze usuwać, nawet jeśli jest to początek ciągu
- Ze względu na charakter redukcji, pierwszy znak alfabetyczny wejścia zawsze będzie pierwszym znakiem wyjścia.
zZ
jest ostatnią literą alfabetu. Po nim nie ma liter, alfabet się nie zapętla.
Przypadki testowe
codegolf -> cdef
CodEgolf -> CdEf
codeolfg -> cdefg
ProgrammingPuzzles -> P
Stack Exchange -> St
The quick red fox jumped over the lazy brown dog -> Tuvw
Zebra -> Z
Abcdegfhijkl -> Abcdef
Punktacja
To jest golf golfowy , więc wygrywa najmniej bajtów w każdym języku !
z
Zatrzymamy się, prawda?<space>codegolf
Odpowiedzi:
JavaScript (ES6),
66796867 bajtówW jaki sposób?
Testowanie kolejnych liter
Ponieważ konwersja dwóch znaków na ich kody ASCII byłaby dość długą operacją w JS, zamiast tego używamy następującej formuły:
Pod warunkiem, że oba i b są , powyższe wyrażenie jest równe wtedy i tylko wtedy, gdy i b są kolejnymi literami (tj kolejne cyfry w bazie 36), bez względu na przypadek bohaterów.
[a-zA-Z ]
0
Na przykład:
Sformatowane i skomentowane
Przypadki testowe
Pokaż fragment kodu
źródło
Python 2 , 69 bajtów
Wypróbuj online!
Prosta redukcja ciągu. Po prostu łączymy następny znak wtedy i tylko wtedy
(ord(y)-ord(x[~0]))%32==1
. Bardzo brzydka kontrola - jestem pewien, że można ją poprawić, ale nie jestem pewien jak!źródło
from functools import*
.import functools as f
if.
jest znacznie dłuższy niżfrom functools import*
na pewno, nawet użyty raz. Zobacz ten wątek, aby uzyskać więcej informacji.Python 3 ,
75 85 84 91 81 7775 bajtówMyślę, że jest tak krótki, jak to tylko możliwe w Pythonie 3 . Można go skrócić o kilka bajtów w Pythonie 2, jak pokazano w przesłaniu Syzyfa .
Wypróbuj online!
źródło
05AB1E , 13 bajtów
Wypróbuj online!
-1 dzięki Adnan
źródło
ðK
przezá
?Brachylog , 15 bajtów
Wypróbuj online!
Będzie to 10 bajtów:
⊇.ḷ~sẠ&h~h
gdyby nie dość nieciekawe ograniczenie „łańcuchy mogą zaczynać się spacjami”.Wyjaśnienie
Ponieważ jest to dość deklaratywne, jest to również bardzo powolne.
źródło
MATL ,
181615 bajtówDzięki Mr.Xcoder za wskazanie błędu, teraz poprawionego
Litery na wyjściu są oddzielone znakami nowej linii.
Wypróbuj online!Lub sprawdź wszystkie przypadki testowe (dla zachowania przejrzystości kod stopki wyświetla wszystkie litery wyjściowe w tym samym wierszu).
Wyjaśnienie
źródło
Java (OpenJDK 8) ,
10210174 bajtyWypróbuj online!
-27 bajtów dzięki @Olivier Grégoire
źródło
s->{char c=0;for(char x:s)if(c<33&x>33|~-x%32==c%32)System.out.print(c=x);}
(zchar[]
wejściem).C # (mono) ,
129107939187 bajtówZaoszczędź 2 bajty dzięki @Mr. Xcoder.
Zaoszczędź 4 bajty dzięki @jkelm.
Wypróbuj online!
źródło
(c-1)%32
jest~-c%32
PHP, 64 + 1 bajtów
Uruchom jako potok z
-nR
lub spróbuj online .Oprócz typowych sztuczek: Kiedy
$c
dotrzeZ
,++$c
powodujeAA
,i
&__
przechowuje że długość nietknięty; więc nie$n
będzie już pasować$c
.źródło
Pyth ,
23 22 2120 bajtów-1 bajt pośrednio dzięki funkcji @Erik the Outgolfer's trick (
-Qd
) .-1 bajt dzięki @Erik the Outgolfer.
Wypróbuj tutaj.
źródło
Haskell,
106 10597 bajtówPróbowałem użyć
fromEnum
arytmetyki + char zamiast importowaniaData.Char
, ale skończyło się to dłużej ...Zaoszczędź 8 bajtów dzięki H.PWiz!
Wypróbuj online.
źródło
filter
Data.List
Pyth,
212018 bajtówWypróbuj tutaj.
Znacznie wydajniejsza 20-bajtowa wersja:
Wypróbuj tutaj.
-1 dzięki Mr. Xcoder (pośrednio).
źródło
.U+b?tlrreb1rZ1kZrz6
(myślę). Ta sztuczka mi jednak pomogła..U+b?tlrreb1rZ1kZr6
ale niestetyr <str> 6
oznacza toA.strip()
, że nie usuwam nie wiodących lub końcowych białych znaków.32
, podczas gdy wszystkie litery mają> 64
, a zatem nie wpływa na funkcjonalność. Myślę, że dotyczy to również twojej odpowiedzi.Perl 6 , 51 bajtów
Sprawdź to
Rozszerzony:
Zauważ, że
<!before …>
jest to stwierdzenie o zerowej szerokościźródło
Galaretka , 17 bajtów
Wypróbuj online!
źródło
Japt ,
181716 bajtówZaoszczędzono 1 bajt dzięki @Shaggy
Przetestuj online!
Myślałem, że to będzie trochę krótsze, ale ... Takie jest życie ...
Wyjaśnienie
źródło
rS
zx
.C # (.NET Core) ,
7060 + 18 bajtów-10 bajtów dzięki TheLethalCoder
Liczba bajtów obejmuje również:
Wypróbuj online!
1 bajt dłużej
(obecnie)(już nie) niż TheLethalCoder, więc publikowanie w celach rozrywkowych. Inne podejście z LINQ.Wykorzystuje to dwie funkcje podobne do C w C # -
char
zmienna znakowa domyślnie zachowuje się tak samo jak liczba całkowitaint
, a operator logiczny AND&&
nie wykonuje właściwej operacji, jeśli left zwraca afalse
. Objaśnienie kodu:źródło
.ToArray()
, zwracając jako,IEnumerable<char>
aby zapisać bajty.q / kdb +,
4745 bajtówRozwiązanie:
Przykłady:
Wyjaśnienie:
Wykorzystanie
mod 32
sztuczki z istniejących rozwiązań wraz z funkcją zbieżności . Iteruj po łańcuchu, jeśli różnica między ostatnim elementem wyniku (np. Zaczyna sięT
od „Szybki czerwony lis ...”) a bieżącym znakiem wynosi 1 (po byciumod
32 d), dodajemy to do wynik (stąd przyjmujemy, dlaczego bierzemylast x
), a następnie rzuć wszystko z powrotem do łańcucha.źródło
Perl 5 , 30 + 1 (-n) = 31 bajtów
Wypróbuj online!
W jaki sposób?
źródło
Siatkówka , 76 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Usuń spacje.
Potrój trzykrotnie pierwszy znak i wstaw separator.
Konwertuj drugi i trzeci znak na małe litery i zwiększaj je. Konwertuj te ostatnie na wielkie litery. To są teraz znaki wyszukiwania.
Spróbuj dopasować jeden z wyszukiwanych znaków. Jeśli zostanie znaleziony, trzykrotnie dopasuj, co spowoduje ponowne uruchomienie pętli do następnego wyszukiwania. W przeciwnym razie po prostu usuń wyszukiwane znaki i resztę danych wejściowych.
źródło
8th , 114 bajtów
Kod
Wyjaśnienie
Przykład
źródło
C (gcc) ,
79787570 bajtówWypróbuj online!
źródło
Proton , 59 bajtów
Port przesyłania Python 2 .
Wypróbuj online!
źródło
Pyth, 15 bajtów
Zestaw testowy
W przeciwieństwie do wszystkich innych odpowiedzi, nie skleja to danych wyjściowych, generuje wszystkie podsekwencje danych wejściowych, a następnie nakazuje im umieszczenie żądanego ciągu na końcu i wysyła go.
źródło
J, częściowe rozwiązanie
Publikuję to w celu uzyskania opinii i pomysłów na ulepszenia bardziej niż cokolwiek innego. Działa, ale nie obsługuje wielkości liter i spacji na krawędziach i jest już długi dla J.
Najpierw dyadyczny czasownik pomocniczy, który informuje, czy lewy i prawy argument znajdują się w kolejności alfabetycznej:
Następnie czasownik, który usuwa pierwszy element, który nie jest częścią alfabetu, zaczynając od pierwszego elementu:
Zauważ, że używamy Adverse,
::
aby zwrócić cały argument bez zmian, jeśli nie znaleziono elementu niepasującego (tj. Jeśli cały argument jest prawidłową pasmą alfabetyczną).Wreszcie, rozwiązanie jest podane przez zastosowanie
f
aż do konwergencji:Wypróbuj online!
A oto parsowana wersja
f
dla łatwiejszego czytania:Pytanie poboczne : dlaczego znaki pola nie są idealnie wyrównane, gdy są wyświetlane na SO (działają w mojej konsoli):
źródło