Biorąc pod uwagę ciąg wejściowy składający się tylko z liter, zwróć rozmiar kroku, który daje minimalną liczbę kroków potrzebną do odwiedzenia wszystkich liter w kolejności na zawijanym alfabecie, zaczynając od dowolnej litery.
Na przykład, weźmy słowo dog
. Jeśli użyjemy kroku o wartości 1, otrzymamy:
defghijklmnopqrstuvwxyzabcdefg Alphabet
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
defghijklmnopqrstuvwxyzabcdefg Visited letters
d o g Needed letters
W sumie 30 kroków.
Jeśli jednak użyjemy kroku 11, otrzymamy:
defghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg
^ ^ ^ ^ ^ ^
d o z k v g Visited letters
d o g Needed letters
W sumie 6 kroków. Jest to minimalna liczba kroków, więc zwracanym wynikiem dog
jest rozmiar kroku; 11
.
Przypadki testowe:
"dog" -> 11
"age" -> 6
"apple" -> 19
"alphabet" -> 9
"aaaaaaa" -> 0 for 0 indexed, 26 for 1 indexed
"abcdefga" -> 1 or 9
"aba" -> Any odd number except for 13
"ppcg" -> 15
"codegolf" -> 15
"testcase" -> 9
"z" -> Any number
"joking" -> 19
Zasady
- Dane wejściowe będą niepustym ciągiem znaków lub tablicą znaków składającą się tylko z liter
a
doz
(możesz wybierać między wielkimi i małymi literami) - Dane wyjściowe mogą być indeksowane 0 (tj. Zakres
0-25
) lub indeksowane 1 (1-26
) - Jeśli jest remis, możesz wydrukować dowolny rozmiar kroku lub wszystkie
- To jest golf golfowy , więc wygrywa najmniej bajtów dla każdego języka!
Odpowiedzi:
Węgiel drzewny , 41 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. 0-indeksowane. Wyjaśnienie:
Zapętlaj ponad 26 rozmiarów stopni. (Właściwie przeglądam tutaj małe litery i używam zmiennej indeksu.)
Zapętlaj każdy znak wejścia po pierwszym.
Zapętlaj 26 razy i generuj ciąg znaków wynikający z wykonania 26 kroków o danym rozmiarze kroku, zaczynając (indeksowany 0) od poprzedniego znaku wejścia.
Znajdź pozycję bieżącego znaku wejścia w tym ciągu lub -1, jeśli nie zostanie znalezione.
Weź sumę wszystkich pozycji, chyba że żadnej nie znaleziono, w takim przypadku użyj -1.
Zapisz sumy.
Znajdź minimalną sumę nieujemną.
Znajdź rozmiar pierwszego kroku z tą sumą i wyślij go.
źródło
JavaScript, 143 bajty
Wypróbuj online!
Dzięki Shaggy użycie
[...Array(26).keys()]
oszczędza 9 bajtów.źródło
Galaretka ,
282623 bajtówWyjście jest indeksowane na 0. Wejście jest bajtowaniem i może być w każdym przypadku, ale wielkie litery są znacznie szybsze.
Wprowadzanie pojedynczej litery musi być w specjalnej obudowie i kosztuje 2 bajty. ._.
Wypróbuj online!
Zauważ, że jest to podejście oparte na brutalnej sile; wejścia z czterema lub więcej literami przekroczą limit czasu w TIO. Zestaw testowy przygotowuje się
_39
na „wydajność”.Jak to działa
źródło
Galaretka , 17 bajtów
Dane wejściowe są testowane na STDIN, dane wyjściowe mają indeks 1.
Wypróbuj online!
Jak to działa
źródło
JavaScript (Node.js) ,
123 121 116114 bajtówWypróbuj online!
Skomentował
s[k++ >> 5]
źródło
Ruby ,
12111411210810289 bajtówWypróbuj online!
0-indeksowane. Pobiera dane wejściowe jako tablicę znaków.
Dzięki ASCII tylko za pomysły na golfa o wartości 12 bajtów.
źródło
p,=*s
kawałku więcej, ale nie jestem pewien pewności teoretycznej rozwiązania z zakodowanym wynikiem karnym ... Więc zmieniłem stałą na nieskończoność (chociaż twoja wartość pozwoliłaby na kolejne 2 bajty wyłączone ).Python 2 ,
230222216194169 bajtówWypróbuj online!
-22 bajtów od tsh
-39 bajtów od Jo King
Starsza wersja z wyjaśnieniem:
Wypróbuj online!
Byłoby to krótsze w języku z największą liczbą liter (nie wymagałobyTo przesłanie wykorzystuje terazfloat('inf')
obsługi nieskończonych pętli). Właściwie to przesłanie nadal potrzebowałoby tego do obsługi ciągów takich jak „aaa”.26*len(s)
jako górną granicę, która zatrzymuje nieskończone pętle.To przesłanie ma indeks 0 (zwraca wartości od 0 do 25 włącznie).
f
pobiera (n wielkich liter) ciąg znaków i zwraca Optimal Alphabet Steppingt
to funkcja pomocnicza, która pobiera ciąg i przesuwanie alfabetu i zwraca liczbę przeskoków potrzebnych do ukończenia ciągu (lub26*len(s)
jeśli jest to niemożliwe).źródło
while a!=A(c)and S<len(s)*26:
i możesz usunąćif a==i:return float('inf')
, ponieważlen(s)*26
jest to górna granica każdej odpowiedzi.Czerwony , 197 bajtów
Wypróbuj online!
źródło
05AB1E (starsza wersja) ,
332726 bajtówUżywa starszej wersji, ponieważ wydaje się, że występuje błąd, gdy chcesz zmodyfikować / użyć wyniku po zagnieżdżonej mapie w nowej wersji 05AB1E.
Wyjście indeksowane 0.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Python 3 ,
191178162 bajtówDziękujemy wszystkim za wszystkie wskazówki! wygląda to bardziej jak golf.
Wypróbuj online!
I mój oryginalny kod, jeśli ktoś jest zainteresowany.
Zamienia słowo w listę wartości ASCII, a następnie iteruje wielkości kroków od 0 do 25, sprawdzając, ile kroków zajmuje wyczerpanie listy (istnieje pułap, aby zatrzymać nieskończone pętle).
Liczba kroków jest dodawany do listy A .
Po duży dla pętli indeks najmniejszej wartości wydrukowaniu. Jest to równe wartości i (rozmiar kroku) dla tej iteracji pętli QED.
źródło
range(26)
wystarczy - nie musisz określać początku, ponieważ 0 jest domyślną;a.append(n)
może byća+=[n]
; pierwszy wiersz byłby krótszy jako mapaw=list(map(ord,input()))
(właściwie przy obecnym algorytmie, w Py2 można również upuścićlist(...)
zawijanie); uniknąć dodatkowych podziałów odstęp / linii, jak to możliwe (na przykład, nie ma potrzeby liniami w oneliners:if p>122:p-=26
)n>99
wyglądają podejrzanie, czy jest to arbitralna stała, aby wyjść z nieskończonej pętli? Wtedy prawdopodobnie powinno to być coś w rodzaju 26 * len (w), ponieważ nigdy nie wiadomo, jak duże będzie wejście.list(...)
w Py3, a także jeden dodatkowyif
: 165 bajtów . Zapoznaj się również z tym tematem porad , jestem pewien, że znacznie poprawisz swoje umiejętności, korzystając z porad tam!while p!=c and n>len(w)*26:
i pozbyć się tej ostatniej instrukcji if dla -8 bajtów.n+=1
ip+=i
na osobnych liniachn+=1;p+=i
na jeden.