Angenommen, Sie haben eine Zeichenfolge wie die folgende:
abaabbbbbaabba
Zählen Sie, wie oft ein bestimmtes Zeichen in der Eingabezeichenfolge angezeigt wird, jedoch nur, wenn das Zeichen nur einmal hintereinander angezeigt wird . Zum Beispiel, wenn das Zeichen ist a
,
abaabbbbbaabba
^ x x ^
Die Summe wäre 2 (die aa
würde nicht zählen, weil die a
zweimal hintereinander erscheint).
Wie hängt das mit FizzBuzz zusammen?
Wenn das Zeichen 3-mal (oder ein Vielfaches von 3-mal) in einer Reihe oder 5-mal (oder ein Vielfaches von 5-mal) in einer Reihe vorkommt, wird der Zähler dekrementiert . Wenn es ein Vielfaches von 3 und 5 ist, wird der Zähler immer noch inkrementiert. Denken Sie daran, dass der Zähler ebenfalls erhöht wird, wenn das Zeichen nur einmal in einer Reihe vorkommt, und ignoriert wird, wenn das Zeichen mehrmals in einer Reihe vorkommt (außer in den oben beschriebenen Situationen).
Um es noch einmal zusammenzufassen 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)
Referenz (ungolfed) Implementierung in 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);
}
}
- Die zu durchsuchende Zeichenfolge kann beliebig lang sein, das Muster besteht jedoch nur aus einem einzelnen Zeichen.
- Keine der Zeichenfolgen enthält reguläre Sonderzeichen.
- Das ist Code-Golf ; kürzestes Programm in Bytes gewinnt.
- Keine Standardlücken.
Antworten:
Funktion , 1840 Bytes
Verdammt, diese Sprache ist nicht golffähig.
Dieses Programm erwartet, dass das erste Zeichen der Eingabe das zu suchende Zeichen und der Rest der Eingabe die zu durchsuchende Zeichenfolge ist. Dies bedeutet, dass in der Eingabe (und damit in der Ausgabe 1)
aaaba
nach gesucht wird . Sie können sie mit einem Zeilenumbruch oder einem Leerzeichen ( ) trennen, aber nur, weil der zusätzliche Zeilenumbruch / Leerzeichen keine Auswirkungen auf die Ausgabe hat.a
aaba
a aaba
Wie immer erhalten Sie ein ansprechenderes Rendering (ohne Zeilenabstand), wenn Sie es
$('pre').css('line-height',1)
in Ihrer Browserkonsole ausführen .(1840 Bytes bei Codierung als UTF-16.)
Erläuterung
¹
Gibt das erste Zeichen einer Zeichenfolge zurück.²
Zählt die Anzahl der Vorkommen eines Zeichens am Anfang einer bestimmten Zeichenfolge. Wenn Sie beispielsweise das Zeichena
und die Zeichenfolge angebenaaba
, wird 2 zurückgegeben. Füra
undbaa
wird 0 zurückgegeben.³
ruft²
auf, um die Anzahl der Zeichen zu Beginn zu ermitteln, überprüft, ob die Zahl durch 3 und 5 teilbar ist und ob sie gleich 1 ist, und ermittelt das richtige Inkrement / Dekrement. Es wird auch ein zusätzliches Zeichen vom Anfang der Zeichenfolge entfernt (z. B. wennaaabba
3 + 1 = 4 Zeichen entfernt werden, wird angegebenba
). Dann ruft es sich rekursiv mit der kürzeren Zeichenfolge auf und fügt das Ergebnis hinzu.¹
auf, um das erste Zeichen aus der Eingabe zu entfernen, und ruft³
mit diesem Zeichen und dem Rest der Zeichenfolge als separate Argumente auf.quelle
CJam,
4036353230 BytesDanke an @ MartinBüttner für das Golfen ab 1 Byte!
Vielen Dank an @AndreaBiondo für das Abschlagen von 2 Bytes und den Weg für weitere 3 Bytes!
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
llcf=e`::*0-{(_!\6563282Zb:(=}%1b
beträgt 33 Bytes.C
160126125119114109104100 BytesKann wahrscheinlich verbessert werden ... Dies nimmt Eingaben von Befehlszeilenargumenten entgegen (erstes Argument ist Muster, zweites ist Zeichenfolge). Unterstützt nicht die Suche nach dem Muster NULL char (\ x00).
EDIT **
126125119114109104100 Bytes **: Nach Einbeziehung von Dennis 'Vorschlägen und einigen zusätzlichen Ideen (Klausel else entfernt, die while-Anweisung in einer einzigen Anweisung kombiniert und anstelle von! = Die Subtraktion verwendet). Außerdem wurde ein zusätzliches Semikolon in der for-Schleife entfernt (das war eigentlich ein Teil von Dennis 'Vorschlag). Noch mehr verkürzt durch Entfernen der Variablen 'i' und 'a'.Die Operatoren if und negation ('!') Wurden entfernt, indem der ternäre Operator missbraucht wurde. Komprimierte die Modularitätsprüfungen mit
diesem bitweisen 'UND'-Trickund setzte den (t <2) -Vergleich in die ternären Operatoren. Ersetzt !! t * (...) durch Verschieben !! t in den ternären Operator, sodass ich Klammern entfernen kann.Mann, ich möchte es wirklich unter die 100-Byte-Marke bringen: S
TENTATIVE Lösungen: Ich bin nicht sicher, ob diese als gültig angesehen werden, aber ich kann 93 Zeichen erreichen, wenn ich Exits anstelle von printf ("% d", s) verwende. Aber dann wäre die Ausgabe nicht sichtbar, sondern ein Rückkehrcode. Wenn die Ausgabe wirklich notwendig ist, kann ich sie auch auf 98 Bytes reduzieren, aber es würde auch das Drucken aller Zwischenwerte von s vor der endgültigen Antwort erfordern ...
quelle
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);}
sollte aber genauso gut funktionieren (und es ist 23 Bytes kürzer).main
mitfor(a=*z[1];c;i++)
anfängst, brauchst du das{}
um das if ... else nicht.Ruby,
111 10396 BytesDiese Herausforderung wurde für Ruby's gemacht
Enumerable#chunk
, also musste ich dies posten. :)Online-Test: http://ideone.com/pG4mAn
Der Code ist ziemlich einfach. Hier ist eine besser lesbare Version: http://ideone.com/ub3siA .
quelle
Python 3,
361, 300, 296, 263, 256, 237, 229, 188, 178, 164 Bytes.Dank Vaultah von SOPython wurden 15 Bytes eingespart.
9 Bytes dank Joe Kington von SOPython gespeichert.
11 Bytes dank DSM von SOPython eingespart.
Dies ist das erste Mal, dass ich eine Antwort sende, daher bin ich sicher, dass dies viel kürzer sein könnte. Die Testzeichenfolge wird als erste Antwort auf die Eingabe und das Suchzeichen als zweite Antwort verwendet.
Ungolfed-Version:
Ich habe festgestellt, dass einer der Testfälle fehlgeschlagen ist.
quelle
Haskell, 120 Bytes
f
macht den Job.quelle
Java,
146152143138139136 Bytes%3&%5
Überprüfungen .i<2
Vergleich.%3&%5
Check funktioniert nicht wie gedacht).Implementiert als
BiFunction<String, String, Integer>
in Java 8, lassen Sie mich wissen, ob dies ein vollständiges Programm sein muss (oder ob ich das Programm überhaupt fallen lassen kann)java.util.regex
Paketpräfix darunter ablegen kann).Die Byteanzahl oben enthält nicht die Newline unten, die lediglich zu Formatierungszwecken auf dieser Site hinzugefügt wird.
Grobe Erklärung:
b
, d. H"[^"+b+"]"
."a" -> 1
).-1
,0
und1
.sum()
um eine Antwort zu bekommen.quelle
Javascript, 206 Bytes
Erweitert:
Erläuterung:
Ich verwende Regex, um zu zählen, wie oft ein Zeichen insgesamt erscheint, und subtrahiere dann alle Male, die es in Gruppen auftrat. Zum Schluss gehe ich die Gruppen durch und mache das Fizz Buzz Increment / Decrement.
Besteht die in der Frage angegebenen Testfälle:
und so weiter
quelle
new
, useexec
anstelle vonmatch
undlength
, und Sie sollten gut sein.Perl,
82656359 Bytes58 Byte + 1 Byte Befehlszeilenparameter
Nicht besonders kurz, aber es ist ein Anfang - wird ihn weiter verkürzen.
Angenommen
-i
, Sie geben der Eingabezeichenfolge die folgende Beispielverwendung:quelle
Pyth, 32 Bytes
so nah! Noch 2 Bytes, um Dennis 'exzellenten CJam-Eintrag zu binden
Testen Sie es online
quelle
Gawk, 140
Eingabe wie folgt: "char space string"
Ungolfed
quelle
Pyth, 27 Bytes
Testsuite
Eingabe in das Formular zB:
Erläuterung:
quelle