Zielsetzung
Schreiben Sie eine Routine, die eine Zeichenfolge aus druckbaren ASCII-Zeichen ( s) akzeptiert und eine Zeichenfolge mit denselben Zeichen wie ( s) zurückgibt , die neu angeordnet wurde, sodass keine Teilzeichenfolge mit zwei Zeichen mehr als einmal vorkommt. Das Programm muss alle Benchmark-Zeichenfolgen (siehe unten) in jeweils weniger als einer Minute auf einem modernen Computer verarbeiten . Ich werde auch einen besonderen Bonus von 50 Wiederholungen für die Antwort mit der niedrigsten Punktzahl vergeben, die eine gültige 30-Zeichen-Zeichenfolge in weniger als einer Minute verarbeitet.
Bei einer gegebenen Eingabe Mississippi
wäre dies beispielsweise eine gültige Ausgabe issiMspiips
(es werden keine Teilzeichenfolgen mit zwei Zeichen zweimal angezeigt ), während dies eine ungültige Ausgabe wäre ipMsispiiss
(da die Teilzeichenfolge is
zweimal angezeigt wird).
Die Routine kann die Form haben:
- ein vollständiges Programm, das von
stdin
(oder einer gleichwertigen) oder der Befehlszeile gelesen und anstdout
(oder einer gleichwertigen) Stelle ausgegeben wird - Eine Funktion, die ein einzelnes Zeichenfolgenargument akzeptiert und eine Zeichenfolge zurückgibt
Sie können davon ausgehen, dass die Eingabezeichenfolge immer mindestens eine gültige Ausgabe zulässt.
Die Herausforderung
Ihre Routine muss 5 oder mehr Codezeilen enthalten, die durch Zeilenumbrüche voneinander getrennt sind. Leere Zeilen (einschließlich Zeilen, die nur Leerzeichen enthalten) werden in allen Kontexten ignoriert und zählen nicht zur Gesamtanzahl der Zeilen.
Das Vertauschen von zwei beliebigen Zeilen in Ihrem Quellcode muss einen schwerwiegenden Fehler verursachen. Mit "schwerwiegender Fehler" wird auf eine der folgenden Bedingungen verwiesen:
- Der Quellcode kann nicht kompiliert werden, und der Compiler / Interpreter meldet einen schwerwiegenden Fehler
- Die Routine wird mit einem schwerwiegenden Laufzeitfehler oder einer nicht behandelten Laufzeitausnahme abgebrochen
- Die Routine wird zu einem abrupten, abnormalen Programmabbruch gezwungen, der bis auf eine mögliche Fehlermeldung und / oder einen Stapelspeicherauszug keinerlei Ausgabe erzeugt
Alternativ können zusammenhängende Codeblöcke, die keine Zeilenumbrüche enthalten, anstelle von Zeilen verwendet werden. Diese Blöcke sollten in der Quelldatei jeweils in einer eigenen Zeile angezeigt werden, mit der Maßgabe, dass Zeilenumbrüche entfernt werden, bevor der Quellcode kompiliert / interpretiert wird.
Zum Beispiel der Code
aaaa
bbbb
cccc
würde kondensieren
aaaabbbbcccc
bevor sie ausgewertet werden.
In diesem Modus gilt die schwerwiegende Fehlerbedingung für das Austauschen von zwei Codeblöcken (und damit für das Austauschen von Zeilen im Quellcode, bevor Zeilenumbrüche entfernt werden). Daher wird in dem obigen Beispiel die Routinen aaaaccccbbbb
, bbbbaaaacccc
und ccccbbbbaaaa
müssen alle fatalen Fehler produzieren, entweder in compiletime oder Laufzeit.
Bei Einsendungen, die diesen alternativen Modus verwenden, muss die Verwendung deklariert werden.
Wertung
Sei n die Anzahl der nicht leeren Textzeilen in Ihrer Quelldatei, mit n ≥ 5. Sei c die Anzahl der Bytes, die die längste Textzeile (nach Bytelänge) in Ihrer Quelldatei enthält, ohne nachfolgende Zeilenumbrüche.
Die Punktzahl einer Einreichung ergibt sich aus c ( n + 10).
Die Einsendung mit der niedrigsten Punktzahl ist der Gewinner.
Viel Glück. ;)
Benchmark-Strings
Abracadabra Alacazam
Is Miss. Mississauga Missing?
Ask Alaska's Alaskans
GGGGAAAATTTTCCCCgggaaatttccc
A Man A Plan A Canal Panama
Mspiisiipss
gültig, da die einzige Wiederholung die ist, in ii
der nicht vorkommt Mississippi
?
CooliO
OutputoOoCli
?