Uzupełnianie tabulatorów to przydatna funkcja, która automatycznie uzupełnia częściowo napisane polecenia. Zamierzasz to wdrożyć.
Na przykład, jeśli dostępne byłyby polecenia ['apply','apple','apple pie','eat']
, a
uzupełniałoby to appl
, ponieważ wszystkie polecenia zaczynające się od a
również zaczynają się od appl
.
Wejście wyjście
Musisz wpisać ciąg, A i zestaw ciągów, B.
Musisz podać najdłuższy wspólny przedrostek ze wszystkich B, który zaczyna się na A.
- Jeśli żadna z opcji nie zaczyna się od A, zwróć A
- Możesz założyć, że B jest niepusty i że wszystkie ciągi są niepuste
- Nie można zakładać, że żadna z opcji zaczyna się od A, ani że wspólny prefiks będzie dłuższy niż A.
- Możesz rozróżniać małe i wielkie litery.
- Musisz tylko obsługiwać ASCII do wydruku
- Wbudowane, które jawnie wykonują to zadanie, są dozwolone
Przypadki testowe:
'a' ['apply','apple','apple pie','eat'] => 'appl'
'a' ['apple pie'] => 'apple pie'
'apple' ['eat','dine'] => 'apple'
'program' ['programa','programb'] => 'program'
'*%a(' ['*%a()-T>','*%a()-T<','@Da^n&'] => '*%a()-T'
'a' ['abs','absolute','answer'] => 'a'
'a' ['a','abs'] => 'a'
'one to' ['one to one','one to many'] => 'one to '
Zwróć uwagę na końcowe miejsce w ostatnim przypadku testowym
To jest gra w golfa , więc udziel odpowiedzi tak krótko, jak to możliwe!
\
lub'
.'
w przykładzie. Jeśli używam"
ciągów, to ciągi różnią się od innych przykładów.Odpowiedzi:
JavaScript (ES6), 75 bajtów
Objaśnienie: Filtruje we wszystkich pasujących prefiksach, a następnie łączy się z nowymi liniami i dopasowuje do wyrażenia regularnego, który znajduje najdłuższy wspólny prefiks ze wszystkich linii. Jeśli nie ma prefiksów, wyrażenie regularne zwraca pusty ciąg, w którym to przypadku po prostu zwracamy oryginalny ciąg.
źródło
e.startsWith(s)
ze.match("^"+s)
na bajt off currying zapisze kolejnąmatch
z dowolnymi drukowanymi kodami ASCII.(s,a)=>
dos=>a=>
Galaretka ,
1412 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Pyth,
1413 bajtówDzięki @isaacg za -1 bajt
Program, który pobiera listę ciągów, a następnie ciąg znaków na STDIN i drukuje wynik.
Sprawdź wszystkie przypadki testowe
Jak to działa
źródło
f}zT
=>/#z
PowerShell v3 +, 112 bajtów
Pobiera dane wejściowe jako ciąg
$a
i tablicę ciągów$b
. Używa-like
operatora do wyciągnięcia z tego tych elementów$b
(bez rozróżniania wielkości liter)$a
, jawnie rzutuje je jako tablicę@(...)
(ponieważ wynikiem może być jedno dopasowanie jako skalar, w którym to przypadku indeksowanie później się nie powiedzie) i zapisuje tę tablicę w$c
.To tworzy
if
klauzulę. Jeśli nic nie ma$c
(tzn. Nic nie zaczyna się$a
, więc tablica jest pusta), następnie wypisuje$a
za pomocąelse
. Inaczej ...Rzucamy pierwszy element
$c
jako-char
tablicę i pętlę przez każdy element, łącząc łańcuch z poprzednim$i
i umieszczając łańcuchy na rurociągu za pomocą enkapsulujących parens. Ci są filtrowane przez|?{...}
(wWhere-Object
punkcie), aby sprawdzić, czy.count
z$c
jest-eq
seksualnego do.count
rzeczy, w$c
które są-like
podciąg (tj podciąg dopasowuje wszystko w $ c). Ponieważ budujemy nasze podciągi w kolejności od najkrótszej do najdłuższej, potrzebujemy ostatniego[-1]
z powstałych ciągów.Przypadki testowe
źródło
Python 2, 122 bajty
Pełny program; pobiera ciąg i listę ze standardowego wejścia dokładnie tak, jak podano w przykładach, z tym wyjątkiem, że dane wejściowe muszą znajdować się w osobnych wierszach.
Sprawdź wszystkie przypadki testowe
źródło
l.pop()
zamiastl[-1]
?l
jest to zwykleset
w tym momencie, co nie pozwala na indeksowanie (jest nieuporządkowane). (Na szczęście obsługiwane są zarówno zestawy, jak i listypop()
.)Perl, 54 bajty
Obejmuje +2 za
-Xp
(można łączyć z-e
) i +3 za-i
(nie można łączyć)Podaj słownik na STDIN i słowo po
-i
opcji, np .:Tylko kod:
źródło
Perl, 61 bajtów
Obejmuje +2 za
-0p
Uruchom z pierwszym słowem, a następnie słowami ze słownika na STDIN:
tabcompletion.pl
:źródło
Python 2, 112 bajtów
źródło
Haskell, 67 bajtów
Funkcja pomocnicza
?
znajduje najdłuższy wspólny przedrostek dwóch łańcuchów, rekurencyjnie biorąc pierwszy znak, o ile jest taki sam dla obu łańcuchów, a łańcuchy nie są puste.Główna funkcja
%
najpierw zachowuje na liście tylko łańcuchy zaczynające się od podanejs
, sprawdzane przez najdłuższy wspólny przedrostek zs
istnieniems
. Aby poradzić sobie z brakiem ważnych konkursów, dodajes
do pustego wyniku za pośrednictwemmax
. Następnie znajduje najdłuższy wspólny przedrostek, składając funkcję binarną?
.źródło
Python 2, 75 bajtów
Dzięki @xnor za sugestię wbudowanego, pierwotnie używanego przez @BetaDecay w tej odpowiedzi .
Do celów punktacji
ÿ
można zastąpić bajtem DEL. Przetestuj na Ideone .źródło
D, 88 bajtów
Stosowanie:
Kod po prostu usuwa wszystkie elementy, od
q
których się nie zaczynap
, a następnie oblicza największą wspólną podsekwencję początkową pozostałych elementów.Parametry szablonów oszczędzają nam dwa powtórzenia
string
i jedno z nichauto
. Niewłaściwe użycie wyjątku pozwala nam uniknąć zmiennej tymczasowej i warunkowej, które w innym przypadku byłyby konieczne, aby obsłużyć przypadek, w którym brak elementów naq
początkup
.źródło
Python 2,
107102 bajtówDo celów punktacji
ÿ
można zastąpić bajtem DEL. Przetestuj na Ideone .Dzięki @xnor za uratowanie 5 bajtów!
źródło
os.path.commonprefix
znalezieniu wersji Beta Decay możesz ją wykonać za Ciebie.for c in ...
i kończy się błędem po wydrukowaniuif len(set(c))>1:print r or s;_
.PHP,
167160157152 bajtówMógłbym zapisać jeszcze 3 bajty, przypisując zmienne przy pomocy
preg_grep
ipreg_quote
, ale eh.awaria
źródło
PHP, 156 bajtów
z wielką pomocą od Tytusa Dziękujemy
PHP, 199 bajtów
32 bajty zapisywane przez Tytusa z array_unique
Wiem, że rozwiązanie Regex firmy Titus było krótsze, dopóki Tytus nie pomógł mi ulepszyć mojej drogi. Może to, co znalazłem, jest dla ciebie interesujące
źródło
$z
się$s
naprawićapple, [eat,dine]
sprawę. 2)$l=
jest przestarzały; Nie używasz tej zmiennej. (-2) 3)$i++<$m
jest krótszy niż++$i<=$m
. (-1) 4)substr($x,0,$i);
jest krótszy niżstr_split($x,$i)[0]
. (-3) 5) Możesz włożyć$r[]=$v
strlen. (-5)<2
jest krótszy niż==1
. (1) 7), można użyćstrstr
w pierwszej pętli:strstr($v,$s)==$v
. (-3)$r[]=$v;$m=max($m,strlen($v));
się$m=max($m,strlen($r[]=$v));
i upuść curlys. To nie wpływa na warunek.$m
wcale nie potrzebujesz . Wszystko czego potrzebujesz to> minimalna długość zamienników. Nowy 5) Wymień{$r[]=$v;$m=max($m,strlen($v));}
się$r[]=$v;}
i<$m
z<strlen($r[0])
(-13)$r[]=$z=$v;
w pierwszej pętli, a{$s=substr($z,0,$i);foreach($r as$x)if($x[$i]!=$z[$i])break 2;}
dla drugiej (-3)Siatkówka, 60 bajtów
Końcowa nowa linia jest znacząca. Pobiera dane wejściowe jako ciąg znaków w wierszu, a następnie każde słowo w osobnym wierszu (ale bez końcowego nowego wiersza!). Działa w sposób podobny do mojej odpowiedzi JavaScript, dopasowując najdłuższy wspólny przedrostek wszystkich linii rozpoczynających się od ciągu w pierwszym wierszu. Jeśli go nie znajdzie, to po prostu usuwa wszystkie słowa.
źródło
Scala, 119 bajtów
Nie golfowany:
Wyjaśnienie:
źródło
PowerShell , 101 bajtów
Na podstawie niesamowitego wyrażenia regularnego Naila .
Wypróbuj online!
źródło
05AB1E , 14 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Gaia , 12 bajtów
Wypróbuj online!
Pobiera dane jako B, a następnie A.
źródło