Ziele: Einen String ausgeben, der jede positive ganze Zahl enthält, die genau unter 1000 liegt.
Die naheliegende Antwort wäre, jeden von ihnen zu verketten, und das würde eine Zeichenfolge von 2890 Zeichen ergeben (danke manatwork). Um diese Art der einfachen Antwort zu vermeiden, muss die Länge der Zeichenfolge unter 1500 Zeichen liegen. Hier ist ein einfacher Java-Code, der einen String mit 1200 Zeichen ausgibt.
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
import static org.junit.Assert.assertTrue;
/**
* Created with IntelliJ IDEA.
* User: fab
* Date: 05/11/13
* Time: 09:53
* To change this template use File | Settings | File Templates.
*/
public class AStringToContainThemAll {
@Test
public void testsubStrings() throws Exception {
String a = generateNewString();
boolean cool = true;
for (int i = 0; i < 1000; i++) {
assertTrue(a.contains(Integer.toString(i)));
}
}
private String generateNewString() {
List<Integer> myTree = new ArrayList<Integer>();
String finalString = new String("100");
for (int i = 10; i < 1000; i++) {
myTree.add(i);
}
while (myTree.size() > 0) {
if (finalString.contains(Integer.toString(myTree.get(0)))) {
myTree.remove(0);
} else {
String substringLong = finalString.substring(finalString.length() - 2, finalString.length());
boolean found = false;
loop:
for (Integer integer : myTree) {
if (integer.toString().startsWith(substringLong) && !finalString.contains(integer.toString())) {
finalString = finalString.concat(integer.toString().substring(2, 3));
myTree.remove(integer);
found = true;
break loop;
}
}
if(! found){
finalString = finalString.concat(myTree.get(0).toString());
myTree.remove(0);
}
}
}
return finalString;
}
}
Kürzester Code-Gewinn, Bonuspunkt für die kürzeste Saite!
code-golf
string
kolmogorov-complexity
Fabinout
quelle
quelle
B(10, 3)
, aber da Sie keinen zyklischen Zeilenumbruch zulassen, müssen Sie die ersten beiden Zeichen wiederholen.Antworten:
Golfscript - 13 Bytes, 1315 Ausgabe
Das Obige wählt die Zahlen von 0 bis 990 aus, deren erste Ziffer die größte Ziffer der Zahl ist, dh die letzte Ziffer der sortierten Zeichenfolgendarstellung ist lexikografisch kleiner als die Zeichenfolge selbst. Die Logik ist die folgende:
Bei einer 3-stelligen Zahl abc kann die Zahl übersprungen werden , wenn a nicht die größte Ziffer der Zahl ist, da sie später in einem von zwei Fällen behandelt wird:
b <c (z . B. 123 )
Da c die größte Ziffer ist, wird die Nummer cab nicht übersprungen. In diesem Beispielwird weder 312 übersprungen noch der nächste Wert 313 , der, wenn er verkettet ist ( 312, 313 ), 123 enthält.
b ≥ c (zB 132 )
Da b die größte Ziffer ist, wird die Zahl bca nicht übersprungen. In diesem Beispielwird weder 321 übersprungen noch der nächste Wert 322 , der, wenn er verkettet ist ( 321, 322 ), 132 enthält. Ist b = c (z. B. 122 ), gilt dies auch. Der Wert bca wird nicht wie zuvor übersprungen, und da a notwendigerweise kleiner als b ist , wird auch bc <a + 1> nicht übersprungen. In diesem Beispielenthält 221 222 122 .
Da der obige Code nicht nur die letzte, sondern die dritte Ziffer testet, sind alle Werte von 0 bis 99 im Ergebnis enthalten. Die Werte von 1 bis 99 können jedoch übersprungen werden, da, wenn jede dreistellige Folge vorhanden ist, auch jede ein- und zweistellige Folge vorhanden sein muss.
Die Werte von 991-999 können ebenfalls übersprungen werden, da sie von ( 909 910 , 919 920 , ... 989 990 ) generiert werden .
Bei einer Ausgabe von 1315 Byte entspricht dies der Spezifikation des Problems von weniger als 1500.
Ausgabe:
Variante # 1
14 Bytes, 1233 Ausgabe
Durch die strikte Auswahl der letzten statt der dritten Ziffer für den Vergleich werden viele der unnötigen Werte unter 100 eliminiert, wodurch die resultierende Zeichenfolge verkürzt wird.
Variante # 2
16 Bytes, 1127 Ausgabe
Durch vorheriges Abhebeln aller Werte unter 99 kann die resultierende Zeichenfolge noch weiter gekürzt werden.
Golfscript - 19 Bytes, 1016 Ausgabe
Die obigen Werte reichen von 99 bis 909 und addieren jeden Wert, der noch nicht erschienen ist ( 909 wäre normalerweise der letzte Wert, der auf diese Weise hinzugefügt wird). Das Verschieben von 99 nach vorne ist eine Optimierung, um zu vermeiden, dass 910 nach hinten benötigt wird.
Ausgabe:
Golfscript 26 Bytes, 999 Ausgabe
Beachten Sie, dass die von der vorherigen Lösung erzeugte 1016- Zeichenfolge nahezu optimal ist, mit Ausnahme von zwei zusätzlichen Ziffern für jedes Vielfache von 111 (dh
11111
anstelle von111
,22222
anstelle von222
usw.). Die Lösung kann optimiert werden, indem diese zusätzlichen Ziffern entfernt werden (statt drei nur eine Ziffer bei jedem dieser Werte) und909
nach vorne gedreht wird, um ein zu entfernen9
(dies unterscheidet sich von den vorherigen Versionen, die9100
stattdessen nach hinten verschoben wurden) ).Abgerollt und kommentiert:
Die Logik zur Auswahl der angehängten Zeichen besteht aus drei Fällen:
Der Wert aus der ersten Prüfung ist 1 und aus der zweiten -1 .
Das Slice beginnt ab Index 0 ; Es wird die gesamte Zeichenfolge zurückgegeben.
Der Wert aus der ersten Prüfung ist 1 und aus der zweiten etwas ≥ 2 .
Die Scheibe beginnt ab Index ≥ 3 zu starren; Es wird eine leere Zeichenfolge zurückgegeben.
Der Wert aus der ersten Prüfung ist 0 und aus der zweiten -1 .
Das Slice beginnt mit Index -1 . es wird nur das letzte Zeichen zurückgegeben.
Die Summe der Logik ist, dass ein noch nicht erschienener Wert vollständig angehängt wird - es sei denn, es handelt sich um ein Vielfaches von 111. In diesem Fall wird nur ein Zeichen angehängt. Alle anderen Werte werden ignoriert.
Beachten Sie, dass sich die erzeugte Saite von der optimalen Saite unterscheidet, die von Peter Taylors Antwort erzeugt wurde .
Geschichte:
Ausgabe:
quelle
GolfScript (
35 3126 Zeichen)Ausgabe ist
(1020 Zeichen) Dies ist eine Variante des Ansatzes der Lyndon-Wortverkettung: Anstatt die primitiven 1-Zeichen-Wörter zu verwenden, werden für kürzeren Code ein Vielfaches von 111 verwendet, diese Zahlen jedoch wiederholt. und anstatt minimale Elemente der Konjugationsgruppen zu verwenden, werden maximale Elemente verwendet, da dies die Schleifen verkürzt.
Bei 40 Zeichen (kann wahrscheinlich noch verbessert werden) wird eine optimale Zeichenfolge mit einer Länge von 999 Zeichen generiert:
Der Versuch, dies zu tun, führt zu Problemen beim Weglassen der Vielfachen von 111.
Um zu sehen, dass 999 die optimale Länge ist (da meine obigen kurzen Kommentare nicht alle überzeugen), gehen Sie von der vollständigen de Bruijn-Sequenz aus, die (als zyklische Zeichenfolge betrachtet) jede dreistellige Folge von Zeichen von 0 bis 9 enthält es gibt 1000 von ihnen, es muss mindestens 1000 Zeichen lang sein; dass es lange genau 1000 Zeichen werden in der Regel durch einen Eulersche Fuß auf einem Graph , dessen Knoten sind zweistellige Sequenzen nachgewiesen wird ,
xy
mit 10 Kanten, jeweils markiert mit einer Zifferz
, das nehmenxy
zuyz
.Wir brauchen keine Sequenzen, die beginnen
0
, also können wir bei einer de Bruijn-Sequenz drehen, um sie000
am Ende zu setzen . Dann brauchen wir keine der Sequenzen, die sich zum Anfang drehen, aber wir brauchen zwei der0
s, um die Sequenz mit der vorhergehenden Ziffer zu beenden000
, sodass wir eine von ihnen löschen können, um eine Zeichenfolge mit 999 Zeichen zu erhalten. Jeder verbleibende0
wird in einer Zahl verwendet, die nicht mit beginnt0
.quelle
10,:^{:x^>{x.@:&<+^>{x&@}/}/}/0.
Abweichend davon, was für echte Lyndon-Wörter10,:^{:x^>{x.@:&<+^>{.x>{x&@}*}/}/}%3>0.
(40 Zeichen) für die optimale Zeichenfolge ergibt .GolfScript, 17 Zeichen
Einfacher Ansatz, um jede Zahl zu addieren, wenn sie nicht bereits in der Zeichenfolge vorhanden ist (Hinweis: 999 ist nicht aktiviert oder hinzugefügt, aber bereits in der Ausgabe enthalten).
Die Ausgabe umfasst 1133 Zeichen:
quelle
Ich habe keinen Code, aber ich dachte, jemand würde diesen intuitiven Beweis dafür zu schätzen wissen, dass 999 Zeichen die untere Grenze für die Länge der Ausgabe sind:
Erstens ist jede ein- und zweistellige Zahl Teil einer dreistelligen Zahl. Ignorieren Sie daher alle Zahlen unter 100. 100-999 einschließlich sind 900 dreistellige Zahlen.
Der beste Weg, um das Problem zu lösen, ist, wenn jeder Charakter so oft wie möglich verwendet wird. Das heißt, die Zahlen überlappen sich so weit wie möglich:
Die erste Zahl fügt daher 3 Zeichen hinzu, und jede nachfolgende Zahl fügt 1 Zeichen hinzu. Das ergibt 3 + 899 = 902 Zeichen als Untergrenze.
Wenn es jedoch eine Null gibt, können wir sie nicht verwenden, um eine neue dreistellige Zahl zu beginnen. Wir können es jedoch in der Mitte einer anderen dreistelligen Zahl wiederverwenden, solange keine weitere Null folgt:
Aber:
Daher erweitert jede in der Ausgabe auftauchende Null die Ausgabe um 1 Zeichen - mit Ausnahme der letzten beiden Zeichen, die Null sein können, da sie keine weiteren Zahlen überlappen:
Es gibt 81 Zahlen mit genau einer Null in der Mitte (? 0?), 81 mit genau einer Null am Ende (?? 0) und 9 mit zwei Nullen (? 00).
Jede ?? 0-Zahl kann eine Null mit einer ?? 0? nummer oder eine? 00 nummer, aber nicht beides. 0 & le; und? 00 kann niemals Nullen gemeinsam nutzen, daher müssen mindestens 81 + 9 * 2 Nullen in der Ausgabe vorhanden sein.
Dies ergibt eine Untergrenze von 3 + 899 + 81 + 9 * 2 - 2 = 999 Zeichen.
Entschuldigung, wenn dies als nicht thematisch angesehen wird, aber es war zu lang, um in einen Kommentar zu passen.
quelle
Perl,
37 34 3332 (11361132 Zeichen)für $ @ (1..999) {$ _. = $ @ if! / $ @ /} printfür $ i (1..999) {$ _. = $ i if! / $ i /} printfür (1..1e3) {$ s. = $ _ if $ s! ~ / $ _ /} print $ sAusgänge:
Kürzere Zeichenfolge:
38 3734 (1020 Zeichen):für ($ @ = 1e3; $ @ -;) {$ _. = $ @ if! / $ @ /} printfür ($ i = 1e3; $ i -;) {$ _. = $ i if! / $ i /} printAusgänge:
Immer noch nicht zufrieden mit der Vervielfältigung vor allem des 99999 zu Beginn! Ich denke, dass viel mehr Prüfungen viel mehr Code erzeugen würden ...
Bearbeiten: Vorschlag von @Peter Taylor hinzugefügt
Edit 2: Einige tolle Vorschläge von @primo! Danke
quelle
$_.=$@if!/$@/
können Sie die Zeichenfolge wiederholen$_.=$@x!/$@/
. Dasfor
kann durch einwhile
als Anweisungsmodifikator verwendetes Modulo ersetzt werden:...while$@=--$@%1e3
APL (20, Ausgabe: 1020)
Erläuterung:
{∨/⍺⍷⍵:⍵⋄⍵,⍺}
: wenn⍺
ist ein Teilstring von⍵
, return⍵
, sonst return⍵,⍺
/
: reduzieren über⍕¨
: die Zeichenfolgendarstellung von jedem von⍳999
: die ganzen Zahlen von1
bis999
.Ausgabe:
APL (41, Ausgabe: 999)
Erläuterung:
⌽⍕¨100+⍳898
:('999' '998' ... '101')
(in umgekehrter Reihenfolge, da die Reduktion in der APL von rechts nach links verläuft, dhF/a b c ≡ a F (b F c)
)/
: reduzieren⍵,⍺⍴⍨
: rechtes Argument, gefolgt von den erstenN
Zeichen des linken Arguments, wobeiN
gilt:3×~∨/⍺⍷⍵
:3
if⍺
ist kein Teilstring von⍵
, sonst0
(1=⍴∪⍺)
:1
wenn⍺
nur ein einziges Zeichen, sonst0
∨
: größter gemeinsamer Teiler der beiden vorherigen Werte, also:1
wenn⍺
nicht bereits vorhanden ist⍵
und nur ein eindeutiges Zeichen hat,3
wenn⍺
nicht bereits vorhanden ist,⍵
aber mehr als ein eindeutiges Zeichen hat,0
andernfalls'0',⍨
: füge am Ende des Ergebnisses eine Null hinzuAusgabe:
quelle
Ruby:
5046 Zeichen (Ausgabe von 1020 Zeichen)Probelauf:
Testlauf:
Ruby:
10297 Zeichen (999 Zeichen werden ausgegeben)Probelauf:
Testlauf:
quelle
(?0..?9*3).map{|i|$/[i]||($><<i;$/+=i)}
vielleicht?JavaScript, 39
1020 Zeichen Ausgabe:
Nachprüfung:
for(i=0;i<1000;i++)console.assert(k.indexOf(i)>=0)
quelle
Mathematica (
6264 Zeichen, 1002 Ausgabe)Da dies eine native Funktion nutzt, schätze ich umso mehr die Schönheit kürzerer Lösungen von Grund auf. Die Ausgabe ist 1002 Zeichen lang.
quelle
DeBruijnSequence
zyklischer Zeilenumbruch vorausgesetzt. Das Voranstellen von "79", den letzten beiden Ziffern, löst das Problem.Mathematica, 51 Zeichen
Ausgabe (1155 Zeichen):
quelle
{i, j, k}
demi
von 0 bis 9 ist undj
,k
sind kleiner alsi
. Dann konvertiert es die Liste in eine Zeichenfolge.Python - 53
631134 AusgabeDas ist ziemlich brachial, aber es ist gültig. Ja, es hat eine führende Null, aber es speichert zwei Zeichen, indem es keine hat
range(1,1000)
.Das obige wirft eine
DeprecationWarning
Überschreitung der Verwendung von 1e3 in demrange()
Aufruf, aber es speichert ein Zeichen über 1000.Es gibt auch eine etwas optimalere Längenausgabeversion, indem die Zeichenfolge auf Kosten von umgekehrt wird
65 Zeichen (danke an res und filmor für die Tipps) :Python - 58, 1021 Ausgabe
quelle
for i in range(999):s+=`i`*(not`i`in s)
range(999,99,-1)
anstelle von um ein Zeichen verkürzenrange(1000)[::-1]
.str(i)*(str(i)not in s)
ist ein bisschen kürzer alsi=str(i);s+=[i,''][i in s]
;)1e3
anstelle von1000
K, 33
Grundsätzlich dasselbe wie die Howards-Lösung - 1133 Zeichen.
quelle
Java -
12698 Zeichen (Java 6)Ausgabe (1020 Zeichen):
Kann eine gute Saitenlänge erreichen (laut Peter Taylor , aber später sagte er 999 war optimal), indem man ein paar Zeichen hinzufügt (+20 Zeichen für
147118):Ausgabe (1002 Zeichen):
Edit : Danke an Fabinout für den Hinweis, dass Java 6 28 Zeichen einsparen kann.
quelle
public static void main(String[]a)
? (das würde meinen Code von...public static void main(String[]c){...
auf ändern...static{...
)Windows PowerShell - 40, 1020 Ausgabe
Ausgabe:
quelle
Haskell, 75 Bytes - 1002 Ausgabe
Ein Siebansatz, der eine minimale Lösung ergibt.
Beachten Sie, dass diese Lösung unpraktisch langsam ist.
quelle
Data.List
forisInfixOf
einbinden, können aber dennoch 2 Bytes einsparen, indem Sie etwas mehr Golf spielen: 1) Hardcoden = 1000
2) Useall
overand
und eine pointfreie Version des Prädikats 3) Use(!!0)
overhead
4) Use list- understand über die Kombination vonmap
&filter
5) Verwendung(<$>)
übermap
:[s|s<-show<$>[1..],all((`isInfixOf`s).show)[1..1000]]!!0
Powershell, 36 Bytes, 1020 Ausgabe
Ausgabe:
Alternative, 69 Bytes, 1000 Ausgabe
Ausgabe:
Alternative,
8273 Bytes, 999 Ausgabe (Minimum)Dies ist ein vereinfachter Algorithmus von Generiere den kürzesten De Bruijn, der für Konstanten angepasst ist: alphabet =
9876543210
und length =3
Ausgabe:
Testskript:
quelle
05AB1E , 9 Bytes und 1109 Zeichen
Ausgänge:
Probieren Sie es online aus oder überprüfen Sie, ob es alle Zahlen unter 1000 enthält .
Erläuterung:
quelle
Pyke, 13 Bytes (nicht konkurrierend), Stringlänge 1133
Pyke ist neuer als die Herausforderung und daher nicht wettbewerbsfähig.
Probieren Sie es hier aus!
quelle
PHP,
4844 BytesVielen Dank an @primo, der mich daran erinnert hat
ereg
.oder
Ausgabe: 1020 Zeichen. benötigt PHP <7
PHP 7, 48 Bytes:
ereg
wurde in PHP 7 entferntWenn das zweite Argument für
strstr
(oderstrpos
andere Zeichenfolgensuchfunktionen) keine Zeichenfolge ist, wird es als ASCII-Code verwendet, sodass eine Umwandlung in eine Zeichenfolge$i
erforderlich ist.quelle
ereg($i,$s)
für 4 (ich würde auch<?
in die Byteanzahl einschließen ).ereg
wurde vermutlich entfernt, weil der Funktionsname zu kurz ist und / oder nicht genügend Unterstriche enthält. Dassplit
wurde auch beseitigt, ist besonders genial.ereg
wurde entfernt, da POSIX nur einen Teil der Möglichkeiten von PCRE enthält; und wahrscheinlich wollten sie nicht zwei verschiedene bibliotheken unterhalten. Ich werde fragen, ob ich jemals wieder Rasmus Lerdorf treffen sollte.split
wurde entfernt, ist aberjoin
geblieben (wahrscheinlich, weil es "nur" ein Alias ist). Entschuldigung für die Pedanterie; aber ich kenne leute, die ironie nicht erkennen können.Groovy, 49 Zeichen / Byte
Ich war mir nicht sicher, ob ich dies als eine Funktion tun sollte, die eine Zeichenfolgenvariable zurückgibt, oder ob ich das Ergebnis ausdrucken sollte. Bei Verwendung des Regex-Matchers wurden 2 Bytes gespeichert, bei Verwendung des ternären Operators anstelle von "if" wurde ein anderes Byte gespeichert. Die Ausgabezeichenfolge besteht aus 1133 Zeichen.
Ausgabe:
quelle
Game Maker Language, 1014 - String 1000
show_message(909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900)
Ebenfalls:
Ruby, 1003 - String 1000
p'909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900'
quelle
ruby
Code kannp
anstelle derputs
Übergabe einen numerischen Parameter verwenden.