Código golf ABC's: el desafío de la caja ASCII

14

Dados dos números enteros positivos, 'A' y 'b', salida de una "caja" ascii-arte que es un caracteres de ancho y b caracteres de altura. Por ejemplo, con '4' y '6':

****
*  *
*  *
*  *
*  *
****

Simple derecho? Aquí está el giro: el borde del cuadro debe ser los caracteres de "a" y "b" alternando. Esto comienza en la esquina superior izquierda y continúa en una espiral en el sentido de las agujas del reloj. Por ejemplo, el ejemplo anterior con 4 y 6 debería ser

4646
6  4
4  6
6  4
4  6
6464

A y B pueden ser números de dos dígitos. Por ejemplo, las entradas "10" y "3" deberían mostrar esto:

1031031031
1        0
3013013013

Para mantener la salida relativamente pequeña, no tiene que admitir tres o más números de dígitos. Además, dado que las entradas están restringidas a enteros positivos , '0' es una entrada no válida, que no tiene que manejar.

Aquí hay algunos casos de prueba más:

Input: (3, 5)
Output:

353
5 5
3 3
5 5
353

Input: (1, 1)
Output:

1

Input: (4, 4)
Output:

4444
4  4
4  4
4444

Input: (27, 1)
Output:

271271271271271271271271271

Input: (1, 17)
Output:

1
1
7
1
1
7
1
1
7
1
1
7
1
1
7
1
1

Input: (12, 34):
Output:

123412341234
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
4          1
3          2
2          3
1          4
432143214321

Puede tomar entradas y salidas en cualquier formato razonable, y las lagunas estándar están prohibidas. Como se trata de código de golf, ¡la respuesta más corta en bytes gana!

DJMcMayhem
fuente
Relacionado
DJMcMayhem
¿Debo comenzar el patrón desde la esquina superior izquierda en sentido horario?
Leaky Nun
@LeakyNun Sí, eso es necesario.
DJMcMayhem
Si aes 1, ¿es la pared izquierda o la pared derecha?
Leaky Nun
77
¿No está mal el primer ejemplo? (3,5) debe tener 3 de ancho y 5 de alto
Brian

Respuestas:

4

Pyth , 65 51 bytes

juXGhHX @ GhHeH @ jkQ ~ hZ {s [+ L] 0UhQ + R] thQUeQ + L] teQ_UhQ + R] 0_UeQ) m *; hQeQ
AQjuXGhHX @ GhHeH @ jkQ ~ hZ {s [, L0G, RtGH_, LtHG_, R0H) m *; GH

Pruébalo en línea!

Monja permeable
fuente
4

C #, 301 bytes

Estoy seguro de que se puede hacer mucho más golf aquí, pero estoy feliz de haber obtenido una solución que funcionó.

Encontré un error donde el resultado final estaba en el orden incorrecto, ¡maldición!

a=>b=>{var s=new string[b];int i=4,c=b-2,k=a;var t="";for(;i++<2*(a+b);)t+=t.EndsWith(a+"")?b:a;s[0]=t.Substring(0,a);if(b>2){for(i=0;++i<b-1;)s[i]=(a<2?t.Substring(1,c):t.Substring(2*a+c))[c-i]+(a>1?new string(' ',a-2)+t.Substring(a,c)[i-1]:"");for(;--k>=0;)s[b-1]+=t.Substring(a+c,a)[k];}return s;};

Versión antigua: 280 bytes

a=>b=>{var s=new string[b];int i=4,c=b-2;var t="";for(;i++<2*(a+b);)t+=t.EndsWith(a+"")?b:a;s[0]=t.Substring(0,a);if(b>2){for(i=0;++i<b-1;)s[i]=(a<2?t.Substring(1,c):t.Substring(2*a+c))[c-i]+(a>1?new string(' ',a-2)+t.Substring(a,c)[i-1]:"");s[b-1]=t.Substring(a+c,a);}return s;};
TheLethalCoder
fuente
2

Python 2, 199 bytes

w,h=input()
s=(`w`+`h`)*w*h
r=[s[:w]]+[[" "for i in[0]*w]for j in[0]*(h-2)]+[s[w+h-2:2*w+h-2][::-1]]*(h>1)
for y in range(1,h-1):r[y][w-1],r[y][0]=s[w+y-1],s[w+h+w-2-y]
print"\n".join(map("".join,r))
Loovjo
fuente
2

Ruby, 128 bytes

->w,h{s="%d%d"%[w,h]*q=w+h;a=[s[0,w]];(h-2).times{|i|a<<(s[2*q-5-i].ljust(w-1)+s[w+i,1])[-w,w]};puts a,h>1?(s[q-2,w].reverse):p}

Salidas de nueva línea si la altura es 1.

Enlace de Ideone: https://ideone.com/96WYHt

Leibrug
fuente
1
Puede hacerlo en [w,h]*""lugar de "%d%d"%[w,h]4 bytes, y no necesita los paréntesis s[q-2,w].reverse, pero luego necesitará un espacio después del :byte, así que -1 byte.
Jordania
2

JavaScript 213 212 202

c=>a=>{for(a=$=a,c=_=c,l=c*a*2,b=0,s=Array(l+1).join(c+""+a),O=W=s.substr(0,a),W=W.substr(0,a-2).replace(/./g," ");--_;)O+="\n"+s[l-c+_]+W+s[$++];return O+"\n"+[...s.substr(l-a-c+1,a)].reverse().join``}

Seguramente tiene margen de mejora.

Editar: guardado un byte gracias a TheLethalCoder

usuario2428118
fuente
Creo que `${c}${a}`.repeat(l+1)podría ahorrarte un byte.
Neil
Ah, y no es lo W=W.substr(0,a-2).replace(/./g," ")mismo que W=" ".repeat(a-2)? (¿Su código realmente funciona a=1?)
Neil
2

C, 311 bytes

char s[5];sprintf(s,"%d%d",a, b);int z=strlen(s);int i=0;while(i<a){printf("%c",s[i++%z]);}if(b>2){i=1;while(i<b-1){char r=s[(a+i-1)%z];char l=s[(2*a+2*b-i-4)%z];if(a>1){printf("\n%c%*c",l,a-1,r);}else{printf("\n%c",l);}i++;}}printf("\n");if(b>1){i=0;while(i<a){printf("%c",s[(2*a+b-i-3)%z]);i++;}printf("\n");}

Utiliza automáticamente bibliotecas incluidas stdio.hy string.h.

ncke
fuente
2

JavaScript (ES6), 171 bytes

(w,h)=>[...Array(h)].map((_,i)=>i?++i<h?(w>1?s[p+p+1-i]+` `.repeat(w-2):``)+s[w+i-2]:[...s.substr(p,w)].reverse().join``:s.slice(0,w),s=`${w}${h}`.repeat(p=w+h-2)).join`\n`

Donde \nrepresenta el carácter de nueva línea literal. Crea una cadena de dígitos repetida, luego decide qué concatenar en función de en qué fila estamos; la fila superior es solo la porción inicial de la cadena de dígitos repetida, la fila inferior (si la hay) es una porción invertida desde el medio de la cadena, mientras que las filas intermedias se construyen usando caracteres tomados de otras partes de la cadena.

Neil
fuente
Puedes usar curry cambiando (w,h)=>a w=>h=>para guardar un byte
TheLethalCoder
0

TSQL, 291 bytes

Golfizado:

DECLARE @ INT=5,@2 INT=4

,@t INT,@z varchar(max)SELECT @t=iif(@*@2=1,1,(@+@2)*2-4),@z=left(replicate(concat(@,@2),99),@t)v:PRINT iif(len(@z)=@t,left(@z,@),iif(len(@z)>@,right(@z,1)+isnull(space(@-2)+left(@z,1),''),reverse(@z)))SET @z=iif(len(@z)=@t,stuff(@z,1,@,''),substring(@z,2,abs(len(@z)-2)))IF @<=len(@z)goto v

Sin golf:

DECLARE @ INT=5,@2 INT=4

,@t INT,@z varchar(max)
SELECT @t=iif(@*@2=1,1,(@+@2)*2-4),@z=left(replicate(concat(@,@2),99),@t)

v:
  PRINT
    iif(len(@z)=@t,left(@z,@),iif(len(@z)>@,right(@z,1)
      +isnull(space(@-2)+left(@z,1),''),reverse(@z)))
  SET @z=iif(len(@z)=@t,stuff(@z,1,@,''),substring(@z,2,abs(len(@z)-2)))
IF @<=len(@z)goto v

Violín

t-clausen.dk
fuente
0

Python 3, 155 148 bytes

Golfed de 7 bytes más:

p=print
def f(w,h):
 s=((str(w)+str(h))*w*h)[:2*w+2*h-4or 1];p(s[:w])
 for i in range(h-2):p(['',s[-i-1]][w>1]+' '*(w-2)+s[w+i])
 p(s[1-h:1-h-w:-1])

Sustituido 2*w+2*h-4or 1por max(1,2*w+2*h-4)y ['',s[-i-1]][w>1]para (s[-i-1]if w>1else'').

Versión anterior:

p=print
def f(w,h):
 s=((str(w)+str(h))*w*h)[:max(1,2*w+2*h-4)];p(s[:w])
 for i in range(h-2):p((s[-i-1]if w>1else'')+' '*(w-2)+s[w+i])
 p(s[1-h:1-h-w:-1])
RootTwo
fuente