Schreiben Sie ein Programm, das 2 Zeichenfolgen als Eingabe verwendet und das längste gemeinsame Präfix zurückgibt. Das ist Code-Golf , also gewinnt die Antwort mit der kürzesten Anzahl von Bytes.
Test Case 1:
"global" , "glossary"
"glo"
Test Case 2:
"department" , "depart"
"depart"
Test Case 3:
"glove", "dove"
""
"aca", "aba"
.global
undGLOSSARY
zurückglo
oder''
?Antworten:
Python 3, 54 Bytes
Vielen Dank an Python für die integrierte Funktion für diese Aufgabe! : D
Nimmt die Eingabe als zwei Wörter, die durch ein Leerzeichen wie z
glossary global
.quelle
Haskell, 29 Bytes
Verwendung:
Definiert die Binärfunktion rekursiv
%
durch Mustervergleich. Nimmt bei zwei Zeichenfolgen mit gleichen Anfangsbuchstaben diese Anfangsbuchstaben und stellt sie der Funktion der übrigen Zeichenfolgen voran. Auf alles andere gibt die leere Zeichenfolge.quelle
Pyth,
87 BytesVielen Dank an @isaacg für 1 Byte aus
Nimmt Eingaben in Anführungszeichen und Komma getrennt, wie
"abc", "acc"
. Dies führt zu einem Fehler (lässt jedoch stdout leer), wenn das Ergebnis die leere Zeichenfolge ist. Wenn dies nicht akzeptabel ist, fügen Sie 2 Bytes für hinzu#e@F._MQq
Test Suite
Erläuterung
quelle
e|@F._M.z]k
.#...q
als ein Byte weniger ist, dass ich in dem vollständigen Code bearbeiten würde, denke ich , dass ist verwirrend"abc", "def"
und Sie könnenQ
anstelle von.z
C ++,
10110099 BytesLiest zwei Zeichenfolgen aus
stdin
und druckt das Zeichen an der aktuellen Position aus einer der Zeichenfolgen, während das Zeichen an der aktuellen Position dem Zeichen an derselben Position in der anderen Zeichenfolge entspricht.Vielen Dank an Zereges für das Speichern eines Bytes.
quelle
for
Aussage ...int i
im globalen Raum (so dass es 0 wird initialisiert)Haskell, 38 Bytes
Anwendungsbeispiel:
( ((map fst.fst.span(uncurry(==))).).zip ) "global" "glossary"
->"glo"
.Zippen Sie beide Eingabezeichenfolgen in eine Liste von Zeichenpaaren. Machen Sie zwei Listen daraus: die erste mit allen Paaren von Anfang an, solange beide Zeichen gleich sind, die zweite mit allen Resten. Löschen Sie die zweite Liste und extrahieren Sie alle Zeichen aus der ersten Liste.
quelle
CJam,
12119 BytesDadurch werden die Zeichenfolgen in zwei separaten Zeilen mit einem Zeilenende im Unix-Stil gelesen, d
<string>\n<string>\n
. H.Danke an @ MartinBüttner für -1 Byte und an @ jimmy23013 für -2 Byte!
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
l_q.-
.APL, 13
Dies ist eine Funktion, die ein Array mit zwei Zeichenfolgen verwendet und das Präfix zurückgibt:
quelle
AppleScript, 215 Bytes
Und ich habe es so sehr versucht ...; (
Ich wollte sehen, wie gut AppleScript das schaffen kann, und Mann, es ist nicht für Zeichenkettenvergleiche gebaut.
quelle
tell app "System Events" to <something>
. Es ist jedoch interessant zu sehen, wie es mit solchen Dingen umgeht. @ kirbyfan64sosrs , 14 bytes
Live-Demo und Testfälle.
Das ist ziemlich einfach. Es stimmt nur mit dem längsten gemeinsamen Präfix überein und entfernt den Rest der Zeichenfolge. Wenn es kein längstes gemeinsames Präfix gibt, wird einfach alles gelöscht.
quelle
sed, 18
Ich hatte etwas viel längeres und komplizierteres im Sinn, daher geht die Anerkennung für diese Idee an @ kirbyfan64sos .
Beinhaltet +1 für die
-r
Option zum Sedieren.quelle
CJam,
12826Probieren Sie es online.
(Habe die Idee,. = Anstelle von .- zu verwenden, nachdem ich Dennis 'Antwort gelesen habe.)
Bei all den Randfällen wurde es für einen CJam-Anfänger wie mich zu schwierig, es kurz zu halten. Hoffentlich funktioniert das zumindest in allen Fällen.
quelle
C #,
201147 BytesIch weiß, dass es nicht sehr wettbewerbsfähig ist. Ich wollte nur sehen, wie es aussehen würde.
EDIT: Danke Ash Burlakzenko, Berend und Dennis_E
quelle
using System.*
?.ForEach(x=>Console.Write(x))
könnte verkürzt werden auf.ForEach(Console.Write)
using System.Collections.Generic;
ist unnötig. Entfernen Sie ein weiteres Byte, indem Sie das Leerzeichen entfernenstring[] a
.Contains
ist unnötig. 2-Sie können ein paar Bytes sparen,using System;
indem SieSystem.Console.Write;
3- entfernen und sagen. Dieser Code gibt das falsche Ergebnis ("a") für die Eingabe "aab", "aaab" ausIndexOf
. Die kürzeste Lösung, die ich mira[0].Take(a[1].Length)
vorstellen kann, ist die Verwendung von " This is 147 bytes long: using System.Linq; class a {static void ((c, i) => a [1] [i] == c) .ToList (). ForEach (System.Console.Write);}} "Common Lisp, 39
Nimmt zwei Zeichenfolgenargumente, bestimmt den Index i, in dem sie sich unterscheiden, und gibt eine Teilzeichenfolge von 0 bis i zurück .
quelle
Perl 5,
201918 Bytes19 Bytes plus 1 für das
-E
Flag anstelle von-e
:Dies wird schamlos kopiert Digital - Trauma ‚s sed Antwort . Es wird davon ausgegangen, dass die Eingabe ein paar Wörter ohne Leerzeichen (oder vor dem ersten) und mit einem Leerzeichen dazwischen ist.
Aktualisieren:
ThisSuitIsBlackNot schlug vor,
-pe
wie folgt zu verwenden, um ein Byte zu speichern (danke!):Und dann schlug Luk Storms vor,
-nE
wie folgt vorzugehen, um ein weiteres Byte zu speichern (danke!):(Ich zähle
-E
als ein Byte anstelle des Standards-e
, aber-n
oder-p
als zwei. Mein Eindruck ist, dass das hier SOP ist.)quelle
-M5.010
msgstr " ist bei Bedarf kostenlos" . Pro gleichem Meta-Beitrag,-pe
oder-ne
wäre 1 zusätzliches Byte, nicht 2. Alsoperl -nE 'say/^(.*).* \1/'
würden 16 Bytes gewertet.Python 3, 72
31 Bytes dank FryAmTheEggman gespart. 8 dank DSM gespeichert.
quelle
zip
? : Dinput()
s in daszip
speicherna
undb
binden.Python 3, 47
Eine Funktion, die eine Liste
w
mit zwei Wörtern verwendet und das gemeinsame Präfix druckt, bevor sie mit einem Fehler beendet wird.Mit der
print
Funktion von Python 3 können Sie Zeichenfolgen bündig gegeneinanderprint(end=c)
ausgeben (dank Sp3000 für das Speichern von 3 Bytes mit dieser kürzeren Syntax). Dies nimmt wiederholt zwei Buchstaben aus den Wörtern und druckt den ersten der Buchstaben. Die Indizierungc[c!=d]
führt zu einem Fehler außerhalb der Grenzen, bei demc!=d
die Ausführung abgebrochen wird, wenn zwei ungleiche Buchstaben auftreten.Eine explizite for-Schleife ist ein Zeichen länger als das Listenverständnis:
quelle
print(end=c[c!=d])
?print
als optional bezeichnet wird und nur mit dem Endargument aufgerufen werden kann und die Zeichenfolge enthalten kann. Das ist im Allgemeinen ein wirklich nützlicher Trick. Du solltest einen Tipp geben.Javascript ES6, 52 Bytes
Verwendung:
quelle
ada,aca
...f=
(a,b)=>[...a].map((e,i)=>e==b[i]?e:b='').join``
Retina , 14 Bytes
Verwendet die gleiche Idee wie kirbyfan64sos . Trotz Martins Behauptung, dass der Match-Modus möglicherweise das Drucken von Erfassungsgruppen ermöglicht, wurde er leider noch nicht implementiert. Andernfalls kann
(.*).* \1
diese Option zusammen mit etwa 2 Byte für eine noch nicht vorhandene Konfigurationszeichenfolge verwendet werden.Jede Zeile wird in einer eigenen Datei abgelegt, wobei pro zusätzlicher Datei 1 Byte hinzugefügt wird. Alternativ können Sie auch eine einzelne Datei mit dem
-s
Flag ausführen .quelle
\1
stellt sicher, dass beide Wörter mit demselben Präfix beginnen. Also egal wie gierig es(.*)
ist,\1
ist das selbe.K, 24 Bytes
Finden Sie das Minimum der Länge jeder Zeichenfolge. (
(&/#:'x)
). Kürzen Sie jede Zeichenfolge auf diese Länge (#'x
). Vergleichen, schmieren und summieren Sie dann die resultierende Sequenz:Nehmen Sie zum Schluss so viele Zeichen aus der ersten der angegebenen Zeichenfolgen (
#*x
).In Aktion:
quelle
Powershell, 65 Bytes
Vergleichen Sie die Zeichenfolgen und verkleinern Sie die erste, bis sie entweder übereinstimmt (print and exit) oder die Zeichenfolge null ist und die Schleife endet.
quelle
Julia, 62 Bytes
Ungolfed:
Behebung eines Problems (bei den hohen Kosten von 14 Bytes) dank xnor!
quelle
C99, 73 Bytes
Ähnlich wie diese Antwort , aber kürzer und erfüllt die Spezifikation (Eingabe von stdin).
quelle
#include<stdio.h>
, was für die Kompilierung des Programms erforderlich ist.main(int c,char**a){for(;*a[1]==*a[2]++;putchar(*a[1]++));}
(59 Bytes).MATLAB,
50 bis40 BytesDefiniert eine Funktion, die 2 Zeichenfolgen als Eingabe akzeptiert und an das Befehlsfenster ausgibt
Diese Lösung funktioniert für alle Zeichenfolgen und Ausgaben
wenn keine Übereinstimmung vorliegt.
Kann unter Verwendung eines Skripts anstelle einer Funktion (unter Verwendung der lokalen Variablen a, b) (-16 Byte) gespielt werden.
also immer 34 Bytes
Der Funktionsstil (der der akzeptierte Stil zu sein scheint) ergibt
(Danke @Stewie Griffin)
quelle
@(a,b)a(1:find([diff(char(a,b)) 1],1)-1)
. =)Perl 6 , 28 Bytes
Ich habe zwei gefunden, deren Werte aus STDIN stammen und auf der Perl 5-Antwort basieren.
Das erste erfordert genau ein Leerzeichen zwischen den Eingaben, während das andere mindestens ein Leerzeichen zwischen den Eingaben erfordert.
Das ist ziemlich viel kürzer als das erste, was ich ausprobiert habe und das die Werte von der Kommandozeile übernimmt.
oder sogar die Lambda-Version davon:
Dies ist jedoch viel einfacher einzustellen, so dass eine beliebige Anzahl von Eingabezeichenfolgen auf Kosten von nur einem Strich akzeptiert werden.
quelle
Japt, 27 Bytes
Japt ist eine verkürzte Version von Ja vaScri pt .Dolmetscher
(Die Zeichenfolgen werden folgendermaßen in das Eingabefeld eingefügt:
"global" "glossary"
)Dieser Code entspricht genau dem folgenden JS:
Ich habe noch keine anonymen Funktionen implementiert, wofür das
$...$
ist: Alles zwischen den Dollarzeichen bleibt beim Wechsel zu JS unberührt. Nachdem ich Funktionen hinzugefügt habe, reicht dieser 21-Byte-Code aus:Und nachdem ich ein paar weitere Features implementiert habe, sind es im Idealfall 18 Bytes:
Vorschläge willkommen!
Es stellt sich also heraus, dass dieses Programm in modernem Japt nur 15 Bytes umfasst:
Probieren Sie es online!
quelle
MATL ,
119 BytesProbieren Sie es online!
(-2 Bytes dank Giuseppe)
quelle
y
Idee ist ziemlich gut, ich habe Dinge wie eine Initialeiti
statt der ausprobiert1Gw
, aber nicht daran gedacht, diey
dafür zu verwenden.Clojure / ClojureScript, 51
Ziemlich einfach. Leider sind die Leerzeichen um die Parameter-Destrukturierung notwendig (das ist das
[a & b]
Zeug). Nicht die kürzeste, aber ich habe einige andere Antworten in Sprachen geschlagen, die gerne mit ihrer Kürze angeben, also poste ich sie.quelle
Python 2, 50 Bytes
Eingang
Die Eingabe erfolgt als zwei Zeichenfolgen:
Ausgabe
Die Ausgabe ist jedes Zeichen, gefolgt von einem Leerzeichen. Das ist hoffentlich kein Problem. Wenn dies jedoch der Fall ist, bearbeite ich meine Antwort.
quelle
"global" , "glossary"
(zwei separate Zeichenfolgen) gegeben. Wie viele andere Antworten folgen dem auf den Buchstaben? @ ThomasKwaprint(exit()if a!=b else a,end='')
? Ich weiß nicht, ob das funktionieren wird oder nicht, aber es könnte seinTeaScript, 16 Bytes
20Nimmt jede Eingabe durch ein Leerzeichen getrennt.
quelle
PHP, 52 Bytes
Nicht spektakulär, aber macht den Job:
Nimmt zwei Befehlszeilenargumente an:
quelle
while(($a=$argv)[1][$i]==$a[2][$i])echo$a[1][$i++];
- Eine weitere Lösung nur für PHP7 (und das Beste, was mir einfallen könnte, sind @ 50 Byte)<?=substr(($a=$argv)[1],0,strspn($a[1]^$a[2],~ÿ));
- Stellen Sie sicher, dass sich Ihr Editor im ASCII-Modus befindet. Es ist wichtig,~ÿ
dass er nicht in Unicode konvertiert wird.