Dikdörtgen sahte fraktal


13

Hedef

Programın amacı, yatay ve dikey olarak dönüşümlü olarak art arda iki katına çıkan bir ASCII sanat dikdörtgeni çizmektir. Dikdörtgenin boyutu her iki katına çıktığında, fazladan alan farklı bir karakterle temsil edilir ve önceki alanlar değişmeden kalır. En küçük iki bölümün her biri bir karakter içerir ve herhangi bir köşede olabilir.

Program, tam dikdörtgenin içerdiği bölüm sayısını tanımlayarak tek bir tamsayıyı girdi olarak kabul eder.

Başka harici kaynaklara veya girdilere izin verilmez.

Numune giriş ve çıkışı

10

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

Seçim kriterleri

Bir haftadaki en kısa kod puanları kazanır.


4'ün gücü olmayanlar için çıktı ne olmalıdır?
marinus

Çıktının A, B, C vb. Sırada olması gerekiyor mu?
Kendall Frey

2
@marinus 4'ün güçleri hakkında özel olan nedir? Belki de örneği yanlış anladınız?
Kendall Frey

@KendallFrey, hayır, sadece basılabilir n karakter olması gerekiyor .
Hand-E-Food

Sol üst köşede tam olarak tekrarlamak zorunda mı
mniip

Yanıtlar:


10

APL, 25 karakter / bayt *

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

Parçalarına ayrıştırılmış görünüm

{                   ⍵↑⎕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

Örnekler

      {⍉⍣⍵⊃{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, APL sembollerini üst 128 bayt değerleriyle eşleştiren kendi (eski) tek baytlık karakter kümesiyle
yazılabilir. Bu nedenle, puanlama amacıyla, sadece ASCII karakterleri ve APL sembolleri kullanan bir N karakterleri programı N bayt uzunluğunda kabul edilebilir.


9

GolfScript, 30 karakter

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

Örnek ( çevrimiçi çalıştırın ):

> 7
01335555
22335555
44445555
44445555
66666666
66666666
66666666
66666666

Bu, sorudakiler gibi çift sayılar için yanlış çıktı üretir ...
Timwi

@ Timwi Sadece test ettim ve benim için çalışıyor. Çıktı aktarılır, ancak soruda yön belirtilmedi.
Howard

Tamam, sanırım o zaman çok
katıydım

@ Hm, nasıl anlıyorum "ve önceki alanlar değişmeden kalıyor". İlk iki karakterin herhangi bir köşede olabileceğini, ancak yönün değişebileceğini söylemiyor.
Martin Ender

7

Python 2.7-85 103

Bu zip(*s), listeyi sürekli olarak aktarmak için sözdizimini kullanır . Daniel'e 12 karakteri tıraş eden bahşişi için çok teşekkürler! Sonra harfler yerine sayılar kullanarak birkaç tıraş daha.

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)

Ayrıca, bit kaydırma daha düşük (?) Önceliğe sahip olmak 1<<xyerine bu kullanır 2**x. Gözlemek:

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

Ve bazı çıktılar:

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

1
Güzel. İle biraz kısaltabilirsiniz for i in s:print''.join(i).
Daniel Lubarov

5

Ruby, 88

Standart girişten N değerini okur.

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

N = 8 için Örnek Kullanım:

echo 8 | rectangular-pseudo-fractal.rb

Çıktı:

ABDDFFFFHHHHHHHH
CCDDFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH

N = 10

echo 10 | rectangular-pseudo-fractal.rb

Çıktı:

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

Bunun çıktısı neye benziyor?

@LegoStormtroopr bazı örnekler ekledi, yine de soru ile aynı format.
Paul Prestidge

4

J, 57 43

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

Örnekler:

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

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

C ve D'nin her ikisi de yatay olarak uzanır. Yatay ve dikey olarak değişmelidirler.
El-E-Gıda

@ Hand-E-Food haklısın. Bunu işaret ettiğiniz için teşekkürler. Kod (ve posta) sabitledim.
barbermot

4

MATLAB, 86 Karakter

@Flawr tarafından pezpelenen MATLAB'deki en kısa denemem (iki kez!):

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

Örnek çıktı:

>> disp(f(7))
ACEEGGGG
BCEEGGGG
DDEEGGGG
DDEEGGGG
FFFFGGGG
FFFFGGGG
FFFFGGGG
FFFFGGGG

Bu size bazı bayt kazandıracak: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
flawr

@flawr: Oh! Açıkçası!
knedlsepp

Argümanı PS fixile değiştirerek başka bir bayt kaydedin fix(n/2-[.5,1]): Gerçekten güzel bir çözümle cat, boyutu seçebileceğiniz bu kullanım hakkında bilmiyordum =)
flawr

@flawr: Görünüşe göre oldukça israfım. ;-)
knedlsepp

Burada yeni olduğunuzu fark ettim, bu yüzden codegolf'a hoş geldiniz.SE, bir tane olması güzel.) Biraz daha matlab bağımlısı, b.) Almanca konuşanlar burada (sanırım)!
Kusur

3

q [73 karakter]

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

misal

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"

3

Kaydırma , 59 karakter

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

(Bu program base-2 logaritması için talimatlarım varsa biraz daha kısa olabilir, ancak yapmıyorum, bu yüzden manuel olarak bir döngü ile yaparım.)

Açıklamalı kod

n girdidir.

❶ | 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]
終

Çıktı

İçin n= 6:

ABDDFFFF
CCDDFFFF
EEEEFFFF
EEEEFFFF

Elbette 뀀( @) öğesini başka bir temel karakterle değiştirebilirsiniz, örneğin (boşluk) ve n= 7 ile:

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

Programı uzatmayan en yüksek sayı (= 255) 'dir, bu da bize ( nbu sefer = 8) verir:

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

Program 1 karakterini uzatırsak, örneğin 냟및(= \u4DFF) ve n= 9 kullanın, şunu elde ederiz:

一丁七七丅丅丅丅万万万万万万万万
丂丂七七丅丅丅丅万万万万万万万万
丄丄丄丄丅丅丅丅万万万万万万万万
丄丄丄丄丅丅丅丅万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈

3

C #, 239 185 182 180 bayt

C # daha az ayrıntılı dillerde hiçbir şey yoktur.

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

Çıktı, güzellik için seçilen karakterler:

!"$$&&&&((((((((****************
##$$&&&&((((((((****************
%%%%&&&&((((((((****************
%%%%&&&&((((((((****************
''''''''((((((((****************
''''''''((((((((****************
''''''''((((((((****************
''''''''((((((((****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************

1
Nasıl saydığınızdan emin değilim, ancak 184 saydım. Parantezleri dış forhalkadan atarak 182 yaparak iki karakter kaydedebilirsiniz.
Bob

Teşekkürler @Bob! Mikro optimizasyon sırasında yanlış saymış olmalıyım.
El-E-Gıda

2

PERL, 122 karakter

$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

boşluk ekleyerek:

$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

Çıktı:

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

1

PERL,  94   81 karakter

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

Fraktal yinelemeli harf harf, yeni satırlar ve sütunlar, satırlar ve sütunlar ekleyerek oluşturur ... Bunu yapmak için basit dize işlemleri kullanır. Sözdizimi şekerine izin vermek için bir harf yerine standart değişkeni kötüye kullandığımı unutmayın (boşlukları atlamak gibi - $:x2vb.)

Eklenen boşluk ve yorumlarla:

$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

Bazı çıktılar:

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

1

Kaydırma , 45 karakter

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

Bu çözüm diğer Sclipting çözümünden tamamen farklı çalışır. Çok daha sıkıcı, ama daha kısa ...

Açıklamalı

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
⓶丟各겠終

1

Delphi 348 || 449 girintili

Girinti olmadan

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.

Girintili

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.

1

CJam, 30 (23) bayt

CJam bu mücadeleden birkaç ay daha genç olduğundan yeşil onay işareti için uygun değil.

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

Burada test edin.

OP, herhangi bir benzersiz yazdırılabilir karakter kümesine izin verildiğini açıkladı, bu yüzden sadece yazdırılabilir ASCII karakterlerini başlangıçtan alıyorum (köşede bir boşluk, !sonraki ve benzeri).

Yönlendirme çift ve tek girişler arasında değişebilirse (ki sanmıyorum, ancak GolfScript gönderiminin yaptığı şey), 25 baytta yapabilirim:

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

Fikir gerçekten basit: boşluk içeren bir ızgara ile başlayın ve sonra N-1 kez onu transpoze edin ve bir sonraki karakterle tüm satırları ikiye katlayın.

Uzun versiyon için, sonunda tutarlı bir yönelimi garanti etmek için tekrar N-1 kez tekrar aktarıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.