삼각형 수의 이진 이미지


18

나의 도전은 조금 어렵고 매력적이지 않은 경향이 있습니다. 여기에 쉽고 재미있는 것이 있습니다.

알쿠 인의 순서

Alcuin의 순서 A(n) 는 삼각형을 세면서 정의됩니다. A(n)정수 변과 둘레를 가진 삼각형의 수입니다 n. 이 순서는 York의 Alcuin의 이름을 따서 불립니다.

이 시퀀스의 처음 몇 요소는 다음과 n = 0같습니다.

0, 0, 0, 1, 0, 1, 1, 2, 1, 3, 2, 4, 3, 5, 4, 7, 5, 8, 7, 10, 8, ...

예를 들어 A(9) = 3, 때문에 주변 정수 측면과 유일한 삼각형 9입니다 1 - 4 - 4, 3 - 3 - 3그리고 2 - 3 - 4. 아래 3 개의 유효한 삼각형을 볼 수 있습니다.

정수 변과 둘레가있는 삼각형 9

이 순서에는 꽤 흥미로운 패턴이 있습니다. 예를 들어 A(2*k) = A(2*k - 3).

자세한 내용 은 OEIS의 A005044 를 참조하십시오 .

도전

그러나 당신의 도전은이 숫자들의 이진 표현에 관한 것입니다. 각 시퀀스 번호를 이진 표현으로 변환하고 열 벡터에 넣고 정렬하면 매우 흥미로운 이진 그림이 만들어집니다.

다음 그림에서 시퀀스 번호의 이진 표현을 볼 수 있습니다 A(0), A(1), ..., A(149). 첫 번째 열에는의 이진 표현 A(1), 두 번째 열에는의 표현 A(1)등이 있습니다.

n = 0에서 149까지의 Alcuin 시퀀스의 이진 표현

이 그림에서 일종의 반복되는 패턴을 볼 수 있습니다. 예를 들어 시퀀스 번호가있는 이미지를 보면 프랙탈처럼 보입니다 A(600), A(601), ..., A(899).

n = 600에서 899까지 Alcuin 시퀀스의 이진 표현

당신의 임무는 그러한 이미지를 생성하는 것입니다. 함수에서 스크립트는 두 개의 정수를 수신 0 <= m < n하며 Alcuin의 sequence 이진 이미지를 생성해야합니다 A(m), A(m+1), A(m+2), ..., A(n-2), A(n-1). 따라서 입력 0, 150은 첫 번째 그림을 생성하고 입력 600, 900은 두 번째 그림을 생성합니다 .

원하는 인기있는 그래픽 형식을 사용할 수 있습니다. image.online-convert.com을 사용하여 png로 변환 할 수있는 모든 형식을 가정 해 봅시다 . 또는 이미지를 화면에 표시 할 수 있습니다. 선행 흰색 행은 허용되지 않습니다!

이것은 코드 골프입니다. 따라서 가장 짧은 코드 (바이트)가 이깁니다.


3
이진 이미지를 만드는 데 도움이 될 때까지이 도전에 관심이있었습니다. 외부 단계처럼 보입니다. 나는 파이썬에서 이미지 생성을 위해 라이브러리를 배우는 것을 좋아하지 않으며, 그렇게하면 골프를 많이하지 않을 것으로 기대합니다.
xnor

1
@ xnor : 그런 다음 PBM 과 같은 간단한 이미지 형식을 사용하십시오 .
Jakube

아니면 white=1 and black=0다른 방법입니까?
Maltysen

@Maltysen white=0 and black=1. 다른 방법으로. A(0)흰색 열을 A(9)=3생성하고 아래쪽에 2 개의 검은 픽셀이있는 흰색 열을 생성합니다.
Jakube

1
첫 번째 이미지가 정확합니까? 그것은 0,0,0,1,0,2질문의 시작 부분에있는 목록이 말합니다 0,0,0,1,0,1.
Maltysen

답변:


2

J ( 52 45 (코드 페이지 437))

이것은 허용 될 것입니다 (제 생각에)

[:|:' █'{~[:#:[:([:<.48%~*:+24+6*]*2|])(}.i.)

육각 덤프

(실제로 검은 사각형은 코드 페이지 437의 DB 16 또는 219 10 입니다.)

0000: 5b 3a 7c 3a 27 20 db 27 7b 7e 5b 3a 23 3a 5b 3a   [:|:' .'{~[:#:[:
0010: 28 5b 3a 3c 2e 34 38 25 7e 2a 3a 2b 32 34 2b 36   ([:<.48%~*:+24+6
0020: 2a 5d 2a 32 7c 5d 29 28 7d 2e 69 2e 29            *]*2|])(}.i.)

용법

이것은 다음과 같이 출력됩니다 (코드 태그는 줄 사이에 공간을 추가하여 엉망이됩니다) :

   A=:[:|:' █'{~[:#:[:([:<.48%~*:+24+6*]*2|])(}.i.)
   0 A 100
                                                                             █ █████████████████████                                          
                                                     █ ██████████████████████ █              █ █████                          
                                     █ ██████████████ █          █ ██████████ █      █ ██████ █                   
                         █ ██████████ █      █ ██████ █    █ ████ █    █ ████ █  █ ██ █  █ ██ █  █ █  
                 █ ██████ █    █ ████ █  █ ██ █  █ ██ █  █  █  █  █  █  ██ ██ ██  ██  ██  ██  ██  ██
           █ ████ █  █ ██ █  █  █  █  ██  ██  ██  ██  ██  █  █  █  █ ██ █  █ ████ █                               
       █ ██ █  █  ██  ██  ██  █  █ ██ █                █ ██ █  █  ██  ██  ██  █  █ ██ █                                   
   █ ██ ██  ██ ██ █        █ ██ ██  ██ ██ █        █ ██ ██  ██ ██ █        █ ██ ██  ██ ██ █        █    
   2000 A 2100
████████████████████████████████████████████████████████████████████████████████████████████████████

████████████████████████████████████████████████████████████████████████████████████████████████████
                                                                             █ █████████████████████
                             █ ██████████████████████████████████████████████ █
     █ ██████████████████████ █                      █ ██████████████████████ █
█████ █          █ ██████████ █          █ ██████████ █          █ ██████████ █          █ █████████
 ████ █    █ ████ █    █ ████ █    █ ████ █    █ ████ █    █ ████ █    █ ████ █    █ ████ █    █ ███
█  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █
██  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █ ██ ██ █
 █ ██ ██ ██ ██ ██ █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  ██ ██ ██ ██ ██  █  █
  ██ ██ ██  █  █  ██ ██ ██  █  █  █  █  █  █  █  █  █  █  █  █  █  █ ██ ██ ██ █  █  █  █ ██ █  █ ██
 █ ██ █  █ ██ █  █ ██ █  █ ██ █  █  █  █  █  █  █  █  █  █  ██ ██ ██  █  █  ██  ██ ██ ██  ██  ██  ██
  ██  ██  ██  ██  ██  ██  ██  ██ ██ ██  █  █  █  █  █  █ ██ █  █ ██ █  █ ████ █    █ ██████ █
█ █                        █ ████ █  █ ██ █  █  █  █  ██  ██  ██  ██  ██  █  █  █  █ ██ █  █ ████ █
 █ ██ █                █ ██ █  █  ██  ██  ██  █  █ ██ █                █ ██ █  █  ██  ██  ██  █  █ █
██  ██ ██ █        █ ██ ██  ██ ██ █        █ ██ ██  ██ ██ █        █ ██ ██  ██ ██ █        █ ██ ██

표준 J 콘솔에서는 줄 사이에 간격이 없으므로 규칙을 '대체로 이미지를 화면에 표시 할 수 있습니다'라고 부릅니다. (이 이미지는 내부적으로 현명한 이미지 형식으로 표현되어야한다고 말하지 않았습니다)

편집 : JQT와 달리 Jconsole은 코드 페이지 437을 기본값으로 사용하며 문자열에서 사각형을 사용할 때 사각형을 올바르게 렌더링합니다.


9

매쓰, 126 (122) 121 89 바이트

Image[1-Thread@IntegerDigits[l=Round[(#+3#~Mod~2)^2/48]&/@Range@##,2,⌈2~Log~Max@l⌉]]&

이것은 두 정수를 매개 변수로 사용하고 화면에 이미지를 표시하는 명명되지 않은 함수를 정의합니다. 각 정사각형을 단일 픽셀로 표시하지만 원하는 경우 실제로 확대 할 수 있습니다.

나는 이제 OEIS 기사에 나와있는 명시 적 공식을 사용하고 있습니다 (Mathematica 섹션의 첫 번째 공식 은 David Carraher 덕분입니다). 지금도 엄청나게 빠릅니다.

다음은 몇 가지 주석이있는 들여 쓰기 코드입니다.

Image[1-Thread@IntegerDigits[   (* 3. Convert each number to padded binary, transpose
                                      invert colours, and render as Image. *)
    l = Round[
      (#+3#~Mod~2)^2/48
    ] & /@ Range@##,            (* 1. Turn input into a range and get the Alcuin
                                      number for each element. *)
    2,
    ⌈2~Log~Max@l⌉               (* 2. Determine the maximum number of binary digits. *)
]] &

출력은 다음과 같습니다 0, 600.

여기에 이미지 설명을 입력하십시오


대략 같은 크기 (왼쪽과 오른쪽 천장은 철자가되어야하기 때문에) :Image[1 - Thread@IntegerDigits[ l = Round[If[EvenQ[#], #^2, (# + 3)^2]/48] & /@ Range@##, 2, \[LeftCeiling]2~Log~Max@l\[RightCeiling]]] &
DavidC

@DavidCarraher 감사합니다. 골프를 조금 더 했어요. :) (OEIS 기사를 확인해야합니다.)
Martin Ender

8

CJam ( 56 55 53 자) / GolfScript (64 자)

CJam :

"P1"q~,>{_1&3*+_*24+48/}%_:e>2b,\2_$#f+2fbz(,@@:~~]N*

GolfScript :

"P1"\~,>{.1&3*+.*24+48/}%.$-1=2base,\{2.$?+2base}%zip(,@@{~}/]n*

둘 다 NetPBM 형식으로 출력을 생성하며 본질적으로 서로의 포트입니다.

해부

CJam                 GolfScript           Explanation

"P1"                 "P1"\                NetPBM header
q~,>                 ~,>                  Create array [m .. n-1]
{_1&3*+_*24+48/}%    {.1&3*+.*24+48/}%    Map the sequence calculation
_:e>2b,\             .$-1=2base,\         Compute image height H as highest bit
                                          in largest number in sequence
2_$#f+2fb            {2.$?+2base}%        Map sequence to bits, ensuring that
                                          each gives H bits by adding 2^H
z(,@@                zip(,@@              Transpose and pull off dummy row to use
                                          its length as the "width" in the header
:~~                  {~}/                 Flatten double array and dump on stack
]N*                  ]n*                  Separate everything with whitespace

CJam 56-> 53의 Optimizer 에 감사합니다 .


1
처음에 "P1"이 없어서 ''?
Optimizer

@Optimizer도 GS에서 생각하는 데 사용됩니다.
피터 테일러

확실하지 않음 : 출력에 높이가 표시되어야합니다. 그러나 여전히 맵 단축으로 절약 할 수 있습니다.
피터 테일러

51 :'PoXq~{_1&3*+_*24+48/}%>_:e>2b,\2_$#f+2fbz(,@@]e_N*
Optimizer

5

피시스 -101 60 59

a를 출력합니다 .pbm. 더 골프를 칠 수 있습니다.

Km.B/++24*dd**6%d2d48rvzQJCm+*\0-eSmlkKlddK"P1"lhJlJjbmjbdJ

내가 Pyth로 번역 할 것이기 때문에 골프를 많이하지 않습니다.

다음에 오는 설명. 지금은 동등한 파이썬 코드를 살펴보십시오.

OEIS 알고리즘을 사용하여 시퀀스를 계산 한 다음 이진수로 변환하고 숫자를 채우고 행렬 회전을 수행하여 pbm이미지 형식으로 지정합니다 . 나는 무차별적인 힘을 사용하지 않기 때문에 엄청나게 빠릅니다.

         K=
 m          rvzQ      Map from eval input to eval input
  .B                  Binary rep
   /      48          Divided by 48
    ++                Triple sum      
     24               Of 24,
     *dd              Square of d
     **               Triple product
      6               6
      %d2             Modulo d%2
      d               Var d
J                     Set J=
 C                    Matrix rotation from columns of row to rows of columns
  m           K       Map K (This does padding)
   +                  String concat
    *                 String repeat
     \0               "0"
     -     ld         Subtract the length of the column from
      eS              The max
       mlkK           Of all the column lengths
    d                 The column
"P1"                  Print header "P1"
l                     Length of
 hJ                   First row
lJ                    Number of columns
jb                    Join by linebreaks
 m  J                 Map on to J
  jb                  Joined columns by linb
   d

600,900예를 들면 다음과 같습니다 .

600-900

온라인으로 사용해보십시오 .


4

R - 127 125

이것이 규칙을 완전히 준수하는지 확실하지 않습니다. 이미지를 파일로 출력하지는 않지만 래스터를 만들어 출력 장치에 플롯합니다.

Martin과 같은 공식을 찾았지만 here .

명명되지 않은 함수를 사용합니다.

require(raster);function(m,n)plot(raster(mapply(function(n)rev(as.integer(intToBits(round((n+n%%2*3)^2/48)))),m:n),0,n,0,32))

다음과 같이 실행

require(raster);(function(m,n)plot(raster(mapply(function(n)rev(as.integer(intToBits(round((n+n%%2*3)^2/48)))),m:n),0,n,0,32)))(0,600)

다음 플롯을 생성합니다

여기에 이미지 설명을 입력하십시오


raster네임 스페이스에 첨부하지 않으면 7 바이트를 삭제할 수 있습니다 raster(). 패키지에 고유 한 것이기 때문입니다. 대신하세요 raster::raster(...).
Alex A.

@AlexA. 감사합니다, 그 편집을 할 것입니다
MickyT

@AlexA. 불행히도 방금 시도해 보았고 오류가 발생했습니다. 래스터도 sp를 필요로하기 때문이라고 생각합니다. 내가 추적 할 수 있는지 보겠습니다.
MickyT

버머. 길을 잃게해서 죄송합니다.
Alex A.

3

파이썬 2 + PIL , 255 184

내 첫 번째 버전은 이미지를 보여주기 위해 PIL을 사용했습니다.

i,R,B=input,range,lambda x:bin((x*x+6*x*(x%2)+24)/48)[2:]
def F(k,v):i.load()[k]=v
a,b=i(),i();h=len(B(b));from PIL import Image;i=Image.new('P',(b-a,h))
[F((x-a,y),int(B(x).zfill(h)[y])) for x in R(a,b) for y in R(h)]
i.putpalette([255]*3+[0]*3)
i.show()

새 버전은 stdout에서 흑백 PPM 이미지를 생성합니다.

i,R,B=input,range,lambda x:bin((x*x+6*x*(x%2)+24)/48)[2:]
def p(s):print s
a,b=i(),i();h=len(B(b));p('P1 %i %i'%(b-a,h))
[p(' '.join([B(x).zfill(h)[y] for x in R(a,b)])) for y in R(h)]

PPM 버전의 일부 문자 저장 : 공백이 필요하지 않습니다 for. x%2순서를 (으)로 변경하면 주변 에서 흩 날리는 것을 피할 수 있습니다 x%2*.... 인쇄를 함수로 정의하지 않고 줄 바꿈을 피하기 위해 for사용 하고 새 줄을 시작 print ...,하기 위해 공백 print을 사용하여 두 개의 중첩 루프를 사용하는 것이 더 짧 습니다. 이진 확장의 길이를 강제로 설정 h하지 않는 방법 은를 zfill추가 2**h한 다음 마지막 h숫자 를 추출하는 것 입니다.
xnor

2

자바-291

암호:

(function(a,b,c){c.width=b;t=c.getContext('2d');t.strokeStyle='black';for(i=a;i<=b;i++){g=(Math.floor(((i*i)+6*i*(i%2)+24)/48)>>>0).toString(2);l=g.length;for(j=0;j<l;j++){if(g[l-1-j]=='1'){t.rect(i-a,j,1,1);t.fill();}}}document.body.appendChild(c);})(0,300,document.createElement('canvas'))

설명:

(function (a, b, c) {
    //setting canvas width
    c.width = b;
    //get context 2d of canvas
    t = c.getContext('2d');
    //setting storke style.
    t.strokeStyle = 'black';
    //looping from a to b
    for (i = a; i <= b; i++) {
        //calculating A(i) and converting it to a binary string
        g = (Math.floor(((i * i) + 6 * i * (i % 2) + 24) / 48) >>> 0).toString(2);
        //looping through that string
        for (j = 0; j < g.length; j++) {
            //since canvas is upside down and the first digit is actually the last digit:
            if (g[g.length - 1 - j] == '1') {
                //we create the 1 by 1 rect
                t.rect(i - a, j, 1, 1);
                //we draw the rect
                t.fill();
            }
        }
    }
    //we append everything to the body
    document.body.appendChild(c);
    //parameters are put here
})(0, 300, document.createElement('canvas'))

결과:

예, 결과는 거꾸로 표시되지만 0,0a js canvas가 왼쪽 위에 있기 때문 입니다 . :삼 알퀸의 순서

데모:

jsfiddle 데모

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