Größter gemeinsamer Teilstring

30

Erstellen Sie ein Programm oder eine Funktion, die eine Liste von Zeichenfolgen als Eingabe verwendet und die längste Zeichenfolge ausgibt, die eine Teilzeichenfolge aller Eingabezeichenfolgen ist. Wenn es mehrere gleich lange Teilzeichenfolgen gibt, die nicht mehr Teilzeichenfolgen sind, geben Sie eine davon aus.

  • Dies kann bedeuten, dass der leere String ausgegeben wird.
  • Wenn es mehrere gültige Ausgaben gibt, können Sie eine davon ausgeben. Sie müssen für eine bestimmte Eingabe keine konsistente Ausgabe angeben, solange die Ausgabe immer gültig ist.
  • In der Eingabe ist immer mindestens eine Zeichenfolge enthalten, es ist jedoch möglicherweise keine nicht leere Zeichenfolge vorhanden.
  • Alle druckbaren ASCII-Zeichen werden möglicherweise in der Eingabe angezeigt. Sie können davon ausgehen, dass dies die einzigen Zeichen sind, die angezeigt werden.
  • Sie können die Eingabe oder Ausgabe mit einer der Standardmethoden erstellen .
  • Standardlücken sind nicht erlaubt.
  • Das ist - je weniger Bytes Code, desto besser.

Testfälle:

[Inputs] -> [Valid outputs (choose one)]

["hello", "'ello"] -> ["ello"]
["very", "much", "different"] -> [""]
["empty", "", "STRING"] -> [""]
["identical", "identical"] -> ["identical"]
["string", "stRIng"] -> ["st", "ng"]
["this one", "is a substring of this one"] -> ["this one"]
["just one"] -> ["just one"]
["", "", ""] -> [""]
["many outputs", "stuptuo ynam"] -> ["m", "a", "n", "y", " ", "o", "u", "t", "p", "s"]
["many inputs", "any inputs", "ny iii", "yanny"] -> ["ny"]
["%%not&", "ju&#st", "[&]alpha_numeric"] -> ["&"]
Sara J
quelle
2
@ Adám Bei dieser Frage wird nach der längsten gemeinsamen Teilfolge gefragt, nicht nach der Teilzeichenfolge .
Türklinke
1
Sind die Zeichenfolgen nur alphanumerisch oder alphabetisch oder nur druckbar?
Verkörperung der Ignoranz
@EmbodimentofIgnorance Alle druckbaren ASCII-Zeichen können in der Eingabe erscheinen.
Sara J
2
@ Shaggy Im Allgemeinen nicht. Wenn die beiden unterschieden werden können, undefinedbedeutet dies, dass es keine gültige Ausgabezeichenfolge gibt. Wenn die leere Zeichenfolge (oder eine andere Zeichenfolge) eine gültige Ausgabe ist, ist die Behauptung, dass keine gültige Ausgabe vorhanden ist, falsch.
Sara J

Antworten:

8

Python 2 , 82 Bytes

f=lambda h,*t:h and max(h*all(h in s for s in t),f(h[1:],*t),f(h[:-1],*t),key=len)

Probieren Sie es online!

Nimmt eingegebenen splatted. Zeitüberschreitung bei Eingaben, bei denen die erste Zeichenfolge lang ist.

Die Idee ist, Teilzeichenfolgen der ersten Zeichenfolgen hzu verwenden, um die längste zu finden, die in allen verbleibenden Zeichenfolgen enthalten ist t. Dazu verzweigen wir beim Entfernen des ersten oder letzten Zeichens von rekursiv h.


Python 2 , 94 Bytes

lambda l:max(set.intersection(*map(g,l)),key=len)
g=lambda s:s and{s}|g(s[1:])|g(s[:-1])or{''}

Probieren Sie es online!

Eine direktere Methode. Die Hilfsfunktion ggeneriert die Menge aller Teilzeichenfolgen von s, und die Hauptfunktion nimmt die längste in ihrer Schnittmenge ein.

xnor
quelle
8

Brachylog (v2), 3 9 Bytes

{sᵛ}ᶠlᵒtw

Probieren Sie es online!

Volles Programm. Eingabe von der Standardeingabe (als JSON-artige Liste von Zeichenfolgen), Ausgabe in die Standardausgabe.

Erläuterung

{sᵛ}ᶠlᵒtw
 s         Find a substring
  ᵛ          of every element {of the input}; the same one for each
{  }ᶠ      Convert generator to list
     lᵒt   Take list element with maximum length
        w  Output it

Anscheinend ist die Tiebreak-Reihenfolge sin Brachylog anders als in fast allen anderen Fällen. Wir müssen sie daher manuell überschreiben, um die längste Ausgabe zu erzielen. (Das ist ein bisschen frustrierend: vier zusätzliche Zeichen für die Außerkraftsetzung plus zwei Gruppierungszeichen, da Brachylog nicht zwei Metapredicates hintereinander analysiert.)

Brachylogs sgibt keine leeren Teilzeichenfolgen zurück, daher brauchen wir einen kleinen Trick, um das zu umgehen: Anstatt eine Funktionsübergabe (was normalerweise der Fall ist) zu erstellen, schreiben wir ein vollständiges Programm und geben es auf die Standardausgabe aus. Auf diese Weise geben wir eine gemeinsame Teilzeichenfolge einfach aus und sind fertig. Wenn es keinen gemeinsamen Teilstring gibt, gibt das Programm einen Fehler aus, druckt aber trotzdem nichts auf die Standardausgabe und gibt daher den Null-String wie vorgesehen aus.

ais523
quelle
1
Ich habe dies mit der Eingabe versucht ["many inpuabts", "any inabputs", "ny iabii", "yanabny"]. Ich habe mit den Ergebnissen ab und gerechnet ny . Habe aber nur das Ergebnis a . Mache ich etwas falsch ?
t-clausen.dk
1
Ugh, anscheinend habe ich mich für sfalsch an die Tiebreak-Reihenfolge erinnert , und das Überschreiben der Tiebreak-Reihenfolge ist byteweise ziemlich teuer. Tun Sie das jetzt trotzdem, denn es ist wichtig, dass die Antwort richtig ist. Irgendwie bemerkte keiner der Testfälle, die ich ausprobiert hatte, den Unterschied.
ais523
1
@ ais523 Die Bestellung s besteht darin, zuerst alle Präfixe der Eingabe (längste zuerst), dann die erste zu
löschen
5

Gelee , 12 6 Bytes

Ẇ€f/ṫ0

Probieren Sie es online!

Vielen Dank an @ JonathanAllan für das Speichern von 6 Bytes!

Nick Kennedy
quelle
Ich glaube, Ẇ€œ&/Ṫḟ0würde die Arbeit erledigen und vier Bytes einsparen, da die Unterzeichenfolgen bereits nach Länge geordnet sind, daher wird das gefilterte Ergebnis sein; dann bleibt nur, dass wenn es keine Übereinstimmungen gibt, der Schwanz eine Null erzeugt, und da wir garantierte Listen von Zeichen sind, können wir diese einfach herausfiltern.
Jonathan Allan
auch ich denke, œ&/kann durch f/hier sparen eine andere ersetzt werden
Jonathan Allan
Ich habe eine Pull-Anfrage gesendet, um (hoffentlich) das Ergebnis des Reduzierens einer leeren Liste zu einer leeren Liste zu machen (anstatt einen TypeError auszulösen). Wenn das zusammenfällt, glaube ich, dass diese Antwort dann ein Sechs-Byter werden könnte Ẇ€f/ṛ/.
Jonathan Allan
@ JonathanAllan klingt gut. Vielen Dank für die anderen Tipps - ich hoffe, Sie haben mich gefreut, sie aufzunehmen.
Nick Kennedy
Ja, mein Grund für diese Kommentare war, dass Sie die Ideen in Ihren Beitrag einbinden konnten.
Jonathan Allan
5

Ruby 2.6, 76 59 54 Bytes

->a{*w=a;w.find{|r|w<<r.chop<<r[1..];a.all?{|s|s[r]}}}

Probieren Sie es online!- Ruby 2.5 Version (56 Bytes)

Wie?

Erstellen Sie eine Liste möglicher Übereinstimmungen, die zunächst auf das ursprüngliche Array festgelegt wurde. Durchlaufen Sie die Liste, und fügen Sie dem Ende der Liste zwei neue Zeichenfolgen hinzu, wenn eine Zeichenfolge nicht übereinstimmt, und kürzen Sie dabei das erste oder das letzte Zeichen ab. Am Ende wird eine Übereinstimmung (eventuell eine leere Zeichenfolge) gefunden.

Danke Kirill L für -2 Bytes und Histokrat für weitere -2

GB
quelle
4

R , 119 116 108 106 Bytes

function(S,`?`=nchar,K=max(?S),s=Reduce(intersect,lapply(S,substring,0:K,rep(0:K,e=K+1))))s[which.max(?s)]

Probieren Sie es online!

Suchen Sie alle Teilzeichenfolgen jeder Zeichenfolge, suchen Sie die Schnittmenge jeder Teilzeichenfolgenliste und geben Sie schließlich eine der längsten zurück.

-3 Bytes dank Kirill L.

-8 Bytes mit lapply anstelle von Map

Nochmals -2 Bytes dank Kirill L., der Klammern entfernt

Giuseppe
quelle
Ich habe keine Zeit zu überprüfen, aber wenn ich mich nicht irre, ncharreichen 2 Vorkommen aus, um etwas zu retten, indem ich mich ncharals unärer Operator anmelde.
Kirill L.
@KirillL. ja, es ist um 2 Bytes kürzer. Vielen Dank! Durch Aliasing erhalten listwir ebenfalls -3 Bytes.
Giuseppe
Sie können auch Zahnspangen für eine weitere -2
Kirill L.
@KirillL. Vielen Dank! Ich mache mir ein bisschen Sorgen, dass ich das mit Seriencode anfangen werde ...
Giuseppe,
Das ist das Problem beim Golfspielen einer Sprache, die Sie jeden Tag benutzen
MickyT
4

05AB1E , 14 9 8 Bytes

€Œ.«ÃéθJ

-6 Bytes dank @Adnan .

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

€Œ       # Get the substring of each string in the (implicit) input-list
       # Right-reduce this list of list of strings by:
    Ã    #  Only keep all the strings that are present in both list of strings
     é   # Sort by length
      θ  # And pop and push its last item
         # The substrings exclude empty items, so if after the reduce an empty list remains,
         # the last item will also be an empty list,
       J # which will become an empty string after a join
         # (after which the result is output implicitly)
Kevin Cruijssen
quelle
1
Ich denke, €Œ.«Ãõªéθsollte für 9 Bytes arbeiten.
Adnan
@Adnan Warten Sie, wir haben eine Reduzierung .. Wie habe ich das vermisst. : SI versucht Å«Ã, aber wusste nicht, dass ich .«Ãstattdessen hätte verwenden sollen .. Danke!
Kevin Cruijssen
1
Eigentlich sollte ich €Œ.«ÃéθJfür 8 arbeiten.
Adnan
4

Zsh , 126 ... 96 Bytes

-3 Bytes aus der Arithmetik für, -6 Bytes aus der impliziten "$@"(danke roblogic), -5 Bytes aus dem Entfernen nicht benötigter { }, -1 Bytes aus der Kurzform von for, -1 Bytes durch Verwenden von repeat, -1 Bytes durch Verketten for s ($b)mit seinem Hauptteil, -13 Bytes durch Ändern der Wiederholungsschleife für einen bestimmten Wert.

for l
eval a=\( \$l\[{1..$#l},{1..$#l}\] \)&&b=(${${b-$a}:*a})
for s ($b)(($#x<$#s))&&x=$s
<<<$x

Probieren Sie es online! Probieren Sie es online! Probieren Sie es online!

Wir lesen alle möglichen Teilzeichenfolgen in das Array ein aund stellen dann bden Schnittpunkt der Arrays aund ein b. Das Konstrukt ${b-$a}wird nur $abei der ersten Iteration ersetzt: Im Gegensatz zu seiner Geschwistererweiterung ${b:-$a}wird es nicht ersetzt, wenn bgesetzt, sondern leer.

for l;                              # implicit "$@"

# === OLD ===
{
    a= i=                           # empty a and i
    repeat $[$#l**2]                # compound double loop using div/mod
        a+=($l[++i/$#l+1,i%$#l+1])  # append to a all possible substrings of the given line
#               1+i/$#l             # 1,1,1...,  1,1,2,2,2,... ...,  n,n
#                       1+i%$#l     # 1,2,3...,n-1,n,1,2,3,... ...,n-1,n
#       a+=( $l[       ,     ] )    # append that substring to the array
# === NEW ===
    eval a=\( \
        \$l\[{1..$#l},{1..$#l}\] \  # The {bracket..expansions} are not escaped
    \) &&
# ===     ===
    b=( ${${b-$a}:*a} )
#         ${b-$a}                   # if b is unset substitute $a
#       ${       :*a}               # take common elements of ${b-$a} and $a
#   b=(               )             # set b to those elements
}
for s ($b)                          # for every common substring
    (( $#x < $#s )) && x=$s         # if the current word is longer, use it
<<<$x                               # print to stdout
GammaFunktion
quelle
Wie funktioniert das? a+=( $l[1+i/$#l,1+i%$#l] )
Roblogic
1
@roblogic Ich denke, ich habe es jetzt besser erklärt, überprüfe die Bearbeitung. Die Idee ist, eine Schleife zu n ^ 2 zu for
erstellen
1
Sie könnten in der Lage sein, for l in "$@"einfach zu schneiden for l;- es ist ein Bash-Trick
Roblogic
ich muss sagen, zsh ist so viel eleganter als bash. Es gibt nichts Vergleichbares zu diesem schönen Array-Vergleich AFAIKb=(${${b-$a}:*a})}
roblogic
1
Es gibt einige nette Dinge, die Sie damit machen können, und es ist nicht allzu beliebt. Das bedeutet, dass ich die meisten Fragen, auf die ich stoße, mit einer zsh-Antwort beantworte. : P Wenn du zsh lernen willst, empfehle ich man zshexpnund vor man zshparamallem. Ich habe sie immer offen, wenn ich eine Antwort schreibe.
GammaFunction
3

Haskell , 80 Bytes

import Data.List
f(x:r)=last$sortOn(0<$)[s|s<-inits=<<tails x,all(isInfixOf s)r]

Probieren Sie es online!

Holen Sie sich alle Suffixe ( tails) des ersten Wortes xin der Liste und nehmen Sie alle Präfixe ( inits) dieser Suffixe, um alle Teilzeichenfolgen svon zu bekommen x. Halten Sie jeweils : szu isInfixOf allStrings in der verbleibenden Liste r. Sortieren Sie diese Teilzeichenfolgen nach Länge (mit dem (0<$)Trick ) und geben Sie die letzte zurück.

Laikoni
quelle
3

Retina 0.8.2 , 48 Bytes

M&!`(?<=^.*)(.+)(?=(.*\n.*\1)*.*$)
O#$^`
$.&
1G`

Probieren Sie es online! Erläuterung:

M&!`(?<=^.*)(.+)(?=(.*\n.*\1)*.*$)

Suchen Sie für jedes Suffix der ersten Zeichenfolge das längste Präfix, das auch eine Teilzeichenfolge aller anderen Zeichenfolgen ist. Listen Sie alle diese Suffix-Präfixe (dh Teilzeichenfolgen) auf. Wenn es keine passenden Teilzeichenfolgen gibt, erhalten wir nur die leere Zeichenfolge, die wir sowieso wollen.

O#$^`
$.&

Sortieren Sie die Teilzeichenfolgen in umgekehrter Reihenfolge der Länge.

1G`

Behalten Sie nur die erste, dh die längste Teilzeichenfolge.

Neil
quelle
Es nsei die Anzahl der Argumente. Dann (?=(.*\n.*\1)*.*$)sollte es sein (?=(.*\n.*\1){n-1}.*$), nicht wahr? Testfall:["very", "different", "much"] -> [""]
mazzy
1
@mazzy Ich sehe das Problem nicht: Online
Neil
es ist kein Problem. mit {n}könnten Sie Start- und (.+)(?=(.*\n.*\1){n}n(?<=^.*).*$
Endmuster
@mazzy Ich kann nicht in Retina 0.8.2, und in Retina 1 müsste ich mit eval rumspielen, was wahrscheinlich sowieso länger wäre.
Neil
3

TSQL-Abfrage, 154 Byte

USE master
DECLARE @ table(a varchar(999)collate Latin1_General_CS_AI,i int identity)
INSERT @ values('string'),('stRIng');

SELECT top 1x FROM(SELECT
distinct substring(a,f.number,g.number)x,i
FROM spt_values f,spt_values g,@ WHERE'L'=g.type)D
GROUP BY x ORDER BY-sum(i),-len(x)

Probieren Sie es online aus

Die Groß- und Kleinschreibung wird beachtet, indem die Spalte 'a' mit einer Sortierung deklariert wird, die CS enthält (Groß- und Kleinschreibung beachten).

Wenn alle Zeichenfolgen von 2540 Startpositionen (viele identisch) getrennt werden, die nützlichen Werte jedoch zwischen 1 und 2070 liegen und 0 bis 22 Zeichen nach der Startposition enden, kann die Endposition länger sein, indem der Typ auf 'P' anstelle von 'L' geändert wird. würde aber die leistung lähmen.

Diese eindeutigen Zeichenfolgen innerhalb jeder Rownumber werden gezählt. Die höchste Anzahl entspricht immer der Anzahl der Zeilen in der Tabellenvariablen '@'. Wenn Sie die Reihenfolge bei gleicher Anzahl umkehren, bleibt der Teilstring mit den meisten Übereinstimmungen über den Ergebnissen, gefolgt von der umgekehrten Länge des Teilstrings, und der längsten Übereinstimmung mit den meisten Übereinstimmungen oben. Die Abfrage wählt nur die oberste Zeile aus.

Ändern Sie den ersten Teil der Abfrage in, um alle Antworten zu erhalten

SELECT top 1mit x FROM

t-clausen.dk
quelle
3

C # (Visual C # Interactive Compiler), 320 bis 257 Byte

l=>(string.Join(",",l.Select(s=>new int[s.Length*s.Length*2].Select((i,j)=>string.Concat(s.Skip(j/-~s.Length).Take(j%-~s.Length))))
.Aggregate((a,b)=>a.Intersect(b)).GroupBy(x=>x.Length).OrderBy(x =>x.Key).LastOrDefault()?.Select(y=>y)??new List<string>()));

Probieren Sie es online!

Requisiten zu @Expired Data und @dana

Innat3
quelle
Sie können den String einfach von einer Funktion zurückgeben. Im Interactive Compiler könnte es also so aussehen: 294 Bytes
Abgelaufene Daten
1
Hier ist die Lösung, die ein paar Bytes weniger als 215 Bytes umfasst
abgelaufene Daten
@ExpiredData ah perfect das ist das Beispiel, das ich brauchte :)
Innat3
186
dana
184
Verkörperung der Ignoranz
3

Perl 6 , 62 60 Bytes

{~sort(-*.comb,keys [∩] .map(*.comb[^*X.. ^*]>>.join))[0]}

Probieren Sie es online!

Ich ärgere mich ein wenig, dass Perl 6 keine Einstellungsoperationen für Listen von Listen ausführen kann, weshalb es ein zusätzliches .combund gibt>> dort.

Eine weitere ärgerliche Sache ist, dass maxich keine Funktion zum Vergleichen von Artikeln verwenden kann, sortsondern stattdessen verwenden muss. Wie in den Kommentaren ausgeführt,max kann man ein Argument nehmen, es endet jedoch länger, da ich die maxRückgabe einer negativen Unendlichkeit berücksichtigen muss , wenn es gemeinsame Teilzeichenfolgen gibt ( online ausprobieren ! ).

Scherzen
quelle
3
maxkann eine solche Funktion übernehmen (Arity 1), entweder nach Position, wenn sie im OO-Modus aufgerufen wird, oder nach einem benannten :byArgument im prozeduralen Modus.
Ven
2

Japt v2.0a0 -hF, 8 Bytes

Îã f@eøX

Danke an Shaggy für das Speichern von 3 Bytes

Versuch es

Îã              //Generate all substrings of the first string
 f@             //Filter; keep the substrings that satisfy the following predicate:
   e            //    If all strings of the input...
    øX          //    Contain this substring, then keep it
-h              //Take last element
-F              //If last element is undefined, default to empty string
Verkörperung der Ignoranz
quelle
Sie müssen am Ende nicht nach Länge sortieren, um 3 Bytes zu sparen. Auch -Fstandardmäßig auf den leeren String.
Shaggy
2

Japt -h , 8 Bytes

(Ich könnte die letzten 3 Bytes abschneiden und -Fhstattdessen das Flag verwenden, aber ich bin kein Fan von using -F)

mã rf iP

Probieren Sie es aus oder führen Sie alle Testfälle aus

mã rf iP     :Implicit input of array
m            :Map
 ã           :  Substrings
   r         :Reduce by
    f        :  Filter, keeping only elements that appear in both arrays
      i      :Prepend
       P     :  An empty string
             :Implicit output of last element
Zottelig
quelle
1

Python 3 , 137 Bytes

def a(b):c=[[d[f:e]for e in range(len(d)+1)for f in range(e+1)]for d in b];return max([i for i in c[0]if all(i in j for j in c)],key=len)

Probieren Sie es online!

Artemis unterstützt Monica
quelle
Möglicherweise möchten Sie anstelle von 4 einzelne Leerzeichen als Einrückung verwenden, um mehr als 100 Byte zu sparen.
Shieru Asakoto
@JoKing tio.run/…
Artemis unterstützt Monica
Richtig, hier ist eine feste Version des 135-Byte-Programms
Jo King,
1

Python 2 , 103 Bytes

lambda b:max(reduce(set.__and__,[{d[f:e]for e in range(len(d)+2)for f in range(e)}for d in b]),key=len)

Probieren Sie es online!

Dies ist ein anonymes Lambda, das jedes Element in die Menge aller Teilzeichenfolgen umwandelt, dann reducenach set intersection ( set.__and__) und dann das maxElement nach length zurückgibt.

Scherzen
quelle
1 Byte kürzer mit set.intersection.
ovs
1

Perl 5 (-aln0777F/\n/ -M5.01 -MList::util=max ), 99 Bytes

kann sicherer golfen werden

map/(.+)(?!.*\1)(?{$h{$&}++})(?!)/,@F;say for grep{y///c==max map y///c,@b}@b=grep@F==$h{$_},keys%h

TIO

Nahuel Fouilleul
quelle
1

JavaScript (ES6),  98 bis  92 Byte

a=>(g=b=s=>a.every(x=>~x.indexOf(s))?b=b[s.length]?b:s:g(s.slice(0,-1,g(s.slice(1)))))(a[0])

Probieren Sie es online!

Arnauld
quelle
1

Kohle , 30 Bytes

≔⊟θη≔⁰ζFLη«≔✂ηζ⊕ι¹ε¿⬤θ№κεPε≦⊕ζ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Dieser Algorithmus ist effizienter und kürzer als das Generieren aller Teilzeichenfolgen. Erläuterung:

≔⊟θη

Füge den letzten String aus der Eingabeliste in eine Variable ein.

≔⁰ζ

Nullen Sie den Teilstring-Startindex.

FLη«

Durchlaufen Sie alle möglichen Teilzeichenfolgen-Endindizes. (Tatsächlich geht dies ohne die Länge von 0 aus, sodass der Wert später angepasst wird.)

≔✂ηζ⊕ι¹ε

Beziehen Sie den aktuellen Teilstring.

¿⬤θ№κε

Überprüfen Sie, ob diese Teilzeichenfolge in allen anderen Eingabezeichenfolgen enthalten ist.

Pε

Wenn dies der Fall ist, überdrucken Sie einen zuvor ausgegebenen Teilstring.

≦⊕ζ

Andernfalls versuchen Sie, den Teilzeichenfolgen-Startindex zu erhöhen.

Neil
quelle
1

Bash , 295 .. 175 Bytes

Nicht schön, aber immerhin funktioniert es. Probieren Sie es online

-37 durch allgemeine Reinigung ; -52 durch Plagiieren aus der Antwort von zsh ; -26 durch Ersetzen des Arrays durch eine Schleife ; -2 dank GammaFunction ; -3 entfernt i=0von forSchleifen

for l;{ d=${#l}
for((;i<d**2;i++)){ a="${l:i/d:1+i%d}" k=
for n;{ [[ $n =~ $a ]]&&((k++));}
((k-$#))||b+=("$a");};}
for e in "${b[@]}";do((${#e}>${#f}))&&f="$e";done
echo "$f"

Hier ist das originale ungolfed-Skript mit Kommentaren

roblogic
quelle
1
Save 2 mehr: Sie können ersetzen ((k==$#))&&mit ((k-$#))||. Damit können Sie auch verwenden, k=anstatt es auf 0 zu setzen.
GammaFunction
1
Ich denke, "Nicht schön, aber es funktioniert" ist das MO für Bash-Skripte :)
Joeytwiddle
0

Rot , 266 174 Bytes

func[b][l: length? s: b/1 n: 1 until[i: 1 loop n[t: copy/part at s i l r: on foreach u
next b[r: r and(none <> find/case u t)]if r[return t]i: i + 1]n: n + 1 1 > l: l - 1]""]

Probieren Sie es online!

Die Rekursion wurde in Iteration geändert und die Sortierung wurde entfernt.

Galen Ivanov
quelle
0

JavaScript (Node.js) , 106 Byte

a=>(F=(l,n,w=a[0].substr(n,l))=>l?n<0?F(--l,L-l):a.some(y=>y.indexOf(w)<0)?F(l,n-1):w:"")(L=a[0].length,0)

Probieren Sie es online!

a=>(                      // Main function
 F=(                      //  Helper function to run through all substrings in a[0]
  l,                      //   Length
  n,                      //   Start position
  w=a[0].substr(n,l)      //   The substring
 )=>
 l?                       //   If l > 0:
  n<0?                    //    If n < 0:
   F(--l,L-l)             //     Check another length
  :a.some(                //    If n >= 0: 
   y=>y.indexOf(w)<0      //     Check whether there is any string not containing the substring
                          //     (indexOf used because of presence of regex special characters)
  )?                      //     If so:
   F(l,n-1)               //      Check another substring
  :w                      //     If not, return this substring and terminate
                          //     (This function checks from the longest substring possible, so
                          //      it is safe to return right here)
 :""                      //   If l <= 0: Return empty string (no common substring)
)(
 L=a[0].length,           //  Starts from length = the whole length of a[0]
 0                        //  And start position = 0
)
Shieru Asakoto
quelle
0

Gaia , 15 Bytes

eḋ¦&⊢⟨:l¦:⌉=¦⟩∇

Probieren Sie es online!

e		| eval as code
 ḋ¦		| find all non-empty substrings
   &⊢		| Reduce by set intersection
              ∇	| and return the first element where
      ⟨:l¦:⌉=¦⟩	| the length is equal to the max length
Giuseppe
quelle
0

PowerShell , 165 163 87 Byte

-76 Bytes dank Nail für die großartige Regexp .

"$($args-join'
'|sls "(?<=^.*)(.+)(?=(.*\n.*\1)*.*$)"-a -ca|% m*|sort Le*|select -l 1)"

Probieren Sie es online!

Weniger golfen:

$multilineArgs = $args-join"`n"
$matches = $multilineArgs|sls "(?<=^.*)(.+)(?=(.*\n.*\1)*.*$)" -AllMatches -CaseSensitive|% matches
$longestOrNull = $matches|sort Length|select -Last 1
"$longestOrNull"
mazzy
quelle
0

Java (JDK) , 158 Byte

a->{for(int l=a.get(0).length(),i=l,j;i>=0;i--)for(j=0;j<l-i;){var s=a.get(0).substring(j++,j+i);if(a.stream().allMatch(x->x.contains(s)))return s;}return"";}

Probieren Sie es online!

Credits

Olivier Grégoire
quelle
1
159 Bytes (entfernte Testfälle, um den TIO-Link in einen Kommentar einzufügen)
Sara J
0

Pyth , 16 Bytes

eolN.U@bZm{s./dQ

Probieren Sie es online!

       m     Q    # Map Q (parsed input) over the following function (lambda d:
          ./d     # Partitions of d (all substrings)
         s        # Reduce on + (make one list)
        {         # deduplicate
    .U            # reduce the result on the following lambda, with starting value result[0]
      @bZ         # lambda b,Z: Intersection between b and Z
                  # Result so far: all common substrings in random order
 o                # sort the resulting sets by the following lambda function:
  lN              # lambda N: len(N)
e                 # last element of that list
ar4093
quelle