Sie müssen ein Programm oder eine Funktion schreiben.
Die Eingabe ist eine 'Karte' von Zahlen. Sie können die Karte entweder als Zeichenfolge mit neuen Zeilenzeichen ( \n
) oder als 2D-Array von Zeichenfolgen verwenden.
Alle Karten bestehen aus 5 mal 5 Zeichen, und die Zeichen sind immer entweder Ziffern größer als 0 oder Leerzeichen.
Hier ist ein Beispiel für eine Karte:
12 45
11233
233
1
2 899
Ihre Aufgabe ist es, die verbundenen Komponenten in der Karte zu finden. Eine gültige Komponente ist eine Reihe von mindestens drei horizontal und / oder vertikal ( nicht diagonal ) verbundenen identischen Ziffern ( keine Leerzeichen ). Sie müssen dann die Zeichen der gültigen verbundenen Komponenten durch x
s ersetzen und das Ergebnis drucken oder zurückgeben.
Die Ausgabe für das obige Beispiel wäre also:
x2 45
xx2xx
2xx
1
2 899
Hier ist ein weiterer Testfall (danke an Martin Ender):
Input:
2 3
4
1 5
111 6
11 7
Output:
2 3
4
x 5
xxx 6
xx 7
Dies ist Code Golf, also gewinnt der kürzeste Code in Bytes!
quelle
Antworten:
JavaScript (ES6),
171161139137136133132 BytesDies ist eine Übersetzung meiner Python-Antwort. E / A als Zeichenarrays.
Schade, dass es keinen effizienten Weg gibt
sum
...quelle
Python 3,
238237200199192181 BytesDefiniert eine Funktion
f(a)
, die die Eingabe als Array von Zeichen verwendet und dasselbe geänderte Array zurückgibt. ( Zeichenarrays sind standardmäßig als Zeichenfolgen zulässig. )Ungolfed mit Erklärung
Der geänderte Code ist rekursiv, funktioniert aber genauso.
quelle
Ruby, 304 Bytes
Anwendungsbeispiel:
Der Code verwendet die Blot-Methode erneut, um die Pfadlänge zu berechnen.
Variablen / Methoden:
Versuch einer detaillierteren Erklärung:
Erstellen Sie eine Kopie der Eingabezeichenfolge, mit der wir die Länge des Pfads von einem bestimmten Punkt in der Karte ermitteln.
Definieren Sie eine anonyme Funktion 'ps' (Pfadlänge) (Lambda), die den Kartenindex i als Argument verwendet. es gibt die Länge des Pfades von diesem Punkt zurück. Dazu wird die Methode 'b' (Blot) aufgerufen, um x in eine Kopie der Originalkarte einzufügen, und anschließend die Anzahl der x in der zurückgegebenen Zeichenfolge gezählt.
Der folgende Teil durchläuft jedes Zeichen in der Karte (Index i, Zeichen s [i]). Es ruft die Funktion 'b' (Blot) an der Kartenposition i auf, wenn die Pfadlänge von Position i größer als 2 ist und wenn es sich nicht um ein Leerzeichen oder ein Zeilenumbruchzeichen handelt.
Die Funktion b (Blot) verwendet die Map-Zeichenfolge und einen Index als Argument. Es initialisiert @v (besuchtes Array) und ruft die Hilfsfunktion b2 auf.
Die Funktion b2 verwendet die Kartenzeichenfolge, eine Kartenposition (i) und ein Zeichen im aktuellen Pfad (c). Es ruft sich rekursiv auf, um verbundene Ziffernabschnitte durch das Zeichen 'x' zu ersetzen. es gibt die Eingabezeichenfolge zurück (dies ist so, dass die ps-Funktion scan () für den Rückgabewert aufrufen kann).
Diese if-Anweisung überprüft, ob die angegebene Kartenposition (i) innerhalb der Grenzen der Zeichenfolge (0 ... s.size) liegt und ob das Zeichen bei s [i] mit dem Startzeichen identisch ist. Außerdem wird @v [i] aktiviert, um eine unendliche Rekursion zu vermeiden.
Dies ist das Bit, das das Zeichen am Index (i) durch das Zeichen 'x' ersetzt. Außerdem wird dieser Index als besucht markiert.
Hier ruft sich b2 rekursiv auf und sucht nach dem Pfad. i + 1 ist ein Zeichen rechts, i-1 ist ein Zeichen links, i + 6 ist eine Zeile tiefer (5 Ziffern + 1 Zeilenumbruch = 6 Zeichen), i-6 ist eine Zeile höher.
quelle
C (Ansi),
243233179188 BytesGolf:
Mit Anmerkungen:
}}
Eingang:
Erwartet eine neue Zeile am Anfang und Ende der Zeichenfolge.
Beispiel Eingabe:
Beispielausgabe:
Aktualisieren
Durch das Fixieren des Rasters konnte ich fast 60 Bytes sparen.
quelle
Mathematica, 180 Bytes
Erläuterung:
Reine Funktion, die ein
5x5
Array akzeptiert .
ist das 3-Byte-ZeichenU+F3C7
für den privaten Gebrauch, das den Postfix-Transponierungsoperator darstellt\[Transpose]
.(f=Flatten@#;p=Partition)
: Glättet die Eingabeliste und speichert sie inf
. Legt es festp = Partition
und gibt es zurück.g=p[r,5]
: Das Array{{1,2,3,4,5}, ..., {21,22,23,24,25}}
(dies liegt daran, dassr
es auf gesetzt wirdRange@25
).Join[g=p[r,5],g]
: die Liste der Zeilen und Spalten vong
.p[#,2,1]&
: Reine Funktion, die die Liste#
in Unterlisten2
mit einer Überlappung unterteilt1
; dh die Liste benachbarter Paare in#
.##&@@p[#,2,1]&
: Wie oben, außer dass a zurückgegeben wirdSequence
.##&@@p[#,2,1]&/@Join[g=p[r,5],g]
: Ordnet die vorherige Funktion der Zeilen und Spalten vong
zu, um eine Liste aller benachbarten Einträge in zu erhalteng
. Mein Bauch sagt, dass es einen kürzeren Weg gibt, dies zu tun.r~Graph~Cases[...]
: Graph, dessen Eckpunkte die ganzen Zahlen sind1, ..., 25
und dessen Kanten die Kanten zwischen benachbarten Einträgen sind, ing
denen dieselben entsprechenden Einträge im Eingabearray vorhanden sind (außer" "
){a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: Muster, das so übereinstimmt{a,b}
, dassf[[a]] == f[[b]]
(gleicher Wert im Eingabearray) und das nicht gleich ist" "
. SetA = f[[a]]
speichern1
Byte....:>a<->b
: Ersetzen Sie jede Übereinstimmung durch eine ungerichtete Kante von a nach b.VertexComponent
: Gibt die verbundene Komponente des zweiten Arguments (einen Scheitelpunkt) im ersten Argument (ein Diagramm) zurück.Tr[1^VertexComponent[...]]
: Die Größe der angeschlossenen Komponente. Speichert1
Byte vonLength@VertexComponent[...]
.If[Tr[...]<3,f[[#]],"x"]&
: Reine Funktion, die einen Eintrag#
in nimmtg
. Wenn die Größe der angeschlossenen Komponente kleiner als ist3
, ersetzen Sie sie durch den entsprechenden Eintrag in der Eingabe. Andernfalls ersetzen Sie es durch"x"
.(f=Flatten@#;p=Partition)[...,5]
: Und schließlich das Ergebnis in ein5x5
Array umformen .quelle
Clojure, 188 Bytes
Das ist ziemlich überwältigend: D.
Wird so aufgerufen (es wird ein 1D-Vektor von Zeichen benötigt):
Zu faul, um es zu lösen,
for[m(range 30)]
besucht aber im Grunde jeden Index und für jeden Index erstellt das Innerelet[n(for[p[-1 -6 1 6]...(+ m p))]
eine Liste von 0 bis 4 Elementen, in der Orte aufgelistet sind, die den gleichen Wert (1 - 9) wie der mittlere Ort hatten. Wenn mehr als ein Nachbar mit dem Mittelstück übereinstimmt, bedeutet dies, dass alle diese einen Cluster bilden, sodass diese Positionen zu dem Satz hinzugefügt werden, der bei verwendet wird(if((set(flatten(...)))i)
. Wenn der Indexi
aus der Menge gefunden wird,\x
wird er ausgegeben und ansonsten der ursprüngliche Wert. Das:when( ... )
ist ziemlich interessant ...quelle