Rechteckiges Pseudofractal

13

Tor

Ziel des Programms ist es, ein ASCII-Kunstrechteck zu zeichnen, dessen Größe sich horizontal und vertikal abwechselt. Jedes Mal, wenn sich die Größe des Rechtecks ​​verdoppelt, wird der zusätzliche Bereich durch ein anderes Zeichen dargestellt und die vorherigen Bereiche bleiben unverändert. Die beiden kleinsten Abschnitte enthalten jeweils ein Zeichen und dürfen sich in einer beliebigen Ecke befinden.

Das Programm akzeptiert eine einzelne Ganzzahl als Eingabe und definiert die Anzahl der Abschnitte, die das vollständige Rechteck enthält.

Andere externe Ressourcen oder Eingaben sind nicht zulässig.

Sample Ein- und Ausgabe

10

ABDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
CCDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ

Auswahlkriterium

Der kürzeste Code in einer Woche gewinnt die Punkte.

Hand-E-Food
quelle
Was soll die Ausgabe für Nicht-Potenzen von 4 sein?
Marinus
Muss der Ausgang der Reihenfolge A, B, C usw. entsprechen?
Kendall Frey
2
@marinus Was ist das Besondere an Potenzen von 4? Vielleicht haben Sie das Beispiel falsch verstanden?
Kendall Frey
@KendallFrey, nein, es müssen nur n eindeutige druckbare Zeichen vorhanden sein.
Hand-E-Food
Muss es genau in der oberen linken Ecke wiederkehren
Mniip

Antworten:

10

APL, 25 Zeichen / Byte *

{⍉⍣⍵⊃{a,⍺⍴⍨⍴a←⍉⍪⍵}/⌽⍵↑⎕A}

Explosionszeichnung

{                   ⍵↑⎕A}   ⍝ take the first ⍵ letters
    ⊃{           }/⌽        ⍝ fold over them, using the first one as initial accum. value
            a←⍉⍪⍵           ⍝    ensure the accum. is a table, transpose it and call it 'a'
        ⍺⍴⍨⍴                ⍝    make a table as large as 'a' filled with the next letter
      a,                    ⍝    append it to the right of 'a' and loop as new accumulator
 ⍉⍣⍵                        ⍝ transpose the result as many times as the original ⍵ number

Beispiele

      {⍉⍣⍵⊃{a,⍺⍴⍨⍴a←⍉⍪⍵}/⌽⍵↑⎕A}¨⍳8
A AB  AB  ABDD  ABDD  ABDDFFFF  ABDDFFFF  ABDDFFFFHHHHHHHH
      CC  CCDD  CCDD  CCDDFFFF  CCDDFFFF  CCDDFFFFHHHHHHHH
                EEEE  EEEEFFFF  EEEEFFFF  EEEEFFFFHHHHHHHH
                EEEE  EEEEFFFF  EEEEFFFF  EEEEFFFFHHHHHHHH
                                GGGGGGGG  GGGGGGGGHHHHHHHH
                                GGGGGGGG  GGGGGGGGHHHHHHHH
                                GGGGGGGG  GGGGGGGGHHHHHHHH
                                GGGGGGGG  GGGGGGGGHHHHHHHH

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ *: APL kann in einem eigenen (älteren) Einzelbyte -Zeichensatz geschrieben werden, der APL-Symbole den oberen 128-Byte-Werten zuordnet
. Aus diesem Grund kann ein Programm mit N Zeichen , das nur ASCII-Zeichen und APL-Symbole verwendet, als N Byte lang betrachtet werden.

Tobia
quelle
9

GolfScript, 30 Zeichen

~(,[0`]{{[49+]1$,*+}+%zip}@/n*

Beispiel ( online ausführen ):

> 7
01335555
22335555
44445555
44445555
66666666
66666666
66666666
66666666
Howard
quelle
Dies erzeugt die falsche Ausgabe für gerade Zahlen, wie die in der Frage ...
Timwi
@ Timwi Ich habe es gerade getestet und es funktioniert für mich. Die Ausgabe ist transponiert, aber die Ausrichtung wurde in der Frage nicht angegeben.
Howard
Okay, ich glaube ich war damals zu streng :)
Timwi
@Howard Hm, so verstehe ich "und die bisherigen Bereiche bleiben unverändert". Er sagt, die ersten beiden Zeichen könnten sich in einer Ecke befinden, aber er sagt nicht, dass sich die Ausrichtung ändern könnte.
Martin Ender
7

Python 2.7 - 85 103

Dies verwendet die zip(*s)Syntax, um die Liste fortlaufend zu transponieren. Vielen Dank an Daniel für seinen Tipp, der 12 Charaktere rasiert hat! Rasieren Sie sich dann noch ein paar Mal, indem Sie Zahlen anstelle von Buchstaben verwenden.

s=[]
for i in range(input()):x=1<<i/2;s=zip(*s+[chr(65+i)*x]*x)
for i in s:print''.join(i)

Auch wird dies 1<<xeher verwendet, als dass 2**xdie Bitverschiebung eine niedrigere (?) Priorität hat. Beobachten:

>>> 1<<(2*3)
64
>>> 1<<2*3
64
>>> 2**2*3
12
>>> 2**(2*3)
64

Und einige Ausgaben:

10
01335555777777779999999999999999
22335555777777779999999999999999
44445555777777779999999999999999
44445555777777779999999999999999
66666666777777779999999999999999
66666666777777779999999999999999
66666666777777779999999999999999
66666666777777779999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999

quelle
1
Nett. Sie können es mit etwas kürzen for i in s:print''.join(i).
Daniel Lubarov
5

Rubin, 88

Liest N von der Standardeingabe.

s=[?A]
66.upto(64+gets.to_i){|i|x=i.chr*y=s.size;i%2<1?s.map!{|r|r+x}:s+=[x*2]*y}
puts s

Anwendungsbeispiel für N = 8:

echo 8 | rectangular-pseudo-fractal.rb

Ausgabe:

ABDDFFFFHHHHHHHH
CCDDFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH

N = 10

echo 10 | rectangular-pseudo-fractal.rb

Ausgabe:

ABDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
CCDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
Paul Prestidge
quelle
Wie sieht die Ausgabe aus?
@LegoStormtroopr hat einige Beispiele hinzugefügt, es ist jedoch genau das gleiche Format wie in der Frage.
Paul Prestidge
4

J 57, 43

(,`,.@.(=/@$@[)$${&a.@(66+2&^.@#@,)^:)1$'A'

Beispiele:

5 (,`,.@.(=/@$@[)$${&a.@(66+2&^.@#@,)^:)1$'A'
ABDDFFFF
CCDDFFFF
EEEEFFFF
EEEEFFFF

7 (,`,.@.(=/@$@[)$${&a.@(66+2&^.@#@,)^:)1$'A'
ABDDFFFFHHHHHHHH
CCDDFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
Barbermot
quelle
C und D erstrecken sich beide horizontal. Sie sollten sich horizontal und vertikal abwechseln.
Hand-E-Food
@ Hand-E-Food hast du recht. Vielen Dank für den Hinweis. Ich habe Code (und Post) behoben.
Barbermot
4

MATLAB, 86 Zeichen

Mein kürzester Versuch in MATLAB, gepimpt von @flawr (zweimal!):

function M=f(n)
M='';
if n
M=cat(mod(n,2)+1,f(n-1),64+n*ones(2.^fix(n/2-[.5,1])));
end

Beispielausgabe:

>> disp(f(7))
ACEEGGGG
BCEEGGGG
DDEEGGGG
DDEEGGGG
FFFFGGGG
FFFFGGGG
FFFFGGGG
FFFFGGGG
knedlsepp
quelle
Dadurch sparen Sie einige Bytes:function M=f(n) M=''; if n M=cat(mod(n,2)+1,f(n-1),64+n*ones(2.^fix([n-1,n-2]/2))); end
Fehler
@flawr: Oh! Offensichtlich!
Knedlsepp
Speichern Sie ein weiteres Byte durch Ersetzen des Arguments von fixdurch fix(n/2-[.5,1])PS: Wirklich schöne Lösung mit cat, wusste nicht, über diese Verwendung, wo Sie die Dimension wählen können =)
Fehler
@flawr: Mir scheint, ich bin ziemlich verschwenderisch. ;-)
knedlsepp
Mir ist gerade aufgefallen, dass du neu hier bist, also willkommen bei codegolf.SE, es ist schön, a.) Noch ein paar Matlab-Junkies zu haben, b.) Hier Deutsch zu sprechen (nehme ich an)!
Fehler
3

q [73 Zeichen]

{"c"$64+{n:x 0;m:x 1;if[2>n;m:(),m];(o;$[n-2*n div 2;,';,][m;(#m;#m 0)#o:n+1])}/[x-1;(1;1)]1}

Beispiel

10
"ABDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ"
"CCDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ"
"EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ"
"EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ"
"GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ"
"GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ"
"GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ"
"GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"

3
"AB"
"CC"

6
"ABDDFFFF"
"CCDDFFFF"
"EEEEFFFF"
"EEEEFFFF"
Nyi
quelle
3

Sclipting , 59 Zeichen

❶塊갠分감⓶左貶終辦감標가⓺貶⓹開上❶❶貶雙是不⒉갠乘⒉終가①上뀀❷②갠分小是增終❸⓷另要감右⓶갠加⓶終丟字⓶終丟겠終

(Dieses Programm könnte etwas kürzer sein, wenn ich Anweisungen für den Logarithmus zur Basis 2 hätte, aber das tue ich nicht, also mache ich es manuell mit einer Schleife.)

Kommentierter Code

n ist der Eingang.

❶ | n n

f = i => (1 << (i/2)) - 1;
塊갠分감⓶左貶終 | n n f

w = f(n);
辦 | n w f

d = 1;
감 | n w f d

s = "";
標 | n w f d M [s]

for (y in [0..f(n-1)])
가⓺貶⓹開上 | w d M [s] y

    if ((y & (y-1)) == 0) d *= 2;
    ❶❶貶雙是不⒉갠乘⒉終 | w d M [s] y

    for (x in [0..w])
    가①上 | w d M [s] y x

        c = 64; // '@'
        뀀 | w d M [s] y x c

        if (x < d/2) c++;
        ❷②갠分小是增終 | w d M [s] y x c

        a = x | y;
        ❸⓷另 | w d M [s] y c a

        while (a > 0) { a >>= 1; c += 2; }
        要감右⓶갠加⓶終丟 | w d M [s] y c

        s += (char) c;
        字⓶ | w d M [s] y
    終丟 | w d M [s]

    s += "\n"
    겠 | w d M [s]
終

Ausgabe

Für n= 6:

ABDDFFFF
CCDDFFFF
EEEEFFFF
EEEEFFFF

Natürlich können Sie 뀀( @) auch in ein beliebiges anderes Basiszeichen ändern , z. B. mit (Leerzeichen) und n= 7:

!"$$&&&&
##$$&&&&
%%%%&&&&
%%%%&&&&
''''''''
''''''''
''''''''
''''''''

Die höchste Zahl, die das Programm nicht verlängert, ist (= 255), was uns ( n= 8 dieses Mal) ergibt :

Āāăăąąąąćććććććć
ĂĂăăąąąąćććććććć
ĄĄĄĄąąąąćććććććć
ĄĄĄĄąąąąćććććććć
ĆĆĆĆĆĆĆĆćććććććć
ĆĆĆĆĆĆĆĆćććććććć
ĆĆĆĆĆĆĆĆćććććććć
ĆĆĆĆĆĆĆĆćććććććć

Wenn wir das Programm 1 Zeichen länger machen, zB 냟및(= \u4DFF) und n= 9, erhalten wir:

一丁七七丅丅丅丅万万万万万万万万
丂丂七七丅丅丅丅万万万万万万万万
丄丄丄丄丅丅丅丅万万万万万万万万
丄丄丄丄丅丅丅丅万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
Timwi
quelle
3

C # 239 185 182 180 Bytes

C # hat nichts mit den weniger ausführlichen Sprachen zu tun.

using C=System.Console;
class P{
    static void Main(string[]a){
        for(int x,i,n=int.Parse(a[0]);n-->0;C.CursorTop=0)
            for(i=1<<n,x=1<<n/2+n%2;i-->0;)
                C.Write((char)(n+33)+(i%x<1?"\n":""));
    }
}

Ausgabe, Zeichen für die Hübschheit ausgewählt:

!"$$&&&&((((((((****************
##$$&&&&((((((((****************
%%%%&&&&((((((((****************
%%%%&&&&((((((((****************
''''''''((((((((****************
''''''''((((((((****************
''''''''((((((((****************
''''''''((((((((****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
Hand-E-Food
quelle
1
Nicht sicher , wie Sie gezählt, aber ich zählte 184. Sie können zwei Zeichen speichern , indem Sie die Klammern von der äußeren Notwasserung forSchleife, so dass 182
Bob
Vielen Dank @ Bob! Ich muss bei der Mikrooptimierung falsch gezählt haben.
Hand-E-Food
2

PERL, 122 Zeichen

$N=<>;$x=$r=1;do{$_=chr$a+++65;$s=$x;$o=$_ x$s;$o.=$_++x$s,$s*=2while$N+65>ord++$_;print"$o\n"x$r;$r=$x;$x*=2}while++$a<$N

mit zusätzlichen Leerzeichen:

$N=<>;
$x=$r=1;
do{
    $_=chr$a+++65;
    $s=$x;
    $o=$_ x$s;
    $o.=$_++x$s,$s*=2 
        while $N+65>ord++$_;
    print "$o\n"x$r;
    $r=$x;
    $x*=2
} while++$a<$N

Ausgabe:

$ echo 8 | perl pseudo-fractal.pl
ABDDFFFFHHHHHHHH
CCDDFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
Tomas
quelle
1

PERL,  94   81 Zeichen

$N=$_;$_=$:=A;$h=1;++$i%2?s/$/$:x$h/gem:($_.=($/.$:x2x$h)x$h,$h*=2)while++$:,--$N

Es konstruiert das Fraktal iterativ Buchstabe für Buchstabe und fügt neue Zeilen und Spalten sowie Zeilen und Spalten hinzu ... Verwendet dazu einfache Zeichenfolgenoperationen. Beachten Sie, dass ich die Standardvariable anstelle des Buchstabens 1 missbrauche, um Syntaxzucker zuzulassen (wie das Weglassen von Leerzeichen $:x2usw.).

Mit zusätzlichen Leerzeichen und Kommentaren:

$N=$_;
$_=$:=A;                    # $: is current letter
$h=1;

++$i%2? 
s/$/$:x$h/gem:              # every odd run - add "columns"
($_.=($/.$:x2x$h)x$h,$h*=2) # every even run - add "rows"
while++$:,--$N              # iterate over letters

Einige Ausgaben:

$ echo 8 | perl -p pseudo-fractal.fill.pl.5a5
ABDDFFFFHHHHHHHH
CCDDFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
Tomas
quelle
1

Sclipting , 45 Zeichen

가⓶貶上倘감雙⓶壹長⓸講增字⓶復⓷是標⓷各①合終并不⓶梴❸⓶疊合終不뀐標뀐并終終⓶丟各겠終

Diese Lösung funktioniert völlig anders als die andere Sclipting-Lösung. Es ist viel langweiliger, aber es ist kürzer ...

Kommentiert

for i in [0..n-1]
가⓶貶上
    if (i != 0)
    倘
        i &= 1
        감雙
        e = list[0].Length
        ⓶壹長
        c = ((char) (c[0] + 1)).Repeat(e)
        ⓸講增字⓶復
        if (i)
        ⓷是
            concatenate c onto every element of list
            標⓷各①合終并
        else
        不
            concatenate c.Repeat(list.Length) onto list
            ⓶梴❸⓶疊合
        終
    else (i.e., i == 0)
    不
        c = "A"
        뀐
        list = ["A"]
        標뀐并
    終
終
concatenate "\n" to every element in list
⓶丟各겠終
Timwi
quelle
1

Delphi 348 || 449 mit Einzug

Ohne Einzug

var inp,j,i,x: integer;s:string;L:TStringlist;begin L:=TStringList.Create;readln(s);inp:=StrToIntDef(s,4);if inp<4then inp:=4;s:='';l.Add('AB');for I:=2to inp-1do begin j:=Length(L[0]);if i mod 2=0then for x:=0to L.Count-1do L.Add(s.PadLeft(j,Chr(65+i)))else for x:=0to L.Count-1do L[x]:=L[x]+s.PadLeft(j,Chr(65+i));end;Write(L.GetText);readln;end.

Mit Einzug

var
  inp,j,i,x: integer;
  s:string;
  L:TStringlist;
begin
  L:=TStringList.Create;
  readln(s);
  inp:=StrToIntDef(s,4);
  if inp<4then inp:=4;
  s:='';
  l.Add('AB');

  for I:=2to inp-1do
  begin
    j:=Length(L[0]);
    if i mod 2=0then
      for x:=0to L.Count-1do L.Add(s.PadLeft(j,Chr(65+i)))
    else
      for x:=0to L.Count-1do
        L[x]:=L[x]+s.PadLeft(j,Chr(65+i));
  end;
  Write(L.GetText);
  readln;
end.
Teun Pronk
quelle
1

CJam, 30 (23) Bytes

CJam ist ein paar Monate jünger als diese Herausforderung, sodass es nicht für das grüne Häkchen geeignet ist.

l~(Sa1${{_,I'!+*+}%z}fI\{z}*N*

Teste es hier.

Das OP hat in einem Kommentar klargestellt, dass jeder Satz eindeutiger druckbarer Zeichen zulässig ist. Daher nehme ich nur die druckbaren ASCII-Zeichen von Anfang an (mit einem Leerzeichen in der Ecke, als !Nächstes usw.).

Wenn sich die Ausrichtung zwischen geraden und ungeraden Eingaben ändern kann (was ich nicht glaube, aber das macht die GolfScript-Übermittlung), kann ich dies in 25 Bytes tun:

S]l~({{_,I'!+*+}%z}fIN*

Die Idee ist wirklich einfach: Beginnen Sie mit einem Raster, das ein Leerzeichen enthält, und transponieren Sie es dann N-1-mal und verdoppeln Sie alle Zeilen mit dem nächsten Zeichen.

Für die Langfassung transponiere ich am Ende auch nochmal N-1, um eine gleichmäßige Orientierung zu gewährleisten.

Martin Ender
quelle