Ich habe ein ernstes Problem. Ich habe einige Textdateien, in denen ich meine sehr wichtigen Nummern aufbewahre - alle wichtigen! Und zwei und drei ..
Diese Zahlen waren so wichtig, dass ich sie nicht diesen neuen Dezimal- oder Binärzahlensystemen anvertrauen konnte. Ich habe jede Zahl in Unary verschlüsselt, so:
+--+
| |
+---+ +----+ |
| | | |
+---+ +-------+
~/two.txt
Einfach und zuverlässig: zwei ASCII-Schleifen für die Nummer 2. Leider verwickeln sich diese Dinge mit der Zeit, und jetzt fällt es mir schwer, herauszufinden, wie viele Schleifen sich in jeder Datei befinden. Hier einige Beispiele, die ich von Hand ausgearbeitet habe:
Eins:
+---+
| |
+--+ |
| |
+--+ |
| |
| |
| |
+--+ +--+
| |
+---------+
Drei:
+---------+
| +-----+ |
| | +-+ | |
| | | | | |
| | +-+ | |
| +-----+ |
+---------+
Vier:
+--------------+
| +--+ +--+ |
| | | | | |
+-|-----|-----|----+
| | | | | | | |
| +--+ +--+ +--+ |
+------------------+
+------------+
| |
+-----+ +-----+ |
| | | |
+-----|-----------+ | |
| | +--+ | | | |
+-+ +--|--|--+ +---------+
| | +-+ | | |
+------+ | | | |
+-------+ | |
|| | |
|+-----+
| |
+---+
Fünf:
+--------+ +--------+ +--------+
| | | | | |
| +--|-----+ +--|-----+ |
| | | | | | | | | |
+-----|--+ +-----|--+ +--------+
| | | |
+--------+ +--------+
Können Sie mir helfen, meine Schleifen zu zählen?
Hier sind die Regeln:
- Da ich alles in ASCII-kodiertem Unary speichere, ist mir die Raumeffizienz sehr wichtig. Daher ist dies Codegolf. Das kleinste Programm in Bytes gewinnt.
- Schleifen werden mit den Zeichen +, -, | gezeichnet. Jede Ecke in der Schleife ist eindeutig gezeichnet: genau eines der Zeichen über und unter dem + ist | und genau eines nach rechts oder links ist -. Zwei + Zeichen sind niemals benachbart.
- Stränge können untereinander und untereinander verlaufen. Wenn sich die Litzen kreuzen, können Sie die "Unter" -Litze sofort auf beiden Seiten der "Über" -Litze sehen.
- Ihr Programm sollte eine Zeichenfolgendarstellung der Schleife (entweder von stdin oder als Funktionsparameter) nehmen und eine Zahl erzeugen (entweder zu stdout oder als Rückgabewert).
- Die Linienlängen in der Loop-Zeichnung sind möglicherweise nicht einheitlich, und auf jeder Linie befinden sich möglicherweise nachgestellte Leerzeichen.
- Sie können davon ausgehen, dass der Eingang mindestens eine Schleife enthält.
Ich zähle auf dich!
+
?Antworten:
SnakeEx - 98 Bytes mit Javascript, 44 ohne
Dies schien ein gutes Problem zu sein, um meine Sprache von der Fortnightly Challenge an zu testen :
Der beste Ort, um dies auszuprobieren, ist mein Online-Dolmetscher .
SnakeEx gleicht Textmuster mithilfe von "Schlangen" ab, die sich um den zu regulären Texten passenden Text bewegen. Der Code liest sich wie ein regulärer Ausdruck, außer:
<T>
Anweisung. Dies ist ein Richtungsbefehl, der die Schlange von ihrer aktuellen Richtung nach links und rechts abzweigt.{e<>PE}
ist wie ein Unterprogrammaufruf. Es, das eine Schlange erzeugt, deren Definitione
sich vorwärts bewegt (<>
) und deren ParameterP
(Huckepack - die laichende Schlange folgt der neuen Schlange) undE
(exklusiv - nicht mit etwas übereinstimmen, das bereits übereinstimmt). Diese exklusive Prüfung ist das einzige, was die Schlange davon abhält, sich unendlich zu drehen.`
am Ende gibt an, dass das Folgende nur abgeglichen werden soll, wenn es bereits abgeglichen wurde. Mit diesem Präfix können wir das Schließen der Schleife erzwingen.Da SnakeEx wie Regex ist und die Ergebnisse technisch nicht so ausgibt, wie es von selbst gewünscht wird, müssen wir es vermutlich in ein JavaScript einbinden, das den Interpreter aufruft:
Bearbeiten : Es wurde korrigiert, um mit den zusätzlichen Testfällen von blutorange zu arbeiten
quelle
[^ ]
mit[|\-]
;)C # - 338
388433BytesDurch Ändern eines eindimensionalen Arrays wurden eine Reihe von Bytes gespeichert.
Zuerst liest es die Eingabe ein und macht sie hübsch und rechteckig mit einem "" Rand, so dass wir keine Begrenzungen in der Horizontalen überprüfen müssen (billiger, als in der Vertikalen zu überprüfen, als die zusätzliche Zeile einzufügen). . Dann schaut es durch das Rechteck zurück und trifft immer auf eine rechte untere Ecke. Wenn es auf eine davon trifft, richtet es sich nach einem beliebigen + auf und löscht sie nach und nach (mit einem Leerzeichen). Es hört auf zu folgen, wenn es auf ein Leerzeichen trifft. Getestet an den fünf angegebenen Beispielen.
quelle
Beleg ,
5141 + 2 = 43 Bytes(Jetzt aktualisiert, um mit @ blutoranges Testfall zu einem hohen Preis zu arbeiten.)
Da @BMac SnakeEx für diese Herausforderung verwendete, dachte ich, ich würde versuchen, meine 2D- Vorlage für die Mustererkennung , Slip, zu verwenden. Da Slip jedoch nicht über die zur Lösung dieses Problems erforderlichen Funktionen verfügt, habe ich sie in den letzten Tagen hinzugefügt. Mit anderen Worten, diese Einsendung ist nicht gewinnberechtigt .
Laufen Sie mit der
n
Flagge für die Anzahl der Übereinstimmungen, zProbieren Sie es online aus .
Erläuterung
Aufgrund der Vielzahl neuer Funktionen in dieser Einreichung ist dies eine gute Gelegenheit, sie vorzustellen.
Slip versucht, von jeder Position aus eine Übereinstimmung zu finden und gibt nur eindeutige Übereinstimmungen zurück. Beachten Sie, dass wir verwenden
[^ +]
- während die Verwendung[-|]
theoretisch zwei Bytes einsparen würde, ist die-
am Anfang / Ende von Zeichenklassen unescaped noch nicht in Slip implementiert.quelle
three
hat auch+
s, die nicht eins-
, eins|
und zwei Leerzeichen sind, alsoRuby 295
Versuchen Sie es online: http://ideone.com/kIKELi ( ich hinzugefügt
#to_a
Anruf in der ersten Zeile, weil ideone.com verwendet Ruby - 1.9.3, die nicht unterstützt#size
fürEnumerable
s In Ruby 2.1.5+ der Code ausgeführt wird OK. . )Der Ansatz ist der folgende:
+
Zeichen in der Eingabe und betrachten Sie jedes von ihnen als eine eigene Form+
Zeichen verbinden, und kombinieren Sie ihre Formen zu einerHier ist eine besser lesbare Version:
quelle
JavaScript (ES6) 190
197 202 215 235 289 570Bearbeiten eines eindimensionalen Arrays anstelle von zwei Dimensionen, maximale Zeilengröße 999 Zeichen
Bearbeiten Hinzugefügtes animiertes Code-Snippet, siehe unten
Ungolfed ersten Versuch
Animiertes Snippet
Code-Snippet anzeigen
Test In der Firefox / FireBug-Konsole
quelle
Ruby, 178
187199212Bessere Ruby-Version, schafft eine Funktion F. Jetzt mit leckereren Interpreter-Warnungen ständig.
Testen Sie es online: ideone
Grundsätzlich
b
startet die Funktion bei jedem+
, durchläuft die Schleife rekursiv und setzt alle+
aufu
. Somit wird bei jedemb
Aufruf eine Schleife entfernt . Die FunktionF
versucht nur, wie oft wir anrufen müssen,b
bis keine Schleifen mehr übrig sind.quelle
Python 2 - 390
Nimmt einen String mit Zeilenumbrüchen von stdin. Es ist eine ziemlich einfache Methode, ein gutes Stück Golf zu spielen, aber ich bin mir sicher, dass es nicht so lang ist, wie es sein könnte.
quelle
Python 2 - 346 Bytes
Implementiert als Funktion
c
, die die Dateidaten als Eingabe verwendet und die Anzahl der Schleifen zurückgibt.Zunächst zerlegt die Funktion die Daten in eine Zuordnung von Schleifenelementpositionen zu dem Elementtyp an dieser Position (z
{(0,0): '+'}
. B. ). Dann werden zwei gegenseitig rekursive interne Funktionen verwendet. Das erste entfernt ein Schleifensegment aus dem Mapping und entscheidet, welche Positionen für das nachfolgende Segment überprüft werden sollen. Die zweite prüft, welche Art von Schleifenelement an den ausgewählten Stellen vorhanden ist, und ruft, wenn es mit den erwarteten kompatibel ist, die erste auf, um den neu gefundenen Abschnitt zu entfernen.quelle