Powiedz, że masz taki ciąg:
abaabbbbbaabba
Policz, ile razy określony znak pojawia się w ciągu wejściowym, ale tylko wtedy, gdy znak pojawia się tylko raz z rzędu . Na przykład, jeśli postać jest a
,
abaabbbbbaabba
^ x x ^
Łącznie byłoby 2 ( aa
nie liczą się, ponieważ a
pojawia się dwa razy z rzędu).
Jak to się ma do FizzBuzz?
Jeśli znak pojawia się 3 (lub wielokrotność 3) razy z rzędu lub 5 (lub wielokrotność 5) razy z rzędu, licznik jest zamiast tego zmniejszany . Jeśli jest to wielokrotność 3 i 5 razy, licznik jest nadal zwiększany. Pamiętaj, że licznik jest również zwiększany, jeśli postać pojawia się tylko raz z rzędu, i jest ignorowana, jeśli postać pojawia się dowolną liczbę razy z rzędu (oprócz sytuacji opisanych powyżej).
Reasumując, jeśli ciąg jest do meczu a
,
input counter (explanation)
a 1 (single occurence)
aaa -1(multiple of 3)
aaaaa -1(multiple of 5)
aaaaaaaaaaaaaaa 1 (multiple of 15)
aa 0 (none of the above)
aba 2 (two single instances)
aaba 1 (one single occurence(+1) and one double occurence(ignored))
aaaba 0 (one single occurence(+1) and one triple (-1)
aaaaaa -1 (six is a multiple of three)
Implementacja referencyjna (nie golfowa) w java:
import java.util.Scanner;
import java.util.regex.*;
public class StrMatcher {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //Scanner to get user input
int total = 0;//Running total of matches
System.out.println("Enter a string: ");
String strBeingSearched = sc.nextLine(); //String that will be searched
System.out.println("Enter string to match with: ");
String strBeingMatched = sc.nextLine(); //Substring used for searching
//Simple regex matcher
Pattern pattern = Pattern.compile("(" + strBeingMatched + ")+");
Matcher matcher = pattern.matcher(strBeingSearched);
while(matcher.find()){ //While there are still matches
int length = matcher.end() - matcher.start();
int numberOfTimes = length/strBeingMatched.length();//Calculate how many times in a row the string is matched
if((numberOfTimes == 1)||((numberOfTimes % 3 == 0) && (numberOfTimes % 5 == 0))){
total++; //Increment counter if single match or divisible by 15
} else if((numberOfTimes % 3 == 0)||(numberOfTimes % 5 == 0)) {
total--; //Decrement counter if divisible by 3 or 5 (but not 15)
}
strBeingSearched = strBeingSearched.substring(matcher.end());
matcher = pattern.matcher(strBeingSearched); //Replace string/matcher and repeat
}
System.out.println(total);
}
}
- Ciąg, który będzie przeszukiwany, może mieć dowolną długość, ale wzorzec będzie tylko jednym znakiem.
- Żaden ciąg nie będzie zawierał znaków specjalnych wyrażenia regularnego.
- To jest golf golfowy ; najkrótszy program w bajtach wygrywa.
- Brak standardowych luk.
Odpowiedzi:
Funciton , 1840 bajtów
Cholera, ten język nie nadaje się do gry w golfa.
Ten program oczekuje, że pierwszym znakiem danych wejściowych będzie znak do wyszukania, a reszta danych wejściowych do wyszukiwania ciągu. Oznacza to, że
aaaba
będzie wyszukiwał naa
wejściuaaba
(a tym samym na wyjściu 1). Możesz je oddzielić znakiem nowej linii lub spacją (a aaba
), ale tylko dlatego, że dodatkowy znak nowej linii / spacja nie ma znaczenia dla wyniku.Jak zawsze możesz uzyskać ładniejszy rendering (bez odstępów między wierszami), jeśli wykonasz go
$('pre').css('line-height',1)
w konsoli przeglądarki.(1840 bajtów, gdy jest zakodowany jako UTF-16.)
Wyjaśnienie
¹
zwraca pierwszy znak ciągu.²
zlicza liczbę wystąpień znaku na początku danego ciągu. Na przykład, biorąc pod uwagę znaka
i ciągaaba
, zwraca 2. Dlaa
ibaa
zwraca 0.³
wywołuje,²
aby uzyskać liczbę znaków na początku, sprawdza, czy liczba jest podzielna przez 3 i 5 i czy jest równa 1, i określa odpowiedni przyrost / spadek. Usuwa również jeden dodatkowy znak z początku łańcucha (np. Biorąc pod uwagę,aaabba
że usuwa 3 + 1 = 4 znaki, dającba
). Następnie wywołuje się rekurencyjnie z krótszym łańcuchem i dodaje wynik.¹
celu usunięcia pierwszego znaku z danych wejściowych oraz wywołania³
z tym znakiem i resztą łańcucha jako osobne argumenty.źródło
CJam,
4036353230 bajtówDzięki @ MartinBüttner za grę w golfa na 1 bajcie!
Dzięki @AndreaBiondo za grę w golfa na 2 bajtach i torowanie drogi dla kolejnych 3!
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
llcf=e`::*0-{(_!\6563282Zb:(=}%1b
wynosi 33 bajty.C,
160126125119114109104100 bajtówPrawdopodobnie można to poprawić ... To pobiera dane wejściowe z argumentów wiersza poleceń (pierwszy argument to wzorzec, drugi to ciąg znaków). Nie obsługuje wyszukiwania wzorca znaku NULL (\ x00).
EDYCJA **
126125119114109104100 bajtów **: Po uwzględnieniu sugestii Dennisa i kilku dodatkowych pomysłów (usunięto klauzulę else, połączyłem while w jedną instrukcję i zastosowano odejmowanie zamiast! =). Usunięto także dodatkowy średnik w pętli for (to była właściwie część sugestii Dennisa). Jeszcze bardziej skrócony poprzez usunięcie zmiennych „i” i „a”.Usunięto operatory if i negacja („!”) Poprzez nadużywanie operatora potrójnego. Skompresowano kontrole modułowości, używając
tego bitowego „ORAZ” oszukaćpodwójny &&, ponieważ bitowy „&” ma błąd, i umieszczając porównanie (t <2) wewnątrz operatorów trójskładnikowych. Zastąpiłem !! t * (...) przez przeniesienie !! t do operatora trójskładnikowego, co pozwala mi usunąć nawiasy.Człowieku, naprawdę chcę sprowadzić go poniżej znaku 100 bajtów: S.
PRZYGOTOWANE rozwiązania: Nie jestem pewien, czy można je uznać za prawidłowe, ale mogę przejść do 93 znaków, jeśli użyję wyjścia (wyjść) zamiast printf ("% d", s). Ale wtedy wynik nie byłby widoczny, byłby to raczej kod powrotu. Jeśli dane wyjściowe są naprawdę konieczne, mogę je również zmniejszyć do 98 bajtów, ale wymagałoby to również wydrukowania wszystkich wartości pośrednich s przed ostateczną odpowiedzią ...
źródło
i,t,s,a;main(c,z)char**z;{a=*z[1];while(c){if((c=z[2][i])!=a)s+=(!!t)*((t<2)-!(t%3)-!(t%5)+3*!(t%15)),t=0;else++t;++i;}printf("%d",s);}
powinien działać równie dobrze (i jest o 23 bajty krótszy).main
zfor(a=*z[1];c;i++)
, nie potrzebne są{}
wokół if ... else.Rubin,
111 10396 bajtówTo wyzwanie zostało zrobione dla Ruby
Enumerable#chunk
, więc musiałem to opublikować. :)Test online: http://ideone.com/pG4mAn
Kod jest dość prosty. Oto bardziej czytelna wersja: http://ideone.com/ub3siA .
źródło
Python 3,
361, 300, 296, 263, 256, 237, 229, 188, 178, 164 bajtów.Zaoszczędzono 15 bajtów dzięki vaultah z SOPython.
Zaoszczędzono 9 bajtów dzięki Joe Kingtonowi z SOPython.
Oszczędność 11 bajtów dzięki DSM z SOPython.
Po raz pierwszy przesyłam odpowiedź, więc jestem pewien, że może być ona znacznie krótsza. Bierze ciąg testowy jako pierwszą odpowiedź na dane wejściowe, a znak wyszukiwania jako drugą.
Wersja bez golfa:
Odkryłem, że zawiodłem jeden z przypadków testowych.
źródło
Haskell, 120 bajtów
f
wykonuje pracę.źródło
Java,
146152143138139136 bajtów%3&%5
kontroli.i<2
porównanie.%3&%5
czek nie działa zgodnie z myślą).Zaimplementowane jako
BiFunction<String, String, Integer>
w Javie 8, daj mi znać, jeśli jest to wymagany pełny program (lub jeśli mogę nawet upuścićjava.util.regex
prefiks pakietu poniżej).Powyższa liczba bajtów nie obejmuje nowej linii poniżej, która jest po prostu dodawana do celów formatowania na tej stronie.
Z grubsza wyjaśnienie:
b
, tj"[^"+b+"]"
."a" -> 1
.).-1
,0
i1
.sum()
aby uzyskać odpowiedź.źródło
JavaScript, 206 bajtów
Rozszerzony:
Wyjaśnienie:
Używam wyrażenia regularnego, aby policzyć całkowitą liczbę pojawień się postaci, a następnie odejmij od niej wszystkie czasy pojawienia się w grupach. Na koniec przeglądam grupy i wykonuję przyrost / dekrement szumu.
Przechodzi przypadki testowe podane w pytaniu:
i tak dalej
źródło
new
, użyjexec
zamiastmatch
i aliaslength
, i powinieneś być dobry.Perl,
82656359 bajtów58 bajtów + 1 bajtowy parametr wiersza poleceń
Niezbyt krótki, ale to początek - będzie nadal go skracał.
Zakładając, że
-i
można podać ciąg wejściowy przykładowe użycie, wygląda następująco:źródło
Pyth, 32 bajty
tak blisko! Jeszcze 2 bajty, aby powiązać doskonałe wejście Dennisa do CJam
Przetestuj online
źródło
gawk, 140
Wprowadź jako „ciąg znaków char”, podobnie jak
Nie golfił
źródło
Pyth, 27 bajtów
Zestaw testowy
Wprowadź w formularzu np .:
Wyjaśnienie:
źródło