Code Golf ABC: Die ASCII Box Challenge


14

Bei zwei positiven Ganzzahlen, 'a' und 'b', wird ein ASCII-Kunst- "Kästchen" ausgegeben, das a Zeichen breit und b Zeichen groß ist. Zum Beispiel mit '4' und '6':

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

Einfach richtig? Hier ist die Wendung: Der Rand der Box muss die Zeichen "a" und "b" abwechselnd sein. Dies beginnt in der oberen linken Ecke und setzt sich in einer Spirale im Uhrzeigersinn fort. Zum Beispiel sollte das vorherige Beispiel mit 4 und 6 sein

4646
6  4
4  6
6  4
4  6
6464

A und B können zweistellige Zahlen sein. Beispielsweise sollten die Eingänge "10" und "3" Folgendes ausgeben:

1031031031
1        0
3013013013

Um die Ausgabe relativ klein zu halten, müssen Sie keine drei- oder mehrstelligen Zahlen unterstützen. Da Eingaben auf positive Ganzzahlen beschränkt sind, ist '0' eine ungültige Eingabe, die Sie nicht verarbeiten müssen.

Hier sind einige weitere Testfälle:

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

Sie können Eingaben und Ausgaben in jedem vernünftigen Format vornehmen, und Standardlücken sind verboten. Da dies Codegolf ist, gewinnt die kürzeste Antwort in Bytes!



Muss ich das Muster von der oberen linken Ecke im Uhrzeigersinn starten?
Undichte Nonne

@LeakyNun Ja, das ist notwendig.
DJMcMayhem

Wenn aes 1 ist, ist es die linke Wand oder die rechte Wand?
Undichte Nonne

7
Ist das erste Beispiel nicht falsch? (3,5) sollte 3 breit und 5 groß sein
Brian

Antworten:



4

C # 301 Bytes

Ich bin mir sicher, dass hier noch viel mehr Golf gespielt werden kann, aber ich bin froh, dass ich eine Lösung gefunden habe, die funktioniert hat.

Ich habe einen Fehler gefunden, bei dem das Endergebnis in der falschen Reihenfolge war, verdammt!

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

Alte Version: 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;};

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

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}

Gibt eine nachgestellte Newline aus, wenn height 1 ist.

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


1
Sie können [w,h]*""statt "%d%d"%[w,h]für 4 Bytes auch die Klammern verwenden s[q-2,w].reverse, benötigen dann aber ein Leerzeichen nach dem :, also -1 Byte.
Jordanien

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

Es gibt sicherlich Raum für Verbesserungen.

Bearbeiten: Ein Byte dank TheLethalCoder gespeichert


Ich denke `${c}${a}`.repeat(l+1), Sie könnten ein Byte sparen.
Neil

Oh, und ist das nicht W=W.substr(0,a-2).replace(/./g," ")dasselbe wie W=" ".repeat(a-2)? (Funktioniert Ihr Code tatsächlich für 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");}

Verwendet automatisch eingeschlossene Bibliotheken stdio.hund 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`

Wobei \ndas wörtliche Zeilenumbruchzeichen darstellt. Erstellt eine sich wiederholende Ziffernfolge und entscheidet dann anhand der Zeile, in der wir uns befinden, was verkettet werden soll. Die obere Reihe ist nur der erste Abschnitt der sich wiederholenden Ziffernfolge, die untere Reihe (falls vorhanden) ist ein umgekehrter Abschnitt von der Mitte der Zeichenfolge, während dazwischen liegende Zeilen aus Zeichen aufgebaut werden, die aus anderen Teilen der Zeichenfolge stammen.


Sie können Currying verwenden, indem Sie zu ändern (w,h)=>, w=>h=>um ein Byte zu speichern
TheLethalCoder

0

TSQL, 291 Bytes

Golf gespielt:

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

Geige


0

Python 3, 155 - 148 Bytes

Ab 7 weiteren Bytes golfen:

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

Ersetzt 2*w+2*h-4or 1für max(1,2*w+2*h-4)und ['',s[-i-1]][w>1]für (s[-i-1]if w>1else'').

Vorherige Version:

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])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.