Was wird umzingelt?

18

Ich wollte schon immer einen Text mit #s umgeben, aber ich habe Probleme herauszufinden, was ich umgeben habe, so dass Sie in dieser Herausforderung ein Programm schreiben werden, um genau das zu tun

Beispiele

Ein- / Ausgänge werden durch einen Zeilenumbruch getrennt.

###
#a#
###

a
 #
#a#
 #

a
  ###  
 # a #
# b c #
#######

  a 
 b c 
ABCDHIJ
E####GK
F# M #L
#   N#O
P####

  M 
   N
###A###
#C#B#o#
#d###e#
 # go#
  ###

C   o
d   e
  go

Spec

  • #s sind das, was einen Textblock "umgibt"
  • # wird immer nebeneinander sein (auch diagonal)
  • # wird immer eine geschlossene Form bilden
  • Es wird nur eine #Form geben
  • Im Falle einer konkaven Form sollten die Löcher mit Leerzeichen gefüllt werden.
  • Leerzeichen müssen in der Ausgabe erhalten bleiben
Downgoat
quelle
zuerst war ich wie ... nimm einfach das #s raus und los gehts ... und dann wurde es schwer.
Bald Bantha
Ich habe Probleme beim Abrufen von Eingaben in Javascript und beim Aufteilen nach Zeilenumbrüchen ... Wie muss ich Eingaben abrufen? könnte es mit einem \nnach jeder eingabezeile formatiert und als funktion param an mein programm übergeben werden oder was?
Bald Bantha
1
Was ist der Satz gültiger Eingabezeichen?
Ton Hospel
Liegt ein Fehler am Ausgang des MN- Beispiels vor? Die Ausgabe besteht nur aus dem umschlossenen Text _M_\n___N(Unterstriche anstelle von Leerzeichen wegen Formatierungsproblemen), während die Ausgabe in den Beispielen abc und Codego auch Leerzeichen enthält, bei denen die Eingabe #s enthielt. Wenn nur der von # umgebene Text gedruckt werden soll, sollte die Ausgabe des abc- Beispiels _a_\n_b_c_(anstelle von __a_\n_b_c) und die Ausgabe des Codego- Beispiels Co\nde\n_go(anstelle von C___o\nd___e\n__go) sein.
Epidemie
@epidemian ah, schöner Fang. Ich habe das MNBeispiel behoben .
Da es

Antworten:

6

Perl, 144 138 132 129 128 127 126 124 Bytes

Beinhaltet +2 für -p0

Es wird davon ausgegangen, dass der Code \0kein gültiges Eingabezeichen ist (zumindest innerhalb von #).

Führen Sie mit der Eingabe auf STDIN aus:

surround.pl < surround.txt

surround.pl:

#!/usr/bin/perl -p0
/^#[^#\0]/m&&s/^|[^#\n\0]\0/\0\0/mg,s%.%s/.(.*)/$+\0/g;/#/&&reverse"\n",/^./mg%seg until$?++<$$_++;y/\0/#/;s/^#*\n|#+$|^#//mg;y;#; 

Der Code funktioniert wie er ist, aber ersetzen Sie die \0und \ndurch die Literalversionen für die beanspruchte Punktzahl. Beachten Sie, dass am Ende der Zeile ein Leerzeichen steht. Der Code wird viel zu oft wiederholt, sodass Sie möglicherweise 30 Sekunden auf die Ausgabe warten müssen.

Erläuterung

Ich werde ein Floodfill machen, bei dem \0von #außen in orthogonalen Richtungen angehalten wird . Danach werde ich die #Seiten abschneiden und alles, was übrig bleibt, durch Leerzeichen ersetzen. Um nicht alle Richtungen in der Überflutung bewältigen zu müssen, drehe ich immer wieder den Zielbereich und fülle nur die Überflutung von rechts nach links

/^#[^#\0]/m                   The rotation is written such that it slices
                              off the first column. That is ok unless the
                              first column contains a # that is followed by
                              something that could be the inside. There is
                              no newline inside the [] because short lines
                              will get extended during the rotation and 
                              the character following the # will end
                              up as a \0 and match in a later round
    &&s/^|[^#\n\0]\0/\0\0/mg  In case the # could be an interior border I
                              will add two columns of \0's in front. One 
                              will be a sacrifice for the rotation, the
                              other column will end up at the end of the area
                              after two rotations and function as seed for the
                              floodfill. This regex also does one step of
                              the floodfill from the back to the front.
                              After a certain number of loops we are certain
                              to get to a first column that must not be 
                              dropped so at some point the last column is 
                              guaranteed to consist of only \0. And we only need
                              to fill backward since the rotations will make
                              any direction backward at some point

s%.%  process column  %seg    I will replace each character (including \n)
                              in the string by the next column in reversed
                              order or an empty string if there are no more
                              interesting columns. This is therefore a right
                              rotation. There are less columns than
                              characters so this loop is long enough

    s%.%s/.(.*)/$+\0/g        Remove the next (now first) character from each
                              row (so remove the column). Because the
                              original area is not necessarily a rectangle
                              add a \0 at the end of the row so we won't run
                              out out of columns (this would cause shorter
                              rows to have no entry in the new rotated row)
                              This will not do anything for empty lines so
                              they DO get squeezed out. But that is not a 
                              problem since the problem statement says there
                              will be only one # shape so any empty lines
                              are can be safely dropped (this would not be
                              so if there could be multiple # shapes because
                              that could create a new surrounded area

    /#/                       Check if any of the remaining columns still 
                              has a #. If not all remaining columns are on 
                              the outside and can be dropped
       &&reverse"\n",/^./mg   Collect the column and add a \n to its reverse

 until$?++<$$_++              Keep doing this until we get to a multiple of
                              65536 rotations when $? waraps back around to 0
                              (this is a multiple of 4 so the area is left
                              unrotated) and an area we have seen before
                              ($$_ >= 1)
                              (so all slicing and flood filling is finished)
                              $_ having been seen in a previous rotations is
                              not a problem (though rather tricky to prove)

An dieser Stelle z

AB##J
E####GK
F# M #L
#   N#O
P####

wird ersetzt durch:

0000000
0####00
0# M #0
#   N#0
0####00

Grundsätzlich wurden alle Spalten und Zeilen, die nicht direkt an die Innenseite angrenzen, abgeschnitten. Alle übrigen Zeichen wurden durch \ 0 ersetzt. Oben und rechts befindet sich eine zusätzliche Ebene von \ 0. Alles, was übrig bleibt, ist Aufräumen:

y/\0/#/                       Replace any outside that is left by #
s/^#*\n|#+$|^#//mg            Removes the first two and last line (the only 
                              lines that can consist of purely #)
                              Removes any trailing #
                              Removes the first column of #
y;#; \n;                      Replace any remaining # by space since they 
                              are needed to fill the concave parts
                              The final \n; is not written since it is implicit
                              in the -p loop
Tonne Hospel
quelle
Arbeiten Ihre Überflutungen um Innenecken herum, wenn es welche gab?
mbomb007
@ mbomb007: Ja, da der Bereich wiederholt gedreht wird, kann er auch verwinkelten Gängen folgen. Die Schleife, die zu früh stoppt, bevor sehr dicke Mauern
abgebaut werden, ist
@ mbomb007: Aaaaund der Dickwandfehler ist jetzt behoben
Ton Hospel
Durch Kopieren und Einfügen Ihrer Lösung im Ist-Zustand (ohne Ersetzen der maskierten Zeichen) ist die Ausgabe lediglich die Eingabe, bei der alle Zeichen entfernt wurden #. Bitte überprüfen Sie meine Bash-Sitzung: codepad.org/YbCzB4O4
Ardnew
@ardnew: Ups, sorry. Denn das letzte Update hat nicht die volle Lösung repaste, und ich hätte die Weile durch eine bis ersetzen sollen. Behoben, bitte versuchen Sie es erneut
Ton Hospel
4

Javascript, 485 464 427 417 396 390 Bytes

s='indexOf';k='lastIndexOf';h="#";t=b=>b[0].map((x,i)=>b.map(x=>x[i]));i=>{m=i.split`
`;for(h of m){m[m[s](h)]=h.split``;}for(y=0;y<m.length;y++){for(z=x=0;x<m[y].length;x++){if(m[y][x]==h)break;if(m[y][s](h)<x&&m[y][k](h)>x)z++;q=t(m);if(q[y][s]h)<x&&m[y][k](h)>x)z++;if(z>2)m[y][x]=h}}for(p of m){v=p.join``.match(/\S/);e=v?p.join``:'';m[m[s](p)]=e;}m=m.join`
`;return m.replace(#/g," ")}

Ja. Ich habe es versucht. Und obwohl ich bei 485 Bytes bin, gewinne ich, weil niemand sonst Lust hatte, diese Frage zu beantworten. Also, hah!
Und außerdem bin ich mir bewusst, dass ich so viel Golf spielen kann. Ich bin im Moment nur müde. Nun, jetzt bin ich bei 396. Danke an Conor für den Großteil des Golfspiels

Bald Bantha
quelle
1
Deklarieren Sie die Variablen innerhalb der for-Schleifen außerhalb mity=z=0
Bálint