Disons que vous avez une chaîne comme celle-ci:
abaabbbbbaabba
Comptez le nombre de fois qu'un caractère spécifié apparaît dans la chaîne d'entrée, mais uniquement si le caractère n'apparaît qu'une seule fois de suite . Par exemple, si le caractère est a
,
abaabbbbbaabba
^ x x ^
Le total serait de 2 (le aa
ne compterait pas car le a
apparaît deux fois de suite).
Quel est le lien avec FizzBuzz?
Si le caractère apparaît 3 (ou un multiple de 3) fois de suite, ou 5 (ou un multiple de 5) fois de suite, le compteur est décrémenté à la place. S'il s'agit d'un multiple de 3 et 5 fois, le compteur est toujours incrémenté. N'oubliez pas que le compteur est également incrémenté si le caractère n'apparaît qu'une seule fois de suite et il est ignoré si le caractère apparaît un autre nombre de fois de suite (en plus des situations décrites ci-dessus).
Pour récapituler, si la chaîne à faire correspondre est 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)
Implémentation de référence (non golfée) en 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);
}
}
- La chaîne qui sera recherchée peut être de n'importe quelle longueur, mais le motif ne sera qu'un seul caractère.
- Aucune des deux chaînes n'aura de caractères spéciaux regex.
- C'est du golf de code ; le programme le plus court en octets gagne.
- Pas de failles standard.
Réponses:
Funciton , 1840 octets
Merde, cette langue est impassible.
Ce programme s'attend à ce que le premier caractère de l'entrée soit le caractère à rechercher et le reste de l'entrée à effectuer la recherche dans la chaîne. Cela signifie que
aaaba
va recherchera
dans l'entréeaaba
(et donc la sortie 1). Vous pouvez les séparer avec une nouvelle ligne ou un espace (a aaba
) mais uniquement parce que la nouvelle ligne / l'espace supplémentaire ne fait aucune différence pour la sortie.Comme toujours, vous pouvez obtenir un rendu plus joli (sans l'espacement des lignes) si vous exécutez
$('pre').css('line-height',1)
dans la console de votre navigateur.(1840 octets en cas de codage UTF-16.)
Explication
¹
renvoie le premier caractère d'une chaîne.²
compte le nombre d'occurrences d'un caractère au début d'une chaîne donnée. Par exemple, étant donné le caractèrea
et la chaîneaaba
, il renvoie 2. Poura
etbaa
, il renvoie 0.³
appelle²
pour obtenir le nombre de caractères au début, examine si le nombre est divisible par 3 et 5 et s'il est égal à 1 et détermine l'incrément / décrément approprié. Il supprime également un caractère supplémentaire au début de la chaîne (par exemple, étant donnéaaabba
qu'il supprime 3 + 1 = 4 caractères, ce qui donneba
). Ensuite, il s'appelle récursivement avec la chaîne la plus courte et ajoute le résultat.¹
pour supprimer le premier caractère de l'entrée et appelle³
avec ce caractère et le reste de la chaîne comme arguments séparés.la source
CJam,
4036353230 octetsMerci à @ MartinBüttner pour avoir joué au golf sur 1 octet!
Merci à @AndreaBiondo d'avoir joué au golf sur 2 octets et ouvert la voie à 3 autres!
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça marche
la source
llcf=e`::*0-{(_!\6563282Zb:(=}%1b
33 octets.C,
160126125119114109104100 octetsPeut probablement être amélioré ... Cela prend une entrée à partir des arguments de la ligne de commande (le premier argument est le modèle, le second est la chaîne). Ne prend pas en charge la recherche de modèle de caractère NULL (\ x00).
EDIT **
126125119114109104100 octets **: Après avoir intégré les suggestions de Dennis, et quelques idées supplémentaires (clause supprimé autre, combiné le tout en une seule instruction et soustraction utilisé au lieu de =!). Suppression du point-virgule supplémentaire dans la boucle for (cela faisait en fait partie de la suggestion de Dennis). Raccourci encore plus en supprimant les variables «i» et «a».Suppression des opérateurs if et negation ('!') En abusant de l'opérateur ternaire. Compression des vérifications de modularité en utilisant
ce «ET» au niveau du bitun double && parce que «&» au niveau du bit a un bogue, et en mettant la comparaison (t <2) à l'intérieur des opérateurs ternaires. Remplacé !! t * (...) en déplaçant !! t dans l'opérateur ternaire, me permettant ainsi de supprimer les parenthèses.Mec, je veux vraiment l'avoir en dessous de la marque des 100 octets: S
Solutions TENTATIVES: Je ne suis pas sûr que celles-ci soient considérées comme valides, mais je peux descendre à 93 caractères si j'utilise exit (s) au lieu de printf ("% d", s). Mais alors la sortie ne serait pas visible, ce serait plutôt un code retour. Si la sortie est vraiment nécessaire, je peux également la réduire à 98 octets, mais cela nécessiterait également l'impression de toutes les valeurs intermédiaires de s avant la réponse finale ...
la source
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);}
devrait tout aussi bien fonctionner (et c'est 23 octets de moins).main
parfor(a=*z[1];c;i++)
, vous n'avez pas besoin de{}
contourner le si ... sinon.Rubis,
11110396 octetsCe défi a été fait pour Ruby
Enumerable#chunk
, j'ai donc dû le poster. :)Test en ligne: http://ideone.com/pG4mAn
Le code est assez simple. Voici une version plus lisible: http://ideone.com/ub3siA .
la source
Python 3,
361, 300, 296, 263, 256, 237, 229, 188, 178, 164 octets.15 octets enregistrés grâce à vaultah de SOPython.
9 octets enregistrés grâce à Joe Kington de SOPython.
Sauvegardé 11 octets grâce à DSM de SOPython.
C'est la première fois que je soumets une réponse, donc je suis sûr que cela pourrait être beaucoup plus court. Il prend la chaîne de test comme première réponse à l'entrée et le caractère de recherche comme deuxième.
Version non golfée:
J'ai découvert que j'échouais l'un des cas de test.
la source
Haskell, 120 octets
f
Fait le travail.la source
Java,
146152143138139136 octets%3&%5
vérifications.i<2
Comparaison raccourcie .%3&%5
vérification ne fonctionnait pas comme prévu).Mis en œuvre en tant que
BiFunction<String, String, Integer>
dans Java 8, faites-moi savoir si cela doit être un programme complet (ou si je peux même supprimer lejava.util.regex
préfixe du package ci-dessous).Le nombre d'octets ci-dessus n'inclut pas la nouvelle ligne ci-dessous, qui est simplement ajoutée à des fins de formatage sur ce site.
Explication grossière:
b
, c'est-à-dire"[^"+b+"]"
."a" -> 1
).-1
,0
et1
.sum()
pour obtenir une réponse.la source
Javascript, 206 octets
Étendu:
Explication:
J'utilise l'expression régulière pour compter le nombre total de fois qu'un personnage apparaît, puis soustraire de cela toutes les fois où il est apparu en groupes. Enfin, je passe par les groupes et fais l'incrémentation / décrémentation du fizz buzz.
Réussit les cas de test donnés dans la question:
etc
la source
new
, utilisez à laexec
place dematch
et aliaslength
, et vous devriez être bon.Perl,
82656359 octets58 octets + 1 octet paramètre de ligne de commande
Pas particulièrement court, mais c'est un début - continuera de le raccourcir.
En supposant que vous
-i
pouvez utiliser pour donner à la chaîne d'entrée un exemple d'utilisation, procédez comme suit:la source
Pyth, 32 octets
si proche! 2 octets de plus pour égaler l'excellente entrée CJam de Dennis
Testez-le en ligne
la source
gawk, 140
Entrez comme "chaîne d'espace de caractères", comme ceci
Non golfé
la source
Pyth, 27 octets
Suite de tests
Entrez dans le formulaire, par exemple:
Explication:
la source