Öklid algoritmasını tekrar görselleştirin


10

Görev

İki pozitif tamsayı verildiğinde:

  1. İki tamsayı tarafından belirtilen boyutlarda dikdörtgeni çizin.
  2. Yer kalmayıncaya kadar Adım 3'ü tekrarlayın.
  3. (Kalan) dikdörtgenin üç tarafına dokunarak en büyük kareyi çizin ve doldurun.
  4. Ortaya çıkan dikdörtgenin çıktısını alın.

Misal

Örneğin, girdimiz 6ve 10.

6 x 10 boyutundaki içi boş dikdörtgeni çiziyoruz:

xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx

Tekrar tekrar kareleri doldurduktan sonra, elde edeceğimiz şey budur:

aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaaccdd
aaaaaaccdd

4 kare var burada ( a, b, c, d), kenar uzunluğu her biri 6, 4, 2, 2sırasıyla.

Kurallar ve özgürlük

  1. Her kare için farklı bir harf kullanmalısınız.
  2. Desteklenen harflerin tümü yazdırılabilir karakterler olduğu ve en az 10desteklenen karakterler olduğu sürece hangi harfleri destekleyeceğinizi seçebilirsiniz .
  3. Yukarıdaki 3. Adımın her yinelemesinde iki seçeneğiniz vardır (yalnızca bir seçeneğiniz olan son yineleme hariç). Her iki seçenek de geçerlidir.
  4. Gereken kare sayısı, desteklediğiniz harf sayısını aşmayacaktır.
  5. Sen de destekleyen harflerle kareler doldurabilirsiniz herhangi bir sırada .

testcases

Giriş: 6, 10

Çıktı:

aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaaccdd
aaaaaaccdd

veya

aaaaaaccdd
aaaaaaccdd
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb

veya

bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
ccddaaaaaa
ccddaaaaaa

veya

ccddaaaaaa
ccddaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa

veya

ddddddaaaa
ddddddaaaa
ddddddaaaa
ddddddaaaa
ddddddbbcc
ddddddbbcc

Giriş: 1,1

Çıktı:

a

Giriş: 1,10

Çıktı:

abcdefghij

Giriş: 10,1

Çıktı:

a
b
c
d
e
f
g
h
i
j

Yukarıdaki test vakaları için ekleyebileceğimden daha fazla olasılık olduğunu unutmayın.

puanlama

Bu . Bayt cinsinden en kısa cevap kazanır.

Standart boşluklar geçerlidir.


Yanıtlar:


3

Odun kömürü , 30 bayt

NδNγFβ¿×γδ«UOγδι¿‹γδA⁻δγδA⁻γδγ

Çevrimiçi deneyin! Açıklama:

Nδ      Input d
Nγ      Input g
Fβ      For i In ['a' ... 'z']
 ¿×γδ«   If g * d
  UOγδι   Oblong g, d, i
  ¿‹γδ    If g < d
   A⁻δγδ   d = d - g
   A⁻γδγ   Else g = g - d

Can sıkıcı bir şekilde Kömürün Dikdörtgen komutu 0bana 4 baytlık bir boyut getirmeyecek. Diğer yaklaşım ise döngüde olmak olurdu g * d, ancak sonra nasıl tekrarlanacağını bulamadım b(küçük harflerle önceden tanımlanmış).


Üzgünüz, bu bilinçli bir tasarım kararıydı, sizce olumsuz girdilere de izin verilmeli mi?
ASCII-sadece

@ ASCII-only Mevcut davranış nedir (hem 0 hem de negatif için)? En iyi fikrim, negatifin sağ / alt yerine sola / yukarıya çekmesi olurdu. (Ayrıca, kullanırsam W×γδ, her seferinde nasıl farklı bir harf yazdırabilirim?)
Neil

@Neil wow, sinir bozucu olacağını kastettiğini görüyorum.
Sihirli Ahtapot Urn



1

Jöle , 32 bayt

Ṁ,ạ/y
³,⁴ÇÐĿp/€Fs2
pµ¢ṣLµ€+95ỌsY

Çevrimiçi deneyin!

Ṁ,ạ/yBir açıklama ister misin? İşte burada.

Ṁ,ạ/y          - perform one step of the Euclidean Algorithm, input 2-element list
 ,             - pair of the following two:
Ṁ              -  maximum of the the input list
  ạ/           -  absolute difference of the two elements
    y          - use this as a mapping on the input.

³,⁴ÇÐĿp/€Fs2   - apply Euclidean Algorithm
³,⁴            - start with the pair [input 1, input 2]
   Ç           - apply a step of the Euclidean Algorithm
    ÐĿ         - repetitively until the results repeat
      p/€      - take the Cartesian product of each step
         Fs2   - flatten and split into all coordinate pairs of letters

pµ¢ṣLµ€+95ỌsY
p              - Cartesian product of inputs: provides all possible coordinate pairs.
 µ   µ€       - for each coordinate
   ṣL         - find the number of times it is included in
  ¢           - the above list of covered coordinates.
       +95Ọ   - convert number of times to letters
           s  - split into rows
            Y - join by newlines.

Bunun yerine örtük argümanları kullanarak biraz daha golf oynayabilirim ³,⁴.


1

Haskell , 181 bayt

import Data.List
(['!'..'~']&)
a#[]=a
a#b=zipWith(++)a$transpose b
(s&a)b|b<1=[]|b>a=transpose$s&b$a|n<-div a b,(t,u)<-splitAt n s=foldl1(#)((<$[1..b]).(<$[1..b])<$>t)#(u&b$mod a b)

Çevrimiçi deneyin!

İçin 10bayt daha yerine güzel bir spiral olsun :)

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

Çevrimiçi deneyin!

Ungolfed

(#)Operatör yanyana koyar iki matrisi, ancak doğru bir, mesela transposes:

!!!                !!!"
!!! # "#$    ->    !!!#
!!!                !!!$

a # [] = a
a # b  = zipWith (++) a $ transpose b

Bu temelde Euclid algoritmasının özyinelemeli versiyonudur, ancak bölenleri ve geri kalanları unutmak ve geri dönmek yerine gcd, ondan kareler oluşturur ve bunları biriktirir (#). sDeğişken biz kullanabileceği kalan karakterler şunlardır:

(s & a) b
  | b == 0 = []                     -- Base case
  | b > a = transpose $ (s & b) a   -- In this case we can just flip the arguments and rotate the result by 90 degrees
  | n <- div a b                    -- set n to the number of squares we need
  , (t,u) <- splitAt n s =          -- take n characters, ..
               ((<$[1..b]).(<$[1..b]) <$> t)                     -- .. build squares from them and ..
    foldl1 (#)                                                   -- put them next to each other
                                             (u & b $ mod a b)   -- recursively build the smaller squares with the remaining characters..
                                            #                    -- .. flip them and put them next to the previous one(s)

Gerçek işlev, yukarıdaki işlevi yazdırılabilir karakterlerin bir dizesiyle çağırır:

(['!'..'~']&)

Sen saymak gerekir import Data.Listkullanımına transpose.
Anders Kaseorg

Yaptım ama pointfree fonksiyonunu kullandığımda (benim bildiğim kadarıyla) bu ithalatı yapmak mümkün değil. Ama bayt sayımına dahil ettim, lütfen bayt sayımının gerçekte olduğu 164
TIO'ya bakın

1
Ah. Tuhaf önişlemci oyunları oynayabilirsiniz , ancak bir noktada TIO'dan kopyaladıktan sonra yazınızdaki kodu manuel olarak düzenlemek daha mantıklıdır.
Anders Kaseorg
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.