Знову візуалізуйте алгоритм Евкліда


10

Завдання

Дано два натуральних числа:

  1. Намалюйте прямокутник з розмірами, визначеними двома цілими числами.
  2. Повторіть крок 3, поки не буде більше місця.
  3. Намалюйте та заповніть найбільший квадрат, що торкається трьох сторін (залишився) прямокутника.
  4. Виведіть отриманий прямокутник.

Приклад

Наприклад, нашим входом є 6і 10.

Намалюємо порожнистий прямокутник розміром 6 х 10:

xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx

Після багаторазового заповнення квадратів ми отримали ось що:

aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaaccdd
aaaaaaccdd

Є 4 квадрата тут ( a, b, c, d), кожен з довжиною сторони 6, 4, 2, 2відповідно.

Правила і свобода

  1. Для кожного квадрата потрібно використовувати іншу літеру.
  2. Ви можете вибрати, які літери підтримувати, якщо всі букви підтримуються для друку, і 10підтримуються принаймні символи.
  3. У кожному етапі 3 етапу вище, у вас є два варіанти (за винятком останньої ітерації, де у вас є лише один вибір). Обидва варіанти є дійсними.
  4. Кількість необхідних квадратів не перевищує кількість букв, які ви підтримуєте.
  5. Ви можете заповнити квадрати літерами, які підтримуєте, у будь-якому порядку .

Тестові шафи

Вхід: 6, 10

Вихід:

aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaaccdd
aaaaaaccdd

або

aaaaaaccdd
aaaaaaccdd
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb

або

bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
ccddaaaaaa
ccddaaaaaa

або

ccddaaaaaa
ccddaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa

або

ddddddaaaa
ddddddaaaa
ddddddaaaa
ddddddaaaa
ddddddbbcc
ddddddbbcc

Вхід: 1,1

Вихід:

a

Вхід: 1,10

Вихід:

abcdefghij

Вхід: 10,1

Вихід:

a
b
c
d
e
f
g
h
i
j

Зауважте, що є більше можливостей, ніж я можу включити для тестів вище.

Оцінка балів

Це . Найкоротша відповідь у байтах виграє.

Застосовуються стандартні лазівки .


Відповіді:


3

Вугілля деревне , 30 байт

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

Спробуйте в Інтернеті! Пояснення:

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

Наполеглива команда «Тривалість вугілля» не сприймає 0розмір, який коштує мені в 4 байти. Інший підхід полягав би в тому, щоб циклічно зафіксувати час g * d, але тоді я не міг розробити, як його повторити b(що заздалегідь визначено малими літерами).


На жаль, вибачте, це було свідоме дизайнерське рішення, чи вважаєте ви, що також слід дозволити негативні дані?
ASCII лише

@ ASCII-тільки Яка поведінка в даний час (як для 0, так і для негативного)? Моя найкраща ідея - щоб негатив притягувався вліво / вгорі замість правого / нижнього. (Також, якщо я використовую W×γδ, як я друкую інший лист кожного разу?)
Ніл

@Neil вау, я бачу, що ти маєш на увазі, що БУДЕ дратувати.
Чарівна восьминога урна



1

Желе , 32 байти

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

Спробуйте в Інтернеті!

Ṁ,ạ/yВи хочете пояснення? Ось.

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

Я, швидше за все, можу гольф трохи більше, використовуючи неявні аргументи замість цього ³,⁴.


1

Haskell , 181 байт

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)

Спробуйте в Інтернеті!

Для 10байтів більше ви отримаєте гарну спіраль замість цього :)

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

Спробуйте в Інтернеті!

Безумовно

У (#)оператор ставить дві матриці поруч один з одним, але переставляє правильний, наприклад:

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

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

Це в основному рекурсивна версія алгоритму Евкліда, але замість того, щоб забувати дільники і залишки і повертати їх gcd, він будує з нього квадрати і накопичує їх (#). sЗмінний є іншими символами , які ми можемо використовувати:

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

Фактична функція просто викликає функцію зверху рядком усіх друкованих символів:

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

Вам потрібно порахувати, import Data.Listщоб використовувати transpose.
Anders Kaseorg

Я це зробив, але (наскільки мені відомо) неможливо зробити цей імпорт, коли я використовую функцію pointfree. Але я включив його до підрахунку байтів, будь ласка, дивіться TIO, де насправді вважається кількість байтів 164..
ბიმო

1
Ой. Ви можете грати в дурні препроцесорні ігри , але в якийсь момент має сенс просто редагувати код у своєму дописі вручну після копіювання з TIO.
Anders Kaseorg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.