Codice golf ABC: The ASCII Box Challenge


14

Dati due numeri interi positivi, 'a' e 'b', generano una "scatola" di arte ascii che è larga un carattere e alta b . Ad esempio, con '4' e '6':

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

Semplice vero? Ecco il colpo di scena: il bordo della scatola deve essere alternato tra i caratteri "a" e "b". Questo inizia nell'angolo in alto a sinistra e continua in una spirale in senso orario. Ad esempio, l'esempio precedente con 4 e 6 dovrebbe essere

4646
6  4
4  6
6  4
4  6
6464

A e B possono essere numeri a due cifre. Ad esempio, gli ingressi "10" e "3" dovrebbero generare questo:

1031031031
1        0
3013013013

Per mantenere l'output relativamente piccolo, non è necessario supportare tre o più numeri di cifre. Inoltre, poiché gli input sono limitati a numeri interi positivi , '0' è un input non valido, che non è necessario gestire.

Ecco alcuni altri casi di test:

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

È possibile accettare input e output in qualsiasi formato ragionevole e le scappatoie standard sono vietate. Dato che si tratta di code-golf, vince la risposta più breve in byte!



Devo iniziare il motivo dall'angolo in alto a sinistra in senso orario?
Leaky Nun,

@LeakyNun Sì, è necessario.
James,

Se aè 1 è la parete sinistra o la parete destra?
Leaky Nun,

7
Il primo esempio non è sbagliato? (3,5) dovrebbe essere largo 3 e alto 5
Brian

Risposte:


4

Pyth , 65 51 byte

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

Provalo online!


4

C #, 301 byte

Sono sicuro che ci sia molto più golf che si può fare qui, ma sono solo felice di avere una soluzione che ha funzionato.

Ho trovato un bug in cui la linea di fondo era nell'ordine sbagliato, dannazione!

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;};

Vecchia versione: 280 byte

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;};

2

Python 2, 199 byte

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))

2

Rubino, 128 byte

->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}

Emette una nuova riga finale se l'altezza è 1.

Link Ideone: https://ideone.com/96WYHt


1
Puoi fare [w,h]*""invece che "%d%d"%[w,h]per 4 byte e non hai bisogno delle parentesi in giro s[q-2,w].reverse, ma allora avrai bisogno di uno spazio dopo il :, quindi -1 byte.
Giordania,

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``}

Ha sicuramente margini di miglioramento.

Modifica: salvato un byte grazie a TheLethalCoder


Penso che `${c}${a}`.repeat(l+1)potrebbe farti risparmiare un byte.
Neil,

Oh, e non e ' W=W.substr(0,a-2).replace(/./g," ")lo stesso di W=" ".repeat(a-2)? (Il tuo codice funziona davvero a=1?)
Neil,

2

C, 311 byte

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");}

Utilizza automaticamente le librerie incluse stdio.he string.h.


2

JavaScript (ES6), 171 byte

(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`

Dove \nrappresenta il carattere letterale di newline. Crea una stringa di cifre ripetute, quindi decide cosa concatenare in base alla riga su cui ci troviamo; la riga superiore è solo la sezione iniziale della stringa di cifre ripetuta, la riga inferiore (se presente) è una sezione invertita dal centro della stringa, mentre le righe intermedie vengono costruite utilizzando caratteri presi da altre parti della stringa.


Puoi usare il curry cambiando (w,h)=>in w=>h=>per salvare un byte
TheLethalCoder

0

TSQL, 291 byte

golfed:

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

Ungolfed:

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

Violino


0

Python 3, 155 148 byte

Scolpito da altri 7 byte:

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])

Sostituito 2*w+2*h-4or 1per max(1,2*w+2*h-4)e ['',s[-i-1]][w>1]per(s[-i-1]if w>1else'') .

Versione precedente:

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])
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.