Pangram to zdanie lub fragment, który zawiera wszystkie dwadzieścia sześć liter alfabetu, jak pokazano w tym wyzwaniu golfowym . Jednak okno pangramatyczne to pangram w postaci jakiegoś segmentu tekstu, który może kończyć się lub rozpoczynać w połowie słowa, znalezionego gdzieś w większym dziele. Występują one naturalnie wszędzie, będąc odpowiednimi podzbiorami prawdziwych pangramów, więc po prostu sprawdzenie, czy coś zawiera okno pangramatyczne, byłoby nudne, a także wcześniej.
Jesteśmy więc zainteresowani znalezieniem najmniejszego tekstu w danym fragmencie tekstu na podstawie jego długości litery! Oczywiście w możliwie najkrótszym kodzie w bajtach, aby pasował do motywu.
Zasady i wytyczne
- Odbierz ciąg wejściowy i zwróć ciąg najmniejszego okna pangramatycznego na wejściu, jeśli taki istnieje. Jeśli nie, zwróć wartość logiczną Fałsz lub pusty ciąg.
- To, czy napis jest oknem pangramatycznym, czy nie, nie uwzględnia wielkości liter i zależy tylko od 26 liter, a nie od znaków interpunkcyjnych, cyfr i innych nieparzystych symboli.
- Podobnie, długość litery okna pangramatycznego jest całkowitą liczbą wyświetleń liter przypadków, w których występują w nim , a nie tylko liczbą każdego znaku. Zwrócona wartość musi być najmniejsza na podstawie tej liczby. W końcu jesteśmy językoznawcami, a nie programistami.
- Dane wyjściowe okna pangramatycznego muszą jednak być dokładnym podciągiem wejściowym, zawierającym tę samą wielkość liter i interpunkcję itp.
- Jeśli istnieje wiele najkrótszych okien pangramatycznych o tej samej długości litery, zwróć dowolne z nich.
Przypadki testowe
'This isn't a pangram.'
==> False
'Everyone knows about that infamous Quick-Brown-Fox (the one who jumped over some lazy ignoramus of a dog so many years ago).'
==> 'Quick-Brown-Fox (the one who jumped over some lazy ig'
'"The five boxing wizards jump quickly." stated Johnny, before beginning to recite the alphabet with a bunch of semicolons in the middle. "ABCDEFGHI;;;;;;;;;;;;;;;JKLMNOPQRSTUVWXYZ!" he shouted to the heavens.'
==> 'ABCDEFGHI;;;;;;;;;;;;;;;JKLMNOPQRSTUVWXYZ'
The five boxing wizards jump quickly
zwracany?Q
? Nie dodaje się do liczby liter.Odpowiedzi:
Pyth,
201614 bajtówWyjaśnienie:
Wypróbuj tutaj!
Gdy nie ma poprawnego rozwiązania, program kończy pracę z błędem bez wyjścia na standardowe wyjście.
źródło
!-GrT0
jest też krótszy dla stanu filtra. Myślę też, że potrzebujesz,l
aby sortowanie działało poprawnie.l
, a bez niego uzyskasz różne wyniki . Uważam, że problemem są powtarzające się litery, ale nie jestem w 100% pewien.Pyth - 22 bajty
\ o / FGITW!
Pakiet testowy .
źródło
Rubinowy, 100 bajtów
Zwraca zero, jeśli nie znaleziono okna.
źródło
JavaScript (ES6),
139138136 bajtówZaoszczędź 2 bajty dzięki @Neil!
Zębaty
źródło
[r=l="",...s].map((_,b,a)=>
?map
funkcji.PowerShell v2 +, 218 bajtów
Tak, więc manipulowanie podciągami (nie ma żadnych wbudowanych) nie jest tak naprawdę mocnym kolorem PowerShell ...
Pobieramy dane wejściowe
param($a)
i ustawiamy nowy pusty hashtable$z
. Będzie to nasze przechowywanie kandydujących podciągnięć pangramatycznych.Używając niewielkiej modyfikacji mojego kodu z Exploded Substrings , konstruujemy wszystkie podciągi wejściowe. Tak, nawet jednoznakowe ciągi znaków interpunkcyjnych. To jest kod-golf , a nie najszybszy kod . ;-)
Wszystkie te podciągi są otoczone parenami i połączone z inną pętlą za pomocą
|%{...}
. Tymczasowo ustawiamy$y
na bieżący podłańcuch, ustawiamy licznik pomocniczy$j
i uruchamiamy kolejną pętlę65..90|%{...}
, dogodnie ponad kodami znaków ASCII dla wielkich liter. Każdą wewnętrzną pętlę robimy$y
wielkimi literami i wyciągamy.IndexOf
ten konkretny znak. Ponieważ to zwróci,-1
jeśli nie zostanie znalezione, my+1
wynik przed pomnożeniem go$j
. Zapewnia to, że jeśli nie zostanie znaleziony żaden znak,$j
będzie równy zero.Właśnie o
if
to chodzi. Jeśli$j
jest niezerowe, oznacza to, że każda litera została znaleziona co najmniej raz w podłańcuchu$y
, więc musimy dodać to do naszej puli kandydatów. Robimy to, pobierając$y
i-replace
zapisując każdą nie-literę niczym, co daje nam długość litery tego podłańcucha. Używamy tego jako indeksu do tablicy mieszającej$z
i przechowujemy$y
pod tym indeksem. To dziwne, że zastępuje podciągi o tej samej długości literą, które występują „najdalej” w oryginalnym ciągu, ale jest to dozwolone przez reguły, ponieważ martwimy się tylko o długość liter.Wreszcie musimy uporządkować
$z
i wyciągnąć najmniejsze. Musimy użyć.GetEnumerator
wywołania, aby posortować obiekty wewnątrz$z
, a następniesort
te naName
(tj. Indeks długości od góry), wybierając ten[0]
(tj. Najkrótszy) i wyprowadzając jego.Value
(tj. Podłańcuch). Jeśli żaden taki podłańcuch nie pasuje, spowoduje to wyrzucenie błędu (Cannot index into a null array
) przy próbie indeksowania$z
i wyprowadzenie nic, co jest falsey w PowerShell. (trzeci przypadek testowy poniżej ma wyraźną obsadę,[bool]
aby to pokazać)Przypadki testowe
źródło
Haskell, 180 bajtów
To było trudne, ale naprawdę zabawne bez importu.
Znacznie mniej golfa:
Niespodzianka, niespodzianka: jest naprawdę powolna.
źródło
Oracle SQL 11.2, 461 bajtów
Nie grał w golfa
s
Widok rozgałęzia zasilanie w znakach, a także zwraca położenie każdego znaku.Widok rekurencyjny
v
zwraca wszystkie podciągi wejściowes jest podłańcuchem
pozycji pierwszego znaku podłańcucha
l pozycji ostatniego znaku dodanego do bieżącego podłańcucha
c
Widok zwraca alfabetu, jedną literę na raza
Widok zwraca alfabet doklejane jako jeden ciągSELECT s,f,SUM(SIGN(INSTR(LOWER(s),c))
Zwraca dla każdego podciągu liczbę różnych liter w nim zawartych,
INSTR
zwraca pozycję litery w podłańcuchu, 0 jeśli nie występujeSIGN
zwraca 1, jeśli pos> 0, 0 jeśli pos = 0WHERE x=26
Filtruje podciąg zawierający cały alfabet
TRANSLATE(LOWER(s),' '||a,' ')
Usuwa każdą literę z podłańcucha
LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')
Długość w literach to długość podłańcucha minus długość podciągu bez liter
SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')),0))
Zachowuje tylko podciąg z mniejszą liczbą liter.
Jeśli jest więcej niż jeden, pierwszy zostaje posortowany jako rosnące ciągi znaków
źródło
Python 3,
171, 167, 163, 157, 149 bajtów.Zaoszczędź 4 bajty dzięki DSM.
Zaoszczędź 8 bajtów dzięki RootTwo.
Zabijanie wymaga sortowania na podstawie liczby liter.
Przypadki testowe:
źródło
.upper()
jest to potrzebne w kluczowej funkcji.PowerShell (v4),
198156 bajtówPrzypadki testowe
Niegolfowane wyjaśnienie oryginału
Jest to zagnieżdżona pętla o brutalnej sile, która sprawia, że okna przesuwne wszystkich rozmiarów:
Dla każdego okna filtruje tylko litery (domyślnie dopasowuje wyrażenie regularne bez rozróżniania wielkości liter), przepuszcza pozostałe znaki przez unikalny filtr, sprawdza, czy w teście pangram jest 26 unikalnych znaków.
Wszystkie okna z pangramami są przekształcane w tryplety (liczba liter łącznie z duplikatami, indeks początkowy, długość okna z interpunkcją) , które są sortowane w celu znalezienia najkrótszej według ogólnej liczby znaków, wybierany jest pierwszy i tworzony jest ciąg wyjściowy .
Istnieje wiele indeksowania poza granicami łańcucha, dla których PowerShell użytecznie zwraca $ null, zamiast zgłaszania wyjątków.
NB nowy 156-bajtowy numer jeden jest tym samym podejściem, ale przepisany, aby korzystać z potoku o wiele więcej.
NB nie jestem pewien, czy wersja bez golfa działa, ponieważ nie napisałem tego, a potem grałem w golfa, to tylko na wystawę.
źródło
Haskell, 123 bajty
Definiuje funkcję
h
, która zwraca pustą listę, jeśli nie ma okna pangramatycznego lub listy elementów z minimalnym oknem. Przykład użycia:Jak to działa:
źródło