Ihre Herausforderung: Schreiben Sie eine Funktion, die eine Zeichenfolge s
, ein Zeichen c
und die Länge des längsten Laufs von c
in nimmt s
. Die Länge des Laufs wird sein l
.
Regeln :
- Wenn die
s
Länge 0 ist oderc
leer ist,l
sollte 0 sein. - Wenn es keine Instanzen von
c
in gibts
,l
sollte 0 sein. - Es gelten Standard- Regelungslücken und Standard-E / A-Regeln .
- Egal wo sich im
s
Lauf vonc
s befindet,l
sollte gleich sein. - Beliebige druckbare ASCII-Zeichen können in
s
und erscheinenc
.
Testfälle :
s,c --> l
"Hello, World!",'l' --> 2
"Foobar",'o' --> 2
"abcdef",'e' --> 1
"three spaces",' ' --> 3
"xxx xxxx xx",'x' --> 4
"xxxx xx xxx",'x' --> 4
"",'a' --> 0
"anything",'' --> 0
Gewinner :
Wie beim Code-Golf gewinnt die kürzeste Antwort in jeder Sprache.
s
und ac
, die nicht in einem nicht leerens
Fall enthalten sind, in Ihre Testfälle aufnehmen?s
/ vorkommenc
?c
kann leer sein? In vielen Sprachen ist ein Zeichen nur eine Ganzzahl mit spezieller Semantik, und Sie können auch keine leere Ganzzahl haben.Antworten:
05AB1E , 5 Bytes
Code:
Verwendet die 05AB1E- Codierung. Probieren Sie es online!
Erläuterung:
quelle
γ¢M
funktioniert nicht so, wie ich es mir vorgestellt habe, das wäre ein 3-Byte-Wert.Mathematica, 35 Bytes
Reine Funktion, die eine Liste von Zeichen und ein anderes Zeichen als Eingabe verwendet und eine nicht negative Ganzzahl zurückgibt. Verbesserte meine erste Anstrengung, indem ich Adnans Beobachtung verwendete (stimmt zu!), Dass man testen sollte, ob das Sonderzeichen gleich ist, bevor man das Array aufteilt.
Thread[#==#2]
prüft, ob jedes eingegebene Zeichen im ersten Argument dem als zweites Argument angegebenen Zeichen entspricht.Boole
konvertiert das resultierendeTrue
s undFalse
s in1
s und0
s.Split
teilt die Liste in Läufe von aufeinanderfolgenden Elementen auf;Tr/@
summiert jede Unterliste undMax
findet den Gewinner. (Aufgrund derMax
Funktionsweise gibt diese Funktion zurück, wenn das erste Argument die leere Liste ist-∞
. Sie wissen also, tun Sie das nicht.)erste Einreichung (51 Bytes)
Split@#
teilt die Eingabe in Läufe aufeinanderfolgender Zeichen auf, z. B.{{"t"}, {"h"}, {"r"}, {"e", "e"}, {" ", " ", " "}, {"s"}, {"p"}, {"a"}, {"c"}, {"e"}, {"s"}}
für den vierten Testfall./.a:{c_String..}:>
ersetzt jeden Teilausdrucka
, der eine Liste eines wiederholtes Zeichenc
durchLength@a
multipliziertBoole[c==#2]
, das ist ,1
wennc
das Eingabezeichen und entspricht0
ansonsten. DannMax
extrahiert die Antwort.quelle
Japt ,
20 1815 BytesProbieren Sie es online!
5 Bytes gespart dank obarakon und ETHproductions
quelle
fV+Vî+)
... Ich lasse Sie den Rest herausfinden :-)"If s is of length 0 or c is empty, l should be 0"
, ich nehme das vielleicht zu wörtlichs
es keine Instanzen von enthältc
.Python , 38 Bytes
Probieren Sie es online!
Dennis hat 3 Bytes gespart, indem
c
er eine Zeichenfolge mit doppelten Zeichen aktualisiert hat , anstatt rekursiv eine Zahl zu aktualisieren, mit der multipliziertc
werden soll.quelle
f=lambda s,c:c in s and-~f(s,c+c[0])
Speichert 6 Bytes (3 wenn False nicht erlaubt ist).05AB1E ,
116 Bytes-5 Bytes dank Carusocomputing
Probieren Sie es online!
quelle
γvy²¢M
für 6 Bytes die gleiche Idee.Haskell,
4339 BytesProbieren Sie es online!
Führen Sie den String durch und ersetzen Sie das aktuelle Zeichen durch einen Zähler, der erhöht wird, wenn er gleich ist,
c
oder setzen Sie ihn auf zurück,0
wenn nicht. Nimm das Maximum der Liste.Danke an @xnor für 4 Bytes.
quelle
sum[n+1|c==k]
.*fromEnum(c==k)
Pointfree und Lambda experimentiert , aber es waren immer 2 oder 3 Bytes länger.C #
116115 BytesMein erster Code Golf
Wurde bearbeitet, weil die ursprüngliche Übermittlung ein Snippet war und der erforderliche Namespace für reguläre Ausdrücke fehlte
Bearbeiten Sie die vollständige Umschreibung von Nummer 2, um Zeichen mit speziellen Bedeutungen für reguläre Ausdrücke zu unterstützen
using System.Linq; s => c => System.Text.RegularExpressions.Regex.Replace (s, "[^" + c + "]", ++ c + ""). Split (c) .Max (x => x.Länge);quelle
c
unds
vordefiniert sein. Wir nennen dies ein "Code-Snippet" und es ist nicht erlaubt. Sie könnten wahrscheinlich Ihren Code als anonyme Funktion umstrukturieren oder diese Variablen für die Eingabe festlegen. Beides ist erlaubt.(s,c)=>
. Sie müssenSystem.Text.RegularExpressions.Regex
eine using-Anweisung direkt vor Ihrer Funktion verwenden oder hinzufügen.JavaScript (ES6),
545351 Byte-2 Byte dank @Neil
-1 Byte dank @apsillers
Nimmt die Eingabe in currying Syntax:
f("foobar")("o")
.Testschnipsel
Eine weitere Option mit
eval
undfor
(54 Bytes)Alte Antwort mit Regex (85 Bytes)
quelle
x==c?i++:i=0
kann nur sein,i=x==c&&i+1
da einfalse
Ergebnis aufx==c
Vergleich wird als0
für numerische Vergleiche und Inkremente (und wird nie der Rückgabewert sein, da jede Zahl, einschließlich0
,j
wird immer Vorrang vor der Null-likefalse
ini
)false
(da die Herausforderung immer die Rückgabe einer Nummer erfordert)s=>c=>[...s].map(x=>j=(x!=c?i=0:++i)>j?i:j,i=j=0)&&j
scheint ein paar Bytes zu sparen.f=s=>c=>[...s].map(x=>j=(i=x==c&&i+1)>j?i:j,i=j=0)&&j
, der ein Byte kürzer ist.JavaScript (Firefox 30-57),
75 bis72 ByteES6-kompatibles Snippet:
split
Gibt eine Reihe leerer Zeichenfolgen und einzelner Zeichen sowie die Abläufe zurück, dies hat jedoch keine Auswirkungen auf das Ergebnis.quelle
Mikro 112 Bytes
quelle
C (gcc) 63 Bytes
Probieren Sie es online!
quelle
Perl 6 ,
45 4342 BytesProbier es aus
Probier es aus
Probier es aus
Erweitert:
quelle
JavaScript, ES6, 52
Rekursive Lösung, bei der die Zeichenfolge als Array behandelt wird (Hinweis: Die ursprüngliche Eingabe ist immer noch eine Zeichenfolge) und Zeichen von links nach rechts verwendet werden
C
:Zeichnet den aktuellen Einlauf
t
und den globalen Best-In aufT
.Erläuterung:
Das Setzen
t
vonfalse
auf Nicht-Übereinstimmungen funktioniert, weil jedes Mal, wennt
es erhöht wird,false
so behandelt wird0
(dh sofalse + 1
ist1
) undfalse
niemals mehr als ein Wert in global-max verglichen wirdT
.quelle
[C,...s]
Syntax nicht vertraut . Sollte mir helfen,slice()
Bytes aus meinen eigenen Posts zu entfernen.Gelee , 5 Bytes
Dies ist eine dyadische Verknüpfung / Funktion, die eine Zeichenfolge und ein Zeichen akzeptiert. Beachten Sie, dass es nicht als vollständiges Programm funktionieren kann, da für die Eingabe über Befehlszeilenargumente die Python-Syntax verwendet wird und Python im Gegensatz zu Jelly Singleton-Zeichenfolgen nicht von Zeichen unterscheidet.
Probieren Sie es online!
Wie es funktioniert
quelle
Retina , 25 Bytes
Probieren Sie es online!
Das erste Zeichen ist das zu prüfende Zeichen.
quelle
APL (Dyalog) ,
1811 BytesErfordert das Austauschen
⊂
mit⊆
in Version 16.0 oder mit⎕ML←3
(Standard auf vielen Systemen).Probieren Sie es online!
⎕=⎕
Boolescher Wert für die Gleichheit zwischen zwei Eingaben⊂⍨
Selbstpartitionierung (Partitionen beginnen, bei denen ein Element ungleich Null größer als sein Vorgänger ist)≢¨
zählen jeden0,
voranstellen einer Null (für die Fälle mit leerer Eingabe)⌈/
davon maxAlte Lösung
Fordert zuerst zur Eingabe von s auf , dann zur Eingabe von c
Probieren Sie es online!
⎕
Eingabeaufforderung für s⊢
dafür(
...)⎕S 1
PCRE S uche für die Längen der Vorkommen'+'
ein Pluszeichen (bedeutet eines oder mehrere),¨
an jedes der Elemente von angehängt⎕
der Aufgeforderte c0,
voranstellen einer Null (für die Fälle mit leerer Eingabe)⌈/
davon maxc muss als 1-Element-Vektor einer eingeschlossenen Zeichenfolge angegeben werden, wenn ein Escape-Vorgang erforderlich ist.
quelle
PHP,
7067 Bytesdrei Versionen:
Nimmt Eingaben von Befehlszeilenargumenten entgegen. Laufen Sie mit ihnen
-r
oder testen Sie sie online .quelle
PHP , 70 Bytes
Probieren Sie es online!
PHP , 75 Bytes
Probieren Sie es online!
PHP , 83 Bytes
Probieren Sie es online!
+8 Bytes zu vermeiden
@
quelle
#
natürlich) fehl .~
kann scheiternchr(207)
.++$n
! Sie meinten druckbare ASCII. ;)echo$r?max($r):0;
speichert ein ByteJavaScript (ES6),
474038 Bytes(7 Bytes dank @Neil und 2 Bytes dank @HermanLauenstein gespeichert.)
Erläuterung:
Sucht rekursiv nach einer längeren Ausführung, bis keine gefunden wird.
Snippet:
Code-Snippet anzeigen
quelle
f=(s,c)=>c&&s.includes(c)&&1+f(s,c+c[0])
?s=>g=c=>c&&s.includes(c)&&1+g(c+c[0])
.||0
, was immer noch kürzer ist als meine Lösung.f=
ist nicht Teil der Curry-Version, da nur die innere Funktion rekursiv ist.Gelee,
109 BytesErläuterung:
Probieren Sie es online!
quelle
Œgf€L€Ṁ
.Python 3 , 71 Bytes
Probieren Sie es online!
quelle
Haskell , 66 Bytes
Probieren Sie es online!
Eine etwas leichter zu lesende Version - nicht sinnlos:
Gruppiert die Zeichenfolge nach Buchstaben, filtert nach den Gruppen, die das richtige Zeichen enthalten, findet dann die Längen, fügt 0 an die Längenliste an, falls sie nicht angezeigt wird, und ermittelt schließlich den Maximalwert.
quelle
Mathematica, 109 Bytes
Eingang
quelle
Python 2 , 69 Bytes
Probieren Sie es online!
quelle
CJam ,
20191816 BytesProbieren Sie es online!
Erläuterung
quelle
Excel, 56 Bytes
s
sollte eingegeben werdenA1
.c
sollte eingegeben werdenA2
.Die Formel muss eine Matrixformel ( Ctrl+ Shift+ Enter) sein, die geschweifte Klammern hinzufügt
{ }
.Technisch ist dies nur möglich, wenn die längste Ausführung weniger als 1.048.576 beträgt (was 2 ^ 20 entspricht), da Sie auf diese Weise in der aktuellen Excel-Version Zeilen in einem Arbeitsblatt haben. Da die Millionen + -Werte bei jeder Neuberechnung in den Speicher geladen werden, ist dies keine schnelle Formel.
quelle
MATL , 15 Bytes
Probieren Sie es online!
Der grundlegende Algorithmus ist sehr einfach (keine Verwendung von Split!), Aber ich musste einwerfen
0i0v
und0h
die Kantenfälle berücksichtigen. Trotzdem fand ich den Ansatz gut, und vielleicht kann ich noch eine andere Technik finden, um die Randfälle zu behandeln: Der Algorithmus findet die längste Ausführung in der Mitte einer Zeichenfolge in Ordnung, aber nicht für einzelne Zeichen oder leere Zeichenfolgen; Ich teste immer noch, ob ich die Variablen an besseren Stellen auffüllen kann, um bessere Ergebnisse zu erzielen.Funktioniert nicht leer
c
. Andererseits nehme ich an, dass jede Zeichenfolge eine unendliche Anzahl leerer Zeichenfolgen zwischen den einzelnen Zeichen enthält :)quelle
R ,
6658 Bytes-8 Bytes dank BLT und MickyT
Gibt eine anonyme Funktion zurück. TIO hat einen 1-Byte-Unterschied, weil
el
es aus unerklärlichen Gründen nicht funktioniert.Probieren Sie es online!
quelle
r=rle(el(strsplit(s,'')))
function(s,c)max((r=rle(el(strsplit(s,''))))$l*(r$v==c),0)
el
funktioniert nicht mit TIO (keine Ahnung warum) und ich habe es einfach aus dem dortigen Arbeitscode kopiert und eingefügt, also muss ich mich daran erinnern, das wieder in @MickyT abzulegen. Sehr clever! Vielen Dank!Java 8,
6765 Bytes-2 Bytes dank @ OlivierGrégoire
Nimmt Eingaben
s
alschar[]
, undc
alschar
Erläuterung:
Probieren Sie es hier aus.
quelle
m=m>(t=x==c?t+1:0)?m:t;
ist kürzer als{t=x==c?t+1:0;m=m>t?m:t;}
.s->c->java.util.Arrays.stream(s.split("[^"+c+"]")).mapToInt(z->z.length()).max().orElse(0)
)Ruby, 40 Bytes
->s,c{s.split(%r{[^#{c}]}).max&.size||0}
Probieren Sie es online!
quelle