Cel:
Biorąc pod uwagę tablicę ciągów, utwórz skrócone wersje każdego ciągu.
Specyfikacja:
W przypadku tego wyzwania skrót to pierwsze N znaków ciągu. Dla napisu abc
: a
, ab
, i abc
są ważne skróty, a bc
, a ac
nie są.
Biorąc pod uwagę tablicę ciągów, chcemy znaleźć najkrótszy zestaw skrótów, taki, który biorąc pod uwagę dane wejściowe i dowolny skrót, można określić, do którego elementu danych wejściowych odnosi się skrót.
Przykład:
Wkład: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
Przeszukujemy struny, zaczynając od pierwszego.
Poniedziałek jest tylko ciągiem znaków z
M
, więc najkrótszym możliwym skrótem jestM
.Wtorek zaczyna się
T
, ale i czwartek. Oznacza to, że próbujemy łańcuchaTU
. Ponieważ żadne inne ciągi nie zaczynają się od tego, używamyTU
.Środa jest
W
, czwartek jestTh
i piątek jestF
.
Więcej przykładów:
Input: "one,two,three,four,five,six,seven"
Output: "o,tw,th,fo,fi,si,se"
Input: "red,orange,yellow,green,blue,purple"
Output: "r,o,y,g,b,p"
Input: "a,ab,abc"
Output: Not valid! No abbreviation for `a` that doesn't apply to the other items.
Uwagi:
Wprowadzasz i wyprowadzasz w dowolny rozsądny sposób.
Możesz założyć, że wejście zawsze będzie prawidłową tablicą ciągów.
Możesz założyć, że zawsze będzie rozwiązanie, w przeciwieństwie do ostatniego przypadku testowego.
Ciągi będą się składać wyłącznie z drukowalnego ASCII (lub drukowalnych znaków w twoim kodowaniu)
To jest kod golfowy, więc wygrywa najmniej bajtów!
U
na wtorek, ale małe literyh
na czwartek.Odpowiedzi:
Siatkówka , 29 bajtów
Dane wejściowe i wyjściowe są listami ciągów oddzielonymi od linii.
Wypróbuj online! (Zestaw testowy z separacją przecinków dla wygody).
Wyjaśnienie
To po prostu dopasowuje wszystkie prefiksy za pomocą jednego wyrażenia regularnego i drukuje je (
!
).m
is
są zwykłymi modyfikatorami wyrażeń regularnych służącymi do tworzenia^
początkowych linii.
dopasowania i dopasowywania kanałów.źródło
Python 2 ,
8786 bajtówWypróbuj online!
źródło
lambda a:[[b[:i]for i in range(len(b))if sum(s[:i]==b[:i]for s in a)<2][0]for b in a]
dla 85 bajtówlen(b)
z4**8
oszczędza 2 kolejne bajty, przy założeniu, że sznurki nie będzie już ponad 65536 znakówJavaScript (ES6),
81787470 bajtówPobiera dane wejściowe jako tablicę ciągów.
Sformatowane i skomentowane
Przypadki testowe
Pokaż fragment kodu
źródło
reduce
.Galaretka , 14 bajtów
Wypróbuj online!
Jak to działa
źródło
Haskell , 48 bajtów
Wypróbuj online!
f
jest główną funkcją, biorąc listęString
s i zwracając aString
. Jego definicja to skrót monadycznyf a=map (a#) a
.a#x
patrzy na ciągx
i listęa
i próbuje znaleźć najkrótszy prefiks,x
który jest unikalny wa
. Jeślia
ma jeden element, po prostu użyj pustego ciągu. Jeślia
nie jest to jeszcze jeden element, odetnij pierwszy znakx
, odfiltruj i posiekaj elementya
zaczynające się od tego samego znaku, a następnie powtórz.źródło
Mathematica, 64 bajty
źródło
Galaretka ,
1412 bajtówWypróbuj online!
Jak to działa
źródło
C ++ 11 (MinGW), 198 bajtów
Zadzwoń z:
Dodanie
void
identyfikatora przed funkcją powinno sprawić, że będzie się kompilować również w innych kompilatorach, tym samym dodając 5 bajtów do długości.źródło
void f...
, nie działa inaczej ... + 5 bajtów, niestety. Funkcje, o ile mi wiadomo, wymagają specyfikatorów typów w C ++JavaScript ES6, 70 znaków
źródło
PHP,
131 120 119118 bajtówDzięki @ Jörg za
preg_grep
.pobiera dane wejściowe z argumentów wiersza poleceń; wypisuje wyniki po jednej linii.
Uruchom
-nr
lub wypróbuj online .-
.+15 bajtów do poprawki: zastąpić drugą
$argv
zarray_slice($argv,1)
.a&
z""<
(+1 Byte) do naprawienia.Wstaw
&($t.=$c)
przed&&
i wymienić". preg_quote($t.=$c)."
z$t
.awaria
wersja bez wyrażenia regularnego,
131130 bajtówWymienić pierwszy i ostatni
a&
z""<
(+2 bajtów) do poprawki dla PHP 7.1.awaria
całkowicie nieciekawa uwaga:
strstr($u,$t)==$u
i0===strpos($u,$t)
mają tę samą długość i ten sam wynik.źródło
0x0A
) zamiast\n
, zaoszczędzi to jeden bajt;).PHP, 127 bajtów
nie działa z nieprawidłowymi tablicami
PHP, 132 bajty
Wersja online
151 bajtów obsługuje znaki specjalne
PHP, 140 bajtów
źródło
preg_quote
Make tylko 10 bajtów więcej0
. Ale możesz zaoszczędzić jeden bajt$i=+$s=""
.count()-count()
rzeczy: gwarantowane jest, że dane wejściowe są prawidłowe (-21 bajtów). Myślę, że mógłbym to naprawić i pograć w golfa do 120 bajtów.$_GET
był dobrym pomysłem!Clojure, 118 bajtów
Działa to na prefiksach o długości do,
1e2
ale ta sama liczba bajtów może obsługiwać do1e9
.i
pętle długości prefiksów,S
to sekwencja podciągów długościi
. Ten ostatnifor
zastępuje te podciągi,nil
które występują częściej niż jeden raz. Redukcja zachowuje pierwszą wartość zerową dla każdego łańcucha, szkodaor
nie jest funkcją, więc musiałem ją zawinąć.To faktycznie zwraca listy list takich jak
((\M) (\T \u) (\W) (\T \h) (\F))
, ale myślę, że jest to dopuszczalne. Clojure jest dość gadatliwy ze sznurkami isubs
rzucałbyStringIndexOutOfBoundsException
inaczejtake
.Pełne przykłady:
źródło
SQL (smak PostgreSQL 9.4), 219 bajtów
A teraz najdłuższa odpowiedź :) Nie sądzę, żeby to mogło pokonać Java. Spróbuję ogolić jeszcze kilka. Mam nadzieję pozbyć się jednego z zagnieżdżonych zapytań, ale nie podoba mi się moja szansa.
Zakłada się, że istnieje tabela zawierająca ciągi, nad którymi należy pracować. Ponieważ jest to SQL, kolejność zwrotu nie jest taka sama jak kolejność tabel, w tym przypadku jest mało prawdopodobna. Jeśli jest to problem, usunę go.
SQL Fiddle
Objaśnienie
Wewnętrzne zapytanie wykorzystuje
generate_series
iLATERAL
łączenie do tworzenia wierszy dla ciągu podzielonego na coraz większe długości, więc „jeden” staje się „o”, „włączony”, „jeden”. Utrzymywana jest również liczba znaków w zwrocie.Następnie dodajemy liczbę rekordów, które mają ten sam wynik. Na przykład „f” z czterech i pięciu ma 2, ale „fo” i „fi” mają po jednym.
OVER
Oświadczenie w SQL może być dość silny.COUNT(*)
byłby to zwykły sposób, aleSUM(1)
daje ten sam rezultat.Następnie oceniamy wyniki dla każdego wejścia na podstawie najmniejszej liczby powtórzeń i znaków.
ROW_NUMBER
tu też by działał, ale jest dłuższy.Na koniec wybieramy najniższy numer rangi dla każdego słowa.
źródło
Pure Bash , 146 bajtów
Wypróbuj online!
źródło
APL (Dyalog) , 27 bajtów
Wypróbuj online!
{
anonimowa funkcja, gdzie ⍵ reprezentuje argument ...∘.(
tabela funkcji, w której znajduje się funkcja⊃
pierwszy element⍷
lista boolowska „lewy argument zaczyna się tutaj od prawego argumentu?”)
gdzie są właściwe argumenty⍵
argumenty(
a lewy argument to↑
stół z rzędami składającymi się z,/
przedrostki¨
każdy z⍵
argumenty+/
suma w poprzek (liczy, ile argumentów ma ten prefiks)↓
podziel tabelę na listę wierszy⍳⍨¨
w każdym z nich znajdź lokalizację pierwszego1
jeden (tj. pierwszy prefiks, który kieruje tylko jednym argumentem)↑¨⍨
dla każdej lokalizacji pobiera tyle znaków z odpowiedniego elementu⍵
argument}
koniec funkcji anonimowejźródło
PowerShell,
151139 bajtówZainteresowany, jeśli jest na to lepszy sposób. Musiałem użyć znaku
foreach
(powyżej a|%
), aby móc wykonaćbreak
zagnieżdżoną pętlę bez oznaczania go.Edycja: 2 golfy z AdmBorkBork
źródło
-notin
zamiast-not$x.contains($a)
i!($w...
zamiast-not($w...
zaoszczędzić trochę bajtów, tak?APL, 26 bajtów
Wyjaśnienie:
↓↑⍵
: wstaw każdy łańcuch,⍵
aby dopasować długość najdłuższego łańcucha∘.(
...)⍨
: dla każdej możliwej pary ciągów znajdź wspólny prefiks:≢
: nierówność tablic∧
: i=
: równość w kategoriach przedmiotowych∧\
: i skanuj (zachowaj tylko wiodące mecze)+/¨
: zsumuj każdy wektor w tabeli, podając długość wspólnych prefiksów⌈/
: znajdź maksymalną wartość w każdej kolumnie1+
: dodaj jeden, podając liczbę znaków potrzebną do zachowania unikalności każdego łańcucha⍵↑¨⍨
: weź tyle znaków z każdego ciąguTest:
źródło
Q, 93 bajty
Rozwiązany rekurencyjnie, pobiera ciąg znaków jako dane wejściowe, otrzymuje pierwsze n elementów każdego ciągu przy każdej rekurencji. Jeśli którykolwiek z tych elementów nie jest unikalny, zastępuje je pierwszymi elementami n + 1.
źródło