Odległość Hamminga między dwoma strunami o równej długości jest liczbą pozycji, w których odpowiadające znaki są różne. Jeśli struny nie są równej długości, odległość Hamminga nie jest zdefiniowana.
Wyzwanie
Napisz program lub funkcję, która znajdzie największą odległość Hamminga spośród wszystkich par ciągów z listy ciągów, wypełnionych zgodnie z wymaganiami zgodnie z zasadami opisanymi poniżej.
Postacie będą z wewnątrz a-zA-Z0-9
.
Ciągi mogą nie być równej długości, więc dla każdego porównania krótszy ciąg musi być wypełniony w następujący sposób:
- owiń ciąg od początku tyle razy, ile potrzeba, aby dopasować wymaganą długość
- zmieniaj wielkość liter każdego owijania nieparzystego (1, 3, 5 itd.)
- pozostawiając rzeczy na zewnątrz
a-zA-Z
bez zmian podczas pakowania
Załóżmy na przykład, że musisz ab9Cd
uzupełnić ciąg 5 znaków, aby kończył się 18 znakami. Skończyłbyś z:
ab9CdAB9cDab9CdAB9
^^^^^ ^^^
z ^
dodanym pod 1. i 3. owinięciem, aby podkreślić zmiany wielkości liter.
Wejście wyjście
Format wejścia / wyjścia jest elastyczny. Możesz założyć, że dane wejściowe mają co najmniej dwa ciągi i że wszystkie ciągi będą miały co najmniej jeden znak.
Dane wyjściowe to liczba całkowita.
Zasady
To jest golf golfowy . Obowiązują standardowe zasady.
Przypadki testowe
[ "a", "b" ] => 1
[ "a", "b", "c" ] => 1
[ "a", "a", "c" ] => 1
[ "abc", "abcd" ] => 1
[ "abc12D5", "abC34d3", "ABC14dabc23DAbC89d"] => 17
[ "a", "Aaa", "AaaA", "aAaAa", "aaaaaaaaaaaaaa", "AAaAA", "aAa" ] => 8
["AacaAc", "Aab"] => 2
Realizacja referencyjna
Testowałem przykłady z (całkowicie nie golfowym) kodem R, który możesz wypróbować tutaj, aby porównać inne przykłady, które możesz wypróbować ze swoim kodem.
["AacaAc", "Aab"] => 2
. Celowy golf w odpowiedzi na moją galaretkę nie udałby się w tej sprawie, ale przeszedłby wszystkie pozostałe.Odpowiedzi:
Galaretka , 20 bajtów
Nie bardzo z tego zadowolony. Powinno być możliwe do gry w golfa, nawet do ~ 15 bajtów.
Wypróbuj online!
lub Sprawdź zestaw testowy!
Wyjaśnienie
źródło
LÞ
i nadal uzyskać takie same maksimum na końcu.ṁ/
w niektórych przypadkach przycina najdłuższy do najkrótszego, co nie jest tym, czego chcemy ... Myślę, że przypadki testowe są zbyt dobrze wybrane (i to jest raczej niefortunny zbieg okoliczności) ...["AacaAc", "Aab"]
.Python 2 , 86 bajtów
Wypróbuj online!
Podane dwa ciągi,
s,t
,zip((s+s.swapcase())*len(t),t))
będzie to lista krotek o długościlen(t)
odzip
skraca do najkrótszych iterable. Jeślilen(s)<len(t)
, to „padnie”s
przy żądanej zamianie wielkości liter i obliczamysum
różne znaki.Jeśli
len(t)<=len(s)
, to wyniksum
będzie mniejszy lub równy,sum
jeśli oceniamyt,s
; więc nie ma to wpływu na wynikmax
w takim przypadku.źródło
y!=
zamiast!=y
zaoszczędzić 1 bajtJavaScript (Node.js) , 111 bajtów
Wypróbuj online!
źródło
Galaretka , 19 bajtów
Wypróbuj online!
źródło
Rubin ,
8982 bajtówTworzy iloczyn krzyżowy listy wejściowej względem siebie przed obliczeniem odległości Hamminga dla każdej pary, przy użyciu metody duplikacji podobnej do Chasa Browna . Ruby nie może jednak skompresować razem łańcuchów znaków ani dodać wartości logicznych bez dodatkowego obciążenia, dlatego konieczne jest ręczne iterowanie pary łańcuchów.
-7 bajtów z GB.
Wypróbuj online!
źródło
Java 10 ,
748740667666616 bajtówTo musi być najgęstszy i nieczytelny, a jednocześnie najdłuższy golf, jaki kiedykolwiek wymyśliłem.
Metoda wywołania
h(String[])
z jawną tablicą (bez zmiennych argumentów): np.zwraca
1
.Możesz wypróbować online !
Nie golfił i skomentował:
Ja wiem, lepszym rozwiązaniem może być osiągnięty, zwłaszcza dla części ciąg parowania.
EDYCJA : ogol 8 bajtów, zmieniając rozmiar tablicy int
hammingDistance()
na kwadrat podanej liczby ciągów znaków. Naprawia takżeArrayIndexOutOfBounds
wyrzucenie w jednym z przypadków testowych.EDYCJA 2 : Zaoszczędzono 33 bajty dzięki komentarzom Kevina Cruijssena : usunięto deklarację klasy, skrócono nazwy do 1 znaku, zmieniono operatory itp.
EDYCJA 3 : Zapisz 1 bajt i osiągnij wynik zatwierdzony przez szatana, zmieniając metodę z var-arg na tablicę.
EDYCJA 4 : Zaoszczędź kolejne 50 bajtów dzięki Kevin Cruijssen , ponownie: zaktualizuj wersję Java z 8 do 10, aby użyć
var
słowa kluczowego, usuniętejStringBuilder
instancji itp.źródło
hammingDistance
używaćd
lub innej nieużywanej zmiennej. Większość twoich&&
może być&
i||
może być|
.c^' '
może byćc^32
.boolean w = false;
może byćboolean w=0>1;
.i=0
inicjalizacji pętli może być usunięty i zmienić,i,j
się,i=0,j
.++j
można usunąć i++
dodać do.charAt(j++)
..toString()
może być+""
.for(j=i+1;j<l;++j)
może byćfor(j=0;++j<l;)
. Itd. Itp.StringBuilder
może byćStringBuffer
(jeśli przejdziesz na Javę 10, może to byćvar b=new StringBuffer(l);
.boolean
Ichar
może być równieżvar
. Jeśli nie masz Java 10 lokalnie, jest on dostępny w TIO ). Ponadtofor(;i<n;++i){for(char c:s.toCharArray())b.append(e(w,c));w=!w;}
może byćfor(;i++<n;w=!w)for(char c:s.toCharArray())b.append(e(w,c));
. I jestem prawie pewien, że możeszStringBuffer
całkowicie usunąć i po prostu użyćString
i+=
zamiastappend
.05AB1E ,
3329 bajtówWypróbuj online lub sprawdź wszystkie przypadki testowe .
Najprawdopodobniej można go zmniejszyć o połowę w liczbie bajtów, ale działa ...
Wyjaśnienie:
źródło
Java 11, 387 bajtów
Wypróbuj online. (UWAGA: Ponieważ Java 11 nie jest jeszcze w TIO,
String.repeat(int)
został emulowany jakrepeat(String,int)
dla tej samej liczby bajtów.)Wyjaśnienie:
źródło
R 173 bajtów
Wypróbuj online!
@ngm: Starałem się jak najlepiej zagrać w twój kod ( oczywiście z dużymi modyfikacjami), ale, jak dobrze wiesz, R nie jest zbyt golfistą w manipulowaniu ciągami: P
źródło
outer
uzyskanie wszystkich kombinacji i wykonywanie arytmetyki modułowej zamiast punktów kodowychchartr
.