Betrachten Sie diese fünf ASCII-Meerestiere:
- Standardfisch:
><>
oder<><
- Schneller Fisch:
>><>
oder<><<
- Starker Fisch:
><>>
oder<<><
- Dehnbarer Fisch:
><<<>
oder<>>><
- Krabbe:
,<..>,
Schreiben Sie ein Programm, das eine beliebige Zeichenfolge akzeptiert <>,.
. Wenn es eine Möglichkeit gibt, die gesamte Zeichenfolge als eine Reihe sich nicht überlappender Meerestiere zu interpretieren , sollte die Zeichenfolge mit einzelnen Leerzeichen zwischen den Kreaturen nachgedruckt werden. Ist diese Interpretation nicht möglich, sollte nichts ausgegeben werden (das Programm endet stillschweigend).
Beispielsweise kann die Zeichenfolge <><><>
als zwei Standardfische hintereinander interpretiert werden. Die entsprechende Ausgabe wäre <>< ><>
.
Als weiteres Beispiel ><>><>>
enthält die Zeichenfolge "Instanzen" von ...
(Klammern nur als Indikatoren hinzugefügt)
- ein paar Standardfische:
[><>][><>]>
- ein flotter Fisch:
><[>><>]>
- ein robuster Fisch in mehrfacher Hinsicht:
[><>>]<>>
und><>[><>>]
Allerdings erstreckt sich nur die Paarung eines Standardfisches und eines robusten Fisches [><>][><>>]
über die gesamte Länge der Schnur, ohne dass sich die Zeichen der Fische teilen (keine Überlappungen). Somit ist die Ausgabe an entsprechenden ><>><>>
ist ><> ><>>
.
Wenn es mehrere Möglichkeiten gibt, die Zeichenfolge zu interpretieren, können Sie eine davon drucken. (Und nur druckt ein . Von ihnen) Zum Beispiel <><<<><
kann als Standard Fisch und ein stabilen Fisch interpretiert werden: [<><][<<><]
oder als schnellen Fisch und ein Standard - Fisch: [<><<][<><]
. Also entweder <>< <<><
oder <><< <><
wäre eine gültige Ausgabe.
Die Krabben sind nur zum Spaß. Da sie nicht mit beginnen oder enden <
oder >
, sind sie viel leichter zu (zumindest optisch) zu identifizieren. Zum Beispiel die Zeichenfolge
,<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>
würde natürlich die Ausgabe produzieren
,<..>, ><<<> ,<..>, ><> ,<..>, <>>>< ,<..>, ><>> ,<..>, <<>< ,<..>, <>< ,<..>, >><>
Hier einige Beispiele für Zeichenfolgen (eine pro Zeile), die keine Ausgabe erzeugen:
<><>
,<..>,<..>,
>>><>
><<<<>
,
><><>
,<><>,
<<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><
Die letzte Zeichenfolge hier kann analysiert werden, wenn Sie das führende Zeichen entfernen <
:
<<>< ><<<> >><> ><> ><> <>< <>>>< >><> >><> >><> ><>> <<><
(Möglicherweise gibt es andere mögliche Ausgaben.)
Einzelheiten
- Die Eingabezeichenfolge enthält nur die Zeichen
<>,.
. - Die Eingabezeichenfolge muss mindestens ein Zeichen lang sein.
- Übernehmen Sie die Eingabe auf eine übliche Weise (Befehlszeile, stdin) und geben Sie sie an stdout aus.
- Der kürzeste Code in Bytes gewinnt. ( Handy-Byte-Zähler. ) Tiebreaker ist früherer Beitrag.
quelle
Antworten:
Pyth,
644850 BytesTestfall.
Version , die nicht ewig dauern ( ) hier , in 52 Bytes.
O(9n/3)
Dies ist der Brute-Force-Ansatz, bei dem alle Sequenzen generiert und geprüft werden, ob eine Summe zur Eingabe gehört. Als Zeichen komprimierte Fischdiagramme, deren binäre Darstellungen das
>
und sind<
. Das Ganze wird in einen Try-Catch-Block eingeschlossen, sodass keine Ausgabe erfolgt, wenn keine Ergebnisse gefunden werden.Das ist eine Lösung.
O(9n)
Einige Zeichen sind oben gestrippt, da Steuerzeichen verwendet werden. Sie werden unter dem obigen Link originalgetreu wiedergegeben.
xxd Ausgabe:
quelle
><>><>>
dauert 15 Sekunden auf meinem Computer.Nicht-deterministische Turing-Maschine, 20 Zustände, 52 Übergänge (882 Bytes vielleicht)
Wie konvertiert man das in Bytes? Ich habe die Dateien (absolut nicht golfen) geschrieben, um diese Maschine mit Alex Vinokurs Simulator of a Turing Machine 1 auszuführen .
wc -c
gibt Folgendes aus (ohne die Beschreibungsdatei und die Eingabedateien):Wie auch immer, ich bereitete mich auf mein Informatik-Abitur vor und dachte, dies wäre eine gute Übung (ich weiß nicht, was ich dachte). Also hier ist die Definition:
(die Übergangsfunktion)
Entschuldigen Sie das schlechte Bild, aber ich konnte es nicht ertragen, dieses Ding auf einem Computer neu zu zeichnen. Wenn Sie die Übergangsregeln tatsächlich entschlüsseln möchten, empfehlen wir Ihnen, die oben verlinkte Regeldatei durchzulesen.
Ich habe
X
s anstelle von Leerzeichen verwendet, da Leerzeichen hier schwer zu visualisieren sind und der Simulator keine Leerzeichen im Alphabet akzeptiert.Das Konzept ist recht einfach: Mit q1 bis q4 werden nach rechts gerichtete Fische gefangen, mit q11 bis q14 werden nach links gerichtete Fische gefangen, mit q15 bis q19 werden Krabben gefangen und mit dem Blob q5 bis q10 wird einfach ein Leerzeichen eingefügt und alles bewegt folgende Zeichen eins rechts.
Wenn die Zeichenfolge interpretierbar ist, akzeptiert sie die Zeichenfolge und das Band enthält die Zeichenfolge mit eingefügten Leerzeichen. Andernfalls wird die Zeichenfolge zurückgewiesen (ich denke, dies gilt als keine Ausgabe - das Leeren des Bandes wäre ziemlich einfach, würde aber viele Übergangsregeln erfordern, und ich denke nicht, dass es die Übergangsfunktion schöner aussehen lassen würde).
1 Hinweis: Es ist schwierig zu kompilieren. Ich musste die bearbeiten
src/tape.cpp
Datei und ersetzenLONG_MAX
mit1<<30
und dann auf das gehendemo
Verzeichnis, bearbeiten Sie die Makefile zu ersetzenEXE_BASENAME
mitturing.exe
und auszuführenmake
. Dann gehe in das Verzeichnis mit den Dateien, die ich geschrieben habe und führe sie aus/path/to/turing/download/src/turing.exe meta
.quelle
Fisch (ja, dieser Fisch), 437 Bytes
Dies erscheint mir als eine dieser Programmieraufgaben, bei denen genau eine Sprache richtig ist.
Die folgende Version ist immer noch die längste Antwort auf die Herausforderung,
aber da dies hauptsächlich für das Wortspiel gemacht wurde (ich hoffe, Sie werden es entschuldigen), bleibt dem Leser besseres Golfen als Übung überlassen.
quelle
printf 'H4sIADSjKlUCA4VPQW6DMBC89xUj5AOocSSOlV1/BHGgjgMrBUPN0kRRHl/jmEg99WBLszM7M7s4BqMw2hQotNHxNy+QkDYJZU7rTJqED/p4NIdCLdFmVOfVW6bJY04DeQGhVteBLg4cVqfYLQxBkD3jQ6HzJwTHa/BRRmf4ibEtBpRfriefXCxKZ4cJghtB7eNqIW2lnqMu9D9N3T7sGtOssDInJCk+982/MlmOHQ+I6rqKRv5UpRxCntN7XSk7eSYfK0f+eR3EmI23qilH3iFCrjIqdyNO8nzJvJH7alMu7jsnlHZafWw5VluD9r/0/c2vQ95+AYBxAwS2AQAA'|base64 --decode|gzip -d>a;fish a
> <> 602 Bytes
Eine Lösung in Fisch, wahrscheinlich sehr golfen, aber es ist mein erstes> <> Programm. Es bezieht seine Eingabe vom Eingabestapel und wird im Online-Interpreter> <> ausgeführt.
Wie es funktioniert :
Eine Schleife liest alle Eingaben und stapelt sie, kehrt sie um und setzt unten ein -1, was anzeigt, dass die Analyse abgeschlossen ist (alle Zeichen bleiben auf dem Stapel, bis die Zeichenfolge als analysierbar eingestuft wird).
Das Parsen verwendet die Tatsache, dass alle Zeichen unterschiedlich modulo 5 sind und alle Muster mit Ausnahme von <> << und> <>> deterministisch sind. Analysierte Zeichen werden am unteren Rand des Stapels abgelegt.
Wenn ein Muster vollständig ist und -1 oben steht, werden alle Zeichen gedruckt, andernfalls wird ein Leerzeichen hinzugefügt und das Programm wiederholt.
Wenn <> << oder> <>> angetroffen werden, wird das Register inkrementiert (0 am Anfang), und eine 0 wird vor dem letzten Zeichen auf den Stapel gelegt (so dass <> <oder> <> nach dem Zurücksetzen verbleibt). . Wenn später beim Parsen ein Fehler auftritt, wird das Register verkleinert, und alle Zeichen nach der 0 werden wieder an die Spitze gesetzt (mit Ausnahme von Leerzeichen dank eines% 8 = 0-Tests).
Wenn ein Fehler erkannt wird, während das Register 0 ist oder sich in der Krabbe befindet, endet das Programm sofort.
quelle
Python 3, 156
Die Strategie besteht darin, Fischlisten zu generieren und ihre Verkettung mit der Eingabezeichenfolge zu vergleichen.
Das dauert unglaublich lange. Wenn Sie tatsächlich eine Ausgabe sehen möchten, ersetzen Sie diese
for _ in s
durchfor _ in [0]*3
, wobei 3 die Obergrenze für die Anzahl der Fische ist. Es funktioniert,s
weil ess
höchstens einen Fisch pro Saibling enthält.Danke an Sp3000 für Bugfixes und ein Zeichen, das bei der Eingabe gespart wird.
Alter 165:
quelle
a and b or c
einen falschen Wertb
angab, wenn er möglicherweise falsch war . Ich habe aufif/else
2 Zeichen zurückgegriffen, aber es könnte eine Möglichkeit geben, die ternäre Arbeit zu machen.*l,s=[],input()
Perl, 81 + 1 Bytes
Versuchen Sie diesen Code online.
Dieser Code erwartet die Eingabe in der
$_
Variablen. Führen Sie dies mit Perls-n
Schalter ( gezählt als +1 Byte ) aus, um ihn auf jede Eingabezeile anzuwenden, z. B. wie folgt:Dieser Code verwendet Perls reguläre Ausdrücke (und insbesondere die eingebettete Codeausführungsfunktion ), um eine effiziente Rückverfolgungssuche durchzuführen. Die einzelnen gefundenen Fische werden in dem
@a
Array gesammelt , das bei erfolgreicher Übereinstimmung stringifiziert und ausgedruckt wird.Dieser Code verwendet auch das Perl 5.10+
say
Funktion, und so müssen die ausgeführt wird-E
oder-M5.010
Schalter (oderuse 5.010;
) , wie moderne Funktionen zu ermöglichen. Traditionell sind solche Schalter, die nur zum Aktivieren einer bestimmten Version der Sprache verwendet werden, nicht in der Byteanzahl enthalten.Alternativ ist hier eine 87-Byte-Version, für die überhaupt keine speziellen Befehlszeilenoptionen erforderlich sind. Es liest eine Zeile von stdin und gibt das Ergebnis (falls vorhanden) ohne nachfolgenden Zeilenvorschub in stdout aus:
Ps. Wenn das Drucken eines zusätzlichen Speicherplatzes am Anfang der Ausgabe erlaubt wäre, könnte ich zwei weitere Bytes trivial einsparen mit:
quelle
><(>|<<)>
Python 3,
196186 BytesEinfache Rekursion. Gibt
g
entweder eine Liste analysierter Fische zurück oderNone
ist die Eingabezeichenfolge nicht analysierbar.quelle
Python 2, 234 Bytes
Ich habe zuerst eine Python-Regex-Lösung ausprobiert, aber es scheint keine Möglichkeit zu geben, die Gruppen nach einer Übereinstimmung mit mehreren Mustern zu extrahieren. Das Folgende ist eine rekursive Suche, die in den Testfällen gut zu funktionieren scheint.
Ein Beispieltest:
Und die ungolfed version:
quelle
if
kann in einer einzigen Zeile stehen (wie Sie es anderswo getan haben). Anstattif p<len(t)
ich denke, können Sie auch tunif t[p:]
, um ein paar Bytes zu sparen.C # - 319 Bytes
Diese Lösung ist schändlich einfach, für Golf kaum etwas. Es ist ein vollständiges Programm, nimmt die Eingabe als Zeile von STDIN und gibt das Ergebnis an STDOUT aus.
Es wird einfach versucht, jeden Fisch an die erste Position nach einem Leerzeichen (oder am Anfang der Zeichenfolge) zu bringen und jede Fischart damit abzugleichen. Wenn der Fisch passt, ruft er den Löser nach dem Einfügen eines Leerzeichens nach dem Fisch rekursiv auf oder gibt einfach seine Eingabe zurück (mit einem \ n aus Ausgabegründen), wenn die nicht übereinstimmende Zeichenfolge buchstäblich der Fisch ist (dh wir haben eine Lösung gefunden). .
Ich habe nicht viel unternommen, um dem Fisch-String die übliche Kolmogorov-Behandlung zu geben, weil es nicht allzu lange dauert und ich keinen billigen Weg finde, einen String in C # umzukehren (ich glaube nicht, LINQ wird zahlen), also gibt es vielleicht eine Gelegenheit, aber ich bezweifle es etwas.
quelle
Haskell (Parsec) - 262
quelle
Ich bin ein bisschen wie ein Python Noob, also ignoriere die Verrücktheit: P
quelle
m
anstelle vonmsg
,s
anstelle vonstart
, ...) und nur 1 Leerzeichen pro Inkrement verwenden. Und bitte posten Sie die Anzahl der Zeichen Ihres Programms (Sie können sie hier zählen ).Ruby, 177 Bytes
Nicht die kürzeste, sondern die erste in Rubin:
Hier wird versucht, einen regulären Ausdruck rekursiv zu erweitern und mit der Eingabe abzugleichen.
Wenn eine längere Übereinstimmung gefunden wird, wird r () wiederkehren, wenn nicht, wird geprüft, ob die letzte Übereinstimmung die gesamte Eingabezeichenfolge belegt und erst dann mit zusätzlichen Leerzeichen ausgegeben.
quelle
CJam,
111 9691 (oder 62 Byte)Ein iterativer, gieriger Ansatz, um herauszufinden, welche Fischkombinationen bei der Iteration möglich sind. Wirklich nicht gerade Golf gespielt.
Der Code enthält einige nicht druckbare Zeichen. Verwenden Sie daher den folgenden Link als Referenz.
Update Codiert die Zeichenfolge
Fügt eine Erklärung hinzu, sobald das Golfen abgeschlossen ist
Probieren Sie es hier online aus
62 Bytes
Super langsame Version. Dies erzeugt im Grunde alle Kombinationen und Prüfungen, die der Eingabe entsprechen.
Dies enthält auch nicht druckbare Zeichen. Verlassen Sie sich daher auf den folgenden Link.
Probieren Sie es hier online aus
quelle
Haskell,
148146 BytesTesten:
$ echo "> <>> <>>" | runhaskell fishes.hs
Erläuterung
Gestützt auf meine frühere Antwort auf eine ähnliche Frage. Der Algorithmus läuft in exponentieller Zeit ab.
Dies liest von rechts nach links.
Hiermit wird keine Zeichenfolge gedruckt, die mit einem Leerzeichen endet, auch wenn solche Zeichenfolgen ebenfalls generiert werden, da das Gegenstück ohne Leerzeichen zuerst generiert wird.
quelle
JavaScript (ES6), 164
Rekursiver Tiefenscan.
Als Programm mit I / O über Popup:
Als testbare Funktion:
Testsuite (in Firefox / FireBug-Konsole ausgeführt)
Ausgabe
Ungolfed nur die k-Funktion
quelle
Haskell,
148,142Dabei werden Listenverständnisse verwendet, um den Fisch zu durchlaufen, diejenigen auszuwählen, die dem Start entsprechen, und rekursiv fortzufahren.
quelle
Javascript (
122135 Bytes)Nicht die meisten Golfer hier, könnten ein wenig abgespeckt werden.
Dieses ist Regex-basiert und ein bisschen schwer herauszufinden, was los ist.
Dieser ist ein Einzeiler.
Grundsätzlich überprüfe ich die Syntax und teile dann die Zeichenfolge anhand der Zeichen auf und füge sie zusammen.
Es wird eine Ausnahme ausgelöst, wenn Sie eine ungültige Eingabe machen.
Wenn es keine Ausnahmen werfen kann (
126139 Bytes):Beide sind Einzeiler.
Beides funktioniert genauso.
Vielen Dank an @ edc65 , dass Sie den Edge-Fall erkannt haben , der nicht richtig funktioniert hat.
Sie können es hier testen (die Ausgabe wird in das Dokument geschrieben).
Es basiert auf der Version, die Ausnahmen auslöst, wenn Sie ungültigen Code einführen.
Code-Snippet anzeigen
(Derzeit gibt es einen Fehler in Stack-Snippets,
Ich habe auf Meta gepostetEs wurde schon gestern gefragt. Für sie zu arbeiten, habe ich ersetzt$
mit\x24
, die die gleiche Leistung hat. Sie können über den Fehler hier lesen: http://meta.codegolf.stackexchange.com/questions/5043/stack-snippets-messing-with-js )quelle
><>><>>
. Ich denke, dass dies mit Regexp nicht so einfach gelöst werden kann, Sie brauchen einen Lookahead oder Backtrak oder was auch immer ...Scala, 299 Bytes
Testfälle
Ausgabe
quelle
Java, 288 Bytes
Formatiert:
quelle
Ich wollte keine Größe, aber hier ist eine leicht verständliche Methode, um dies in Dart zu tun.
quelle
Python 3,
166164 BytesRekursive Lösung. Spät auf der Party, aber ich dachte, ich würde es trotzdem posten, da es Sp3000 übertreffen würde
2022 Bytes, ohne die Antwort brachial erzwingen zu müssen.quelle