Nicomachus Teoremini Görselleştirin


35

Nichomachus Teoremi toplamın karesini küplerin toplamıyla ilişkilendirir:

Nichomachus Teoremi

ve güzel bir geometrik görselleştirmeye sahiptir:

görüntüleme

Zorluk: Bu görselleştirmenin 2. bölümünü Ascii'de oluşturun.

Tüm görsel sınırlamaların diyagramınız tarafından desteklendiğinden emin olmanız gerekir. Bu, dört "renk" ile yapmanın en kolay yoludur, ancak yalnızca üçüyle elde etmek mümkündür (bunun için aşağıdaki son örneğe bakın). Dört renkle, bir "şerit" içindeki bölgeleri (yani, tek bir küp oluşturan farklı parçalar) ayırt etmek için iki, bitişik şeritleri ayırt etmek için ikisini kullanın. İsterseniz dörtten fazla rengi de kullanabilirsiniz. Bunlardan herhangi birinin kafası karışırsa, aşağıdaki örnek çıktı netleşmelidir.

Giriş çıkış

Giriş, 0'dan büyük tek bir tam sayıdır. Çıkış, yukarıdaki görüntüdeki bu giriş numarasının düzleştirilmiş ızgarasına karşılık gelen aşağıdaki örneklere benzer bir ascii ızgaradır. Lider ve takip eden boşluklar tamam.

Bu standart kurallarla kod golf.

Örnek çıktılar

N = 1

#

N = 2

#oo   
o@@   
o@@   

N = 3

#oo+++
o@@+++
o@@+++
+++###
+++###
+++###

N = 4

#oo+++oooo
o@@+++oooo
o@@+++@@@@
+++###@@@@
+++###@@@@
+++###@@@@
oo@@@@oooo
oo@@@@oooo
oo@@@@oooo
oo@@@@oooo

N = 5

#oo+++oooo+++++
o@@+++oooo+++++
o@@+++@@@@+++++
+++###@@@@+++++
+++###@@@@+++++
+++###@@@@#####
oo@@@@oooo#####
oo@@@@oooo#####
oo@@@@oooo#####
oo@@@@oooo#####
+++++#####+++++
+++++#####+++++
+++++#####+++++
+++++#####+++++
+++++#####+++++

@BruceForte sayesinde N = 4 için üç renkli sürüm:

#oo+++oooo
o##+++oooo
o##+++####
+++ooo####
+++ooo####
+++ooo####
oo####++++
oo####++++
oo####++++
oo####++++

6
Dört renkli teorem: D
Leaky Rahibe

1
Çıktıyı N = 5 ekleyebilir misiniz lütfen?
Uriel

1
@Uriel Tamamlandı. Düzenlemeye bak.
Jonah

Teşekkürler! Ayrıca, @ ve os'u yalnızca dış şeritteki N = 4'te değiştirebilir miyim? Yoksa çıktı, bu metinlerin başka bir karakter grubuyla katı bir şekilde mi değiştirilmesi gerekiyor?
Uriel

@Uriel geçişi iyi. Tek önemli olan, bitişik renklerin çatışmaması, böylece kalitenin görünür olması.
Jonah

Yanıtlar:


17

MATL , 30 28 27 bayt

t:P"@:s:@/Xk&+@+8MPt&(]30+c

Çevrimiçi deneyin!

Bonus özellikler:

  • İçin 26 bayt , aşağıdaki değiştirilmiş versiyonu üretir grafik çıktısı :

    t:P"@:s:@/Xk&+@+8MPt&(]1YG
    

    MATL Online'da deneyin !

  • Görüntü biraz renk için yalvarıyor ve yalnızca 7 bayta mal oluyor:

    t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
    

    MATL Online'da deneyin !

  • Veya karakter matrisinin aşamalı olarak nasıl oluşturulduğunu görmek için daha uzun bir sürüm (37 bayt) kullanın :

    t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
    

    MATL Online'da deneyin !

Örnek çıktılar

Giriş için 8, aşağıda temel sürüm, grafik çıktı ve renkli grafik çıktı gösterilmektedir.

görüntü tanımını buraya girin

görüntü tanımını buraya girin

görüntü tanımını buraya girin

açıklama

Genel prosedür

Sayısal bir matris, girişin Nolduğu adımlarla dıştan iç katmanlara oluşturulur N. Her adım önceki matrisin iç (sol üst) kısmının üzerine yazar. Sonunda, elde edilen matristeki sayılar karakter olarak değiştirilir.

Örnek

Giriş 4için ilk matris

10 10  9  9  9  9  8  8  8  8
10 10  9  9  9  9  8  8  8  8
 9  9  8  8  8  8  7  7  7  7
 9  9  8  8  8  8  7  7  7  7
 9  9  8  8  8  8  7  7  7  7
 9  9  8  8  8  8  7  7  7  7
 8  8  7  7  7  7  6  6  6  6
 8  8  7  7  7  7  6  6  6  6
 8  8  7  7  7  7  6  6  6  6
 8  8  7  7  7  7  6  6  6  6

İkinci adım olarak, matris

7 7 7 6 6 6
7 7 7 6 6 6
7 7 7 6 6 6
6 6 6 5 5 5
6 6 6 5 5 5
6 6 6 5 5 5

ikincisinin üst yarısına yazılır. Sonra aynı ile yapılır

6 5 5
5 4 4
5 4 4

ve sonunda

3

Elde edilen matris

3 5 5 6 6 6 8 8 8 8
5 4 4 6 6 6 8 8 8 8
5 4 4 6 6 6 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6

Son olarak, 30her girişe eklenir ve sonuçta elde edilen sayılar kod noktaları olarak yorumlanır ve karakterlere dönüştürülür (böylece başlar 33, buna karşılık gelir !).

Ara matrislerin inşaatı

Girişi için N, değerlerini düşürebilirler kgelen Netmek 1. Her biri için k, gelen tamsayılar bir vektör 1ile k*(k+1)oluşturulur, ve daha sonra her bir giriş bölünür kve yuvarlanır. Örnek olarak, bunun için k=4( kson hariç hariç tüm blokların büyüklüğü vardır ):

1 1 1 1 2 2 2 2 3 3

için ise k=3sonuç (tüm bloklar boyutuna sahip olacaktır k):

1 1 1 2 2 2

Bu vektör, yayınlanmış olarak eleman şeklinde, kendisinin aktarılmış bir kopyasına eklenir; ve sonra kher girişe eklenir. Bunun için k=4verir

6  6  6  6  7  7  7  7  8  8
6  6  6  6  7  7  7  7  8  8
6  6  6  6  7  7  7  7  8  8
6  6  6  6  7  7  7  7  8  8
7  7  7  7  8  8  8  8  9  9
7  7  7  7  8  8  8  8  9  9
7  7  7  7  8  8  8  8  9  9
7  7  7  7  8  8  8  8  9  9
8  8  8  8  9  9  9  9 10 10
8  8  8  8  9  9  9  9 10 10

Bu, yatay ve dikey olarak çevrilmesi dışında yukarıda gösterilen ara matrislerden biridir. Geriye kalan tek şey, bu matrisi çevirip şimdiye kadar "birikmiş" matrisin sol üst köşesine yazmak ve ilk ( k=N) basamağı için boş bir matrise başlatılması .

kod

t       % Implicitly input N. Duplicate. The first copy of N serves as the
        % initial state of the "accumulated" matrix (size 1×1). This will be 
        % extended to size N*(N+1)/2 × N*(N+1)/2 in the first iteration
 :P     % Range and flip: generates vector [N, N-1, ..., 1]
"       % For each k in that vector
  @:    %   Push vector [1, 2, ..., k]
  s     %   Sum of this vector. This gives 1+2+···+k = k*(k+1)/2
  :     %   Range: gives vector [1, 2, ..., k*(k+1)/2]
  @/    %   Divide each entry by k
  Xk    %   Round up
  &+    %   Add vector to itself transposed, element-wise with broadcast. Gives
        %   a square matrix of size k*(k+1)/2 × k*(k+1)/2
  @+    %   Add k to each entry of the this matrix. This is the flipped
        %   intermediate matrix
  8M    %   Push vector [1, 2, ..., k*(k+1)/2] again
  Pt    %   Flip and duplicate. The two resulting, equal vectors are the row and
        %   column indices where the generated matrix will be written. Note that
        %   flipping the indices has the same effect as flipping the matrix
        %   horizontally and vertically (but it's shorter)
  &(    %   Write the (flipped) intermediate matrix into the upper-left
        %   corner of the accumulated matrix, as given by the two (flipped)
        %   index vectors 
]       % End
30+     % Add 30 to each entry of the final accumulated matrix
c       % Convert to char. Implicitly display

MATL'yi hiç tanımıyorum ama 30 ekleyerek karaktere dönüştürmek yerine mod10 alarak baytları kurtarır mısınız?
user2390246 20:17

Hatta mod4 ...
user2390246 20:17

@ user2390246 Bunları tek haneli rakamlar olarak tutmak ve karaktere dönüştürmekten kaçınmak mı istiyorsunuz? Bu işe yaramaz, çünkü sayısal matris sayılar arasındaki boşluklarla basılır. Ama yine de fikir için teşekkürler :-)
Luis Mendo

Yeterince adil. N> 226 ile ne olur? Bu geçerli karakter aralığının dışına çıkmaz mı? (Şaşırtıcı şekilde,
TIO'da zaman aşımına uğradı

@ user2390246 Evet, yüksek giriş numaraları için dışarı çıkar. Ve eğer ASCII karakterlerini göz önüne alırsak, maksimum kod noktası 127'dir, bu yüzden daha erken dışarı çıkar. Ancak fark ettiğiniz gibi, bu gerçekleşmeden önce hafızası tükeniyor (sonuçta ortaya çıkan karakter matrisi çok büyük). Her neyse, sadece hafıza veya veri tipi sınırlamaları nedeniyle belirli bir giriş boyutuna kadar çalışmak genellikle mümkündür
Luis Mendo

7

Python 2 , 187 178 164 162 152 bayt

Mr.Xcoder
-1 bayt sayesinde -8 bayt Stephen sayesinde Stephen-
10 bayt sayesinde Jonathan Frech

g=lambda y:y>1and[l+y*f(y,i)for i,l in enumerate(g(y-1))]+y*[''.join(f(y,i)for i in range(y*-~y/2))]or['#']
f=lambda y,i:'0@+#'[(y*~-y/2%y+i)/y%2+y%2*2]

Çevrimiçi deneyin!


Eve geldiğinde, 179 bayt .
Bay Xcoder,

@ Mr.Xcoder 178 bytes
Stephen,

1
Tekrarlayan bir şekilde kullandığınızda lambda işlevinizin isim bayt sayısını içermemesine izin veriliyor mu, yani ismini kodun geri kalanında kullanmak mı?
Jonathan Frech

sum(range(y))%y->y*~-y/2%y
Jonathan Frech

@JonathanFrech evet, özyinelemeli olduğunda orada olmalı.
Rod

7

Kömür , 50 46 bayt

F⮌…·¹N«≔⊘×ι⊕ιθF⊕⊘ι«F§#+@⁺ικ«UO⁻θ×ικθλUOθ⁻θ×ικλ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama ile önceki 50 bayt sürümü: Çevrimiçi deneyin!

F⮌…·¹N«≔÷×ι⁺¹ι²θF⁺¹÷鲫F§#+@⁺ικ«UO⁻θ×ικθλUOθ⁻θ×ικλ

F     «     Loop over
  …·¹       Inclusive range from 1 to
     N      Input as a number
 ⮌          Reversed

   ι⁺¹        Add 1 to current index
  ×   ι       Multiply by current index
 ÷     ²      Divide by 2
≔       θ     Assign to q

F     «      Loop over
             Implicit range from 0 to
   ÷ι²       Half the current index
 ⁺¹          Plus 1

F       «    Loop over
  #+@        Literal string
 §           Circularly indexed by
     ⁺ικ     Sum of outer and inner index

    ×ικ     Multiply outer and inner index
  ⁻θ        Subtract from q
UO     θλ   Draw an oblong (q-ik, q) using that character

UOθ⁻θ×ικλ   Draw an oblong (q, q-ik) using that character

Not: Karakterin üzerine doğrudan atanmaya çalışmak yerine karakterin üzerinde dönüyorum lçünkü Charcoal'da belirsiz bir yapı olduğu için bir dizgenin bir değişkene doğrudan endekslenmesinin sonucunu doğrudan atayamazsınız. Neyse ki bayt sayısı aynı.


Teknik olarak, onun argümanı sipariş beri bir ASCII değişkenle (hala az Golfy yani o erişmek için bir operatöre ihtiyacı olduğunu not) tersine çevrilir olabilir
ASCII sadece

5

C (gcc) , 135 128 120 bayt

f(n,m,i,x,y,k){for(m=n*-~n/2,i=m*m;i--;printf("\n%d"+!!(~i%m),(x/k+y/k+k)%3))for(x=i%m,y=i/m,k=n;x>=k&y>=k;x-=k--)y-=k;}

Çevrimiçi deneyin!

Sadece üç renk kullanır.

Kavramsal olarak, 180 derece döndürülmüş bir ızgara üzerinde çalışır:

000111
000111
000111
111220
111220
111001

Ve formüle göre renkleri hesaplar:

c(x,y,n) = c(x-n,y-n,n-1)                   if x >= n and y >= n
         = (x div n + y div n + n) mod 3    otherwise


@JonathanFrech Bu geçerli bir C değil ve beraberinde geliyor gcc -O2.
nwellnhof

Yeterince adil; ikinci kodun üç ( g(i%m,i/m,n)%3) modülünden dolayı sadece üç renk için çalışması mümkün mü?
Jonathan Frech

Öner x/k&&y/kyerinex>=k&y>=k
ceilingcat

2

R , 131 126 123 bayt

@Giuseppe sayesinde 3 bayt kurtarıldı

function(n){l=w=sum(1:n)
m=matrix(,l,l)
for(i in n:1){m[l:1,l:1]=outer(x<-(1:l-1)%/%i,x,`+`)+i
l=l-i}
write(m%%4,"",w,,"")}

Çevrimiçi deneyin!

Bu, @ LuisMendo'nun MATL cevabı ile aynı algoritmayı kullanır . Tek fark, karakterlere dönüştürme yerine, matrisin her bir elemanın tek bir ascii karakteri olmasını sağlamak için tüm mod4 değerleriyle çıktısı olmasıdır.


1
123 bayt! forDöngüyü -1 byte geri getirdim :)
Giuseppe

1

Python 2 , 176 175 bayt

n=input()
R,J=range,''.join;r=[]
for i in R(n+1):
 S=sum(R(i));c='AxBo'[i%2::2]
 for j in R(S):r[~j]+=c[j/i%2]*i
 r+=[J(c[-j/i%2]for j in R(S+i,0,-1))]*i
for l in r:print J(l)

Çevrimiçi deneyin!


Tanımlarsanız J="".join;(+10 bayt) ve her ikisini de "".join(-2 * 7 = -14 bayt) J(+2 bayt) ile değiştirirseniz, bayt'ı ( print; +1 bayttan sonra ek bir boşluk olması gerektiği gibi) kaydedebilirsiniz . .
Jonathan Frech
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.