Privilegierte Saiten
Der Satz privilegierter Zeichenfolgen wird wie folgt rekursiv definiert.
- Alle Zeichenfolgen der Länge 0 oder 1 sind privilegiert.
- Eine Zeichenfolge mit
s
einer Länge von mindestens 2 ist privilegiert, wenn eine kürzere privilegierte Zeichenfolge vorhanden ist t
, die s
genau zweimal vorkommt, einmal als Präfix und einmal als Suffix. Überlappende Vorkommen werden als unterschiedlich gezählt.
Zum Beispiel sind die Saiten aa
, aaa
und aba
sind privilegiert, aber ab
und aab
sind es nicht.
Eingang
Eine alphanumerische Zeichenfolge.
Ausgabe
Alle privilegierten Teilzeichenfolgen der Eingabezeichenfolge, jeweils genau einmal, in beliebiger Reihenfolge. Die Ausgabe kann im nativen Array-Format Ihrer Sprache (oder dem nächstgelegenen Äquivalent) erfolgen oder eine Teilzeichenfolge pro Zeile gedruckt werden.
Lustige Tatsache
Die Anzahl der Zeichenfolgen in der Ausgabe ist immer genau length(s) + 1
( Quelle ).
Regeln
Sowohl Funktionen als auch vollständige Programme sind zulässig. Die niedrigste Byteanzahl gewinnt und Standardschlupflöcher sind nicht zulässig.
Testfälle
Diese werden zuerst nach Länge und dann alphabetisch sortiert, aber jede Reihenfolge ist akzeptabel.
"" -> [""]
"a" -> ["","a"]
"abc" -> ["","a","b","c"]
"abcaaabccaba" -> ["","a","b","c","aa","cc","aaa","aba","abca","abcca","bccab","bcaaab","caaabc"]
"1010010110101010001101" -> ["","0","1","00","11","000","010","101","0110","1001","01010","10001","10101","010010","101101","0101010","1010101","01011010","10100101","1010001101","1101010100011","00101101010100","011010101000110"]
"CapsAndDigits111" -> ["","1","A","C","D","a","d","g","i","n","p","s","t","11","111","igi","sAndDigits"]
Bestenliste
Hier ist eine Rangliste nach Sprachen, mit freundlicher Genehmigung von Martin Büttner .
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift unter Verwendung der folgenden Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihrer Einreichung? 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
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);i=i.replace("{{PLACE}}",t++ +".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45497;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*((?:[^,\s]|\s+[^-,\s])*)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
t
darf kein einzelnes Symbol sein. Beispielsweiseaaa
handelt es sich um eine privilegierte Zeichenfolge, da sieaa
ein Präfix und ein Suffix enthält und nur zweimal vorkommt. Ich habe es als Beispiel hinzugefügt.Antworten:
.NET Regex, 31 Byte
Die Zeichenfolgen werden
\1
in jedem Spiel erfasst .Erklärung
quelle
CJam,
33453938 BytesAngenommen, es wird ohne nachgestellte Zeilenumbruch gedruckt. Der nachfolgende Zeilenumbruch bedeutet also einen leeren Teilstring ...
Erklärung
quelle
Python 2,
179173164 BytesDerzeit ziemlich sperrig - ich frage mich, ob es möglich ist, den Check und die Teilstring-Generation irgendwie zu kombinieren ...
Das Lambda
f
ist im Grunde eineis_privileged()
Funktion, die die drei Bedingungen zu einem Vergleich kombiniert (Teilzeichenfolge ist privilegiert, erscheint zweimal, ist Suffix und Präfix).Erweitert:
quelle
Python 3,
131129 BytesDadurch werden rekursiv privilegierte Teilzeichenfolgen gefunden, beginnend mit den kürzesten und dem Hinzufügen zu einer Menge. Die Menge wird dann verwendet, um zu bestimmen, ob längere Teilzeichenfolgen privilegiert sind.
Leider handelt es sich um eine Einwegfunktion. Hier ist ein entsprechendes vollständiges Programm ( 145 Bytes ):
quelle
Python,
152147126116 BytesWie im verlinkten Artikel gezeigt, gibt es für jedes Präfix einer Zeichenfolge ein eindeutiges privilegiertes Suffix. Dieses Suffix hat die Form,
p·u·p
in derp
sich die längste zuvor gefundene privilegierte Teilzeichenfolge befindet, die ein Suffix des Präfixes ist. (Die Suche ist das Argument fürmax
, das tatsächlich die Länge von findet,p
weil es einfacher warmax
alslongest
.) Sobaldp
es gefunden wurde, wird das Suffix selbst gebildet, indem nach dem vorletzten Vorkommen vonp
im Präfix gesucht wird , wobei dierfind
Einschränkung verwendet wird, das nicht zu verwenden letztes Zeichen. Wir wissen, dass dies funktionieren wird, dap
es sich um ein zuvor gefundenes Suffix handelt. (Ein strengerer Beweis des Algorithmus kann aus dem Papier abgeleitet werden.)Ich bin mir ziemlich sicher, dass dies in linearer Zeit unter Verwendung eines Suffixbaums anstelle des oben verwendeten
quadratischenkubischen Algorithmus implementiert werden könnte , aber das obige Programm ist sicherlich in allen Testfällen schnell genug und verarbeitet eine Zeichenfolge von 2000a
s in a etwas weniger als eine Sekunde auf meinem (nicht übermächtigen) Laptop.quelle
Ruby, 87
Ich habe das Gefühl, dass es hier irgendwo eine rekursive Regex-Lösung gibt, aber ich bin nicht sehr gut darin, also hier eine sehr langsame und lange rekursive Funktion.
Der Algorithmus ist ungefähr der gleiche wie der von grc und wird langsamer (aber kürzer), indem keine einzelnen Sonderzeichen verwendet werden. Eine Zeichenfolge mit einem Zeichen kann als privilegiert angesehen werden, da die leere Zeichenfolge als Präfix, Suffix und nirgendwo anders verwendet wird.
Der andere interessante Trick ist die Verwendung
$'
einer von Perl geerbten magischen Variablen, die den Wert der Zeichenfolge nach der letzten Übereinstimmung mit regulären Ausdrücken annimmt. Dies gibt mir eine kurze Möglichkeit, das erste Zeichen aus einer Zeichenfolge herauszuschneiden, obwohl ich fast alle diese Zeichen erhalte, indem ich ess[/./]
anstelle von einrichten musss[0]
. Ich verwende es erneut, um zu überprüfen, ob die zweite Teilzeichenfolgenübereinstimmung am Ende der Zeichenfolge erfolgt.quelle
J, 92 Bytes
Dauert bei der längsten Eingabe einige Sekunden.
p
prüft, ob eine Zeichenfolge privilegiert ist (mit Rekursion),s
prüft jeden Teilstring mitp
.Tests:
quelle
JavaScript (ES6) 195
Die P-Funktion überprüft rekursiv, ob eine Zeichenfolge privilegiert ist.
Die F-Funktion versucht jeden Teilstring, der in der angegebenen Zeichenfolge enthalten ist. Gefundene Zeichenfolgen werden als Schlüssel einer Hashtabelle gespeichert, um Duplikate zu vermeiden.
Zuletzt werden die Schlüssel als Ausgabe zurückgegeben.
quelle