Schnellste Waffe im Westen

23

Sie sind der raueste, härteste und coolste Cowboy westlich des Mississippi. Ein seltsamer Typ auf einer verrückten Nerd-Website entschied jedoch, dass es cool wäre, dich in zufällige unfertige Landschaften zu stürzen und zu kämpfen. Egal, du wirst immer noch gewinnen. Um diese anstrengenden Schießereien zu gewinnen, über die Sie nach Hause schreiben, ist es jedoch hilfreich zu wissen, wie viele Kugeln der Feigling in der Landschaft lauert.

Wie wäre es, wenn du diesem armen Kerl hilfst? Suchen Sie in einer ASCII-Landschaft nach der Waffe und teilen Sie ihm mit, wie viele Kugeln in die Waffe geladen sind. Das ist die Waffe:

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

Jedes Xim obigen Bild ist ein möglicher Einschuss für eine Kugel. Der Schlitz enthält entweder ein Leerzeichen oder eines von 0,O,o(möglicherweise nicht konsistent - der Cowboy hat möglicherweise verschiedene Arten von Kugeln in seine Waffe geladen).

Es wird immer genau eine Waffe in der Landschaft geben, die der obigen Beschreibung entspricht. Bitte beachten Sie jedoch, dass die Zwischenräume um und innerhalb der Waffe alles enthalten können.

Eingang

Sie erhalten eine Zeichenfolge, die druckbares ASCII (also keine Tabulatoren) und Zeilenumbrüche enthält, um die Zeilen zu trennen. Auf Wunsch können Sie auch eine Liste mit Zeichenfolgen erstellen. Zeichenfolgen werden alle mit Leerzeichen aufgefüllt, sodass sie alle die gleiche Länge haben. Die Eingabe ist mindestens 4 Zeilen hoch und 7 Spalten breit.

Es wird immer genau eine Waffe in der Landschaft geben.

Ausgabe

Sie geben aus, wie viele Kugeln ( 0, O, o) sich in der Waffe befinden, sodass Ihre Ausgabe immer zwischen 0und erfolgt 6.

Testfälle

  (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

Das ist , also gewinnt die kürzeste Antwort in Bytes.

Stephen
quelle
Sandbox
Stephen
10
+1 Wenn jemand diese Herausforderung FGITWs;)
Beta Decay
2
Sie sollten einen Testfall hinzufügen, in dem sich ein 0innerhalb des Begrenzungsrahmens der Waffe, aber außerhalb der Waffe befindet.
Martin Ender
@StepHen Oh ja, da ist die Null in der Waffe, die nicht dazu gehört. Es wäre gut, Nullen außerhalb der Waffe, aber auch innerhalb des Begrenzungsrahmens zu haben.
Martin Ender
Msgstr "Die Eingabe wird mindestens 4 Zeilen hoch und 5 Spalten breit sein." - Wenn es immer eine Waffe gibt, muss der Eingang mindestens 7 Spalten breit sein.
Manassehkatz-Reinstate Monica

Antworten:

19

Schnecken , 71 Bytes

Probieren Sie es online aus.

A
\/a=\)2w\V={\\u\(}c=\/b={\\c\(2}u!{(nb|.|.n.)=^o=^O=^0^ }{nb|.|.n.}^ 
Feersum
quelle
4
Programming language for 2-dimensional pattern matching.Sie müssen froh sein, dass ich diese Herausforderung dann gemacht habe: P
Stephen
25
Haben Sie einen Link zu dieser Sprache? Es ist ziemlich lustig, dass die schnellste Waffe im Westen eine Schnecke ist.
PyRulez
1
@ PyRulez Hier ist ein Link für Sie
Ovs
6
@ PyRulez können Sie auf den Namen der Sprache auf der TIO-Seite klicken
Stephen
Ich bin daran interessiert, wie das funktioniert.
Kritixi Lithos
6

Mathematica, 170 Bytes

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]&

Nimmt eine Reihe von Zeichenfolgen / Zeichen. Gibt die Anzahl der Aufzählungszeichen zurück.

JungHwan min
quelle
4

JavaScript, 215 211 209 Bytes

Danke an Shaggy für -4 Bytes!

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>

Im Grunde versucht , eine Waffe zu passen nZeichen nach einem Zeilenumbruch, für nvon 0der Länge der Saite.

Artyer
quelle
Sparen Sie ein paar Bytes, indem Sie Zdem Literal bei der ersten Verwendung eine Zuweisung zuweisen und das Symbol entfernen {}.
Shaggy
@ Shaggy Danke!
Artyer
3

Python 2, 219 224 227 Bytes

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)

BEARBEITEN: Es wurde ein Fehler behoben, der mich 5 Bytes kostete: (... fand 3 Bytes an zusätzlichen r''S, die nicht benötigt wurden. Und dann Grrr !! Zählte die \Zeichen in meinem Code nicht richtig, also fügte ich 6 hinzu ...

Nimmt einen String mit Zeilenumbrüchen; wiederholt die Anzahl der gefundenen Kugeln.

Wendet grundsätzlich einen regulären Ausdruck an, der nach dem Pistolenmuster mit den Zeichen 0, 1, ... lineLength des Pads am Zeilenanfang sucht.

Chas Brown
quelle
3

C (GCC) , 357 351 Bytes

#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;}}

Probieren Sie es online! (Golf) (erweitert) (357 Golf) (357 erweitert)

Ich fragte mich, wie schlecht eine Lösung in einer Sprache ohne eingebauten Mustervergleich wäre. Es kam viel kleiner heraus, als ich befürchtet hatte.

Im Grunde zerlegt dieser Ansatz die Waffe in eine Reihe von Einzelteilen, die an bestimmten Stellen in Bezug auf einen bestimmten Index zu sehen sind. Wenn alle Teile dort sind, wo sie erwartet werden, ist es eine Waffe! Der Kugeltest erhöht einen globalen Zähler, um zu verfolgen, wie viele Kugeln sich darin befanden, die wir drucken, wenn wir die einzige Waffe in der Landschaft gefunden haben.

Anmerkung 1: Ich habe die Testfälle mit Leerzeichen aufgefüllt, um eine einheitliche Zeilenbreite sicherzustellen.

Hinweis 2: Fügen Sie 10 Bytes hinzu, wenn Sie den Zuweisungs- Trick nicht mögen , anstatt ihn zurückzugeben . Aus Gründen der Übersichtlichkeit habe ich im erweiterten Code tatsächliche return-Anweisungen verwendet.

jiv
quelle
Drei kleinere Optimierungen: - Verwenden Sie putchar mit dem Wert von b direkt anstelle von printf (3 Byte). - Verwenden Sie den ternären Operator anstelle der if-Anweisung, um die Anzahl der Aufzählungszeichen (1 Byte) zu drucken. - Führen Sie die Initialisierung der Aufzählungsanzahl in das ternäre Druckformat (2 Byte). Das letzte ist ein bisschen übelriechend, da es bedeutet, dass b beim Testen des ersten Index Null ist, aber da ohnehin keine Waffe auf Index 0 stehen könnte, halte ich es für eine faire Änderung.
Jiv