유클리드 알고리즘을 다시 시각화


10

직무

두 개의 양의 정수가 주어지면 :

  1. 두 정수로 지정된 치수로 사각형을 그립니다.
  2. 더 이상 공간이 없을 때까지 3 단계를 반복하십시오.
  3. (나머지) 사각형의 세면을 만지는 가장 큰 사각형을 그리고 채 웁니다.
  4. 결과 사각형을 출력합니다.

예를 들어, 입력은 610입니다.

크기 6 x 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

성가신 Charcoal의 Oblong 명령은 0차원을 취하지 않으므로 4 바이트가 필요합니다. 다른 방법은 while을 반복하는 g * d것이지만 반복하는 방법을 해결할 수 없었습니다 b(소문자로 미리 정의되어 있음).


죄송합니다. 이것은 의식적인 디자인 결정이었습니다. 부정적인 입력도 허용되어야한다고 생각하십니까?
ASCII 전용

@ASCII 전용 현재 동작은 무엇입니까 (0과 음 모두)? 가장 좋은 생각은 부정적인 것이 오른쪽 / 아래쪽 대신 왼쪽 / 위쪽으로 그려지는 것입니다. (또한 사용하면 W×γδ매번 다른 문자를 어떻게 인쇄합니까?)
Neil

@ Neil 와우, 당신이 WOULD가 성가신 것을 의미한다는 것을 알 수 있습니다.
Magic Octopus Urn



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

하스켈 , 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.