Implode la scatola


17

Le caselle ASCII si presentano così:

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

Ecco alcuni esempi delle stesse caselle ASCII, implose:

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

Ecco un link a tutte queste caselle di test in un formato più facile da copiare. L'ordine è composto da tutti gli input seguiti da tutti gli output nello stesso ordine.

Il tuo obiettivo è prendere una casella ASCII come input e restituire la casella implosa. Le regole dell'implosione sono:

  1. "+" non cambia mai; né "-" o "|" direttamente adiacente a "+"
  2. A partire dagli angoli, il "-" e "|" spostarsi verso l'interno di uno spazio in più rispetto allo stesso personaggio più vicino all'angolo. Se un "-" e "|" si sposterebbe mai nello stesso punto, né si muove.
  3. Se un "-" e "-" si spostano nello stesso punto, metti un "=" in quel punto. Se un "|" e "|" spostati nello stesso punto, metti un "in quel punto. Questi contano come due dei loro rispettivi personaggi nello stesso punto muovendosi in direzioni opposte.
  4. Due "-" o due "|" possono spostarsi l'uno accanto all'altro, come mostrato nell'esempio in basso a sinistra.
  5. Se la scatola è abbastanza magra, inizierà a espandersi verso l'esterno allo stesso modo, allontanandosi sempre dal lato da cui è iniziata parte.
  6. Il risultato dovrebbe essere simmetrico lungo la linea centrale in entrambe le direzioni xey (ignorando le nuove linee); questo include gli spazi, quindi potrebbe essere necessario riempire il risultato di spazi per soddisfarlo.

Dettagli regola:

  1. Questo è code-golf, quindi vince il programma più breve in byte.
  2. Si applicano scappatoie standard.
  3. Puoi presumere che ogni riga termini con un carattere di nuova riga.
  4. Gli unici caratteri nella stringa di input saranno "+", "-", "|", "" e "\ n" (newline) e la stringa di output dovrebbe seguire le stesse regole, con l'aggiunta di "=" e "come possibili personaggi.
  5. Opzionalmente potresti avere una sola nuova riga finale alla fine dell'ultima riga.
  6. La casella ASCII più piccola che devi gestire è l'esempio in alto a sinistra. Ogni casella ASCII avrà esattamente 4 "+" s, esattamente ai suoi angoli.
  7. Dovrai gestire caselle di dimensioni m x nper qualsiasi numero intero m,ntale 2<=m,n<256(la dimensione della stringa più grande possibile di 255*(255+1))
  8. Puoi presumere che otterrai sempre una singola casella ASCII valida come input.

Penso che ti sia dimenticato di aggiungere "come possibile carattere nell'output sul numero 4 dei Dettagli regola. Modifica: possiamo presumere che l'input non abbia righe vuote?
Theraot,

Quell'esempio 1x6 è funky, perché implode verso l'esterno? Penso che uno di quelli ||in quell'esempio debba essere un "o qualcosa del genere ...
Magic Octopus Urn

@carusocomputazione come nell'esempio in basso a sinistra, le pareti si muovono l'una nell'altra (quindi il volume della scatola è negativo) - regole 4 e 5.
Lyth

@Lyth non dovrebbe esserci ancora un pensiero "? Immagino "che appaia solo su 3 di larghezza o superiore?
Magic Octopus Urn

@carusocomputing Considera questo: dove andrebbe "? A sinistra o a destra? Non può essere entrambi, ma non può essere neanche perché il risultato è simmetrico.
HyperNeutrino,

Risposte:


15

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

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)

Provalo online!

EDIT : Il mio vecchio metodo prima implode in alto e in basso, quindi a sinistra e a destra. Invece, possiamo implodere la parte superiore, ruotare di 90 gradi e farlo 4 volte. Inoltre, stavo usando il codice intuitivo, questo richiede che l'input sia nella forma [['+', '-', '-', '-', '-', '-', '+'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['+', '-', '-', '-', '-', '-', '+']]brutta ma più breve per il programma: P (Grazie a Phoenix per averlo scoperto)

Riconoscimenti a Leaky Nun per il codice dell'intestazione nel collegamento TIO utilizzato per convertire input leggibili dall'uomo in input leggibili dal computer.

-85 byte grazie a Leaky Nun!
-17 byte passando da implosione superiore a implosione sinistra che consente di archiviare e modificare l'intera riga in una variabile. Grazie a Leaky Nun per il suggerimento!
-1 byte cambiando le cose per rimuovere uno spazio.
-30 byte grazie a Leaky Nun!


Assegna s[0]e S[0]alle variabili per salvare alcuni byte
caird coiningaingaahing

@Ilikemydog Oh, giusto. Grazie!
HyperNeutrino,

È possibile sostituire p=s[0]e P=S[0]con p=z(s[0])e P=z(S[0]), rispettivamente, e quindi sostituire tutte le occorrenze di z(p)con pe tutte z(P)con Pper salvare 18 byte.
R. Kap

È inoltre possibile sostituire (z(s)-1)/2-pcon z(s)/2-.5-pe (p-1)/2-z(s)con p/2-.5-z(s)per salvare altri 2 byte.
R. Kap

@ R.Kap Oh okay. Grazie per entrambi i suggerimenti!
HyperNeutrino,

1

C (clang) , 693 byte

Nuove righe aggiunte per la leggibilità. I primi due sono richiesti ma il resto no.

#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++);
}

Grazie per la grande sfida! È stato piuttosto complicato, ma mi sono comunque divertito molto.

Ciò accetta l'input come argomenti della riga di comando e restituisce a STDOUT una stringa a più righe della casella implosa. Come sempre, i consigli sul golf sono molto apprezzati.

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.