Betrachten Sie beispielsweise ein Array von Bits
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
Wir bezeichnen ein zusammenhängendes Subarray mit einer Länge ≥ 5 als Phase, wenn mindestens 85% der Bits gleich sind und das erste / letzte Bit dem Mehrheitsbit entspricht. Außerdem nennen wir eine Phase maximal, wenn es sich nicht um eine strikte Unteranordnung einer anderen Phase handelt.
Hier sind die maximalen Phasen des obigen Beispiels:
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
-------------
-------------
-------------
Wie Sie sehen, gibt es 3
maximale Phasen. Auf der anderen Seite das
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
---------
ist keine maximale Phase, da es sich um ein striktes Subarray von mindestens einer anderen Phase handelt.
Die Herausforderung
Die Eingabe ist eine Folge von ≥ 5 Bits über STDIN, Befehlszeile oder Funktionsargument. Die Bits können als Zeichenfolge oder als Array eingegeben werden.
Sie müssen eine einzelne Ganzzahl ausgeben, die Anzahl der maximalen Phasen für das Array, die entweder über STDOUT ausgegeben oder von einer Funktion zurückgegeben werden.
Wertung
Dies ist Code-Golf, so dass das Programm mit den wenigsten Bytes gewinnt.
Testfälle
0 1 0 1 0 -> 0
0 0 0 0 0 -> 1
0 0 0 0 1 0 1 1 1 1 -> 0
0 0 0 0 0 1 0 1 1 1 1 1 -> 2
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -> 1
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 -> 2
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -> 1
0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 0 0 1 1 0 0 0 1 1 0 -> 0
1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 -> 4
0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0 -> 5
Hier ist die Erklärung für den letzten Fall:
0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0
---------------------------
-------------------------
-----------------
-----------------
-------------
Unterhaltsame Tatsache: Diese Herausforderung ergab sich aus einem Data-Mining-Problem mit dem Ziel, Änderungen in zeitlichen Daten zu erkennen.
quelle
1 1 0 1 1
85% von 5 ist 4,25. Das heißt, Länge 5 wäre unmöglich oder sollten wir das auf 4 abrunden?0
und am letzten endet.Antworten:
Dyalog APL, 62 Zeichen
{≢∪0~⍨+/∨⍀∨\⌽∘.{((⊃=⊃∘⌽)∧(.85≤(+/⊢=⊃)÷≢)∧5≤≢)(⍺-1)↓⍵↑a}⍨⍳⍴a←⍵}
Ähnlich wie Zgarbs Lösung, aber ein wenig weiter golfen.
quelle
Python 2, 149 Bytes
Die erste Schleife tastet das Array von links nach rechts ab. Jedes durch indizierte Bit
i
wird überprüft, um festzustellen, ob es das erste Bit in einer maximalen Phase sein könnte.Dies geschieht durch die innere Schleife, die von rechts nach links abtastet. Wenn das Subarray zwischen
i
undj
eine Phase ist, erhöhen wir den Zähler und fahren fort. Andernfalls fahren wir fort, bis das Subarray zu klein wird oderj
das Ende der vorherigen Maximalphase erreicht.Beispiel:
quelle
Python 2, 144
Geben Sie die Eingabe in das Formular ein
[0,1,0,1,0]
.Die Reihenfolge der Folgen wird durch Erhöhen des Anfangselements und Verringern der Länge überprüft. Auf diese Weise ist bekannt, dass eine neue Untersequenz keine Untersequenz einer vorherigen Untersequenz ist, wenn der Index ihres letzten Elements größer ist als ein Index des letzten Elements einer zuvor gefundenen Sequenz.
quelle
Dyalog APL, 86 Byte *
Probieren Sie es hier aus. Verwendung:
Dies kann wahrscheinlich ziemlich viel Golf gespielt werden, insbesondere im Mittelteil, wo der Phasenzustand überprüft wird.
Erläuterung
Zuerst sammle ich die Teilzeichenfolgen des Eingabevektors in einer Matrix, wobei die linke obere Ecke die gesamte Eingabe enthält
⌽∘.{(⍺-1)↓⍵↑t}⍨⍳⍴t←⍵
. Für die Eingabe0 0 0 0 0 1 0
ist diese MatrixDann ordne ich die Bedingung, eine Phase zu sein, darüber zu, was zu der 0-1-Matrix führt
Um die Anzahl der maximalen Phasen, ich die Flut
1
‚s nach rechts und nach unten verwenden∨⍀∨\
,sammeln sie die eindeutigen zeilen mit
∪↓
,und zählen Sie diejenigen, die mindestens eine
1
Verwendung enthalten+/∨/¨
.* Es gibt eine Standard-1-Byte-Codierung für APL.
quelle
Clojure, 302
und die leicht ungolfed version
aufrufbar wie folgt aus :
(s [0 1 0 1 0] 10 0)
. Es erfordert ein paar zusätzliche Argumente, aber ich könnte diese mit zusätzlichen 20 Zeichen loswerden.quelle
JavaScript (ES6) 141
Der auf die JavaScript-
Eingabe portierte Algorithmus von @ grc kann ein String oder ein Array sein
Test In FireFox / Firebug - Konsole
Ausgabe
quelle
CJam,
110103 BytesPretttttty lang. Kann viel golfen werden.
Eingabe ist wie
Ausgang ist die Anzahl der Phasen.
Probieren Sie es hier online aus
quelle
JavaScript (ECMAScript 6),
148139 BytesDurchläuft das Array und startet die Iteration am letzten Rekursionsindex. Das Argument kann entweder ein Array oder eine Zeichenfolge sein.
quelle
f=(s,l=0,e=0,p=0)=>{for(n=s.length,o=[j=0,y=0],i=l;i<n;++j>4&x==s[l]&i>e&c>=.85*j&&(e=i,y=1))c=++o[x=s[i++]];return l-n?f(s,l+1,e,p+y):p}
Wolfram - 131
Beispiel
quelle
Java: 771 Byte
Ausführen durch Aufrufen der Methode s (Eingabe int [])
quelle