L'arme la plus rapide de l'Ouest


23

Vous êtes le cow-boy le plus rude, le plus coriace et le plus cool à l'ouest du Mississippi. Cependant, un gars étrange sur un site Web de nerd farfelu a décidé que ce serait cool de vous plonger dans des paysages inachevés aléatoires et de vous battre. Peu importe, vous gagnerez toujours. Cependant, pour vous aider à gagner ces combats exténuants dont vous parlerez à la maison, il est utile de savoir combien de balles le lâche qui se cache dans le paysage a.

Que diriez-vous d'aider ce pauvre gars. Étant donné un paysage ASCII, trouvez l'arme à l'intérieur et dites-lui combien de balles y sont chargées. Voici l'arme:

  (X)
(X\ /X)
 (XVX)
  \X/

Chacun Xdans l'image ci-dessus est un emplacement potentiel pour une balle. L'emplacement contiendra soit un espace, soit un 0,O,o(peut ne pas être cohérent - le cow-boy peut avoir chargé différents types de balles dans son arme).

Il y aura toujours exactement un pistolet, correspondant à la description ci-dessus, dans le paysage. Cependant, veuillez noter que les espaces autour et à l'intérieur du pistolet peuvent contenir n'importe quoi.

Contribution

Vous recevrez une chaîne contenant des caractères ASCII imprimables (donc pas des tabulations) et des retours à la ligne pour séparer les lignes. Vous pouvez également prendre une liste de chaînes, si vous le souhaitez. Les cordes seront toutes remplies d'espaces, elles auront donc toutes la même longueur. L'entrée aura au moins 4 lignes de haut et 7 colonnes de large.

Il y aura toujours exactement un pistolet dans le paysage.

Sortie

Vous afficherez combien de balles ( 0, O, o) il y a dans le pistolet, donc votre sortie sera toujours entre 0et 6.

Cas de test

  (0)   ( )
(o\ /o( \ / )
 (oVo) ( V )
  \o/   \ /

0

----------------------------
////////////////////////////
////////////////////////////
/////////////(o)////////////
///////////(0\// )//////////
////////////( Vo)///////////
/////////////\ /////////////
////////////////////////////
----------------------------

3

()()()()()()()()()()()()()()()()\)/)()()()()()()()()()()()()
()()()()()()()()()()()()()()()()(V)()()()()()()()()()()()()(
()()()()()()()(\0/)()()()()()()()()()()()()()()()()()()()()(
()()()()()()()()()()()()()()()()()()()()()()()( )()()()()()(
()()()()()()(o)()()()()()()()(00)()()()()()(( \(/0)()()()()(
()()()()()()()()()()()()()()()()()()()()()()(( V )()()()()()
()()()()()()()()()()()()()()()()()()()()()()()\O/()()()()()(

2

------(0)---
||||(0\|/0)
-----(0V0)--
||||||\0/
-------_------
|||||||-|
------|-|
|||||||-|
------|-|

6

00ooOO(0)/\\/V

  ( )
( \\/ )
 ( V )
 \\ /

00OOoo()()()())))

0

  (\)     (0)
(0\\/0) ( \0/ )
 (0V0)   ( V )
 \\0/     \ /

1 (left gun is invalid because of the `\` in the bullet slot)

-00(0)00\0
-(O\0/o)\ 
- (OVo)o\0
-o \ /oo/ 

5

C'est le , donc la réponse la plus courte en octets l'emporte.



10
+1 Si quelqu'un FGITW relève ce défi;)
Beta Decay

2
Vous devez ajouter un cas de test où il y a un 0à l'intérieur de la boîte englobante du pistolet mais à l'extérieur du pistolet.
Martin Ender

@StepHen Oh oui, il y a le zéro à l'intérieur du pistolet qui ne lui appartient pas. Ce serait bien d'avoir des zéros à l'extérieur du pistolet mais aussi dans sa boîte englobante.
Martin Ender

"L'entrée aura au moins 4 lignes de haut et 5 colonnes de large." - s'il y a toujours un pistolet, l'entrée doit avoir au moins 7 colonnes de large.
manassehkatz-Reinstate Monica

Réponses:


19

Escargots , 71 octets

Essayez-le en ligne.

A
\/a=\)2w\V={\\u\(}c=\/b={\\c\(2}u!{(nb|.|.n.)=^o=^O=^0^ }{nb|.|.n.}^ 

4
Programming language for 2-dimensional pattern matching.vous devez être content d'avoir fait ce défi alors: P
Stephen

25
Avez-vous un lien vers cette langue? C'est assez drôle que l'arme la plus rapide de l'ouest soit un escargot.
PyRulez


6
@PyRulez vous pouvez cliquer sur le nom de la langue sur la page TIO
Stephen

Je suis intéressé par la façon dont cela fonctionne.
Kritixi Lithos

6

Mathematica, 170 octets

Catch@BlockMap[b="O"|"o"|"0";MatchQ[#,p=Characters@{"  (X)  ","(X\\ /X)"," (XVX) ","  \\X/  "}/." "->_/."X"->$;p/.$->b|"X"|" "]&&Throw@Count[Pick[#,p,$],b,2]&,#,{4,7},1]&

Prend un tableau de chaînes / caractères. Renvoie le nombre de balles.


4

JavaScript, 215 211 209 octets

Merci à Shaggy pour -4 octets!

f=

i=>[...i].map((_,x)=>eval(String.raw`a=i.match(/(\n|^).{${x}}..\(${Z='([oO0 ])'}\).*\n.{${x}}\(${Z}\\.\/${Z}\).*\n.{${x}}.\(${Z}V${Z}\).*\n.{${x}}..\\${Z}\//);a&&alert(a.filter(i=>/^[oO0]$/.test(i)).length)`))

tests = [["  (0)   ( )\n(o\\ /o( \\ / )\n (oVo) ( V )\n  \\o/   \\ /",0],["----------------------------\n////////////////////////////\n////////////////////////////\n/////////////(o)////////////\n///////////(0\\// )//////////\n////////////( Vo)///////////\n/////////////\\ /////////////\n////////////////////////////\n----------------------------",3],["()()()()()()()()()()()()()()()()\\)/)()()()()()()()()()()()()\n()()()()()()()()()()()()()()()()(V)()()()()()()()()()()()()(\n()()()()()()()(\\0/)()()()()()()()()()()()()()()()()()()()()(\n()()()()()()()()()()()()()()()()()()()()()()()( )()()()()()(\n()()()()()()(o)()()()()()()()(00)()()()()()(( \\(/0)()()()()(\n()()()()()()()()()()()()()()()()()()()()()()(( V )()()()()()\n()()()()()()()()()()()()()()()()()()()()()()()\\O/()()()()()(",2],["------(0)---\n||||(0\\|/0)\n-----(0V0)--\n||||||\\0/\n-------_------\n|||||||-|\n------|-|\n|||||||-|\n------|-|",6],["00ooOO(0)/\\\\/V\n\n  ( )\n( \\\\/ )\n ( V )\n \\\\ /\n\n00OOoo()()()())))",0],["  (\\)     (0)\n(0\\\\/0) ( \\0/ )\n (0V0)   ( V )\n \\\\0/     \\ /",1]]

alert = x => i = x;

tests.forEach((t, index) => {
    i = 'Not Found'
    f(t[0]);
    document.getElementById('a').textContent += t[0] + '\n\n' + i + '\n\n';
    if (i != t[1]) {
        document.getElementById('a').textContent += 'Failed test ' + index + '! Expected '  + t[1] + '\n\n';
        document.getElementById('a').style = 'color: red'
    }
})
<pre id="a"></pre>

Essentiellement, essaie de faire correspondre les ncaractères d' un pistolet après un saut de ligne, nde 0à la longueur de la chaîne.


Économisez quelques octets en les affectant à l' Zintérieur du littéral, la première fois que vous l'utilisez et en vous débarrassant du {}.
Shaggy

@Shaggy Merci!
Artyer

3

Python 2, 219 224 227 octets

import re
f=lambda s:sum(sum(g>' 'for g in m.groups())for m in[re.match(r'.*@..\(X\)..@\(X\\./X\)@.\(XVX\).@..\\X/.*'.replace('X','([0Oo ])').replace('@',r'[^\n]*\n.{%d}'%i),'\n'+s,re.DOTALL)for i in range(0,s.find('\n'))]if m)

EDIT: Correction d'un bug qui me coûtait 5 octets: (... trouvé 3 octets de r''s supplémentaires qui n'étaient pas nécessaires. Et puis Grrr !! Ne comptait pas \correctement les caractères dans mon code, donc ajouté 6 ...

Prend une chaîne avec des sauts de ligne; réaccorde le nombre de balles trouvées.

Fondamentalement, applique une expression régulière qui recherche le motif du pistolet avec 0, 1, ... caractères LineLength de pad au début des lignes.


3

C (gcc) , 357 351 octets

#define M(F,C)F(i){i=s[i]==C;}
b,i;char*s,c;M(L,'(')M(R,')')M(A,'/')M(D,'\\')M(V,'V')B(i){i=b=(c=s[i])==32?b:c==111?b+1:c==79?b+1:c==48?b+1:0;}(*t[])(int)={L,B,R,L,B,D,A,B,R,L,B,V,B,R,D,B,A};main(j,v,k,l)char**v;{for(s=v[1];s[l++]!=10;);for(;k=i,s[i++];){for(j=17;j--;)if(!(t[j])(k-=j==13?l-3:j==8?l-5:j==5?2:j==2?l-4:1))break;b=j<0?putchar(b+47):1;}}

Essayez-le en ligne! (golfé) (agrandi) (357 golfé) (357 élargi)

Je me demandais à quel point une solution serait mauvaise dans une langue sans correspondance de modèle intégrée. Il est sorti beaucoup plus petit que je ne le craignais.

Fondamentalement, cette approche décompose le pistolet en une série de pièces individuelles qu'il s'attend à voir dans des emplacements spécifiques par rapport à un index spécifique. Si toutes les pièces se trouvent là où elles sont attendues, c'est un pistolet! Le test de balle incrémente un compteur global pour garder une trace du nombre de balles qu'il contient, que nous imprimons lorsque nous avons trouvé le seul et unique pistolet dans le paysage.

Remarque 1: J'ai rembourré les cas de test avec des espaces pour assurer des largeurs de ligne cohérentes.

Remarque 2: ajoutez 10 octets si vous n'aimez pas l' attribution au lieu de l' astuce de retour . Pour plus de clarté, j'ai utilisé des instructions de retour réelles dans le code développé.


Trois optimisations mineures: - Utilisez putchar avec la valeur de b directement au lieu de printf (3 octets). - Utilisez l'opérateur ternaire au lieu de l'instruction if pour imprimer le nombre de puces (1 octet). - Roll initialisation du nombre de puces en ternaire d'impression (2 octets). Le dernier est un peu malodorant car cela signifie que b est nul lors du test du premier index, mais comme aucun pistolet ne peut être à l'index 0 de toute façon, je pense que c'est un bon changement.
jiv
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.