Implodiere die Box

17

ASCII-Boxen sehen folgendermaßen aus:

++    +---+    +------+    +---+    +---+
++    |   |    |      |    |   |    |   |
      |   |    |      |    |   |    |   |
+-+   |   |    |      |    |   |    |   |
+-+   |   |    |      |    |   |    +---+
      +---+    |      |    |   |
+--+           |      |    |   |    ++
|  |           |      |    |   |    ||
|  |           +------+    |   |    ||
+--+                       |   |    ||
                           +---+    ||
                                    ||
                  +-----+           ||
+------------+    |     |           ++
|            |    |     |
|            |    |     |
+------------+    +-----+

Hier einige Beispiele für dieselben implodierten ASCII-Boxen:

++    +- -+    +-    -+    +- -+    +- -+
++    | - |    | -  - |    | - |    | - |
       | |      | -- |      | |      | |
+-+    | |       |  |        "      | - |
+-+   | - |       ||        | |     +- -+
      +- -+      |  |      |   |
+--+            | -- |      | |     ++
|  |           | -  - |      "      ||
|  |           +-    -+     | |     ||
+--+                       | - |   |  |
                           +- -+   |  |
      --                            ||
     -  -         +-   -+           ||
+-  -    -  -+    | - - |           ++
| --      -- |     | = |
| --      -- |    | - - |
+-  -    -  -+    +-   -+
     -  -
      --

Hier ist ein Link zu all diesen Testfallboxen in einem einfacher zu kopierenden Format. Die Reihenfolge besteht aus allen Eingaben, gefolgt von allen Ausgaben in derselben Reihenfolge.

Ihr Ziel ist es, eine ASCII-Box als Eingabe zu verwenden und die implodierte Box zurückzugeben. Die Implosionsregeln sind:

  1. "+" ändert sich nie; Weder "-" noch "|" direkt neben "+"
  2. Ausgehend von den Ecken werden "-" und "|" Bewegen Sie sich ein Feld weiter nach innen als der gleiche Charakter, der sich näher an der Ecke befand. Wenn ein "-" und "|" würde sich jemals an die gleiche Stelle bewegen, weder bewegt.
  3. Wenn sich ein "-" und ein "-" an derselben Stelle befinden, setzen Sie dort ein "=". Wenn ein "|" und "|" bewege dich an die gleiche Stelle, setze ein "in diese Stelle. Diese zählen als zwei ihrer jeweiligen Charaktere an der gleichen Stelle, die sich in entgegengesetzte Richtungen bewegen.
  4. Zwei "-" oder zwei "|" können sich aneinander vorbeibewegen, wie im Beispiel unten links gezeigt.
  5. Wenn die Box dünn genug ist, dehnt sie sich in gleicher Weise nach außen aus und bewegt sich dabei immer von der Seite weg, an der sie begonnen hat.
  6. Das Ergebnis sollte sowohl in x- als auch in y-Richtung symmetrisch zur Mittellinie sein (Zeilenumbrüche werden ignoriert). Dies schließt Leerzeichen ein. Daher muss das Ergebnis möglicherweise mit Leerzeichen aufgefüllt werden, um dies zu erfüllen.

Regeldetails:

  1. Das ist Code-Golf, also gewinnt das kürzeste Programm in Bytes.
  2. Es gelten Standardlücken.
  3. Sie können davon ausgehen, dass jede Zeile mit einem Zeilenumbruch endet.
  4. Die einzigen Zeichen in der Eingabezeichenfolge sind "+", "-", "|", "" und "\ n" (Zeilenvorschub). Die Ausgabezeichenfolge sollte denselben Regeln folgen, wobei "=" hinzugefügt wird. und "als mögliche Zeichen.
  5. Optional können Sie am Ende der letzten Zeile eine einzelne nachgestellte Zeile einfügen.
  6. Das kleinste ASCII-Feld, das Sie verarbeiten müssen, ist das Beispiel oben links. Jede ASCII-Box hat genau 4 "+" genau an ihren Ecken.
  7. Sie müssen Felder der Größe m x nfür alle Ganzzahlen m,nso behandeln, dass 2<=m,n<256(größtmögliche Zeichenfolgengröße von 255*(255+1))
  8. Sie können davon ausgehen, dass Sie immer eine einzige gültige ASCII-Box als Eingabe erhalten.
Frikative Melone
quelle
Ich denke, Sie haben vergessen, "als mögliches Zeichen in der Ausgabe auf Ziffer 4 der
Regeldetails hinzuzufügen
Das 1x6-Beispiel ist irre, warum implodiert es nach außen? Ich denke, einer von denen ||in diesem Beispiel muss ein "oder etwas sein ...
Magic Octopus Urn
@carusocomputing Wie im Beispiel unten links bewegen sich die Wände durcheinander (das Volumen der Box ist also negativ) - Regeln 4 und 5.
Lyth
@Lyth sollte es da nicht noch ein "obwohl geben? Ich schätze das "erscheint nur auf 3 oder größer?
Magic Octopus Urn
@carusocomputing Bedenke folgendes: Wohin würde das "gehen? Links oder rechts? Es kann nicht beides sein, aber es kann auch nicht beides sein, weil das Ergebnis symmetrisch ist.
HyperNeutrino

Antworten:

15

Python 2 , 591 555 545 527 525 496 436 351 334 333 303 Bytes

s=input()
w=len(s[0])
h=len(s)
V=max(0,w/2-h)
H=max(0,h/2-w)
p=[[' ']*w]*V
q=[' ']*H
s=[q+k+q for k in p+s+p]
d,c=' -=',' |"'
exec"c,d,V,H,w,h=d,c,H,V,h,w;s=map(list,zip(*s))[::-1]\nfor j in range(h-4):q=s[V+j+2];q[H]=c[q[H]==c[2]];r=H+min(j+1,h-4-j);q[r]=c[1+(q[r]>' ')]\n"*4
for x in s:print''.join(x)

Probieren Sie es online!

EDIT : Meine alte Methode implodierte zuerst oben und unten und dann links und rechts. Stattdessen können wir die Spitze implodieren, um 90 Grad drehen und das viermal tun. Außerdem habe ich den benutzerfreundlichen Code verwendet, für diesen muss die Eingabe in der Form erfolgen, [['+', '-', '-', '-', '-', '-', '+'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['+', '-', '-', '-', '-', '-', '+']]die hässlich, aber für das Programm kürzer ist: P (Dank an Phoenix, der das abgefangen hat)

Dank an Leaky Nun für den Header-Code im TIO-Link, der zum Konvertieren von lesbaren Eingaben in computerlesbare Eingaben verwendet wird.

-85 Bytes dank Leaky Nun!
-17 Bytes durch Umschalten von Top-Implosion auf Left-Implosion, wodurch die gesamte Zeile in einer Variablen gespeichert und geändert werden kann. Vielen Dank an Leaky Nun für den Vorschlag!
-1 Byte durch Umschalten, um ein Leerzeichen zu entfernen.
-30 Bytes dank Leaky Nun!

HyperNeutrino
quelle
Weisen Sie s[0]und S[0]Variablen zu, um ein paar Bytes zu speichern
Caird Coinheringaahing
@Ilikemydog Oh, richtig. Vielen Dank!
HyperNeutrino
Sie können jeweils p=s[0]und P=S[0]mit p=z(s[0])und P=z(S[0])ersetzen und dann alle Vorkommen von z(p)mit pund alle z(P)mit ersetzen P, um 18 Byte zu sparen.
R. Kap
Sie können auch (z(s)-1)/2-pmit z(s)/2-.5-pund (p-1)/2-z(s)mit ersetzen p/2-.5-z(s), um 2 weitere Bytes zu sparen.
R. Kap
@ R.Kap Oh okay. Danke für beide Vorschläge!
HyperNeutrino
1

C (clang) , 693 Bytes

Neue Zeilen zur besseren Lesbarkeit hinzugefügt. Die ersten beiden sind erforderlich, der Rest jedoch nicht.

#define P B[i][l]
#define m malloc(8)
I(B,h,V,S,J,Z,i,j,l,n,H,W,c,C,a,z,_,L,G,u,N,M)char**B,**Z;char*L,*G,*u;{
V=strlen(B[0]);
S=J=0;
Z=m;
for(i=0,j=h-1;i<h/2+h%2;i++,j--){
for(l=0,n=V-1;l<V/2+V%2;l++,n--){
if(P!=43&&((B[i][l-1]!=43&&i<1)||(B[i-1][l]!=43&&l<1))){
H=P==45;
W=P=='|';
P=B[j][l]=B[i][n]=B[j][n]=32;
if(H){
c=(N=i+l-1)==(M=j-l+1)?61:45;
if(M<0)L=m,sprintf(L,"%*s",V,""),L[l]=L[n]=c,Z[J]=L,J++;
else B[N][l]=B[N][n]=B[M][l]=B[M][n]=c;
}
if(W){
c=(N=l+i-1)==(M=n-i+1)?34:'|';
if(M<0)G=m,sprintf(G,"|%*s%s%*s|",i-n-2,"",B[i],i-n-2,""),B[i]=B[j]=G,S++;
else B[i][N]=B[j][N]=B[i][M]=B[j][M]=c;
}
}
}
}
for(a=-J+1;a<=h+J;u=a<1?Z[-a]:a<=h?B[a-1]:Z[a-h-1],C=S+1-strlen(u)/2,printf("%*s%s\n",C>0?C:0,"",u),a++);
}

Danke für die tolle Herausforderung! Es war ziemlich knifflig, aber ich hatte trotzdem viel Spaß.

Dies nimmt die Eingabe als Befehlszeilenargumente und gibt eine mehrzeilige Zeichenfolge der implodierten Box an STDOUT aus. Golftipps werden wie immer sehr geschätzt.

Probieren Sie es online!

R. Kap
quelle