Monday Mini-Golf: Seria krótkich golfowych wyzwań, opublikowanych (miejmy nadzieję!) W każdy poniedziałek.
(Przepraszam, ten jest trochę spóźniony.)
Jestem pewien, że większość z was słyszała o odległości Levenshteina , algorytmie do obliczania odległości między dwoma łańcuchami. To wyzwanie polega na wdrożeniu podobnego algorytmu mojego wynalazku *, zwanego odległością anagramową . Główna różnica polega na tym, że kolejność znaków nie ma znaczenia; zamiast tego mierzone są tylko znaki unikalne dla jednego lub drugiego łańcucha.
Wyzwanie
Celem wyzwania jest napisanie programu lub funkcji, która przyjmuje dwa ciągi znaków i zwraca odległość między nimi anagramów. Głównym sposobem na to jest użycie następującej logiki:
- Konwertuj oba ciągi znaków na małe i (opcjonalnie) sortuj znaki każdego z nich alfabetycznie.
- Chociaż ciągi zawierają co najmniej jeden taki sam znak, usuń pierwsze wystąpienie tego znaku z każdego ciągu.
- Dodaj długości pozostałych ciągów i zwróć / wyślij wynik.
Przykład
Jeśli dane wejściowe to:
Hello, world!
Code golf!
Następnie, małe i posortowane, stają się: (według domyślnego sortowania JS; zwróć uwagę na spacje wiodące)
!,dehllloorw
!cdefgloo
Usuwając wszystkie znaki z obu ciągów, otrzymujemy:
,hllrw
cfg
Zatem odległość anagramu między oryginalnymi dwoma łańcuchami = 6 + 3 = 9.
Detale
- Ciągi mogą być pobierane w dowolnym rozsądnym formacie.
- Ciągi będą składały się wyłącznie z drukowalnego ASCII.
- Same łańcuchy nie będą zawierać żadnych białych znaków oprócz zwykłych spacji. (Bez kart, nowych linii itp.)
- Nie musisz używać tego dokładnego algorytmu, o ile wyniki są takie same.
Przypadki testowe
Wejście 1:
Hello, world!
Code golf!
Wyjście 1:
9
Wejście 2:
12345 This is some text.
.txet emos si sihT 54321
Wyjście 2:
0
Wejście 3:
All unique characters here!
Bdfgjkmopvwxyz?
Wyjście 3:
42
Wejście 4:
This is not exactly like Levenshtein distance,
but you'll notice it is quite similar.
Wyjście 4:
30
Wejście 5:
all lowercase.
ALL UPPERCASE!
Wyjście 5:
8
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy prawidłowy kod w bajtach. Tiebreaker przechodzi do przesyłania, które jako pierwsze osiągnęło końcową liczbę bajtów. Zwycięzca zostanie wybrany w następny poniedziałek, 12 października. Powodzenia!
Edycja: Gratulacje dla zwycięzcy, @isaacg, używając Pytha (ponownie) dla zadziwiającego 12 bajtów!
* Jeśli ten algorytm był używany gdzie indziej i / lub otrzymał inną nazwę, daj mi znać! Nie udało mi się go znaleźć podczas 20-minutowego wyszukiwania.
Odpowiedzi:
Pyth, 12 bajtów
Zestaw testowy
Operacja, o której mowa, jest równoważna z operatorem odejmowania bajtowego Pytha
.-
, stosowanym w obu kierunkach. Przypuszczam, że można to nazwać bag bag xor.Rozwiązaniem jest:
.z
: pobierz dane jako listę 2 ciągów.rR0
: konwertuj oba na małe litery..p
: Tworzy wszystkie permutacje, tzn. Normalne i odwrócone..-M
: Zamapuj.-
operację dla każdego zamówienia.s
: Połącz wyniki.l
: Wydrukuj długość.źródło
JavaScript (ES7), 92 bajty
Definiuje anonimową funkcję.
Aby przetestować, uruchom poniższy fragment kodu. Możesz edytować kod i kliknąć „Test”, aby porównać jego wyniki z oryginałem. (Zostaw komentarz, jeśli znajdziesz poprawę!) Dane wejściowe są jak
"Hello, world!", "Code golf!"
w polu wprowadzania.Dzięki @ETHproductions za oszczędność 6 bajtów!
Więcej informacji o pakiecie testowym
Jak to działa
źródło
.join("")+b
z.join``+b
bez skutku.CJam,
2319 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Ruby, 62
Musi być lepszy sposób.
Edytuj: 57 znaków dzięki iamnotmaynard badającej ścieżkę, na którą byłem zbyt leniwy.
źródło
sub
może brać sznurki. Nie możesz użyćc.downcase
zamiast/#{Regexp.escape c}/i
?Python,
9087818079 bajtówWersja Python <3.5, 80 bajtów
Wyjaśnienie
Dla każdego znaku a lub b policz liczbę wystąpień w każdym ciągu i dodaj różnicę (dodatnią).
Edycja: Ponowne czytanie reguł, akceptowane anonimowe funkcje są akceptowane, poprawiona odpowiedź poprzez pozbycie się raw_input. Najpierw golf, proszę bądź delikatny!
Dzięki sp3000 za ulepszenie redefinicji str. Niższej i uświadomienie mi, że druk jest niepotrzebny. Również spacje. Wciąż się uczę.
Przy użyciu python> = 3.5 istnieje krótszy sposób definiowania zestawów, więc bajt można zapisać w stosunku do poprzednich wersji.
źródło
Siatkówka,
4020 bajtów20 bajtów zaoszczędzonych dzięki Martinowi Büttnerowi.
Umieść każdą linię we własnym pliku i zamień na
\n
dosłownie nowy wiersz.źródło
pb , 648 bajtów
Pobiera dane wejściowe ze znakiem tabulacji oddzielającym dwa ciągi.
Ten był doozy. W rzeczywistości implementacja algorytmu nie była najtrudniejszą częścią, która przyszła stosunkowo łatwo. Ale musiałem zrobić dwie rzeczy, które są trudne do zrobienia w PB: Niewrażliwość na wielkość liter i itoa. Zdarzyło mi się, że program do konwersji na małe litery leżał wokoło (sam 211 bajtów długości) i wszystko inne zostało przypięte do końca, aby wykonać pracę specjalnie dla tego wyzwania.
Ten program można oglądać na YouTube! Jest kilka rzeczy, o których należy pamiętać:
chr(-1)
powoduje awarię interpretera podczas działania w trybie zegarka.Hello, world!
iCode golf.
. Jest to nieco inna niż jedna z przykładowych danych wejściowych w wyzwaniu; Użyłem go, ponieważ był krótki, ale zmodyfikowałem go tak, aby poprawne wyjście wynosiłoby 10 zamiast 9. To tylko, aby pokazać, że liczba jest drukowana poprawnie, nawet jeśli jest to wiele cyfr, co jest trudne w pb.chr(10)
nie jest właściwie traktowany, co czyni je w dużej mierze bezużytecznymi. Biorąc to wszystko pod uwagę, uważam, że oglądanie tego jest prawie piękne. To ogromny bałagan okropnego kodu interpretującego inny okropny kod, jego fragmenty rozkładają się na twoich oczach, a jednak wszystko działa na tyle, aby uzyskać właściwą odpowiedź. Wygląda na to, że śmieci są drukowane, ale jeśli dokładnie obejrzysz ze znajomością źródła, możesz dowiedzieć się, co robi i dlaczego w dowolnym momencie. Kiedy oglądam ten film, czuję się jak Cypher:I... I don’t even see the code. All I see is blonde, brunette, red-head.
Bez zbędnych ceregieli, oto kod niepoznany.
źródło
C ++ 199 bajtów
Używa tablicy do przechowywania liczby każdego znaku w pierwszym ciągu, pomniejszając liczbę w drugim ciągu. Następnie znajduje się suma wartości bezwzględnych elementów tablicy: jest to odległość.
Gra w golfa:
Nie golfowany:
źródło
PowerShell, 79 bajtów
Prawie dokładnie taki sam kod jak moja odpowiedź na Anagram Code Golf ... ale ... Mam dziwne zachowanie, jeśli po prostu odetnę się
-eq0
od tej odpowiedzi, więc skończyło się na tym, że muszę jawnie.ToLower()
i przekształcić pozaparam
deklaracją. +Wyjaśnienie również (głównie) skopiowane z tej odpowiedzi - pobiera dwa ciągi znaków wejściowych, czyni je małymi literami i ponownie rzutuje je jako tablice znaków.
diff
Function (aliasemCompare-Object
) wykonuje dwie tablice i zwrotów przedmiotów, które różnią się między nimi. Wykorzystujemy to, ponownie rzutując return jako tablicę()
, a następnie sprawdzając jego długość.+ Na przykład uzyskiwałem fałszywe wyniki
param([char[]]$a,[char[]]$b)(diff $a $b).length
wall lowercase.
/ALL UPPERCASE!
testu. Gdybym ręcznie rozdzielił tablice (np. Uruchomił(diff ('a','l','l'...
), działałby dobrze, ale zawodziłby się za każdym razem, gdy duże / małe litery nakładały się na casting. Wszystko, co mogę przeczytać na temat dokumentacji,diff
domyślnie nie rozróżnia wielkości liter, więc ... wzruszenie ramion ???źródło
Bash,
6867 bajtówja że to działa. Zwróć uwagę na końcowe spacje w drugim wierszu.
Przypadki testowe
źródło
Perl,
5246 bajtów + 3 przełączniki (a, F, n) =5549 bajtówPobiera dane wejściowe ze STDIN z ciągami wejściowymi w swoich własnych wierszach, zakończonych przez EOF.
Przełączniki:
Kod:
źródło
Narzędzia Bash + GNU, 53
sed
przekształca małe litery i dzieli ciąg na linie dlasort
. Ponieważ musimy to zrobić dwa razy, nadałem jej funkcję.comm3 -3
odfiltrowuje odpowiednie linie iwc -l
tworzy liczbę.Wejście odbywa się za pośrednictwem
STDIN
; ponieważ dwa polecenia są odczytywane sekwencyjnie, musisz wysłaćEOF
(Ctrl-D) dwa razy, między łańcuchami i na końcu. Zastępuje plik1
, jeśli jest obecny.źródło
Matlab, 91 bajtów
Wypróbuj online .
Działa to w następujący sposób:
źródło
Galaretka , 6 bajtów
Wypróbuj online!
źródło
F #,
134126 bajtówObjaśnienie :
a
ib
oddzielnie.Zmniejsz każdą grupę za pomocą
-
operatora, co ma następujący efekt:Zsumuj wartość bezwzględną wartości z poprzedniego kroku.
źródło
Scala ,
13481 bajtówDzięki @ ASCII-tylko za ich pracę.
Wypróbuj online!
źródło