Herausforderung:
Schreiben Sie eine Funktion oder ein Programm, das eine Liste von Booleschen Werten akzeptiert und alle Bereiche von True zurückgibt.
Testfälle:
f [F] = []
f [T] = [[0,0]]
f [T,T,F,T] = [[0,1],[3,3]]
f [F,T,T,F,F,T,T,T] = [[1,2],[5,7]]
f [F,T,T,F,F,F,T,T,T,T] = [[1,2],[6,9]]
f [T,T,F,F,F,T,T,T,T,T,T,T,T,T,T,F] = [[0,1],[5,14]]
f [F,F,T,T,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T] = [[2,3],[12,19],[33,54],[93,94]]
Regeln:
- Sie können auswählen, wie die Eingabe codiert werden soll, z. B. eine Liste, ein Array, eine Zeichenfolge usw.
- Die Ausgabe muss in Form einer Liste oder einer Zeichenfolge codiert werden, die eine Liste enthält, also in Form von Arrays, Listen, Tupeln, Matrizen, Vektoren usw.
- Die Booleschen Werte müssen als Konstanten codiert werden, ansonsten ist jede einfache Konvertierung von T / F in gewünschte Konstanten zulässig
- EDIT: eval oder ähnliches zur Laufzeit ist erlaubt.
- Vergessen Sie nicht zu erklären, wie die Eingabe an das Programm / die Funktion übergeben wird, und geben Sie die Eingabe / Ausgabe für die Testfälle an
- Konvertierung in gewünschtes Eingabeformat nicht mitgezählt
- Standardlücken sind nicht zulässig
- Wenn Ihre Sprache dazu eine Funktion hat, ist dies nicht zulässig
- Ich werde meine eigene Vorlage nicht akzeptieren
- EDIT: Ausgabeformat ist flexibel. Wenn Sie keine Liste oder Ähnliches drucken, müssen die Bereichswerte durch ein nicht numerisches Zeichen und separate Bereiche getrennt werden.
Wertung:
- Die Bewertung erfolgt in Bytes, sofern dies nicht für Ihre Sprache ungeeignet ist (z. B. Codels in Piet).
- Die niedrigste Punktzahl gewinnt
Es gibt ein gutes Maß an Flexibilität bei der Eingabe und Ausgabe, aber Lösungen, bei denen T / F durch Funktionen ersetzt werden, die die gesamte Arbeit erledigen, sind nicht zulässig.
Debugging:
Wenn Sie in Haskell schreiben oder es von Haskell aus aufrufen können, überprüft Folgendes Ihre Funktion / Ihr Programm:
import Test.QuickCheck
tf = cycle [True,False]
gen l = foldl (++) [] $ map (\i -> [tf!!i | x<-[1..i]]) l
putIn (a,b) l = zipWith (||) l [(a <= p) && (p <= b) | p <- [0..length l]]
putAllIn rs len = foldr putIn [False|i<-[1..len]] rs
main = print $ quickCheck (check functionNameGoesHere)
code-golf
array-manipulation
Michael Klein
quelle
quelle
Antworten:
Pyth,
1716 BytesVerwendet einige ausgefallene Post-Assign-Zählermagie zusammen mit Lauflängencodierung.
Nimmt die Eingabe als Array von
0
s und1
s, z[1, 1, 0, 1, 0]
. Ausgänge wie bei der Challenge, z[[0, 1], [3, 3]]
.Test Suite
quelle
Pyth, 18 Bytes
Testsuite
Wahr ist dargestellt als
1
, Falsch als0
.Bereiche werden inklusive dargestellt.
quelle
Retina ,
823427 BytesDie leere Zeile sollte ein einzelnes Leerzeichen enthalten.
Die Eingabe ist eine flache Zeichenfolge
_
für wahr und:
falsch. Die Ausgabe erfolgt durch durch Leerzeichen getrennte Paare, jeweils in einer separaten Zeile.Probieren Sie es online aus.
Erläuterung
Das schwere Golfen von 82 auf 27 Bytes war durch geschickte Wahl der Darstellung von wahr und falsch möglich. Ich habe ein Wortzeichen
_
(das keine Ziffer ist) für wahr und ein Nichtwortzeichen:
(das kein Escapezeichen benötigt) für falsch ausgewählt. Dadurch kann ich die Enden von Bereichen als Wortgrenzen erkennen.Wir stimmen mit einer Wortgrenze überein. Wir wollen diese Grenze durch den entsprechenden Index des Wahrheitswerts ersetzen. Im Prinzip ist das mit Retinas neuester
$#
Funktion, die die Anzahl der Erfassungen einer Gruppe zählt , recht einfach . Wir erfassen einfach jeden Charakter vor dieser Position in einer Gruppe. Durch Zählen dieser Zeichen erhalten wir die Position. Der einzige Haken ist, dass die Enden des Bereichs jetzt um eins verschoben sind. Wir wollen eigentlich den Index des Charakters vor dem Match. Dies lässt sich auch leicht beheben, indem optional ein_
nicht erfasstes Zeichen abgeglichen wird und ein Zeichen übersprungen wird, wenn das Ende eines Bereichs erreicht ist.Jetzt ersetzen wir alle Unterstriche durch ein Leerzeichen. Das heißt, wir fügen zwischen dem Anfang und dem Ende jedes Bereichs ein Leerzeichen ein und entfernen dabei die Unterstriche.
Das lässt die Doppelpunkte (und wir müssen immer noch Paare trennen). Dazu teilen wir die gesamte Zeichenfolge in Zeilen um jeden Doppelpunkt auf. Der
S
aktive Split-Modus und das_
Unterdrücken leerer Segmente, sodass bei Doppelpunktfolgen nicht jede Menge Leerzeilen entstehen.quelle
MATL , 17
1820BytesVerwendet die aktuelle Version (9.1.0) der Sprache / des Compilers.
Die Eingabe ist eine Zeichenfolge mit den Zeichen
T
undF
. Die Ausgabe ist eine zweizeilige Tabelle, in der jede Spalte einen Bereich mit 1-Indexierung angibt. Dies ist die Standardsprache.Vielen Dank an Stewie Griffin für das Entfernen von 2 Bytes.
Beispiel
Erläuterung
Es basiert auf einem einfachen regulären Ausdruck:
quelle
Oktave, 43 Bytes
find(diff([0,x,0]))
Findet alle Positionen, an denen das Eingabearray zwischen true und false wechselt. Indem wir dies in eine 2-mal-n-Matrix umformen, erreichen wir zwei Dinge: Die Änderungen von wahr zu falsch und von falsch zu wahr werden in zwei Zeilen unterteilt. Dies ermöglicht es, 1 und 2 von jeder dieser Zeilen zu subtrahieren. Das Subtrahieren von 1 von Zeile 1 ist erforderlich, da Octave 1-indiziert und nicht null-indiziert ist. Das Subtrahieren von 2 vonfind(diff())
der zweiten Zeile ist notwendig, da das die Position des ersten falschen Werts findet, während wir den letzten wahren Wert wollen. Der Subtraktionsteil ist nur in Octave möglich, nicht in MATLAB.quelle
CJam,
2725 BytesErwartet Eingaben wie
TTFTFT
. Probieren Sie es online aus .Erläuterung
quelle
Japt,
343125 BytesDiesmal hat es wirklich geklappt, einen neuen Ansatz zu versuchen.
Probieren Sie es online!
Die Eingabe ist eine Zeichenfolge mit
F
fürfalse
undT
fürtrue
. Die Ausgabe ist ein Array von Arrays. Die Zeichenfolgendarstellung lässt es wie ein einzelnes Array aussehen.Wie es funktioniert
Hinweis: Ich sehe jetzt, dass einige Leute bereits auf diesen Algorithmus gekommen sind, aber ich habe ihn unabhängig entdeckt.
Nicht konkurrierende Version, 22 Bytes
Im neuesten GitHub-Commit habe ich eine neue Funktion hinzugefügt: Ein Lead
;
setzt die VariablenA-J,L
auf unterschiedliche Werte.A
wird auf ein leeres Array gesetzt, sodass es nicht mehr manuell erstellt werden muss.quelle
Python 2, 69 Bytes
Beispielausgabe:
Ein direkter Ansatz, keine Einbauten. Verfolgt den aktuellen Wert
x
und den vorherigen Wertp
. Wenn dies anders ist, haben wir die Läufe gewechselt. Beim Umschalten0
auf1
wird der aktuelle Index gedruckti
. Beim Umschalten1
auf0
wird der aktuelle Index minus eins gedruckt, gefolgt von einem Semikolon.Das
if
ist ziemlich stinkend. Vielleicht wäre Rekursion besser,quelle
Haskell, 74 Bytes
Anwendungsbeispiel:
map(\l->(fst$l!!0,fst$last l)).wordsBy(not.snd).zip[0..] $ [True,False,True,True,False]
->[(0,0),(2,3)]
.Wie es funktioniert:
quelle
J, 26 Bytes
Dies ist ein unbenanntes monadisches Verb (unäre Funktion), das ein 2D-Array oder Ganzzahlen zurückgibt. Es wird wie folgt verwendet.
Erläuterung
quelle
Rubin, 39
Beispielaufruf:
Das
..
ist , wie Ruby - inclusive - Bereiche darstellt.Das einzig Interessante hier ist, wie ich den Index des Bereichsendes erhalte. Es ist komisch. Ich erstelle dynamisch einen regulären Ausdruck, der mit dem letzten Zeichen des Bereichs und anschließend mit allen nachfolgenden Zeichen und dem Ende der Zeichenfolge übereinstimmt, um die korrekte Übereinstimmung zu erzwingen. Dann benutze ich
=~
, um den Index dieses Regex in der ursprünglichen Zeichenfolge zu erhalten.Vermutlich gibt es in Ruby einen kürzeren Weg, dies mit den -naF-Flags zu tun.
quelle
JavaScript (ES6), 59
Eine anonyme Funktion, die als Zeichenfolge von
T
undF
als Array von Arrays ausgegeben wirdPRÜFUNG
quelle
𝔼𝕊𝕄𝕚𝕟 18 Zeichen / 28 Byte
Try it here (Firefox only).
Erläuterung
quelle
Haskell, 62 Bytes
Nimmt als Eingabe eine Liste von 0en und 1en.
Füllt die Liste
l
mit 0 auf beiden Seiten auf und berechnet die indizierte Liste aufeinanderfolgender Paare. BeispielsweiseExtrahieren Sie dann die Indizes, die aufeinanderfolgenden Elementen entsprechen
(0,1)
und(1,0)
die die Starts der Blöcke 0 und 1 sind, subtrahieren Sie 1 von den Starts von 0, um die Endes von 1 zu erhalten, und komprimieren Sie die Ergebnisse.quelle
f l=(\s->zip[i|(i,0,1)<-s][i-1|(i,1,0)<-s])$zip3[0..](0:l)$l++[0]
.Pyth,
1918 BytesErläuterung:
Probieren Sie es hier aus .
quelle
Perl, 47 Bytes
Mit den folgenden Perlrun-Optionen
-lpe
:Alternative bei zeilengetrennter Ausgabe (34 Byte):
quelle
Python 2, 108 Bytes
Testfälle:
Sicher gibt es eine kürzere Lösung als diese, aber es funktioniert.
quelle
Haskell: 123 Bytes (Beispiel, kann nicht gewinnen)
Weniger golfen:
quelle
allTrue s e = and (subList s e)
oder vielleichtallTrue = (and.) . sublist
.all (==True) (subList s e)
ist sehr klar.CJam, 30 Bytes
Eingabe als CJam-artiges Array von
0
s und1
s. Ausgabe als paarweises Array im CJam-Stil.Führen Sie alle Testfälle aus. (Kümmert sich um die Konvertierung der Eingabeformate.)
quelle
Japt, 27 Bytes
Es muss einen Weg geben, wie man Golf spielen kann ...
Wie auch immer, es ist das gleiche wie meine Antwort.
quelle
APL, 17 Zeichen
In
⎕IO←0
und⎕ML←3
. Auf Englisch:⍵×⍳⍴⍵
: Nullen Sie die Elemente des Indexvektors, solange das Argument falsch ist⍵⊂
: Schneiden Sie am Anfang jeder Reihe von Wahrheiten und werfen Sie die falschen weg(↑,↑∘⊖)¨
: Nimm das erste und letzte Element jedes Subarraysquelle
PowerShell, 82 Byte
Regex-Lösung unter Verwendung der Eigenschaften des MatchInfo- Objekts.
Beispiel
quelle
Mathematica, 45 Bytes
Nicht besonders interessant; verwendet ein eingebautes.
quelle
Clojure, 109 Zeichen
Das erste, was mir in den Sinn kam, basierend auf
reduce
undpartition-by
.Einfacher Testfall (Karten
T
zutrue
undF
zufalse
):quelle