Aby sprostać temu wyzwaniu, musisz zaimplementować Abbrev
moduł Ruby w możliwie najmniejszym kodzie.
Wyzwanie
Dane wejściowe będą takie, jak Twój język, jako tablica (tablica, lista, sekwencja itp.) Ciągów. Możesz napisać funkcję lub zaakceptować słowa rozdzielane przecinkami na STDIN.
Następnie musisz obliczyć zestaw jednoznacznych prefiksów dla tych ciągów. Oznacza to, że musisz zwrócić skrót (lub mapę, obiekt itp.) Skrótów do ich oryginalnych ciągów.
„Przedrostek” jest podciągiem oryginalnego ciągu rozpoczynającego się na początku łańcucha. Na przykład „pref” to przedrostek słowa „prefix”.
Jednoznaczne prefiks to taki, który może oznaczać tylko jedno słowo. Na przykład, jeśli dane wejściowe to
car,cat
,ca
to nie jest to jednoznaczny przedrostek, ponieważ może oznaczać „samochód” lub „kot”.Wyjątkiem od tej reguły jest to, że słowo jest zawsze przedrostkiem samego siebie. Na przykład, jeśli masz dane wejściowe, takie jak
car,carpet
,car:car
musi być w danych wyjściowych.
Następnie możesz zwrócić skrót / mapę / obiekt / itp. z funkcji (lub wykonaj odpowiednik w swoim języku) lub wydrukuj go do STDOUT
key:value
parami w formief:foo,fo:foo,...
. (Pary klucz-wartość można również oddzielić białymi spacjami, jeśli skraca to kod).
Przypadki testowe
Input code,golf,going
Output c:code,co:code,cod:code,code:code,gol:golf,golf:golf,goi:going,goin:going,going:going
Input pie
Output p:pie,pi:pie,pie:pie
Input pie,pier,pierre
Output pie:pie,pier:pier,pierr:pierre,pierre:pierre
Input a,dog
Output a:a,d:dog,do:dog,dog:dog
Zasady
Dane wejściowe nie będą zawierać zduplikowanych elementów.
Twój wynik może być w dowolnej kolejności; nie musisz tego sortować.
Nie możesz używać wbudowanego
Abbrev
modułu / funkcji / czegoś takiego jak Ruby.To jest golf golfowy , więc wygra najkrótszy kod w bajtach!
key:value\nkey:value\nkey:value
...?Odpowiedzi:
APL (46)
(Tak, zestaw znaków APL mieści się w bajcie, z miejscem na zapas).
Jest to funkcja, która pobiera listę ciągów znaków i zwraca macierz 2 na N, w której każdy wiersz zawiera jednoznaczny przedrostek i słowo, do którego należy:
Wyjaśnienie:
∆←⍵
: zapisz odpowiedni argument w∆
.{↑∘⍵¨⍳⍴⍵}¨∆
: dla każdego elementu∆
pobierz możliwe prefiksy tego elementu:⍳⍴⍵
: uzyskaj listę od1
do⍵
↑∘⍵¨
: dla każdej z tych liczb uzyskaj tyle elementów z⍵
.∪⊃,/
: połącz listy razem i weź unikalne wartości.{
...}¨
: dla każdego unikalnego prefiksu:∆/⍨⊃¨⍵∘⍷¨∆
: wybierz słowa zaczynające się od tego prefiksu(⊂⍵),
: dołącz także prefiks i konkatenuj∆/⍨2=⍴∆←
: zwraca listę tylko wtedy, gdy są dwa elementy (przedrostek i jedno pasujące słowo)↑
: zamień listę krotek w macierzźródło
Python 2.7 -
146141 bajtówZauważ, że wcięcie w liniach 4 i 5 nie jest 4 spacjami, to efekt uboczny interpretera znakowania SE. To dosłowny znak tabulacji, więc tylko jeden bajt.
Nie jest to technicznie zgodne ze specyfikacją, ale zmienię to, jeśli Klamka wyjaśni. Używa znaku nowej linii zamiast przecinków, aby oddzielić dane wyjściowe. Na przykład:
Nowość: udało mi się pozbyć 5 znaków, przypisując sprawdzany ciąg do zmiennej
e
. Oznacza to, że mam tylko wpisaće
zamiastw[:a]
trzy razy. Oznacza to również, że zapisuję postacie, robiące=w[:a+1]
i zmieniając...range(1,len(w)+1)
narange(len(w))
.Wyjaśnienie:
źródło
sum(b.startswith(e) for b in l)
zamiastlen(filter(lambda b:b.startswith(e),l))
b.startswith(e)
dob.find(e)==0
lubb[:a+1]==e
i sprawdzić<2
liczbę zamiast==1
.e=""\n for a in w:\n\te+=a
for a in range(len(w)):\n\te=w[:a+1]
J - 47 znaków
J traktuje łańcuchy jako wektory znaków, co oznacza, że kiedy próbuje utworzyć listę łańcuchów, w rzeczywistości tworzy tablicę znaków, więc końce są wypełniane spacjami. Rozwiązanie J nazywa się pudełkiem , więc ta funkcja przyjmuje jako argument pudełkowaną listę ciągów, aby zachować długość.
Ponadto J nie ma typu skrótu, więc najbliższa mu jest dwukolumnowa tabela elementów, na przykład ciągi w ramkach. Jeśli jest to niedopuszczalne i muszę domyślnie użyć formularza klucz-wartość, mogę sformatować dane wyjściowe do tego formularza łącznie w 67 znakach :
Wyjaśnienie przez wybuch:
Przykłady:
źródło
Haskell
9687Wersja bez golfa:
Przykład:
Użyłem
inits
funkcji, która znajduje wszystkie prefiksy listy / łańcucha. Czy to się liczy jako oszustwo?źródło
concatMap
przez(=<<)
, który jest w Preludium. Oszczędza ci 10 znaków.concatMap
ale nie mogę zapisać więcej niż 9 znaków.>>=\
za pojedynczy leksem. Przepraszam za to ...Python 3 (97)
Iterujemy nad prefiksami każdego słowa na wejściu, wypisując odpowiednią parę prefiksów / słów, jeśli pojawia się dokładnie raz lub dotyczy całego słowa. Korzystamy z zachowania zwarciowego
or
(iprint
jest funkcją), aby drukować tylko wtedy, gdy spełniony jest jeden z tych warunków.while
Pętla wielokrotnie odcina ostatniego znaku, aby utworzyć krótsze prefiksy, kończące gdy szczątki pustych ciągów. To jedyny raz, kiedy indeksujemy lub kroimy w cokolwiek.Liczymy wystąpienia przedrostka
e
na wejściu, wyszukującS
podciągi w oryginalnym ciągu wejściowym oddzielonym przecinkami','+e
. Przed wejściem poprzedzamy przecinek. To dodanie powoduje dodatkowy pusty element łańcucha, gdy mysplit
, ale nie ma to żadnego efektu, ponieważ nie ma niepustych podciągów.Aby sprawdzić przypadek, gdy podciąg
e
jest całym słowemw
, porównujemy je za pomocą operatora porównania ciągów. Porównuje to leksykograficznie, więc krótsze prefiksy są mniejsze. Podwójna porównanie nie powiedzie się, jeśli alboe==w
alboS.count(c+e)<2
.Gdyby wydruki w formularzu
e,w
były dozwolone, zapisałbym znak, piszące+c+w
zamiast tego.Podziękowania dla podziemnego kolejki linowej, od którego odpowiedzi oparłem moją ogólną strukturę kodu.
źródło
(e<w)*S.count(c+e)>1
można zagrać w golfa,e<w<w*S.count(c+e)
aby zapisać 2 postacie.Ruby, 114
Nie golfowany:
źródło
k4 (70)
niezbyt golfa; jestem pewien, że może być krótszy
całkiem podobny do J impl. powyżej, myślę - w zasadzie po prostu zbiera wszystkie (właściwe) prefiksy, ponownie usuwa słowa z prefiksów (aby obsłużyć
"car"
/"carpet"
case), grupuje je w klasy równoważności, wybiera klasy z tylko jednym elementem, redukuje je z list do ciągi i dodaje na mapie ciągi do siebie.niektóre przypadki testowe
zwróć uwagę, że w
k
/q
, ciąg znaków jest listą znaków, więc ciąg zawierający tylko jeden znak musi zostać oznaczony jako taki przy użyciu,
funkcji unary ; & mmwrt listę ciągów zawierających tylko jeden ciągte wykorzystują
q
dydaktycznegoshow
funkcja, która ma wbudowane formatowania dla niektórych struktur danych, aby wynik był bardziej czytelny:źródło
JavaScript - 212
Początkowe golfa.
Wejście:
code,golf,going
Wynik:
["c:code", "co:code", "cod:code", "code:code", "gol:golf", "golf:golf", "goi:going", "goin:going", "going:going"]
źródło
Perl,
9377Z nowymi liniami i wcięciem dla czytelności:
Trochę za późno i za długo, ale cieszę się, że w końcu spadło poniżej 100. Funkcja zwraca listę, którą można przypisać do zmiennej skrótu:
i
W rzeczywistości zwrócona lista nie jest jeszcze filtrowana - budowa skrótu jest zakończona w momencie jej przypisania, tj. Funkcji zewnętrznej. JEŻELI nie jest wystarczająco czysty / sprawiedliwy, dodaj 3, aby policzyć i umieść zawartość funkcji w nawiasach klamrowych, przygotowując
+
- wtedy funkcja zwraca „prawdziwe” odwołanie do skrótu.źródło
P: 44 bajty
UWAGI
Język Q ma wewnętrzny rdzeń nazwany wewnętrznie K4 (używany w tej odpowiedzi i innej poprzedniej odpowiedzi na to pytanie)
Aby przetestować kod, pobierz interpreter (kx.com, bezpłatny do użytku niekomercyjnego, obsługa systemów Windows, Linux, Mac)
Tłumacz ustny dopuszcza dwie składnie:
pełne (bardziej czytelne nazwy, odrębne nazwy dla moands i diadów, więcej bibliotek, ...). Załaduj plik źródłowy z rozszerzeniem q lub interaktywnym tłumaczem
kompaktowy (funkcjonalny rdzeń wewnętrzny, operatory jednoliterowe, ta sama litera dla obu zastosowań monad / diad, ...). Załaduj plik źródłowy z rozszerzeniem k lub interaktywny interpreter w trybie k (napisz \ po znaku zachęty). W tym trybie należy przetestować kod
Kod definiuje lambda (funkcja anonimowa). Aby nadać nazwę funkcji, potrzebujemy prefiksu name: (np. F: {..}), więc wymaga 46 bajtów
TEST
(przyjmując nazwaną funkcję: w przeciwnym razie zastąp kod f kodem)
zwraca słownik (klucze składniowe! wartości). Klucze są listą symboli (symbol `symb`symb ..) i są wartościami listy symboli. Jeśli wykonamy sentente w interaktywnym tłumaczu, mamy wygodniejszą prezentację (każdy klucz i skojarzenie wartości w innym wierszu)
WYJAŚNIENIE
x
jest domyślnym argumentem dla lambda$x
konwertuj listę symboli na listę ciągów(-1_)\
iteruje każdy element listy symboli(odczytuje jak dla każdego ciągu oblicza prefiksy (przy iteracji po jedzeniu spada ostatni znak ciągu (-1_), aż do pustego ciągu)
$
ponownie przekształca się w listę symboli (lista wszystkich prefiksów)p:
i przypisuje do p,/
zrównaj wszystko (łączy i tworzy jednopoziomową strukturę)=
klasyfikuj -> dla każdego unikalnego prefiksu, przypisuje odpowiednie słowa#:'
oblicza długość (liczbę słów powiązanych z każdym prefiksem)1=
true, jeśli długość = 1 (jednoznacznie), false w przeciwnym razie&
gdzie -> indeks elementów prawdziwychp in\:
określa dla wszystkich prefiksów, jeśli są one w jednoznacznych prefiksach(..)'
stosuje (..) do każdej wartości po prawej stronie (jednoznaczny prefiks)?0,&:
-> wyraźne 0 konkatenowane gdzie (aby poradzić sobie ze słowami jako przedrostkiem)p@
przekształcić indeksy w symbolex!..
zbuduj słownik z x (słowami) jako kluczami i .. jako wartościamiCzytaj jako:
Konstruuj i zwraca słownik ze słowami w postaci kluczy i wartości ..
... wartości indeksów w różnych pozycjach 0 (wszystkie słowa) i gdzie jednoznaczny przedrostek
... jednoznaczne obliczone jako przedrostki, które pojawiają się tylko przy jednym słowie (lista słów powiązana z każdym symbolem ma długość 1)
... wyświetla listę wynikającą z klasyfikacji wszystkich niepowtarzalnych symboli odpowiednimi słowami
... prefiksy obliczane przez powtarzanie upuszczania ostatniego znaku każdego słowa
źródło
PHP 7.0, 67 bajtów (dodaje wyzwanie)
pobiera dane wejściowe z argumentów wiersza poleceń; drukuje przecinek końcowy; biegać z
-nr
.do nowszej PHP , dodać jeden bajt: Wymień
&a
się""<
.dla starszych PHP użyj tych 70 bajtów:
PHP, 70 bajtów
źródło
Brachylog , 23 bajty
Wypróbuj online!
Pobiera dane wejściowe jako listę za pośrednictwem zmiennej wejściowej i generuje listę
[key, value]
par za pomocą zmiennej wyjściowej. Każdy ciąg wejściowy, który nie jest przedrostkiem innego ciągu wejściowego, zostanie wygenerowany dwukrotnie jako przedrostek samego siebie, chociaż nagłówek na TIO ukrywa to, używającᵘ
do uzyskania pełnej listy zamiastᶠ
.źródło
{}ᵘ
, chyba że istnieje krótszy sposób, aby albo wykluczyć coś z przedrostka samego siebie, albo wygenerować każdą niezbędną parę wyjściową bez dodatkowej reguły∋gj
.Perl 5
-a
, 76 bajtówWypróbuj online!
źródło
APL (Dyalog Classic) , 38 bajtów
dzięki Erik the Outgolfer za przypomnienie, żebym użył jednobajtowego kodowania znaków
Wypróbuj online!
źródło
Python (127)
Więc nie mogłem skomentować @undergroundmonorail, ale pomyślałem, że przyjęcie słownika byłoby lepsze? Jestem pewien, że dzięki zrozumieniu listy / słownika można by go ogromnie zmniejszyć, ale nie może sprawić, żeby działał z wyskakiwaniem ze słownika.
Wydruk wygeneruje słownik, nieuporządkowany.
EDYCJA: Ahh spóźniłem się na samochód: samochód / samochód: dywan kryteria. Może kontrola długości?
źródło
Groovy - 212 znaków
Gra w golfa:
przykładowe dane wyjściowe:
Nie golfowany:
źródło
JavaScript (Node.js) , 88 bajtów
Wypróbuj online!
źródło
Zsh , 95 bajtów
Wypróbuj online!
Jedynym sposobem na „zwrócenie” tablicy asocjacyjnej w Bash / Zsh jest zadeklarowanie jej bez
local
słowa kluczowego, a następnie uzyskanie dostępu do niej w zakresie nadrzędnym. Pozwoliłoby to zaoszczędzić jeden bajt. Jednak we / wy za pośrednictwem zmiennych jest zasadniczo niezadowolony, więc zamiast tego wypisujemy definicję tablicy.źródło
Rubinowy , 84 bajtów
Właśnie zauważyłem, że istnieje już rozwiązanie Ruby, no cóż. Zasadniczo poprawia to stare rozwiązanie, wybierając mądrzejsze prefiksy (eliminując potrzebę dodawania każdego słowa jako „prefiksu” na końcu) i licząc prefiksy, aby sprawdzić unikalność przed dodaniem ich do skrótu, zamiast nadpisywania wartości za pomocą manekin, jeśli istnieje duplikat, a następnie kasowanie wpisu.
Wypróbuj online!
źródło