Eingang
Eine alphanumerische Zeichenfolge s
.
Ausgabe
Die kürzeste Zeichenfolge, die genau einmal als (zusammenhängende) Teilzeichenfolge in vorkommt s
. Überlappende Vorkommen werden als unterschiedlich gezählt. Wenn es mehrere Kandidaten gleicher Länge gibt, müssen Sie alle in der Reihenfolge ihres Auftretens ausgeben. Bei dieser Herausforderung kommt die leere Zeichenfolge n + 1
einige Male in einer Zeichenfolge mit einer Länge vor n
.
Beispiel
Betrachten Sie die Zeichenfolge
"asdfasdfd"
Die leere Zeichenfolge kommt zehnmal in der Zeichenfolge vor, sodass sie nicht für ein eindeutiges Vorkommen in Frage kommt. Jeder der Buchstaben "a"
, "s"
, "d"
, und "f"
tritt mindestens zweimal, so dass sie nicht entweder Kandidaten. Die Teilzeichenfolgen "fa"
und "fd"
kommen nur einmal und in dieser Reihenfolge vor, während alle anderen Teilzeichenfolgen der Länge 2 zweimal vorkommen. Somit ist die korrekte Ausgabe
["fa","fd"]
Regeln
Es sind sowohl Funktionen als auch vollständige Programme zulässig und Standardlücken nicht. Die genaue Formatierung der Ausgabe ist innerhalb des Rahmens flexibel. Insbesondere ist es zulässig, für die leere Zeichenfolge keine Ausgabe zu erzeugen, für das Auslösen eines Fehlers jedoch nicht. Die niedrigste Byteanzahl gewinnt.
Testfälle
"" -> [""]
"abcaa" -> ["b","c"]
"rererere" -> ["ererer"]
"asdfasdfd" -> ["fa","fd"]
"ffffhhhhfffffhhhhhfffhhh" -> ["hffff","fffff","hhhhh","hfffh"]
"asdfdfasddfdfaddsasadsasadsddsddfdsasdf" -> ["fas","fad","add","fds"]
Bestenliste
Hier ist die Bestenliste nach Sprachen, die ich versprochen habe.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 45056;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
Antworten:
Pyth,
2726 BytesProbieren Sie es hier aus.
Beachten Sie, dass aufgrund eines Fehlers im Online-Compiler die Groß- und Kleinschreibung für leere Zeichenfolgen nur in der Befehlszeilenversion korrekt funktioniert, die gefunden werden kann hier.
Sie können den Fehler auch beheben, indem Sie eine neue Zeile als Eingabe für den Online-Compiler angeben.
Erläuterung:
quelle
z
schlägt keine Eingabe online fehl, so dass es definitiv ein Fehler im Interpreter ist.Python 3,
12412311196 BytesSucht nach Zeichenfolgen, sodass das erste Vorkommen von links dem ersten Vorkommen von rechts entspricht. Das
+1
in derrange
ist für den leeren String unterzubringen.Wenn nur Python überlappende Übereinstimmungen
.count()
gezählt hätte, wäre dies ein gutes Stück kürzer gewesen.quelle
Mathematica,
959479 BytesStringCases
holt mir alle möglichen Teilstrings, filtert dieTally
undCases
die, die mehrmals vorkommen undMinimalBy
findet die, die am kürzesten sind.quelle
&
am Ende des Codes kein Extra ?GolfScript, 44 Bytes
Übernimmt die Eingabe als Zeichenfolge für stdin und gibt sie in einer Double-Array-Syntax aus: z
[["b"] ["c"]]
.Online-DemoPräparation
Dies ist so angeordnet, dass für die leere Zeichenfolge (die ich als Testfall in die oben verlinkte Online-Demo aufgenommen habe) kein Sonderfall erforderlich ist.
quelle
CJam,
52 4340 BytesEingabe ist die Zeichenfolge ohne Anführungszeichen
Erklärung :
Beispiel:
Ausgabe
Probieren Sie es hier online aus
quelle
Scala, 120 Bytes
Ich habe mit 140 angefangen, was zumindest schon in einen Tweet passt.
quelle
(_)
als Identität stattl=>l
?list.groupBy(_)
das selbe wiex => list.groupBy(x)
. Ich habe keine Ahnung, warum sie es so implementiert haben.JavaScript (ES6), 109
110Bearbeiten Suche anstelle von indexOf, da die Eingabezeichenfolge alphanumerisch ist. Danke @IsmaelMiguel
Rekursive Funktion, die nach Teilzeichenfolgen sucht, die mit der Länge 1 beginnen und nach oben gehen.
Ungolfed und erklärte
Test In FireFox / Firebug - Konsole
Ausgabe
quelle
.search
statt.indexOf
und Sie sparen 2 Bytes.s.indexOf(a)+1
). Mit diesen Zeichen funktioniert es zwar nicht, aber Sie müssen sich keine Sorgen machen! Zitat der OP: "Input: An alphanumeric string s.
"Java, 168
176 233Hier ist ein ziemlich einfaches Beispiel für eine verschachtelte Schleife.
Oder etwas besser lesbar:
quelle
+++
um zu zeigen, ob dies hilfreich ist+ ++
oder++ +
wäre ... Und wenn Sie ein paar weitere Bytes sparen möchten, gibt es möglicherweise eine Möglichkeit, dies durch Initialisierenq=1
, Ersetzenq++
durchq=t
und Ersetzenl++<t&q<1
durch etwas Ähnliches zu erreichent>l+=q
. Möglicherweise müssen ein oder zwei andere Offsets angepasst werden, damit es funktioniert.+++
. Ich habe versucht, es zu optimieren (vor allemq
, was sich etwas verschwenderisch anfühlt), aber noch nichts Festes gefunden.+++
löst immer auf++ +
.Haskell,
169,162,155153151138120115Um es zu benutzen:
Welches gibt:
Btw. Ich hasse die letzte Zeile meines Codes (Wiederholung vonh y
). Jemand Hinweise, um es loszuwerden?quelle
g y=q(minimum.(map l)$y)$y
(sind die Klammernmap l
wirklich erforderlich?) Und dannf=g.concat.q 1.group.sort.concatMap inits.tails
?>>=
stattconcatMap
, dhf x=p$concat$q 1$group$sort$(tails x>>=inits)
spart 2 Bytes. Warum derData.Ord
Import?q
sind nicht erforderlich, da Sie schreiben könnenfilter$(==)k.l
, ebenso wie das letzte$
und die Leerzeichen vor demy
s inp
. Sie können die Semikolons auch nach dem Import entfernen (Data.Ord
scheint in der Tat unnötig zu sein).$
gefolgt von einem Nicht-Leerzeichen. Es wird einige Bytes rasieren, aber ist es in der Sprachspezifikation?J,
61584442403837 BytesHier ist eine Version aufgeteilt in die einzelnen Komponenten der Lösung:
x #/. y
berechnet für jedes einzelne Element,x
wie oft es in vorkommty
. Wenn wir dies als verwendeny #/. y
, erhalten wir diey
Anzahl für jedes einzelne Element . Zum Beispiela #/. a
füra =. 1 2 2 3 4 4
Renditen1 2 1 2
.1 = y
prüft, welche Gegenständey
gleich sind1
. Zum Beispiel1 = a #/. a
Erträge1 0 1 0
.u~
ist das Reflexiv eines monadischen Verbsu
. Dies istu~ y
dasselbe wiey u y
. So#/.~ y
ist das gleiche wie#/.~ y
. Wenn es auf ein dyadisches Verb angewendet wird,u~
ist es das Passiv vonu
. Das heißt,x u~ y
ist das gleiche wiey u x
. Diese werden an vielen anderen Stellen verwendet, die ich nicht ausdrücklich erwähne.~. y
ist die Noppe vony
, ein Vektor mit Duplikaten entfernt. Zum Beispiel~. a
Erträge1 2 3 4
.x # y
( copy ) wählt ausy
den Einträgen in den Indizes aus, in denen ax
enthalten ist1
.(1 = y #/. y) # (~. y)
entsteht ein Vektor aus diesen Elementen vony
denen nur einmal vorkommen. In der stillschweigenden Notation wird dieses Verb als geschrieben~. #~ 1 = #/.~
; Nennen wir diesen Satzunqs
für den Rest der Erklärung.x ]\ y
schafft einex
von1 + y - x
Array aller Infixe des Vektorsy
der Längex
. Zum Beispiel3 ]\ 'asdfasdfd
Erträge# y
ist die Bilanz dery
, dass die Anzahl der Elemente in isty
.u\ y
giltu
für jedes Präfix vony
. Übrigens,#\ y
einen Vektor von ganzen Zahlen von1
bis#y
.< y
setzty
in eine box. Dies ist erforderlich, da Arrays nicht uneinheitlich sein können und wir ein Array mit Suffixen unterschiedlicher Länge berechnen. Ein umrahmtes Array zählt als Skalar.Somit
(i. # y) <@:unqs@(]\) y
erzeugt einen Vektor von#y
geschachtelten Arrays der Länge k (für alle 0 ≤ k <#y
) Infixe von y , die genau einmal vorkommen. Die implizite Form dieses Verbs isti.@# <@unqs@(]\) ]
oderi.@# <@(~. #~ 1 = #/.~)@(]\) ]
wenn wir denunqs
Namen nicht verwenden . Nennen wir diesen Ausdruckallsbsq
für den Rest dieser Erklärung. Zum Beispielallsbsq 'asdfasdfd'
ergibt:(#@> y) # y
Nimmt aus dem Vektor der Boxed Arraysy
diejenigen, die nicht leer sind.{. y
Nimmt das erste Element des Vektorsy
.> y
Entfernt die Box vony
.> {. (#@> y) # y
ergibt sich das erste nicht leere Array ohne Box aus dem Vektor der Arrays mit Boxy
. Dieser Satz ist geschrieben>@{.@(#~ #@>)
in stillschweigender Notation geschrieben.Zum Schluss wird
[: >@{.@(#~ #@>) allsbsq
der vorherige Satz mit zusammengesetztallsbsq
, um eine Lösung für das vorliegende Problem zu finden. Hier ist die vollständige Phrase mit Leerzeichen:quelle
Haskell, 135 Bytes
quelle
PHP
171152134125http://3v4l.org/RaWTN
quelle
$j=0
. Du hast es vor dirsubstr($s,$j++,$i)
. Ohne zu definieren$j
, können Sie dies umschreibensubstr($s,0+$j++,$i)
und Sie sparen 2 Bytes. Warum das? Nun, das erste Mal$j
wird es seinnull
. Und Sie werden effektivnull
an übergebensubstr
, was meiner Meinung nach nicht gut funktionieren wird. Mit0+$j++
wird die konvertierennull
zu0
. Wenn Sie sehen, dass es nicht benötigt wird, fahren Sie ohne es fort und entfernen Sie einfach das$j=0
Teil.$j
nicht für jede Iteration derwhile()
Schleife gelöscht und neu initialisiert . Während es also beim ersten Mal null ist (und daher0
durch einen$j++
Aufruf konvertiert wird ), bleibt es bei zukünftigen Iterationen der äußeren Schleife bei dem Wert, der es zuvor war. Es ist nicht so sehr das Initialisieren als das Zurücksetzen. Vielen Dank für den Vorschlag :-)function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)($b=substr($s,$j++,$i))&(strpos($s,$b)==strrpos($s,$b)&&($a[]=$b));return$a;}
Änderungen: Entfernte ALL Ihre||1
, benutzte die bitweise&
(AND
) anstelle&&
an einer Stelle, verschob den$j<$l&&[...]
Teil außerhalb derfor
(spart 2 Bytes) und entfernte einige unnötige Klammern.function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)strpos($s,$b=substr($s,$j++,$i))==strrpos($s,$b)&&($a[]=$b);return$a;}
vorherigen Code vorgenommene Änderungen: Bewegen Sie den$b=substr($s,$j++,$i)
instrpos($s,$b)
Making Itstrpos($s,$b=substr($s,$j++,$i))
, entfernen Sie unnötigere Klammern und entfernen Sie das nicht benötigte&
.substr($s,$j++,$i)
zurück,""
wenn$j
die Länge der Zeichenfolge erreicht ist, undfalse
danach, so dass die Zuweisung auch als Schleifenbedingungsunterbrechung dienen kann. Dann$l
bleibt nur noch eine Verwendung übrig, sodass auch diese konsolidiert werden kann.Groovy (Java-Regex für Oracle-Implementierung), 124
Getestet auf Groovy 2.4 + Oracle JRE 1.7. Der reguläre Ausdruck sollte für Java 6 bis Java 8 funktionieren, da der Fehler, durch den der obige Code funktioniert, nicht behoben ist. Nicht sicher für frühere Versionen, da es in Java 5 einen Look-Behind-Fehler gibt, der in Java 6 behoben wurde.
Der reguläre Ausdruck findet an jeder Position in der Eingabezeichenfolge die kürzeste Zeichenfolge, die an keiner anderen Stelle eine doppelte Teilzeichenfolge enthält. Der Code außerhalb kümmert sich um die Filterung.
(?=...)
.(.*?)
sucht von der kürzesten Teilzeichenfolge(?=(.*))
erfasst den Rest der Zeichenfolge, um die aktuelle Position zu markieren.(?<=^(?!.*\1(?!\2$)).*)
ist eine Emulation von Look-Behind mit variabler Länge, die den Implementierungsfehler ausnutzt, der es ermöglicht(?<=.*)
, die Längenprüfung zu bestehen.(?!.*\1(?!\2$))
Überprüft einfach, ob Sie den gleichen Teilstring an einer anderen Stelle finden. Das(?!\2$)
verwirft die ursprüngliche Position, an der die Teilzeichenfolge übereinstimmt.Das Limit des äußeren Look-Around-Konstrukts gilt nicht für das verschachtelte Look-Around-Konstrukt. Daher
(?!.*\1(?!\2$))
prüft die verschachtelte negative Vorausschau tatsächlich die gesamte Zeichenfolge, nicht nur bis zur rechten Begrenzung der Rückschau.quelle
Rebol, 136 Bytes
Ungolfed:
Anwendungsbeispiel:
NB. Ich nehme an, der Kern des Codes ist, wie das
find
Teil funktioniert. Hoffentlich wird dies helfen zu erklären ...quelle
Haskell, 119
quelle
q = length
irgendwo platzieren und verwendenq
, rasiert sich einige BytesBrachylog , 10 Bytes
Probieren Sie es online!
Obwohl
ᵍ
nicht automatisch nach dem Wert sortiert wird, nach dem es gruppiert, sondern nach dem ersten Vorkommen jedes Werts, werden die ersten Vorkommen jeder Länge in absteigender Reihenfolge sortiert. Ich bin nicht zu 100% sicher, dass die Eindeutigkeitsfilterung dies nicht durcheinander bringen kann, aber ich habe noch keinen Testfall gefunden, bei dem dies noch fehlschlägt.quelle
05AB1E , 10 Bytes
Gibt für eine leere Zeichenfolge nichts aus.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Dies nutzt den Vorteil, dass 05AB1E nur den
1
Wahrheitswert und alles andere den Falschwert hat. Es ist immer gewährleistet, dass die kürzeste eindeutige Teilzeichenfolge genau einmal für alle möglichen Eingabezeichenfolgen auftritt. (Für eine Eingabezeichenfolge, die nur die gleichen Zeichen enthält (dhaaaaa
), kommen die Eingabezeichenfolgen selbst als Teilzeichenfolge nur einmal vor. Das Ergebnis ist also["aaaaa"]
. Für eine Eingabezeichenfolge mit sich wiederholendem Muster (dh"abcabc"
) gibt es immer noch eindeutige Teilzeichenfolgen, die nur einmal vorkommen (["abca","abcab","abcabc","bca","bcab","bcabc","ca","cab","cabc"]
), so wird dies ergeben["ca"]
.)quelle
Python 2, 150
quelle
""
, aber Sie drucken nichts.Perl 5
-a
,11487 BytesProbieren Sie es online!
Alte Methode: 114 Bytes
quelle