Einführung
Ich möchte den Teilstring mit den meisten 1
in einer Folge von 0
's und 1
' s finden.
Eingang
Ihr Programm hat zwei Eingänge , die Sequenz und die Länge des Teilstrings.
Die Reihenfolge ist eine beliebige Anzahl von 0
's und 1
' s:
01001010101101111011101001010100010101101010101010101101101010010110110110
Die Länge der Teilzeichenfolge ist eine positive Ganzzahl ungleich Null:
5
Ausgabe
Ihr Programm sollte den Startindex des ersten Teilstrings der angegebenen Länge ausgeben, der die meisten enthält 1
. Mit der obigen Eingabe ist die Ausgabe:
10
Das erste Zeichen in der Zeichenfolge beginnt bei einem Index von 0
.
Wertung
Kürzester Code gewinnt!
Regeln
- Ihr Programm muss immer den richtigen Index für alle gültigen Eingaben ausgeben.
- Sie können Ihre Eingabe- / Ausgabemethode aus jeder Antwort mit positiver Punktzahl für die Standardoptionen auswählen . Bitte geben Sie die Methode an, die Sie in Ihrer Antwort auswählen.
1
, geben Sie die erste Teilzeichenfolge aus, die Sie gefunden haben. Sie identifizieren die Teilzeichenfolgen mit dem Index des ersten Zeichens in dieser Teilzeichenfolge. Hilft das?Antworten:
Dyalog APL, 11
Probieren Sie es hier aus. Verwendung:
Erläuterung
Dies ist eine dyadische (dh binäre) Funktion, die die Länge der Teilzeichenfolge von links und die Reihenfolge von rechts angibt. Ihre Struktur ist wie folgt:
Erklärung durch Explosion:
Nehmen wir als Beispiel
4
und0 1 1 0 1 1 1 0
als Eingaben. Zuerst wenden wir die Funktion+/
auf sie an und erhalten2 3 3 3 3
. Dann,+
und⌈/
auf dieses Array angewendet, geben Sie sich und3
, und wird2 3 3 3 3 ⍳ 3
ausgewertet2
, da3
zuerst als zweites Element auftritt. Wir subtrahieren1
und erhalten1
als Endergebnis.quelle
m
Einsen hat, wo sichm
befindet maximal.Rubin, 42
Übernimmt Eingaben durch Aufruf, z
f['01001010101101111011101001010100010101101010101010101101101010010110110110',5]
Dadurch werden Teilzeichenfolgen mit ihrem gesamten ASCII-Wert verglichen und der Index des Maximums zurückgegeben. Ich bin mir nicht sicher, ob
max_by
die Ruby-Spezifikation stabil sein muss, aber es scheint, dass sie in der C-Implementierung enthalten ist.quelle
Python 2, 56
Akzeptiert ein Array von ganzen Zahlen und dann die Länge.
quelle
[int(s) for s in "010010...0"]
f(ss, 999)
Gibt 0 zurück (anstelle von None). Können Sie das beheben? Dies verstößtss
?None
ist in keinem Fall eine gewünschte Ausgabe, da die Antwort eine ganze Zahl ist.Charge - 222
Batch ist offensichtlich die perfekte Sprache für diese Art von Operation.
Nicht golfen / seziert:
Ersteinrichtung. Die Variable
s
ist die Eingabezeichenfolge, undl
wird die Länge des Eingabestrings, minus der Teilstringlänge sein (initialisiert auf negativ ,%2
wo%2
die gegebene Teilstringlänge).Ermitteln Sie die Länge der Eingabe wie
l
folgt: Verwenden Sie eine reine Batch-String-Längenlösung. Dadurch wird die Variable,s
die den Eingabe-String enthält, unkenntlich gemacht und anschließend erneut festgelegt.Der Wert von
x
wird verwendet, um zu überprüfen, welcher Teilstring die größte Anzahl von Einsen hatte. Starten Sie eine Schleife von 0 bis zur Länge der Zeichenfolge abzüglich der Länge der Unterzeichenfolge (variabell
). Ruft die Unterzeichenfolge ab dem aktuellen Punkt in der Schleife (%%a
) ab,c
wird als Eingabezeichenfolge festgelegt%%a
, die mit%2
(der angegebenen Länge der Unterzeichenfolge) beginnt und Zeichen annimmt. Werden alle0
s aus entferntc
, wird der Wert vonc
mit verglichenx
- dh111
ist eine größere Zahl als,11
so können wir einfach die 'Zeichenfolge' verwenden, um einen Größer-als-Vergleich durchzuführen.y
wird dann auf die aktuelle Position in der Zeichenfolge gesetzt - die schließlich ausgegeben wird.Beispiel für die Verwendung von OPs -
quelle
C # (Regex), 196
Der eigentliche reguläre Ausdruck ist nicht so lang, aber alle für ein C # -Programm zum Kompilieren der doppelten Größe des Codes erforderlichen Flusen.
Der eigentliche reguläre Ausdruck, der die Länge auf 5 setzt:
(?=((?<o>1)|0){5})
: Sieh voraus, um 5 Zeichen zu lesen, ohne sie zu verbrauchen, und drücke alle1
in den Stapelo
.(?=[10]{5})(?!((?<-o>1)|0){5})
: An einer Position, die 5 Zeichen voraus hat, ist nicht genügend Element im "Stapel"o
zum Herausspringen vorhanden, dh die Teilzeichenfolge hat streng mehr1
als das, was wir an der aktuellen Position haben.(?!.+(?=[10]{5})(?!((?<-o>1)|0){5}))
: Eine Position wie oben beschrieben kann für den Rest der Zeichenkette nicht gefunden werden, dh alle Positionen haben weniger als oder die gleiche Anzahl von1
's.Wenn Sie das erste Ergebnis nehmen, erhalten Sie die Antwort, da allen Teilzeichenfolgen davor ein Teilzeichenfolge mit mehr
1
vorangestellt ist und wir überprüfen, ob jeder Index, der größer als der aktuelle Index ist, weniger als oder gleich viele hat1
.(Und ich lerne etwas Schönes: Der "Stack" wird beim Backtracking wiederhergestellt).
quelle
Pyth , 12
Dies definiert eine Funktion
g
, die eine Liste von Zahlen und eine Zahl als Eingabe benötigt. Z.BSie können es hier testen: Pyth Compiler / Executor
Erläuterung:
Alternative:
quelle
ho/<>zNQ\0Uz
Leider konvertiert die Zählung einer Zeichenfolge nicht automatisch, wonach Sie suchen, in eine Zeichenfolge :(J,
1514 Zeichenquelle
Matlab (42)
Lassen Sie
s
die Zeichenfolge bezeichnen undn
die Teillänge. Das Ergebnis istr
.Berechne die Faltung von
s
mit einer Folge vonn
Einsen und finde dann das Maximum. Faltung ist einfach mitconv
, und diemax
Funktion gibt die Position des ersten Maximums zurück. Es ist notwendig,1
den resultierenden Index zu subtrahieren , da die Matlab-Indizierung bei beginnt1
, nicht bei0
.Golf gespielt:
quelle
Haskell,
6462 BytesVerwendung:
quelle
n#l=...
p
. Ich denke auch, dass das0
überflüssig ist (obwohl die Klammern das nicht sind und Sie stattdessen möglicherweise ein Leerzeichen benötigen0
).JavaScript (ES6) 73
Eine Funktion, die den angeforderten Wert zurückgibt. Die for-Schleife durchsucht die Eingabezeichenfolge unter Beibehaltung einer laufenden Summe und speichert die Position des Maximalwerts.
Ungolfed
Test In FireFox / Firebug - Konsole
Ausgabe
10
quelle
x
und nicht definierenr
. Dies sollte 4 Bytes reduzieren, was der endgültigen Länge von 69 Bytes entspricht. Auch könnten Sie wahrscheinlich in der Lage sein , zu ersetzen&&
mit&
. Aber schön mit dem~~
Trick!t > x
. Sie müssen r: try einleitenF("00000")
. Und && wird benötigt, um und zu emulierenif
(x=t, r=i-n+1)
wennt
es kleiner oder gleich istx
. Das ist eine gute Verwendung von Lazy Evaluation! Ich wünschte, es könnte irgendwo abgehackt werden, aber ich denke, Sie haben die ganze Arbeit erledigt.PHP (96)
for($a=$b=$c=0;(($d=@substr_count($s,1,$a,$n))>$c&&($b=$a)&&($c=$d))||$a++<strlen($s););echo $b;
http://3v4l.org/J4vqa
Variablen
$s
und$n
sollten in der Befehlszeile für die Suchzeichenfolge bzw. die Länge der Teilzeichenfolge definiert werden.Dies würde auch in jeder C-ähnlichen Sprache mit entsprechenden Funktionen für
substr_count()
und funktionierenstrlen()
.quelle
Mathematica,
38,36Beispiel:
Ausgabe:
quelle
C # (Linq), 148 Bytes
Formatiert:
Nimmt Eingaben als Methodenparameter entgegen.
Was es macht:
quelle
Scala - 70 Bytes
Aber mit Funktionsnamen, solange zipWithIndex vorhanden ist, ist Scala wohl nicht die beste Wahl für Code-Golf.
quelle
C
245185Formatiert:
Verwendung:
quelle
CJam,
2521 BytesTeste es hier.
Nimmt die Eingabe als Ganzzahl für die Länge der Teilzeichenfolge und ein Array von Nullen und Einsen als Folge:
Erläuterung
Das Ergebnis wird am Ende des Programms automatisch ausgedruckt.
Beachten Sie, dass ich auch Slices in Betracht ziehe, die näher am Ende als die gewünschte Länge der Teilzeichenfolge beginnen, aber das ist in Ordnung, da es sich um Teilzeichenfolgen der letzten gültigen Teilzeichenfolge handelt und daher niemals mehr
1
s als diese letzte gültige Teilzeichenfolge hat.quelle
Java 329 Bytes
Ich wollte ein .matches (Regex) implementieren, aber es wäre fast identisch mit den obigen Python-Lösungen gewesen, also habe ich stattdessen ein Schiebefenster ausprobiert. neu hier, also wenn jemand irgendwelche hinweise hat, sei froh, sie zu hören.
}
quelle
i
in der dritten Zeile initialisieren . Der Großteil des Leerzeichens kann entfernt werden. Verwenden SieSystem.out.print(
(kein Zeilenvorschub erforderlich). StattdessenInteger.valueOf(
können Sie verwendennew Integer(
.