Visualisasikan kembali algoritma Euclidean

10

Tugas

Diberi dua bilangan bulat positif:

  1. Gambar persegi panjang dengan dimensi yang ditentukan oleh dua bilangan bulat.
  2. Ulangi Langkah 3 hingga tidak ada lagi ruang.
  3. Gambar dan isi kotak terbesar yang menyentuh tiga sisi persegi panjang (yang tersisa).
  4. Keluarkan persegi panjang yang dihasilkan.

Contoh

Misalnya, input kami adalah 6dan10 .

Kami menggambar persegi panjang berongga ukuran 6 x 10:

xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx

Setelah berulang kali mengisi kotak, inilah yang akan kita dapatkan:

aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaaccdd
aaaaaaccdd

Ada 4 kotak di sini ( a, b, c, d), masing-masing dengan panjang sisi 6, 4, 2,2 masing-masing.

Aturan dan kebebasan

  1. Anda harus menggunakan huruf berbeda untuk setiap kotak.
  2. Anda dapat memilih huruf mana yang akan didukung, selama huruf yang didukung semua karakter yang dapat dicetak dan setidaknya ada 10karakter yang didukung.
  3. Di setiap iterasi dari Langkah 3 di atas, Anda memiliki dua pilihan (kecuali dalam iterasi terakhir, di mana Anda hanya memiliki satu pilihan). Kedua pilihan itu valid.
  4. Jumlah kotak yang diperlukan tidak akan melebihi jumlah huruf yang Anda dukung.
  5. Anda dapat mengisi kotak dengan huruf yang Anda dukung dalam urutan apa pun .

Testcases

Memasukkan: 6, 10

Keluaran:

aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaaccdd
aaaaaaccdd

atau

aaaaaaccdd
aaaaaaccdd
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb

atau

bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
ccddaaaaaa
ccddaaaaaa

atau

ccddaaaaaa
ccddaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa

atau

ddddddaaaa
ddddddaaaa
ddddddaaaa
ddddddaaaa
ddddddbbcc
ddddddbbcc

Memasukkan: 1,1

Keluaran:

a

Memasukkan: 1,10

Keluaran:

abcdefghij

Memasukkan: 10,1

Keluaran:

a
b
c
d
e
f
g
h
i
j

Perhatikan bahwa ada lebih banyak kemungkinan daripada yang bisa saya sertakan untuk testcases di atas.

Mencetak gol

Ini adalah . Jawaban terpendek dalam byte menang.

Celah standar berlaku.

Biarawati Bocor
sumber
Terkait .
Leaky Nun

Jawaban:

3

Arang , 30 byte

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

Cobalah online! Penjelasan:

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

Perintah Oblong Annoyingly Charcoal tidak akan mengambil 0untuk dimensi, yang biaya saya 4 byte. Pendekatan lain adalah loop sementara g * d, tapi kemudian saya tidak bisa mencari cara untuk mengulanginya b(yang sudah ditentukan untuk huruf kecil).

Neil
sumber
Ups, maaf, itu keputusan desain yang disengaja, apakah menurut Anda input negatif juga diperbolehkan?
ASCII-satunya
@ Khusus ASCII Apa perilaku saat ini (baik untuk 0 dan negatif)? Ide terbaik saya adalah negatif akan menarik ke kiri / atas bukan kanan / bawah. (Juga, jika saya gunakan W×γδ, bagaimana saya mencetak huruf yang berbeda setiap kali?)
Neil
@Neil wow, saya mengerti maksud Anda yang AKAN menyebalkan.
Magic Gurita Guci
2

Pyth , 34 byte

M?*GH?<HGCgHG+*G]jk*G]~hZgG-HGYjgF

Cobalah online!

Biarawati Bocor
sumber
2

Haskell , 90 byte

(['a'..]!)
a?x=a<$[1..x]
((a:b)!y)x|x*y<1=""?y|x>y=map(a?y++)$b!y$x-y|z<-y-x=a?x?x++(b!z)x

Cobalah online!

Anders Kaseorg
sumber
1

Jelly , 32 byte

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

Cobalah online!

Ṁ,ạ/yAnda ingin penjelasan? Ini dia.

Ṁ,ạ/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.

Saya mungkin bisa bermain golf sedikit lebih banyak dengan menggunakan argumen implisit sebagai gantinya ³,⁴.

fireflame241
sumber
1

Haskell , 181 byte

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)

Cobalah online!

Untuk 10byte lebih banyak Anda mendapatkan spiral yang bagus, bukan :)

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

Cobalah online!

Tidak disatukan

The (#)menempatkan Operator dua matriks samping satu sama lain, tetapi transposes yang tepat, misalnya:

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

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

Ini pada dasarnya adalah versi rekursif dari algoritma Euclid, tetapi alih-alih melupakan pembagi & sisa dan mengembalikannya gcd, ia membangun kuadrat darinya dan mengakumulasikannya dengan (#). The svariabel adalah karakter yang tersisa yang bisa kita gunakan:

(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)

Fungsi sebenarnya hanya memanggil fungsi dari atas dengan serangkaian semua karakter yang dapat dicetak:

(['!'..'~']&)
ბიმო
sumber
Anda harus menghitung import Data.Listuntuk menggunakan transpose.
Anders Kaseorg
Saya melakukannya tetapi (setahu saya) tidak mungkin melakukan impor itu ketika saya menggunakan fungsi pointfree. Tapi saya memasukkannya dalam hitungan byte, silakan lihat TIO di mana jumlah byte sebenarnya 164..
ბიმო
1
Oh Anda dapat memainkan game preprosesor yang aneh , tetapi pada titik tertentu lebih masuk akal untuk mengedit kode di posting Anda secara manual setelah menyalin dari TIO.
Anders Kaseorg