Combien de Jimmys peuvent contenir?

29

Dans ce défi simple mais amusant , on vous a demandé de déterminer si Jimmy tomberait de sa plateforme. Jimmy a trois parties du corps /, oet \disposées comme ceci

/o\

Les plateformes sont représentées par -. Jimmy tombera de sa plate-forme s'il a deux ou plusieurs parties du corps qui ne sont pas directement au-dessus d'une plate-forme.

Quelques exemples:

   /o\
- -------

Jimmy s'équilibrera puisque toutes leurs parties du corps sont au-dessus de a -.

   /o\
    ------   ---

Jimmy sera équilibré puisque deux parties du corps sont au-dessus de l' -art.

 /o\
-- ----  --

Jimmy s'équilibrera même s'ils sont répartis entre deux plates-formes

  /o\
   -

Jimmy ne sera pas équilibré car deux parties du corps ne sont pas au-dessus d'une plate-forme.


Votre tâche consiste à écrire un programme qui prend une plate-forme comme un conteneur long contenant uniquement -s et s (par exemple une chaîne) et génère le nombre de Jimmys qui peuvent être placés sur la plate-forme de sorte qu'aucun d'entre eux ne tombe et aucun ne le fasse chevauchement. Un Jimmy peut avoir une de ses parties du corps à gauche du début de la chaîne ou à droite de la fin de la chaîne.

Il s'agit de donc les réponses sont notées en octets avec moins d'octets comme objectif.

Cas de test

Contributions

-  -  -

- -
--
-- --
----
- -- --
------- -

Sorties respectives

0
0
1
1
2
2
2
3
Assistant de blé
la source

Réponses:

15

JavaScript (ES6),  45 41  40 octets

4 octets enregistrés grâce à @Shaggy

s=>(0+s+0).split(/.--|-.-|--./).length-1

Essayez-le en ligne!

Arnauld
la source
1
41 octets
Shaggy
7
@Shaggy Merci! Je savais que quelque chose n'allait pas là-bas, mais j'ai dû aider ma femme à un niveau Super Mario Galaxy en attendant ... et c'était aussi un problème de plates-formes cassées. : p
Arnauld
2
le ---n'était pas bien assis avec moi non plus, jusqu'à ce que je travaille sur mon port et que je réalise qu'ils n'étaient pas nécessaires. Je pense que je l'appellerai un jour ici, attrape un sac de canettes et jette SMG moi-même - je ne l'ai pas joué depuis longtemps.
Shaggy
Et maintenant, toutes les autres réponses utilisent le même regex.
Cœur
8

Python 2 , 53 octets

lambda s:len(re.findall('.--|-.-|--.',`s`))
import re

Essayez-le en ligne!

Basé sur l'expression régulière d'Arnauld . Recherche avidement toutes les sous-chaînes de longueur 3 qui ne se chevauchent pas avec deux ou plus -. Une astuce consiste à `s`placer la chaîne d'entrée entre guillemets comme rembourrage pour laisser de la place à Jimmys pour qu'il se bloque à chaque extrémité comme

/o\/o\
'----'

Python 2 , 57 octets

f=lambda s:'--'in s[:3]*2and-~f(s[3:])or s>''and f(s[1:])

Essayez-le en ligne!

Nécessite un format d'E / S ringard de l'entrée déjà entre guillemets. Sorties Falsepour 0.

Une fonction récursive qui place chaque Jimmy à la position la plus à gauche autorisée, soit en plaçant Jimmy sur les trois premiers caractères s'ils peuvent contenir Jimmy, soit en supprimant le premier caractère. Une astuce mignonne consiste à vérifier s'il en s[:3]contient deux ou plus -en faisant '--'in s[:3]*2, ce qui concatène deux copies de s[:3]et vérifie deux adjacentes -.

xnor
la source
3

Japt , 16 octets

Basé sur la solution JS originale d'Arnauld. J'ai essayé quelques méthodes différentes pour obtenir le rembourrage nécessaire de chaque côté de l'entrée, mais tous sont arrivés à la même longueur - toujours à la recherche d'un moyen plus court ...

ûUÊÄÄ è".--|-."ê

Essaye-le

ûUÊÄÄ è".--|-."ê     :Implicit input of string U
û                    :Centre pad with spaces to length
 UÊ                  :  Length of U
   ÄÄ                :  Add 1, twice
      è              :Count the occurrences of
       ".--|-."ê     :  ".--|-." palindromised, resulting in the RegEx /.--|-.-|--./g
Hirsute
la source
3

Excel, 96 octets

A1= plate-forme. Entré comme tableau Formule Ctrl+ Shift+Enter

=SUM(IF(LEN(TRIM(MID(IF(MOD(LEN(A1),3)=1," ","")&A1,3*ROW(INDIRECT("A1:A"&LEN(A1)))-2,3)))>1,1))
remoel
la source
3

05AB1E , 16 octets

ðì‚ε3ôʒ'-¢2@}g}à

Peut certainement être joué au golf. Parfois, il est ennuyeux de voir toutes ces réponses d'expression rationnelle dans un défi lors de l'utilisation de 05AB1E, qui manque de toute expression régulière. ;)

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

ðì            # Prepend a space before the (implicit) input
             # Pair it with the unmodified (implicit) input
   ε          # Map both to:
    3ô        #  Split them into parts of size 3
      ʒ       #  Filter these parts by:
       '-¢   '#   Where the amount of "-"
          2@  #   Is larger than or equal to 2
      }g      #  After the filter: take the length to get the amount of items left
            # After the map: get the maximum of the two
              # (which is output implicitly as result)
Kevin Cruijssen
la source
2

Java 8, 41 octets

s->(0+s+10).split(".--|--.|-.-").length-1

Essayez-le en ligne.

Port de la réponse JavaScript de @Arnauld , sauf qu'il +0s'agit +10de corriger des cas de test comme ----. Ceci est nécessaire car le String#splitJava intégré supprimera les chaînes vides de fin par défaut. Ceci peut être changé en ajoutant un paramètre supplémentaire au splitbuiltin (qui est 0par défaut dans le split-builtin avec un seul argument String). Pour citer l'utilisation de ce paramètre supplémentaire à partir des documents:


nn-1n
n
n zéro, le motif sera appliqué autant de fois que possible, le tableau peut avoir n'importe quelle longueur,

Pour cette raison, .split("...",-1)est généralement utilisé pour conserver TOUTES les chaînes vides à la fin, et j'aurais pu également l'utiliser pour cette réponse ( Essayez-le en ligne ). Dans ce cas , changer le +0pour +10économiser deux octets sur le ,-1, cependant. :)

Kevin Cruijssen
la source
0

Fusain , 25 octets

Pθ↖Fθ¿›№KM-¹«⊞υωM³→»→⎚ILυ

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

Pθ↖

Imprimez la plate-forme sans déplacer le curseur, puis déplacez le curseur vers le haut et vers la gauche car c'est la première position potentielle de Jimmy.

Fθ

Recherchez autant de Jimmies qu'il y a de positions sur la plateforme.

¿›№KM-¹

Vérifiez s'il y a plus d'une pièce de plate-forme à cette position.

«⊞υω

Si c'est le cas, notez une position Jimmy valide ...

M³→»

... et déplacez trois personnages vers la droite pour que les Jimmies ne se chevauchent pas.

Sinon, la prochaine position potentielle de Jimmy est un caractère à droite.

⎚ILυ

Effacez la plate-forme et affichez le nombre de positions découvertes.

Neil
la source
0

Orme 0,19, 108 octets

import Regex as R
f p=List.length<|R.find(Maybe.withDefault R.never<|R.fromString".--|-.-|--.")(" "++p++" ")

Basé sur l'expression régulière dans la réponse JavaScript d' Arnauld . Vérifiez tous les cas de test ici .

Solution alternative sans regex, significativement plus longue à 171 octets :

f p=(String.foldl(\z{x,y,s,c}->let(t,d)=if s<1&&List.length(List.filter((==)'-')[x,y,z])>1 then(2,c+1)else(max 0 s-1,c)in{x=y,y=z,s=t,c=d}){x=' ',y=' ',s=0,c=0}(p++" ")).c

Vérifiez tous les cas de test ici .

OOBalance
la source