Code golf ABC's: The ASCII Box Challenge

14

Étant donné deux nombres entiers positifs, «a» et «b», affichez une «boîte» ascii-art qui est un caractère large et b caractères haut. Par exemple, avec «4» et «6»:

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

C'est simple, non? Voici la torsion: la bordure de la boîte doit être composée des caractères "a" et "b" alternés. Cela commence dans le coin supérieur gauche et se poursuit dans une spirale dans le sens horaire. Par exemple, l'exemple précédent avec 4 et 6 devrait être

4646
6  4
4  6
6  4
4  6
6464

A et B peuvent être des nombres à deux chiffres. Par exemple, les entrées "10" et "3" devraient produire ceci:

1031031031
1        0
3013013013

Afin de conserver une sortie relativement petite, vous n'avez pas à prendre en charge trois numéros ou plus. De plus, comme les entrées sont limitées aux entiers positifs , «0» est une entrée non valide, que vous n'avez pas à gérer.

Voici quelques cas de test supplémentaires:

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

Vous pouvez prendre l'entrée et la sortie dans n'importe quel format raisonnable, et les failles standard sont interdites. Puisqu'il s'agit de code-golf, la réponse la plus courte en octets gagne!

James
la source
En relation
James
Dois-je commencer le motif dans le coin supérieur gauche dans le sens horaire?
Leaky Nun
@LeakyNun Oui, c'est nécessaire.
James
Si aest 1, est-ce le mur de gauche ou le mur de droite?
Leaky Nun
7
Le premier exemple n'est-il pas faux? (3,5) devrait être 3 de large et 5 de haut
Brian

Réponses:

4

Pyth , 65 51 octets

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

Essayez-le en ligne!

Leaky Nun
la source
4

C #, 301 octets

Je suis sûr qu'il y a beaucoup plus de golf à faire ici, mais je suis juste content d'avoir une solution qui a fonctionné.

J'ai trouvé un bug où le résultat était dans le mauvais ordre, bon sang!

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

Ancienne version: 280 octets

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
la source
2

Python 2, 199 octets

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
la source
2

Rubis, 128 octets

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

Affiche une nouvelle ligne de fin si la hauteur est 1.

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

Leibrug
la source
1
Vous pouvez le faire à la [w,h]*""place de "%d%d"%[w,h]4 octets, et vous n'avez pas besoin des parenthèses s[q-2,w].reverse, mais vous aurez besoin d'un espace après le :, donc -1 octet.
Jordan
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``}

Il y a sûrement matière à amélioration.

Edit: enregistré un octet grâce à TheLethalCoder

user2428118
la source
Je pense que cela `${c}${a}`.repeat(l+1)pourrait vous faire économiser un octet.
Neil
Oh, et ce n'est pas W=W.substr(0,a-2).replace(/./g," ")la même chose que W=" ".repeat(a-2)? (Votre code fonctionne-t-il réellement a=1?)
Neil
2

C, 311 octets

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

Utilise automatiquement les bibliothèques stdio.het string.h.

ncke
la source
2

JavaScript (ES6), 171 octets

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

\nreprésente le caractère de nouvelle ligne littéral. Crée une chaîne de chiffres répétée, puis décide quoi concaténer en fonction de la ligne sur laquelle nous sommes; la ligne du haut n'est que la tranche initiale de la chaîne de chiffres répétée, la ligne du bas (le cas échéant) est une tranche inversée du milieu de la chaîne, tandis que les lignes intermédiaires sont constituées à l'aide de caractères provenant d'autres parties de la chaîne.

Neil
la source
Vous pouvez utiliser le curry en changeant (w,h)=>pour w=>h=>enregistrer un octet
TheLethalCoder
0

TSQL, 291 octets

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

Non 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

Violon

t-clausen.dk
la source
0

Python 3, 155 148 bytes

Golfé 7 octets de plus:

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

Remplacé 2*w+2*h-4or 1par max(1,2*w+2*h-4)et ['',s[-i-1]][w>1] pour (s[-i-1]if w>1else'').

Version précédente:

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
la source