Bruder Simulator

73

T er aus der Ordnung der St Golfus Brüder , die Concise hat eine Tradition, ein kurzes Gebet zu rezitieren , wenn sie sehen , dass jemand das machen Zeichen des Kreuzes . Aufgrund des hohen Grades an Sünde, der in letzter Zeit bei Touristen festgestellt wurde, haben sie im Kloster Videoüberwachung installiert und Sie beauftragt, ihnen dabei zu helfen, alte Traditionen im Zeitalter der KI am Leben zu erhalten.

Ihre Aufgabe ist es, die Ausgabe der Finger-Tracking-Software der Brüder zu analysieren und festzustellen, wie viele Gebete fällig sind. Die Eingabe ist eine Matrix, die Ganzzahlen zwischen 0 und 4 enthält. 1,2,3,4 repräsentieren die Positionen der Finger zu aufeinanderfolgenden Zeitpunkten. 0 steht für Nicht-Finger.

Der One True Way TM , um sich selbst zu kreuzen, ist:

.1.
3.4
.2.

("." entspricht einer beliebigen Ziffer). Aufgrund der Ungewissheit über die Rotation der Kamera und der Anwesenheit frommer ostorthodoxer Brüder in der Menge (deren One True Way TM in die entgegengesetzte Richtung zur Seite zeigt) sollten Sie auch alle Rotationen und Reflexionen zählen:

.4. .2. .3. .1. .3. .2. .4.
1.2 4.3 2.1 4.3 1.2 3.4 2.1
.3. .1. .4. .2. .4. .1. .3.

Eine Ziffer kann Teil mehrerer Kreuze sein. Helfen Sie den Brüdern, zu bestimmen, wie oft ihre KI vorhanden sein soll, .pray()indem Sie zählen, wie viele der oben genannten 3x3-Submatrizen vorhanden sind. Schreiben Sie ein Programm oder eine Funktion. Nehmen Sie Eingaben in einer angemessenen und praktischen Form vor.

Testament Fälle:

// in
[[0,4,2,0],
 [1,3,2,4],
 [2,3,1,0]]

// out
2

// in
[[4,3,3,2,4,4,1,3,2,2],
 [0,3,0,2,1,1,2,3,2,3],
 [0,3,1,3,2,4,3,3,1,1],
 [4,3,2,3,2,4,1,4,2,3],
 [0,4,2,3,4,0,2,3,2,4],
 [2,1,0,0,2,0,0,1,2,4],
 [4,0,3,1,3,2,0,3,2,3],
 [1,4,3,3,1,4,0,1,4,4],
 [0,2,4,3,4,3,1,3,0,4],
 [3,0,1,0,4,0,3,3,3,3]]

// out
3

// in
[[3,2,3,1,0,3,4,2,1,1,1,1,4,0,1,3,1,1,2,1,1,3,0,1,0,1,1,0,0,1,0,3,4,0,1,1,2,3,1,2,4,1,0,2,3,0,2,4,3,2],
 [2,4,1,1,0,3,0,2,4,2,3,2,1,3,0,2,3,2,4,4,4,3,2,1,1,3,2,1,2,3,2,4,0,3,1,4,4,1,1,0,1,1,0,2,2,3,1,2,0,2],
 [3,4,0,0,4,4,0,3,4,4,1,3,2,1,3,2,3,2,2,0,4,0,1,2,3,0,4,3,2,2,2,0,3,3,4,4,2,2,1,4,4,1,3,1,1,2,0,1,1,0],
 [1,4,2,2,2,1,3,4,1,1,2,1,4,0,3,2,2,4,1,3,3,0,4,1,1,0,0,1,2,2,1,3,4,0,4,1,0,1,1,0,2,1,3,1,4,4,0,4,3,2],
 [4,4,2,0,4,4,1,1,2,2,3,3,2,3,0,3,2,1,0,3,3,4,2,2,2,1,1,4,3,2,1,1,4,3,4,2,4,0,1,0,2,4,2,2,0,3,3,0,3,2],
 [4,3,3,1,3,1,1,3,3,1,0,1,4,3,4,3,4,1,2,2,1,1,2,1,4,2,1,1,1,1,1,3,3,3,1,1,4,4,0,0,3,3,1,4,4,3,2,3,3,0],
 [1,4,1,4,0,0,1,3,1,2,2,1,1,2,3,3,2,0,3,4,3,2,1,2,2,3,3,1,4,2,1,1,4,1,3,2,0,0,0,1,2,4,1,1,3,0,4,2,3,1],
 [2,2,3,0,0,4,2,1,2,3,1,2,4,1,0,1,0,2,4,1,3,4,4,0,0,4,0,4,4,2,0,0,2,2,3,3,4,1,0,3,2,1,0,1,1,0,3,0,3,2],
 [1,2,4,3,4,3,1,2,2,3,0,1,2,4,4,4,3,1,2,3,4,3,3,2,0,0,2,0,3,4,4,2,3,2,0,2,4,3,0,0,0,4,4,0,4,4,0,3,3,3],
 [4,4,1,2,0,2,2,0,0,3,2,3,2,3,4,1,0,2,3,0,3,2,1,1,4,3,0,2,3,1,0,4,1,2,4,1,1,4,4,4,2,2,2,3,0,1,0,3,0,1],
 [4,0,3,0,2,2,0,3,2,2,2,4,0,4,0,1,0,1,4,3,3,2,3,1,2,2,4,4,0,3,2,3,1,4,1,0,3,2,3,2,2,0,1,2,4,0,3,0,4,4],
 [0,4,0,1,0,2,3,2,1,3,1,1,2,0,3,2,1,4,0,1,4,4,1,3,4,4,1,0,4,1,0,3,4,0,3,2,4,3,3,3,3,1,2,2,3,3,3,1,3,4],
 [3,4,1,2,1,1,1,0,4,0,1,1,0,4,1,3,1,1,2,0,2,1,4,1,4,4,3,2,0,3,0,3,0,1,1,2,1,3,0,4,4,2,2,2,1,3,4,1,1,1],
 [3,0,1,4,2,0,0,3,1,1,1,4,4,0,2,2,0,4,0,3,1,0,2,2,4,4,4,0,4,4,4,4,4,4,3,0,4,4,4,1,2,4,4,3,0,0,4,0,4,2],
 [2,0,1,2,1,1,3,0,3,1,0,4,3,1,2,1,1,3,0,1,2,4,2,1,2,3,4,2,4,4,2,2,3,4,0,0,1,0,0,4,1,3,3,4,1,2,1,3,3,2],
 [4,0,2,0,3,1,2,1,1,1,1,2,3,0,3,1,0,4,3,0,0,0,2,0,1,4,0,2,1,3,4,2,2,4,2,3,1,2,0,2,0,2,4,0,1,2,3,4,1,3],
 [3,0,2,4,2,0,3,4,3,2,3,4,2,0,4,1,0,4,3,3,1,0,2,2,2,1,3,3,1,1,0,3,3,0,3,2,1,1,0,1,2,2,0,4,4,2,0,1,3,1],
 [0,4,4,4,0,3,0,3,0,2,2,0,1,2,3,3,4,3,0,4,1,2,3,3,0,2,2,3,0,0,0,2,4,2,3,4,2,3,4,0,2,0,1,1,3,4,2,2,4,4],
 [2,1,2,3,4,3,1,2,0,0,0,0,0,0,3,4,3,3,1,2,2,1,3,4,1,2,4,0,1,4,1,0,0,0,2,1,1,1,3,0,0,3,1,1,4,2,1,3,4,1],
 [1,0,3,0,2,1,4,2,3,3,1,1,3,4,4,0,1,2,1,3,0,3,1,1,3,0,2,4,4,4,2,3,1,4,3,4,0,1,4,1,1,1,4,0,0,2,3,4,0,4]]

// out
8

"Gesegnet sei das kürzeste der Kürzesten, denn es gewinnt das Königreich der Aufstimmungen." -Buch des heiligen Golfus 13:37

"Du sollst keine Schlupflöcher benutzen, denn sie sind die bösen Werke Luzifers." -Brief an die Meta 13: 666

Leichte Visualisierung von Menschen, die das Kreuz machen


Danke @Tschallacka für die Visualisierung.

ngn
quelle
57
+1 für die Verse am Ende, gaben sie mir ein gutes Lachen: D
HyperNeutrino
6
Kann eine Ziffer Teil mehrerer Kreuze sein?
Martin Ender
9
Oh süßer Jesus, du hast einen Mönchsimulator gemacht.
Magic Octopus Urn
1
Warum ist das erste "T" verknüpft?
JakeGould
4
@JakeGould Um diese Frage mit der Frage zu verknüpfen, zu der das "T" führt.
Erik der Outgolfer

Antworten:

19

Schmutz , 20 Bytes

n`.\1./\3.\4/.\2.voO

Probieren Sie es online!

Eine sehr wörtliche Umsetzung der Spezifikation:

  • n` make Grime zählt die Anzahl der Unterrechtecke der Eingabe, die eine Übereinstimmung ergeben.
  • .\1./\3.\4/.\2. definiert das 3x3 Quadrat:

    .1.
    3.4
    .2.
    

    Wo .kann ein beliebiges Zeichen sein.

  • oOist ein Orientierungsmodifikator, mit dem dieses Rechteck in jeder Drehung oder Reflexion angezeigt werden kann. Das vwird verwendet, um die oPriorität zu verringern, damit wir keine runden Klammern um das Quadrat benötigen.
Martin Ender
quelle
7
Korrigieren Sie für die ersten beiden Tests, Segfault für die letzten. Ich denke, das sollte in Ordnung sein, solange das Programm im Prinzip korrekt und nur durch Ressourcen begrenzt ist.
4.
Zu Ihrer Information: Ich habe gerade den letzten Testfall getestet und es lief gut für mich.
3D1T0R
16

Schnecken , 17 16 Bytes

Ao
\1.=\2o=\3b\4

Probieren Sie es online!

Erläuterung

Alässt Snails die Anzahl der möglichen übereinstimmenden Pfade in der gesamten Eingabe zählen. oLegt die Startrichtung auf eine beliebige orthogonale Richtung fest (anstatt nur nach Osten). Das Muster selbst befindet sich in der zweiten Zeile:

\1    Match a 1.
.     Match an arbitrary character (the one in the centre).
=\2   Check that the next character ahead is a 2, but don't move there.
o     Turn to any orthogonal direction. In practice, this will only be one
      of the two directions from the centre we haven't checked yet.
=\3   Check that the next character ahead is a 3.
b     Turn around 180 degrees.
\4    Match a 4 in that direction.
Martin Ender
quelle
7

Haskell, 108 102 93 Bytes

f((_:t:x):w@((l:q@(_:r:_)):(_:b:z):_))=sum$f((t:x):q:[b:z]):f w:[1|(l*r-1)*(t*b-1)==11]
f _=0

Probieren Sie es online!

Kein Regex. Muster Match

.t.
l.r
.b.

Nehmen Sie in der linken oberen Ecke der Matrix ein 1if (l*r-1)*(t*b-1)==11und gehen Sie rekursiv nach rechts (drop .l.) und nach unten (drop first row). Wenn das Muster nicht übereinstimmt (am rechten oder unteren Rand), nimm a 0. Summiere alle Ergebnisse.

Edit: -9 Bytes dank @xnor.

nimi
quelle
Ich wollte vorschlagen 2^(l*r)+2^(t*b)==4100, die Zahlen zu überprüfen, aber es scheint, dass beide unsere Lösungen 2,6anstelle von ausgetrickst werden 3,4.
Xnor
@xnor aber die Zahlen sind auf0..4
--urous
3
@ Οurous Danke, das habe ich verpasst. Dann können zB arithmetische Ausdrücke noch weiter optimiert werden (l*r-1)*(t*b-1)==11.
Xnor
7

Perl, 70 Bytes

Beinhaltet +2 für 0p

Geben Sie die Eingabematrix als Ziffernblock ohne Leerzeichen in STDIN ein:

perl -0pe '$_=map{/.$/m+y/1-4/3421/;/(?=1.{@{-}}(3.4|4.3).{@{-}}2)/sg}($_)x4'
0420
1324
2310
^D

Dreht das Kreuz durch Drehen der Ziffern

Tonne Hospel
quelle
6

Retina , 92 83 Bytes

L$v`(?<=((.))*).(.)..*¶(?<-1>.)*(.).(.).*¶(?<-2>.)*.(.)
$6$3$4$5
/../_O`.
1234|3412

Probieren Sie es online! Erläuterung:

L$v`(?<=((.))*).(.)..*¶(?<-1>.)*(.).(.).*¶(?<-2>.)*.(.)
$6$3$4$5

Achten Sie auf alle überlappenden 3x3-Quadrate. Ein Lookbehind erfasst den Einzug zweimal, sodass er in der zweiten und dritten Zeile ausgeglichen werden kann. Die Eingabe wird als rechteckig angenommen, damit wir nicht überprüfen müssen, ob die Gruppen ausgeglichen sind. Die unteren / oberen mittleren Zellen und die linken / rechten mittleren Zellen werden dann erfasst.

/../_O`.

Sortieren Sie jedes Zellenpaar in der richtigen Reihenfolge.

1234|3412

Zählen Sie die verbleibenden gültigen Muster.

Neil
quelle
5

Gelee , 26 Bytes

Z3Ƥṡ€3ẎµFḊm2ṙ-s2Ṣ€ṢFµ€ċ4R¤

Probieren Sie es online!

Erläuterung

Z3Ƥṡ€3ẎµFḊm2ṙ-s2Ṣ€ṢFµ€ċ4R¤  Main Link
 3Ƥ                         For each 3 rows
Z                           Zip the rows
   ṡ€3                      Get all arrangements of 3 consecutive columns from these rows. At this step, we have all 3x3 contiguous submatrices
      Ẏ                     Unwrap by one layer; previously grouped by rows, now ungrouped
       µ           µ€       For each 3x3 submatrix
        F                   Flatten it
         Ḋ                  Get rid of the first element
          m2                Take every second element (this only keeps the edges)
            ṙ-              Rotate right 1 element
              s2            Group into pairs; now the top and bottom are grouped and the left and right are grouped
                Ṣ€          Sort each pair
                  Ṣ         Sort the pairs
                   F        Flatten
                      ċ4R¤  Count the number of occurrences of range(4); i.e. [1,2,3,4]

-3 Bytes dank Jonathan Allan (2) und Mr. Xcoder (3) (zusammengeführt)

HyperNeutrino
quelle
@ngn lol der Punkt soll unter dem sein D. Mein schlechtes, repariertes.
HyperNeutrino
Speichern Sie 2 Bytes mit ...Fµ€ċ4R¤anstatt ...Ḍµ€ċ1234(auch beachten Sie, dass 1234ersetzt werden könnte ⁽¡ḋ, um eine zu speichern)
Jonathan Allan
26 Bytes mit Z3Ƥanstelle von ṡ3Z€und ⁼J$µ€Sanstelle von Ḍµ€ċ1234.
Mr. Xcoder
@ JonathanAllan oh cool, danke
HyperNeutrino
5

Java 8, 135 133 131 Bytes

m->{int r=0,i=0,j;for(;++i<m.length-1;)for(j=1;j<m[i].length-1;)if(~(m[i-1][j]*m[i+1][j])*~(m[i][j-1]*m[i][++j])==39)r++;return r;}

-2 Bytes danke an @tehtmi für eine kürzere Formel: (l*r-1)*(t*b-1)==11to~(l*r)*~(t*b)==39

Erläuterung:

Probieren Sie es online aus.

m->{                     // Method with integer-matrix parameter and integer return-type
  int r=0,               //  Result-integer, starting at 0
      i=0,j;             //  Index integers
  for(;++i<m.length-1;)  //  Loop over the rows, skipping the first and last
    for(j=1;j<m[i].length-1;)
                         //   Inner loop over the columns, skipping the first and last
      if(~(m[i-1][j]*m[i+1][j])*~(m[i][j-1]*m[i][++j])==39)
                         //    If (-(bottom*top)-1) * (-(left*right)-1) is exactly 39:
        r++;             //     Increase the result-counter by 1
  return r;}             //  Return the result-counter
Kevin Cruijssen
quelle
1
Kürzere Formel: ~(l*r)*~(t*b)==39(Haskell hat ~anscheinend kein 1-Byte .)
tehtmi
3

Schale , 23 Bytes

#ö§&¦ḣ4SδΛ≈↔Ċ2tΣṁoX3TX3

Probieren Sie es online!

Erläuterung

#ö§&¦ḣ4SδΛ≈↔Ċ2tΣṁoX3TX3  Implicit input, a list of lists of integers.
                     X3  Length-3 slices.
                ṁ        Map over them and concatenate:
                    T     Transpose,
                 oX3      then get length-3 slices.
                         Now we have a list of 3x3-arrays of the (transposed) input.
#ö                       Return number of 3x3-arrays that satisfy this:
                          Take m = [[0,3,0],[2,4,1],[1,4,0]] as an example.
               Σ          Concatenate: [0,3,0,2,4,1,1,4,0]
              t           Tail: [3,0,2,4,1,1,4,0]
            Ċ2            Take every second element: c = [3,2,1,4]
  §&                      c satisfies both of the following:
    ¦                     1) It contains every element of
     ḣ4                      the range [1,2,3,4].
       Sδ                 2) If you zip c
           ↔                 with its reverse,
         Λ                   then each corresponding pair
          ≈                  has absolute difference at most 1.
                         Implicitly print the result.
Zgarb
quelle
3

Dyalog APL , 30 29 28 27 26 Byte ( SBSC )

+/∘,{12 2⍷×∘⌽⍨⊢/4 2⍴⍵}⌺3 3

Probieren Sie es online!

H.PWiz
quelle
sehr gut! ⌽∘⊖×⊢könnte um 2 Bytes kürzer sein, können Sie raten, wie?
ngn
@ngn Was ich wirklich will, ist ein Symbol wie ø;)
H.PWiz
@ngn Ich habe×∘⌽∘⊖⍨
H.PWiz
dies ist kürzer:(⌽×⊖)
ngn
Oh, das ist klug, du hast das Selfie (... ⍨) ⊢/für ein weiteres -1 nach links verschoben . Daran habe ich nicht gedacht. In dieser Situation sollten Sie mich nicht gutschreiben.
ngn
2

Gelee , 36 Bytes

“ƒɦƈạ%ȤFE’b4s4
ṡ3µZṡ3F€µ€ẎḊm2$$€’f¢L

Probieren Sie es online!

37 Bytes

Aus irgendeinem Grund kann ich Ḋm2$$den Link nicht nach oben verschieben.

ṙ1s2I€FPA,P⁼1,24
ṡ3µZṡ3F€µ€ẎḊm2$$€Ç€S

Probieren Sie es online!

fireflame241
quelle
2

Sauber , 255 ... 162 Bytes

Es ist nicht vorteilhaft, häufig Musterfilter in Verstehen zu verwenden, aber in diesem Fall ist es das auch.

import StdEnv,StdLib
? =reverse
@ =transpose
t=tails
$m=sum[1\\f<-[id,@,?,?o@,@o?,@o?o@,?o@o?o@,?o@o?],[a,b,c:_]<-t(f m),[_,1:_]<-t a&[3,_,4:_]<-t b&[_,2:_]<-t c]

Probieren Sie es online!

Definiert die Funktion $, Entgegennehmen [[Int]]und Zurückgeben Int.

Zunächst werden alle Symmetrien der Matrix generiert m(Transformation über f), tailswobei drei oder mehr Zeilen verwendet werden und synchron überprüft wird, wie viele der ersten drei Spaltensätze aus tailsjeder Zeile mit dem Kreuzmuster übereinstimmen.

Dies entspricht dem Zählen der Anzahl der geordneten tailsÜbereinstimmungen tailsmit dem Muster. Dies entspricht [[_,1,_:_],[3,_,4:_],[_,2,_:_]:_]logischerweise der Überprüfung, ob diese Zelle für jede Zelle in der Matrix die linke obere Ecke einer Kreuzrotation ist.

Οurous
quelle
2

Python 3, 120 - 118 Bytes

lambda x:sum({x[i+1][j]*x[i+1][j+2],x[i][j+1]*x[i+2][j+1]}=={2,12}for i in range(len(x)-2)for j in range(len(x[0])-2))

Probieren Sie es online!

Verwendet die Tatsache, dass das Produkt von entgegengesetzten Zahlenpaaren im Kreuz 2 bzw. 12 sein muss und mit einer Menge verglichen wird, die alle unterschiedlichen Ausrichtungen abdeckt. Nimmt die Eingabe als 2D-Array von Ganzzahlen auf.

Wille
quelle
1
Sie müssen nicht f=in der Partitur zählen
ngn
2

Japt -x , 39 38 33 Bytes

ã3 Ëmã3 y x@[XXy]®g1 ë2 ×Ãn e[2C]

Probieren Sie es online!

-1 Byte dank @Shaggy.

-5 Bytes dank @ETHproductions durch Refactoring des Arrays.

Ausgepackt und wie es funktioniert

Uã3 mD{Dmã3 y xX{[XXy]mZ{Zg1 ë2 r*1} n e[2C]

       Input: 2D Array of numbers
Uã3    Generate an array of length 3 segments of U
mD{    Map... (D = 2D array of numbers having 3 rows)
Dmã3     Map over each row of D to generate an array of length 3 segments
y        Transpose; make an array of 3x3 subsections
xX{      Map and sum... (x = 3x3 2D array of numbers)
[XXy]      Array of X and X transposed
mZ{        Map...
Zg1 ë2 r*1   Take row 1, take 0th and 2nd elements, reduce with *
}
n          Sort the array
e[2C]      Equals [2,12] element-wise?
           Implicit cast from boolean to number

       Result: 1D array of counts
-x     Sum of the result array

Es sollte immer noch einen besseren Weg geben, um das Kreuz zu testen ...

Bubbler
quelle
Sie können ein Byte speichern, indem Sie die Gleichheitsprüfung am Ende durch ersetzen e[2C].
Shaggy
Können Sie sich das loswerden 2in ë2?
Oliver