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


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. Вы можете заполнить квадраты буквами, которые вы поддерживаете в любом порядке .

Testcases

Входные данные: 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

Досадно, что команда Oblong от Charcoal не примет 0измерения, которое стоит мне 4 байта. Другой подход заключался бы в цикле while g * d, но потом я не мог понять, как выполнять итерации b(что предопределено строчными буквами).


Ой, извините, это было осознанное дизайнерское решение, как вы думаете, следует ли допускать и отрицательный вклад?
Только для ASCII

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

@ Ничего себе, я понимаю, что ты имеешь в виду, что будет раздражать.
Волшебная урна осьминога



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байтов больше вы получите хорошую спираль вместо :)

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

Попробуйте онлайн!

Ungolfed

В (#)оператор ставит две матрицы рядом друг с другом, но переставляет правильный, например:

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

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.
Андерс Касеорг

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

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