Ce défi est le prix de NinjaBearMonkey pour avoir gagné mes troupeaux de bots! contester avec la soumission Black Knight . Félicitations NinjaBearMonkey!
Le défi ici est assez simple, mais a une variété d’approches possibles. L'histoire raconte que dans le monde des illusions isométriques , il existe 6 types de créatures différentes:
- Ninjas, abrégés
N
- Ours, abrégé
B
- Singes, abrégés
M
- NinjaBears, abrégé
NB
- BearMonkeys, en abrégé
BM
- NinjaBearMonkeys, en abrégé
NBM
( NinjaBearMonkey est, bien sûr, le dernier type le plus puissant.)
Votre tâche consiste à recenser ces créatures lorsqu'elles sont alignées côte à côte, c'est-à-dire lorsque leurs chaînes d'abréviations sont concaténées. La mise en garde est que vous devez vous assurer de ne pas trop compter les parties de certaines créatures en tant que créatures distinctes qui se ressemblent. Les créatures s'aligneront de telle sorte que:
- Toute instance de
NBM
1 NinjaBearMonkey et 0 autre créature. - Toute instance
NB
non suivie deM
est 1 NinjaBear et 0 autre créature. - Toute instance
BM
non précédée deN
est 1 BearMonkey et 0 autre créature. - Sinon, les instances de
N
,B
etM
sont respectivement des ninjas, des ours et des singes isolés.
La ligne se lit de gauche à droite.
Ainsi, par exemple, dans la lignée des créatures NBMMBNBNBM
, il y a 0 Ninja, 1 Ours, 1 Singe, 1 NinjaBear, 0 BearMonkeys et 2 NinjaBearMonkeys.
Défi
Ecrivez un programme ou une fonction qui prend une chaîne de caractères N
, B
et M
, et imprime ou retourne le nombre de chacun des 6 types de créatures qu'il contient.
La sortie devrait avoir la forme
#N #B #M #NB #BM #NBM
avec le nombre de créatures respectives remplaçant chaque #
signe. Tous les 6 comptes doivent être affichés, séparés par des espaces, même lorsqu'ils sont 0. Cependant, ils peuvent être dans n'importe quel ordre (par exemple, ils #NBM
pourraient venir en premier).
Également:
- La chaîne d'entrée ne contiendra que les caractères
N
,B
etM
. - Si la chaîne vide est entrée, tous les comptages sont 0.
- La sortie peut éventuellement contenir un seul espace de début et / ou de fin et / ou une nouvelle ligne de fin.
La soumission la plus courte en octets l'emporte.
Exemples
Entrée: NB
sortie:0N 0B 0M 1NB 0BM 0NBM
Entrée: NBM
sortie:0N 0B 0M 0NB 0BM 1NBM
Entrée: NBMMBNBNBM
(exemple d'en haut)
Sortie:0N 1B 1M 1NB 0BM 2NBM
Entrée: MBNNBBMNBM
sortie:1N 1B 1M 1NB 1BM 1NBM
Entrée: NNNMNBMMBMMBMMMNBMNNMNNNBNNNBNBBNBNMMNBBNBMMBBMBMBBBNNMBMBMMNNNNNMMBMMBM
sortie:17N 6B 14M 5NB 8BM 3NBM
NBMNBM
serait une entrée parfaitement valide. En le lisant de gauche à droite, il y a clairement 2 NinjaBearMonkeys.Réponses:
Pyth, 22 octets
Un moyen assez astucieux de sauvegarder 1 octet, grâce à @Jakube.
Pyth, 23 octets
Manifestation.
Imprime dans l’ordre inverse, avec un espace de fin et pas de nouvelle ligne.
.:"NBM")
est toutes les sous-chaînes, les_
met dans le bon ordre,/zN
compte les occurrences et=:zNd
remplace sur place chaque occurrence de la chaîne en question par un espace.la source
JavaScript ES6, 86 octets
(Je viens juste de répondre à cela.) Il passe par chaque sous-chaîne de
NBM
, en commençant par les plus longues, qui ont une priorité plus élevée. Il recherche chaque occurrence de cette chaîne particulière et la supprime (dans ce cas, la remplace par le nombre actuel afin qu'elle ne corresponde plus). Il remplace finalement chaque sous-chaîne par le compte + la chaîne.Cet extrait de pile est écrit dans l'équivalent ES5 du code ci-dessus pour faciliter le test à partir de n'importe quel navigateur. C'est aussi un code légèrement non-golfé. L'interface utilisateur est mise à jour à chaque frappe.
la source
'NBM<newline>BM<newline>...<newline>N'.replace(/./g, ...)'
, où les<newline>
s sont des sauts de ligne littéraux et les'
s sont des backticks, formant une chaîne de template ES6? Enregistre deux octets dans l'expression régulière (.
ne correspond pas aux nouvelles lignes).Python 2, 78
Une variante de la réponse de Vioz . Amusez-vous avec les représentations de chaînes Python 2!
Compte indirectement les occurrences de la sous-chaîne en y coupant, en comptant les parties et en soustrayant 1. Au lieu de remplacer les sous-chaînes par un symbole de remplissage, remplace la chaîne par la liste
split
produite. Ensuite, lorsque nous prenons sa représentation sous forme de chaîne, les parties sont séparées par des espaces et des virgules.la source
Ruby,
166807268 caractèresExplication:
Le comptage se fait en sens inverse. En effet, les ninjas, ours et singes les plus longs priment les plus petits.
Pour
NBM
,BM
etNB
, les séquencesgsub!
sortent de la chaîne d'origine avec un bloc pour compter le nombre de ces séquences existantes (oui, la fonction modifie son argument).BNBMM
ils seraient comptés commeNBM
etBM
au lieu deB
,NBM
etM
(parce que lorsque leNBM
serait supprimé, il serait mis leB
etM
ensemble et il n'y aurait pas moyen de le distinguer). À l'origine, j'avais renvoyé une chaîne de caractères unique (.gsub!('NBM'){c+=1;?|}
), mais je me suis rendu compte que je pouvais simplement renvoyer le résultat de+=
(qui est un nombre, donc il ne peut en être aucunN
B
M
).PourMaintenant, c'est une boucle (je ne sais pas pourquoi je n'y avais pas pensé en premier lieu), donc cela se fait de la même manière.M
,B
etN
, je peux justecount
combien il y en a dans la chaîne (pas besoin de les enlever viagsub!
).Solution similaire en autruche ,
5451 caractères :Malheureusement, ce n’est pas une solution valable, car il existe un bogue dans la version actuelle d’Ostrich (qui est maintenant corrigé, mais après la publication de ce défi).
la source
%w(NBM BM NB M B N)
et en supprimant la division.Java,
166162Et avec quelques sauts de ligne:
Cela fonctionne assez simplement. Bouclez simplement les jetons, remplacez-les par des points et comptez tant que l'entrée en contient. Commence par compter les plus gros, pour que les plus petits ne le gâchent pas.
Au départ, j'ai essayé de tout remplacer en même temps et de compter la différence de longueur, mais il a fallu quelques caractères supplémentaires de cette façon :(
la source
println
seule déclaration est plus grande que cela. J'en suis cependant satisfait: DString q[]=
pourString[]q=
CJam,
363231 octetsMerci à @Optimizer pour le golf de 1 octet.
Essayez-le en ligne dans l' interprète CJam .
Comment ça marche
la source
N*
->`
devrait suffire.R,
153134118Cela a pris beaucoup de temps, mais j'espère pouvoir en raser quelques-uns. L'entrée est STDIN et la sortie sur STDOUT.
Edit Changement de virement de bord. Je me suis débarrassé de la chaîne fendue et du comptage des pièces. Maintenant, je remplace les pièces par une chaîne plus courte que la pièce. La différence entre les longueurs de chaîne est collectée pour la sortie.
Explication
Essai
la source
Pyth, 19 octets
Ceci est un mélange de la solution Pyth @ isaacg et de l'incroyable tour Python de @ xnor.
Essayez-le en ligne: démonstration ou test de harnais
Explication
la source
Julia,
10697 octetsCela crée une fonction non nommée qui prend une chaîne en tant qu'entrée et affiche le résultat dans STDOUT avec un seul espace de fin et sans nouvelle ligne. Pour l'appeler, donnez-lui un nom, par exemple
f=b->...
.Ungolfed + explication:
Exemples:
la source
Python 2,
93888984 octetsPrenant l'approche simple.
Appelle comme ça:
La sortie est comme ça:
la source
in
.SAS,
144 142 139129Utilisation (7 octets ajoutés pour sysparm):
ou
Usage:
Résultat:
la source
cats('s/',z,'/x/')
à la place de's/'||strip(z)||'/x/'
.macro a i="&sysparm";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;%
data;i="&sysparm";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;
. Puisque vous lisez déjà desysparm
, vous pouvez aussi bien l’exécuter comme une étape de données. Et si vous travaillez en batch, vous n’avez pas besoinrun;
.%macro a(i);i="&i";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;%mend;
PHP4.1, 92 octets
Pas le plus court, mais qu'attendez-vous de plus de PHP?
Pour l'utiliser, définissez une clé sur un cookie, post, obtenir, session ...
L'approach est basique:
Facile, non?
la source
JavaScript,
108116 octetsJuste une approche simple, rien d'extraordinaire
la source
All 6 counts must be shown, separated by spaces, even when they are 0.
. Cas de test:N
Perl, 46
la source
SpecBAS - 164
Utilise la même approche que beaucoup d'autres. La ligne 4 continue de passer en boucle sur la chaîne (en commençant par la plus grande), la remplace si elle est trouvée.
SpecBAS a quelques petites touches par rapport à l’original ZX / Sinclair BASIC (lecture en boucle des listes, recherche de personnages), que je découvre encore.
la source
C,
205186184 octetsUne approche légèrement différente basée sur la machine à états. où
t
est l'étatÉtendu
Fonction de test
la source
for(;;*s++){...}
au lieu dedo{...}while(*s++);
sauver quelques octets? En outre, vous n'avez pas besoin du caractère de nouvelle ligne dans le fichierprintf
.for(;*s;s++)
. Mais je devais boucler avec ce dernier caractère nul. Bon appel à sauver le\n
, ce qui n'est pas nécessaire.C, 146
la source
Haskell - 177 octets (sans importations)
(Désolé pour la nécromancie Internet ici.)
La plate-forme Haskell ne permet pas la recherche de chaînes sans importations et je voulais montrer et exploiter le fait que les chaînes recherchées sont toutes des sous-chaînes d'une chaîne (sans répétitions), afin de pouvoir regrouper les caractères en identifiant les paires autorisées à se suivent, c'est quoi
f
fait ici.J'ai toujours besoin de la liste complète
l
à la fin pour vérifier l'égalité et afficher exactement ce qui est requis, mais ce ne serait pas le cas si le seul défi était de signaler le nombre d'occurrences possibleswords
dans n'importe quel ordre.la source
Bash - 101
Passez la chaîne comme premier argument.
Expliqué un peu:
la source
rs , 275 octets
Démo en direct et tests.
Les rouages sont simples mais un peu bizarres:
Cela utilise de manière créative des groupes pour transformer les entrées de la manière suivante:
dans
La ligne suivante:
Ceci remplace les séquences de lettres majuscules par des traits de soulignement.
Cela insère simplement un signe dièse au début de la ligne.
C'est la partie cool du début. Il prend essentiellement les séquences de lettres minuscules et des caractères de soulignement, les convertit en lettres majuscules, les regroupe et les place avant la livre insérée. Le but de la fourrière est de gérer les séquences déjà traitées.
La livre est réinsérée au début de la ligne.
Les lettres majuscules sont remplacées par leurs équivalents textuels avec les nombres associés. À cause d'un bogue dans rs (je ne voulais pas risquer de le réparer et d'être disqualifié), les séquences vides sont converties en
(^^)
, qui sont remplacées par un 0 dans l'avant-dernière ligne. La toute dernière ligne supprime simplement la livre.la source
KDB (Q), 76 octets
Explication
Tester
la source
Haskell: 244 octets
la source
p
et unes
seule fois, il n'y a donc pas besoin de lui donner un nom (->a#[]=[]:a#"NBM"
, même pourp
). BTW:words"N B M NB BM NBM"
au lieu de la liste des chaînes, vous enregistrez des octets supplémentaires. C’estimport
seulement pourintercalate
, c’est plus court pour le ré-implémenter:...putStrLn.tail.((' ':)=<<)$map...
et vous en débarrasserimport
. Mettez tous les gardes|
dans la définition de#
dans une seule ligne et utilisez à la1<2
place deTrue
:...#(b:m)|a==b=...l#m|1<2=[]...
...?
peut être défini plus court avec une compréhension de la liste:c?t=sum[1|x<-c,x==t]
. Encore une fois, vous utilisez une?
seule fois, utilisez donc le corps directement:...show(sum[1|x<-l#[],x==t])
.