Welche Schalter sind eingeschaltet?

12

Einführung

Sie sitzen mit Ihrem Kollegen zusammen, essen zu Mittag und prahlen mit ihm / ihr über das neueste und angeblich größte Projekt, an dem Sie gearbeitet haben. Sie werden krank und müde von Ihrem ständigen Schaufenster des Egoismus, er / sie fordert Sie heraus, nur damit Sie den Mund halten. Als die egoistische und happy-go-lucky Person , die Sie sind, können Sie natürlich akzeptieren (weil Sie muss jeder und jede Herausforderung annehmen). Die Herausforderung , wie er / sie es erklärt, besteht darin, bei einer Eingabe eines Textblocks, der 1 oder mehr von jedem Zeichen enthält !@#$^&*, die Koordinaten der Schalter, die "an" sind , in einem angemessenen Format auszugeben .

Laut Ihrem Kollegen ist ein Schalter ein $und ein Schalter wird nur dann als "Ein" klassifiziert, wenn er mindestens eines der folgenden Kriterien erfüllt:

  1. Es ist von allen umgeben ^. So...

    ^^^
    ^$^
    ^^^
    

    führt zu einem "Ein" -Schalter.

  2. Es ist von allen umgeben &. So...

    &&&
    &$&
    &&&
    

    führt zu einem "Ein" -Schalter.

  3. Es ist an mindestens zwei Seiten mit vollständig abgedeckt *. Zum Beispiel,

    ***
    &$&
    ***
    

    führt zu einem "Ein" -Schalter, aber

    &*&
    &$&
    &*&
    

    nicht, da der Schalter auf beiden Seiten von s nicht vollständig verdeckt ist* .

  4. Es gibt mindestens 1 !und / oder 1 @in einer der Ecken um ihn herum. Dies gilt nicht, wenn sich eine dieser beiden nicht in einer Ecke befindet. So...

    !&&
    ^$@
    @&!
    

    führt zu einem "Ein" -Schalter, da es mindestens 1 !und / oder @mindestens 1 der Ecken gibt (im obigen Fall gibt es 2 gültige !s und 1 gültiges @in 3 Ecken). Und...

    &!&
    ^$@
    ^!&
    

    funktioniert nicht , obwohl es 2 !und 1 @, da keiner von ihnen sind in jeder der Ecken.

  5. 1 oder mehr #befinden sich auf keiner Seite des Schalters, es sei denn, mindestens 1 &umgibt den Schalter. Mit anderen Worten, wenn #auf einer Seite mindestens eine vorhanden ist, werden alle anderen Regeln außer Kraft gesetzt, sofern nicht auch eine &vorhanden ist. Deshalb:

    #&*
    *$*
    !**
    

    führt zu einem "Ein" -Schalter, obwohl ein #vorhanden ist, da sich &um den Schalter ein befindet, und er folgt mindestens einer der obigen Regeln. Wenn das Ausrufezeichen jedoch nicht so vorhanden wäre:

    #&*
    *$*
    ***
    

    Der Schalter wäre ausgeschaltet, da er nicht mindestens einer der oben genannten Regeln entspricht. Daher wäre ein Schalter, obwohl er von einem #und einem umgeben sein mag, &immer noch ausgeschaltet, es sei denn, er folgt einer oder mehreren dieser Regeln. Außerdem muss zwischen s und s immer ein Verhältnis von> = 1: 1 bestehen, damit der Switch gültig ist. Zum Beispiel,&#

    #&!
    *$*
    **#
    

    wäre immer noch ein ungültiger Schalter, obwohl er 1 dieser Regeln folgt, da es 2 #s gibt, aber nur 1 &, und daher kein Verhältnis von> = 1: 1 zwischen &s und #s. Um dies gültig zu machen, müssen Sie eine oder mehrere zusätzliche &s zu einer Kante hinzufügen , um die Anzahl der #s und &s auszubalancieren , möglicherweise wie folgt:

    #&!
    *$&
    &*#
    
    3:2 ratio between &s and #s
    

    Schließlich...

    #^^
    ^$*
    @^!
    

    Ergebnisse in einer „Aus“ -Schalter, obwohl sie 1 oder mehrere der oben genannten Regeln folgen, da es enthält mindestens 1 #um sie herum, und keine &s, um überwiegen.

  6. Die gültigen Schalter wird nur sein , innerhalb eines Eingangs und daher jeder gültige $muss umgeben sein vollständig von jedem 8 der gültigen Zeichen. Zum Beispiel, wenn die gesamte Eingabe wäre:

    *$*
    !$!
    !!!
    

    Die Oberseite $ist definitiv kein gültiger Schalter, da sich der Schalter an einer Kante befindet und der Schalter daher nicht vollständig von 8 gültigen Zeichen umgeben ist. In diesem Fall sollte der Schalter nicht einmal in Betracht gezogen werden. Der Schalter in der Mitte ist jedoch vollständig gültig und tatsächlich "an", da er mindestens eine der oben genannten Anforderungen erfüllt.

Betrachten Sie zur Demonstration diesen Zeichenblock:

!@#^^$#!@
!@#$$*$&@
@$^!$!@&&

die wir für Koordinaten wie folgt beschriften können, indem wir die vertikale yund die horizontale Achse nennen x:

y

3 !@#^^$#!@
2 !@#$$*$&@
1 @$^!$!@&&

  123456789 x

Die Koordinaten müssen immer in einem (x,y)Format zurückgegeben werden, das einem zweidimensionalen Koordinatengitter ähnelt. Welche Schalter sind jetzt eingeschaltet? Nun, lassen Sie uns zuerst alle finden. Wir können bereits sehen, dass es eine ganz oben und eine ganz unten gibt. Dies sind jedoch automatisch No-Ops, da sie nicht vollständig von 8 Zeichen umgeben sind.

Als nächstes kommt der in Zeile 2. Im Einzelnen dieser:

#^^
#$$
^!$

Wir können sehen, dass es 3 $Zeichen gibt, aber wir wollen uns nur auf das in der Mitte konzentrieren, und wie Sie wahrscheinlich sehen können, ist es bereits ungültig, da es 2 Zeichen #um sich hat, ohne &sie auszugleichen aus. Darüber hinaus folgt dies nicht einmal einer der Regeln. Selbst wenn es sich um einen gültigen Schalter handeln würde, wäre er sowieso "aus".

Als nächstes kommt eine weitere in Reihe 2:

^^$
$$*
!$!

Fokussiere wieder nur auf den Schalter in der Mitte. Dieser Schalter ist "on", da er mindestens 1 !in mindestens 1 Ecke hat. Die Koordinaten von diesem sind (5,2).

Weiter geht es schließlich mit dem letzten Schalter. Dieser ist auch in der zweiten Reihe und sieht so aus:

$#!
*$&
!@&

und, wie Sie wahrscheinlich sehen können, ist dieser auch ein gültiger Schalter, obwohl er von einer #Umgebung umgeben ist, da es 2 andere gibt &, die das Gleichgewicht halten #. Darüber hinaus hat es auch mindestens 1 !in mindestens 1 der Ecken, und daher ist nicht nur der Schalter gültig, sondern es ist auch "an". Die Koordinaten dieses Schalters sind (7,2).

Wir haben endlich das Ende erreicht und 2 "Ein" -Schalter in diesem gesamten Textblock gefunden. Ihre Koordinaten sind (5,2)und (7,2), was ist unsere endgültige Antwort und wie sollte die Ausgabe sein. Diese Eingabe war jedoch sehr einfach. Eingaben können sehr viel größer werden, da die Größe des Textblocks nicht begrenzt ist. Beispielsweise könnte die Eingabe sogar ein zufälliger 200x200Textblock sein.

Einschränkungen

  • Standardlücken sind verboten.

  • Es kann unmöglich ein eingebautes Programm dafür geben, aber für den Fall, dass es solche gibt (in Mathematica), ist die Verwendung von eingebauten Programmen, die dies direkt lösen, verboten.

Testfälle:

Gegeben im Format string input -> [array output]:

@#$$&^!&!# 
@*&!!^$&^@
$!#*$@#@$!   ->  [[7,3],[9,2]]
*@^#*$@&*#

#^&!$!&$@@#&^^&*&*&&
!^#*#@&^#^*$&!$!*^$$
#^#*#$@$@*&^*#^!^@&* -> [[19,3],[15,3],[8,2]]
#$@$!#@$$^!#!@^@^^*#

@!@!^&*@*@
*$*^$!*&#$
@$^*@!&&&#
**$#@$@@#!  -> [[2,8],[5,8],[6,6],[9,3]]
##*&*#!^&^
$&^!#$&^&@
^^!#*#@#$*
$@@&#@^!!&
#@&#!$$^@$


!!@##!$^#!&!@$##$*$#
$^*^^&^!$&^!^^@^&!#!
@*#&@#&*$!&^&*!@*&** -> [[9,4],[9,3]]
^!!#&#&&&#*^#!^!^@!$
&$$^*$^$!#*&$&$#^^&$

Mehr folgt bald

Zusätzliche Bemerkungen

  • Sie können davon ausgehen, dass die Eingabe immer in Form eines vollständigen Blocks (dh eines Rechtecks ​​oder Quadrats) erfolgt.
  • Es wird nie ein anderes Zeichen in der Eingabe geben als das in !@#$^&*.

Denken Sie daran, dies ist ein so dass der kürzeste Code gewinnt!

R. Kap
quelle
12
Scheint etwas lang und willkürlich.
Orlp
@orlp Dafür bin ich da. Es ist sowieso eine Herausforderung. Warum sagst du, dass es willkürlich ist?
R. Kap
6
@ R.Kap Es gibt keine Rechtfertigung für eine der Regeln; Sie scheinen so zusammengesetzt zu sein, dass sie ohne Grund Komplexität hinzufügen.
Fund Monica Klage
6
@ QPaysTaxes Welche Begründung braucht das? Diese sind der Herausforderung gewachsen. Es ist eine Herausforderung, und eine Herausforderung kann buchstäblich alles sein . Alles, was es wirklich braucht, ist ein Satz von Regeln, eine Eingabe und was die Ausgabe auf diesen Regeln basieren soll.
R. Kap
1
Ich sage nicht, dass ich einverstanden bin, ich erkläre, warum es willkürlich aussieht. Nehmen Sie meine beliebteste Herausforderung als Beispiel: Wenn Sie den gesamten Kontext entfernt haben und nur gesagt haben: "Sie erhalten eine Reihe von Zeichenfolgen. Ordnen Sie sie auf der Grundlage der Einrückung zu Gruppen, mischen Sie die Gruppen und mischen Sie dann die inneren Gruppen, behalten Sie jedoch die Mitglieder von "Innere Gruppen am unteren Rand, wenn es sie gibt", würde das keinen Sinn ergeben. Da es sich jedoch um einen Kontext handelt, geben alle diese seltsamen Regeln und Einschränkungen zumindest vor, einen Sinn zu ergeben.
Fund Monica Klage

Antworten:

2

Haskell, 304 Bytes

import Data.List
s!c=sum[1|a<-s,a==c]
f t|Just w<-elemIndex '\n't,h<-t!'\n'=[c|c<-mapM(\a->[2..a-1])[w,h],s<-[(\[x,y]->t!!((h-y-1)*(w+1)+x))<$>mapM(\a->[a-2..a])c],s!!4=='$',foldr1(-)((s!)<$>"#&")<1,or$("@!"/="@!"\\map(s!!)[0,2..8]):zipWith(\c i->all(==c)$(s!!)<$>[0..8]\\(4:i))"^&**"[[],[],[1,7],[3,5]]]

Dies definiert die Funktion, fdie die gegebene Aufgabe ausführt.

faubi
quelle
2

JavaScript (ES6), 363 339 312 309 298 Byte

Dies ist eine Funktion, die die Eingabe als Zeichenfolge verwendet und eine Liste von Koordinaten zurückgibt. Es ist in zwei Hauptteile unterteilt: eine Transformation von Schaltern in ein Koordinatenpaar und die umgebenden Zeichen und eine Überprüfung auf der Grundlage der Regeln der Herausforderung für die umgebenden Zeichen.

a=>[...a].map((z,p,m)=>(y-=z==B,z)=='$'&&(r=m[p-n-2]+m[p-n]+m[p+n]+m[p+n+2]+m[p-n-1]+m[p-1]+m[p+1]+m[p+n+1],r=r[L]<9?r:'')[T]`&`[L]>=r[T]`#`[L]&&(/(\^|&){8}|\*{4}(.\*\*.|\*..\*)/.exec(r)||/!|@/.exec(r.substr(0,4)))&&[1+(p-(w-y))%n,y],y=w=a[T='split'](B='\n')[L='length'],n=a.search(B)).filter(e=>e)
XavCo7
quelle
2

Python 2 , 299 297 279 275 261 259 Bytes

m=input()
R=range
h=len(m)
for y in R(h-2):
 for x in R(len(m[0])-2):
	a=''.join(m[y+o][x:x+3]for o in R(3))
	if(a.count('&')>=a.count('#'))*(a[:4]+a[5:]in('^'*8,'&'*8)or'*'*6in(a[:3]+a[6:],a[::3]+a[2::3])or'!'in a[::2]or'@'in a[::2])*a[4]=='$':print x+2,h+~y

Probieren Sie es online!

Übernimmt die Eingabe als Liste von Zeichenfolgen

Druckt die Ausgabe als Paar von x, y-Koordinaten in jeder Zeile

TFeld
quelle