En Küçük Mükemmel Kare Kareyi yazdırın


16

Kareyi Kareye Alma, yalnızca diğer kareleri kullanarak bir kareyi döşeme işlemidir. Bu döşeme sadece farklı boyutlarda kareler kullanıyorsa, mükemmel olduğu kabul edilir . Mümkün olan en küçük kare kare 21 farklı kare kullanılarak döşenmiş 112x112 kare.

Aşağıda bu meydanın ascii sanat versiyonunu oluşturdum:

################################################################################################################
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ##                         #
#                                                ##                                 ############################
#                                                ##                                 ############################
#                                                ##                                 ##      ##                 #
#                                                ##                                 ##      ##                 #
#                                                ##                                 ##      ##                 #
#                                                ##                                 ##      ##                 #
#                                                ##                                 ##      ##                 #
#                                                ##                                 ##      ##                 #
#                                                #############################################                 #
#                                                #############################################                 #
#                                                ##             ##               ##         ##                 #
#                                                ##             ##               ##         ##                 #
#                                                ##             ##               ##         ##                 #
#                                                ##             ##               ##         ##                 #
#                                                ##             ##               ##         ##                 #
#                                                ##             ##               ##         ##                 #
#                                                ##             ##               ##         ##                 #
#                                                ##             ##               ##         ##                 #
#                                                ##             ##               ##         ##                 #
#                                                ##             ##               ###############################
#                                                ##             ##               ###############################
#                                                ##             ##               ##    ##                      #
#                                                ##             ##               ##    ##                      #
##################################################################               ##    ##                      #
##################################################################               ##    ##                      #
#                           ##                       ##       ###########################                      #
#                           ##                       ##       ###########################                      #
#                           ##                       ##       ##     ##                ##                      #
#                           ##                       ##       ##     ##                ##                      #
#                           ##                       ##       ##     ##                ##                      #
#                           ##                       ##       ##     ##                ##                      #
#                           ##                       ##       ##     ##                ##                      #
#                           ##                       ##################                ##                      #
#                           ##                       ##################                ##                      #
#                           ##                       ##              ##                ##                      #
#                           ##                       ##              ##                ##                      #
#                           ##                       ##              ##                ##                      #
#                           ##                       ##              ##                ##                      #
#                           ##                       ##              ##                ##                      #
#                           ##                       ##              ##                ##                      #
#                           ##                       ##              ##                ##                      #
#                           ##                       ##              ##                ##                      #
#                           ##                       ##              ##                ##                      #
#                           ##                       ##              ###########################################
#                           ##                       ##              ###########################################
#                           ##                       ##              ##                                        #
#                           ##                       ##              ##                                        #
#                           ##                       ##              ##                                        #
#                           ###########################################                                        #
#                           ###########################################                                        #
#                           ##  ##                                   ##                                        #
#                           ##  ##                                   ##                                        #
##################################                                   ##                                        #
##################################                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
#                               ##                                   ##                                        #
################################################################################################################

Gönderiniz yukarıdaki kareyi yazdırmalıdır. İsterseniz yukarıdaki karenin bir yansımasını ve / veya dönüşünü yazdırabilirsiniz. Son satırda bir satırsonuna izin verilir. Bu bir , bu yüzden en küçük teslim kazanır!


@Optimizer Soruya ve Wikipedia'ya göre, tüm küçük karelerin tamamen farklı boyutlarda olması gerekiyor.
Level River St

Nathan, Gönderim kurallara uygun mu? Tüm çizgiler için eşit kalınlık kullandım.
DavidC

@DavidCarraher Karenin her iki yanını ana hatlarıyla belirtiyorum (iç tarafların çoklu pound işaretleri var). Ayrıca, #yerine kullanmanız gerekirX
Nathan Merrill

1
Nathan, Uçakta kenarlar sınır değil. Bunlar tek boyutlu çizgi parçalarıdır. İki karonun bulunduğu yerde, iki değil, tek bir çizgi görmeliyiz. Aksi takdirde, karolar arasında bir boşluk olduğu fikrini aktarıyoruz.
DavidC

@DavidCarraher bu doğru olsa da, onu ascii'de bu şekilde temsil etmenin daha mantıklı olduğunu düşünüyorum.
Nathan Merrill

Yanıtlar:


4

CJam, 88 84 83 bayt

'p:Ci_C*a*"2#   *%!"{i_S*a*{3af.|W%z}4*1$0=C#C*f{\+}..e<{_C&{oNo}|}%}/

Burada test edin.

açıklama

İşte temel fikir: "boş" bir 112x112 kare ile başlayın. Şimdi kareleri okuma sırasına göre (soldan sağa, yukarıdan aşağıya) gidin. Her kareyi ilk kullanılabilir konuma ekleyin. Daha sonra, tamamlanan tüm satırları yazdırın - bu, bir sonraki karenin nereye gittiğini anlamak için sadece ilk (kalan) satırı kontrol etmemizi sağlar.

Boş ızgara, ps'den başlatılır , çünkü boşluktan daha büyük karakter koduna sahip bir karaktere ihtiyacım vardı ve başlangıç ​​ızgarasının boyutu için #kendi karakter kodunu yeniden kullanabildiğim 112için. Dennis'in ASCII sanat hilelerinden bazılarını ızgaradaki küçük kareleri doldurmak için kullandım.

'p:C        e# Store the character 'p' in C.
i           e# Convert to its character code 112.
_C*a*       e# Generate a 112x112 array of p's.
"2#   *%!"  e# The 21 characters in this string correspond to the side lengths of
            e# the squares in the solution in reading order.
{           e# For each character in that string...
  i         e#   Convert to its character code (the current square's side length N).
  _S*a*     e#   Generate an NxN array of spaces.
  {         e#   Run this block 4 times. Each iteration turns the leading column into #'s
            e#   and then rotates the square by 90 degrees.
    3af.|   e#     For the first character in each row, take the bitwise OR with 3. 
            e#     This turns spaces into #'s and leaves #'s unchanged.
    W%z     e#     Reverse and transpose, which rotates by 90 degrees.
  }4*
  1$0=      e#   Copy the remaining grid and fetch the top row.
  C#        e#   Find the index of the first 'p'.
  C*        e#   Get a string of that many p's.
  f{\+}     e#   Prepend this string to each row of the small square, which gives the
            e#   square the correct horizontal position.
  ..e<      e#   Take the pairwise minimum of the square and the remaining grid. The p's
            e#   prepended to the square will leave the grid unchanged, but the spaces
            e#   and #'s in the square will overwrite the p's in the grid.
  {         e#   Map this block onto each row of the grid.
    _C&     e#     Copy the row and check if any p's are left.
    {oNo}|  e#     If NOT, the row is complete and we print it together with a newline.
            e#     This also removes the row from the grid, such that the top row for
            e#     the next iteration will have space for the next square left.
  }%
}/

9

Mathematica 360 426

Kod önce mükemmel kareler karesini çizerek, görüntüyü rasterleştirerek ve ikilileştirerek ve ardından 0'ı "#" ve 1'i "" ye dönüştürerek çalışır.

Çıktı, bir tabloda normal ASCII karakterleri olarak döndürülür.

f@{n_,x_,y_}:=Rectangle[{x,y},{x+n,y+n}];t=Transpose;
Flatten[i=Rasterize[Graphics[{EdgeForm[{(*Thickness[.015],*)Black}],White,
f/@ Partition[{33,0,0,29,0,33,50,0,62,37,33,0,25,29,37,42,70,0,18,70,42,24,88,42,9,54,53,7,63,53,15,50,62,17,65,60,
11,82,66,19,93,66,35,50,77,27,85,85},3]
},ImageSize->70
],RasterSize->70]//Binarize//ImageData,1]/.{0:> "#",1:> " "};
GraphicsGrid@t@Most@Most@Rest@t[Most@Most[Rest[ArrayReshape[%,Dimensions[i]]]]]

pic1


Silerek elde edilen bu oluşturmayı tercih ederim Thickness[.015]

pic2


Çizgi kalınlığı değişmez, 50x50 kare 48 boşluk karakteri ve 48 boşluk karakteri ile #sınırlıdır. Benzer şekilde çizilen sağ ve altta diğer karelere karşı patlar. Dışarısı #yuvarlak olan iki karenin buluştuğu yerde, bu nedenle #iç çizgiler için bir çift alırsınız ve Kareler gerçekten kare, dikey ve yatay olarak aynı sayıda karaktere sahipler, Sorun yazı tipi. Bu cevap spesifikasyona uymuyor, Kabul edilirse, soru objektif olmayan bir kazanç için kapatılacaktı.
Level River St

Çizgiler iki boyutlu değil, tek boyutlu olarak tasarlanmıştır. Kalınlığa sahip sınırlar olarak yorumlanmamalıdırlar. Sonuçta, bir kare bölgeyi kare alt bölgelere ayırıyoruz. Sınırlar herhangi bir alanı kaplamamalıdır.
DavidC

Mesele bu. Çizgiler kareler arasına girer ve OP iç kenarlıklı kareleri temsil etmeyi seçer. Her kare için farklı bir sembol kullanmayı seçtiyse (ve muhtemelen onları doldurdu.) Her durumda, son bayrak sorularından görebileceğiniz gibi, normal anlayış (ve komolgorov karmaşıklığının bütün noktası) etiketi) OP tarafından sağlanan Ascii sanat temsilini sadakatle çoğaltmaktır, kendi yorumunuzu yapmayın. İlginç olsa da, bu geçerli bir cevap değil. Birçok karenin yükseklik ve genişliklerinde hala farklı sayıda karakter vardır.
Level River St

Bana Von Karman Sokaklarını hatırlatıyor
Beta Çürümesi

3

Yakut, 180 bayt

Aşağıdaki ungolfed versiyonuna göre golf versiyonu. ySol üst köşe için aynı koordinatta tipik olarak 2 veya 3 kare olması gerçeğinden yararlanıyoruz .

İlk sihirli dize square sidelength+70ve için ASCII kodlarını içerir y increment +40. Bir kare sidelength (Ascii kodu> 67) ile karşılaştığınızda, bir sonraki karenin aynı y koordinatında olduğunu ve x koordinatının mevcut x koordinatını artırarak elde edilebileceğini varsayıyoruz sidelength+2. Ay artışıyla (Ascii kodu <67) karşılaştığımızda, y koordinatını buna göre arttırır ve x koordinatını ikinci sihirli dizgide kodlanan şekle sıfırlarız.

a=Array.new(112){?#*112}
x=y=1
j=9
'vg_CLW0SUO3J\,a]M*KV/T3n-Hi,e'.each_byte{|i|i>67?(s=i-70;(y..y+s-1).map{|i|a[i][x,s]=" "*s};x+=s+2):(x=')Fo_h){[~'[j-=1].ord-40;y+=i-40)}
puts a

Orijinal versiyon

Bu (tamamen çözülmemiş) çözüm, gereksiz boş satırlar ve girintiler hariç 315 bayt içerir. Sadece 112 #'nin 112 dizesini oluşturur, daha sonra karelerin içlerini boşluklarla değiştirir.

$a=Array.new(112){"#"*112}
def f(x,y,s)
  (y..y+s-1).map{|i|$a[i][x,s]=" "*s}
end

f(1,1,48)
f(51,1,33)
f(86,1,25)

f(86,28,6)
f(94,28,17)

f(51,36,13)
f(66,36,15)
f(83,36,9)

f(83,47,4)
f(89,47,22)

f(1,51,27)
f(30,51,23)
f(55,51,7)

f(64,53,5)
f(71,53,16)

f(55,60,14)

f(71,71,40)

f(30,76,2)
f(34,76,35)

f(1,80,31)

puts $a

3

C, 198 bayt

char*i="bSK8C?A;6HMI927B@Z4UQ",o[112][113],x,y,p,q,n;main(){for(;y<112;puts(o[y]),y++)for(x=-1;++x<112;)if(!o[y][x]){n=*i++-48;for(p=-1;++p<n;)for(q=-1;++q<n;)o[q+y][p+x]=p&&n-1-p&&q&&n-1-q?32:35;}}

(Ungolfed)

char *i="bSK8C?A;6HMI927B@Z4UQ", o[112][113], x, y, p, q, n;
main() {
  for ( ; y<112; puts(o[y]),y++) {
    for (x=-1; ++x<112; ) {
      if (!o[y][x]) {
        n = *i++ - 48;
        for (p=-1; ++p<n; ) {
          for(q=-1; ++q<n; ) {
            o[q+y][p+x] = (p && n-1-p && q && n-1-q) ? ' ' : '#';
          }
        }
      }
    }
  }
}

Tüm bunlar, 112 × 112 baytlık bir diziye (sıfıra başlatıldı) tarama yapmaktır. Sıfır bayt ile karşılaştığında, diziden bir değer alır ive karşılık gelen boyutta bir kutu ekler. Her satırdaki ekstra bayt bir dize sonlandırıcı olarak işlev görür, böylece karakterleri tek tek çıktılamak için puts()kullanmak yerine tüm satırları çıktılamak için kullanabiliriz putchar().

Bu muhtemelen biraz daha golf edilebilir, ancak steveverrill'in cevabını yenmenin çok şanslı olduğunu düşünmüyorum .

(ideone bağlantısı)


+1 Bu, daha az golfik bir dilde benimkinden çok daha iyi, mükemmel bir konsept. Cevabımı yenebileceğine inanıyorum. Ayrıca, döngü sayısını dörde ikiden ikiye düşürmeye baktığımda ve y = kullanarak bir #zaman yazdırmanız gerektiğini unutmayın . !(p%(n-1)&&q%(n-1))forx=i%113i/113 etc
Level River St

3

R, 293 291 287 282 bayt

a=array('#',112:113)
a[,113]='
'
for(g in list(c(0,0,49,34,26),c(27,85,7,18),c(35,50,14,16,10),c(46,82,5,23),c(50,0,28,24,8,1),c(52,63,6,17),c(59,54,15),c(70,70,41),c(75,29,3,36),c(79,0,32))){y=g[1];x=g[2]
for(b in g[0:1-2]){a[(y+2):(y+b),(x+2):(x+b)]=' '
x=x+b+1}}
cat(t(a),sep='')

Bunu yaptıktan sonra @steveverrill ile hemen hemen aynı işlemi yaptığımı fark ettim. '#' Bir dizi ve kare iç boş. Muhtemelen bundan biraz daha sıkabilir. 3. satır için satır başı önemlidir. Birkaç için AlexA'ya teşekkürler.


Sadece bir skez referansta bulunuyorsunuz , bu yüzden önceden ayrı ayrı for(g in list(...))belirtmek yerine yapamaz smıydınız? Sanırım bu sizi 2-3 byte kurtaracak.
Alex

@AlexA. Teşekkürler, tamamen özlediğim bariz olan
MickyT

2

MS-DOS İkili, 137

Aşağıdaki kod, square.com adlı bir dosyaya yazarsanız, başka bir derlemeye gerek kalmadan MS-DOS'ta çalışır (ancak hex olarak verildiğinden, önce "unhex" yapmanız gerekir):

fcba8f01b82370e83000bd1400bb4d018b1743438a27b02043e81e004d75
f1b97000ba8f3289d7b00daab00aaab82409aa83ea70cd214975ecc331c9
88e189ce89d788e1f3aa83c2704e75f4c3201d30e223218527190524063d
1f11521d0d811c0f321f09921c04b8141670101b4d12176619076f1905a6
141066120e4602288d100221022300021f

Çıkış çoğu terminalde tanınmayacak, ancak bunu bir dosyaya ( square.com > output.txt) yönlendirebilir ve bir metin düzenleyicide bakabilirsiniz. Daha okunabilir bir şey istiyorsanız, aşağıdaki kod debug.exe'ye ( debug.exe < square.asm) beslenirse çalışan bir square.com üretir :

a
cld
mov dx,18f
mov ax,7023
call 13a
mov bp,14
mov bx,14d
mov dx,[bx]
inc bx
inc bx
mov ah,[bx]
mov al,20
inc bx
call 13a
dec bp
jnz 110
mov cx,70
mov dx,328f
mov di,dx
mov al,d
stosb
mov al,a
stosb
mov ax,924
stosb
sub dx,70
int 21
dec cx
jnz 125
ret
xor cx,cx
mov cl,ah
mov si,cx
mov di,dx
mov cl,ah
rep stosb
add dx,70
dec si
jnz 140
ret
db 20,1d,30,e2,23,21
db 85,27,19,05,24,6
db 3d,1f,11,52,1d,d
db 81,1c,f,32,1f,9
db 92,1c,4,b8,14,16
db 70,10,1b,4d,12,17
db 66,19,7,6f,19,5
db a6,14,10,66,12,e
db 46,02,28,8d,10,2
db 21,02,23,00,02,1f

n square.com
rcx
89
w
q

1

Matlab / Oktav, 258

Her zaman olduğu gibi, Matrisler. Her kare ans'ın satır ve sütun indekslerinin yanı sıra boyutu da kodladım. Bunları büyük bir 'boş' kare alanı doldurmak için kullanabilirim #.

r=[2,2,2,29,29,37,37,37,48,48,52,52,52,54,54,61,72,77,77,81];
c=[2,52,87,87,95,52,67,84,84,90,2,31,56,65,72,56,72,31,35,2];
s=[47,32,24,5,16,12,14,8,3,21,26,22,6,4,15,13,39,1,34,30];
z=ones(112)*35;
for i=1:20;
    z(r(i)+(0:s(i)),c(i)+(0:s(i)))=32;
end;disp([z,''])

0

Baş, 252

Her codegolfer, genel amaçlı bir sıkıştırma algoritmasını yenebilmelidir:

base64 -d<<<H4sIADyFv1UCA+3ZOw6EMAwFwH5PgeT735EOUSyfQAgOmVeCxUgusAkRbfOLqTARd0qAQCAQCAQCgcAvg80375dW/T+lQGAbsCCdgvsdXl0AAoHjgM8e7mUA92bKG+DtpAevDPflRsko7BXcKAQCD9+X3wOPCoFA4ABgnZ/OmcHTS+bw4PXzkV7Ak93KDdboVm6wxrOAQCAQCAQCgUAgENj++7BuZsq8xQ1vMQAA|gunzip

Daha kısa girdi ( sıkıştırma gzipyerine aptalca kullanılan gzip -9) ve burada bir dize kullanma ipucu için Toby Speight sayesinde .


Burada dizeyle 2 daha kısa:base64 -d<<<H4sIAP9YuVUAA+3XQQrDIBAF0H1PUfD+d+yq0FA7GirGie/vdEZfkCy0lLl5lOfJlPaKoAUIBAKBQCAQCLwzOP3mfdFVv9IKBM4BTyQpGA0PE0AgcB8wzC3A6vS7egH4d5YH64WPtVGh/zvygj8agcCvQuufzA+2GoFA4AZgd9KCwS7Hzu3B7qQFO09rbXDEaa0NjtgLCAQCgUAgEAgEAoHz34dj8wLKvMUNbzEAAA==|gunzip
Toby Speight

Ve daha kısa bir giriş bizi üzüyor 251 :base64 -d<<<H4sIADyFv1UCA+3ZOw6EMAwFwH5PgeT735EOUSyfQAgOmVeCxUgusAkRbfOLqTARd0qAQCAQCAQCgcAvg80375dW/T+lQGAbsCCdgvsdXl0AAoHjgM8e7mUA92bKG+DtpAevDPflRsko7BXcKAQCD9+X3wOPCoFA4ABgnZ/OmcHTS+bw4PXzkV7Ak93KDdboVm6wxrOAQCAQCAQCgUAgENj++7BuZsq8xQ1vMQAA|gunzip
Toby Speight'ın

İşe yaradığından emin misin? Sadece anladım gunzip: command not found. Bir subshell kullanarak çalıştırabilirim: (base64 -d|gunzip)<<<...ancak yine de 258 bayt kullanıyor.
user2845840

Garip, @ user284584 - yolunuzda tuhaf bir şey mi var? Yazdıklarımı test ettim (bu bir fark
yaratırsa

Tanrım ... Yorumunu kopyalamayı ve tekrar kabuğa yapıştırmayı dene. Stackexchange "yardımsever", her biri u + 200c & u + 200b olmak üzere 6 görünmez karakter ekledi. Onları çıkardıktan sonra çalışır.
user2845840
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.