1009 픽셀을 묶습니다


24

출력 은 1009 픽셀을 둘러싸는 모양입니다.

  • 모양은 하나의 닫힌 비교 차 루프 형태이어야합니다.

입력 은 0이 아닌 양의 정수입니다.

  • 각 입력은 고유 한 출력을 산출해야합니다. 즉, 각 출력은 더 낮은 입력을 사용하여 생성 된 출력과 고유해야합니다.

승리 는 최대 입력 제한에 의해 결정됩니다.

  • 제출물의 입력 제한은 고유하지 않거나 유효하지 않은 출력을 제공하는 가장 낮은 입력보다 1 작은 것으로 간주됩니다.
  • 예를 들어 1, 2 또는 3의 입력에 대해 유효하고 고유 한 출력이 생성되지만 4가 아닌 경우 입력 제한은 3입니다.

소스 코드에는 1009 바이트 제한이 있습니다. 무승부가 있으면 가장 적은 바이트를 가진 항목이 이깁니다.


제한 사항 및 설명 :

  • 도형의 최대 크기는 109 x 109 픽셀입니다. 크기에는 모양을 그리는 데 사용되는 선이 포함됩니다.
  • 선은 일정한 너비입니다.
  • 닫힌 공간은 선으로 완전히 둘러싸 야합니다. 이미지 파일의 경계를 사용할 수 없습니다.
  • 닫힌 1009 픽셀은 닫힌 공간만을 나타냅니다. 라인을 포함하지 않습니다.
  • 출력은 이미지입니다.
  • 색상, 선 두께 등과 같은 추가 그래픽 제한은 없습니다.
  • 출력의 고유성은 닫힌 공간만을 나타냅니다. 닫힌 공간이 고유하지 않은 경우 선 변경이나 기타 그래픽 변경은 관련이 없습니다.
  • 모양의 번역은 독특하지 않습니다. 회전, 반사 및 기타 변형은 고유 한 것으로 간주됩니다.
  • 출력은 재현 가능해야합니다. 동일한 입력은 항상 동일한 출력을 제공합니다
  • 출력 간에는 연속적이거나 다른 관계가있을 필요가 없습니다.
  • 제출의 '입력 제한'이외에는 정의 된 출력이 없습니다.
  • 외부 데이터의 다른 입력 또는 가져 오기는 허용되지 않습니다.
  • 선은 연속적이어야합니다. 즉 픽셀이 닿아 야합니다 (코너 수를 터치).
  • 픽셀은 드로잉 방법에 사용되는 '그리기'의 최소 단위이며 반드시 스크린 픽셀에 해당하지는 않습니다.

예 :

  • 다음은 유효한 모양의 예입니다.

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

  • 다음 도형이 잘못되었습니다 :

    invalid1 invalid2 invalid3

편집 : 라인 터치 :

  • 밀폐 된 공간은 연속적이어야하며 픽셀 터치로 정의됩니다. 터치 코너 카운트.
  • 선은 바깥쪽에 공백을 넣을 수 없습니다. @Sparr이 게시 한이 이미지는이 점을 보여줍니다. 각 행의 첫 번째 모양 만 유효합니다.

    감동

  • 선의 바깥 쪽은 닿을 수 있지만 공간을 둘러싸는 방식은 아닙니다.

  • 터치 선이 겹치지 않을 수 있습니다. 예를 들어 2 개의 터치 1 픽셀 두께 선은 결합 된 두께가 2px, 절대 1px가 아닙니다.

같은 모양의 회전은 어떻습니까? 그들은 구별됩니까?
Martin Ender

도형의 측면에서 물린 경우 1 픽셀 너비의 전경 (검은 색) 선을 갖는 것이 괜찮습니까? 또는 너비가 3 픽셀이어야하므로 들어오고 나가는 선이 닿지 않습니까? 또는 너비가 2 픽셀이므로 수신 및 발신 라인 터치가 겹치지 않습니까?
Level River St

몇 가지 질문이 더 있습니다. 1. 109x109 이미지의 테두리가 모양의 경계로 작용할 수 있습니까? 2. 선 두께가 나에게 달려 있다면 200 픽셀이라고 말하면 모양이 검은 색 이미지의 흰색 픽셀일까요? 3. 픽셀이 모퉁이를 만지면 모양이 연결됩니까? 4. 나는 글자 수 제한을 좋아하지 않습니다. 많은 언어가 정확한 출력 사양을 설정하기 위해 3/4를 사용할 수 있습니다.
Martin Ender

2
질문, 1009는 어떻게 얻었습니까?
Claudiu

1
이 중 어떤 모양이 유효하고 구멍이 없습니까? i.imgur.com/FSV0nHz.png
Sparr

답변:


25

파이썬 + Pycairo, 2 백 개 모양

명백한 것으로 시작합시다.

애니메이션 1

from cairo import *
from sys import argv

n = int(argv[1]) - 1

s = ImageSurface(FORMAT_ARGB32, 109, 109); c = Context(s)
c.set_antialias(ANTIALIAS_NONE); c.set_line_width(1); c.translate(54, 54)
def pixel(x, y): c.rectangle(x, y, 1, 1); c.fill()

W, H, R = 100, 10, 9
X1, Y1 = -W / 2 - 1, -H / 2 - 1
X2, Y2 = X1 + W + 1, Y1 + H + 1

pixel(X2 - 1, Y1)
c.move_to(X1, Y1 + 1); c.line_to(X1, Y2 + 1)
c.move_to(X2 + 1, Y1); c.line_to(X2 + 1, Y1 + R + 1);
c.move_to(X2, Y1 + R + 1); c.line_to(X2, Y2 + 1)
c.stroke()

for i in xrange(W):
    offset = (n >> i) & 1
    for y in Y1, Y2: pixel(X1 + i, y + offset)

s.write_to_png("o.png")

명령 행에서 숫자를 받아서 씁니다 o.png.


아주 좋아요 간단한 아이디어, 잘 실행되었습니다. 우승 점수는 아니지만 추가 참가를위한 좋은 기준을 설정합니다.
Sparr

... * 2,Rotations [...] count as unique.
edc65

@ edc65 : 대칭이 아니기 때문에 실제로 * 4입니다.
justhalf

19

BBC 기본, 10 ^ 288 점 (0이 계산되지 않은 경우 마이너스 1)

http://sourceforge.net/projects/napoleonbrandy/ 에서 통역사를 다운로드 하십시오 (일반적인 BBC 기본 통역사가 아니며 긴 문자열을 지원하지 않습니다).

많은 정보를 인코딩하려면 많은 경계가 필요합니다. 그것은 얇은 모양을 의미합니다. 왼쪽에 49 픽셀의 세로 막대로 시작하여 96 픽셀의 촉수 10 개를 추가합니다. 각 촉수는 @ell의 솔루션과 유사한 방식으로 96 비트를 총 960 비트로 인코딩 할 수 있습니다.

BBC Basic은 큰 수를 처리 할 수 ​​없으므로 최대 288 개의 십진수가 문자열로 입력되고, 3 개의 십진수는 10 비트 이진수로 변환됩니다. 각 비트는 촉수 중 하나를 픽셀 인 경우 하나의 픽셀만큼 흔들기 위해 사용됩니다 1(하지만 그렇지 않은 경우 0).

    1MODE1:VDU19,0,7;0;19,15,0;0;               :REM select an appropriate screen mode and change to black drawing on white background
   10INPUT a$
   20a$=STRING$(288-LEN(a$)," ")+a$             :REM pad input up to 288 characters with leading spaces
   50RECTANGLE0,0,8,200                         :REM draw a rectangle at the left, enclosing 49 pixels
   60FOR n=0 TO 95
   70  b=VAL(MID$(a$,n*3+1,3))                  :REM extract 3 characters from a$ and convert to number
   80  FOR m=0 TO 9                             :REM plot the ten tentacles
   90    PLOT71,n*4+8,m*20+8+(b/2^m AND 1)*4    :REM plot (absolute coordinates) a background colour pixel for tentacle m at horizontal distance n
  100    POINT BY 0,-4                          :REM offsetting vertically by 1 pixel according to the relevant bit of b
  110    POINT BY 4,4
  120    POINT BY -4,4                          :REM then plot foreground colour pixels (relative coordinates) above, below and to the right.
  130  NEXT
  140NEXT

산출

288 자리 숫자에 대한 일반적인 출력입니다. 이진수 999는 1111100111입니다. 9 자리 숫자 세트가 촉수의 물결을 어떻게 유발하는지 확인할 수 있습니다.

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

기술

A. Martin의 포인트 3에 대한 답변은 "픽셀의 모서리 만 터치하면 모양이 연결되어 있습니까?" "예"이므로 답변이 준수된다는 것을 이해합니다. 그럼에도 불구하고 모든 행에서 999와 000을 번갈아 가면 (예를 들어) 매우 바쁘게 보입니다.

B. 이것을 측면에서 물린 부분이있는 사각형으로 볼 때, 인접한 촉수 한 쌍 사이에 세 개의 픽셀을 허용하여 바깥 쪽의 검은 선이 절대 닿지 않도록 할 수 있습니다. 이것에 대한 특별한 규칙은 없습니다 (내 대답에 비추어 묻는 이유가 더 명확하기를 바랍니다.) 선이 도형의 바깥쪽에 닿을 수 있으면 촉수를 함께 움직여서 더 적은 픽셀을 사용할 수 있습니다 수직 막대 (그리고 촉수를 조금 더 길게 만듭니다) 그러나 픽셀이 모양의 내부 또는 외부에 있는지 눈으로 판단하는 것은 매우 혼란 스러울 것이므로 검은 선 외부가 절대로 닿지 않아야한다는 나의 해석 그 자체가 최고입니다.

C.이 화면 모드의 BBC 기본은 2x2 정사각형 화면 픽셀을 단일 픽셀로 취급합니다. 모양이 너무 작지 않으면 볼 수 있기 때문에 이것을 그대로 두었습니다. 이러한 BBC 기본 픽셀 각각은 4x4 논리 단위의 상자로 간주됩니다. BBC basic의 개발자들은 처음부터 화면 해상도가 증가 할 것이라는 사실을 알았으므로 논리적 해상도는 물리적 해상도보다 높았습니다.


A : 대답은 "예"로 남아 있지만 지금은 조금 이상합니다. B. 나는 지금 당신의 요점을보고 명확하게하기 위해 편집을했습니다.
jsh

C : 문제가되지 않습니다. 픽셀은 이제 사용 된 가장 작은 도면 단위로 정의됩니다.
jsh

6

Mathematica, 496 바이트, 점수 : 큰 것 (> 1157)

내가 가지고있는 하한은 엄청나게 낮지 만 아직 확인해야 할 무차별 한 힘보다 더 좋은 방법을 찾지 못했습니다.

SeedRandom@Input[];
g = 0 &~Array~{109, 109};
g[[2, 2]] = 1;
h = {{2, 2}};
For[n = 1, n < 1009,
  c = RandomChoice@h;
  d = RandomChoice[m = {{1, 0}, {0, 1}}];
  If[FreeQ[e = c + d, 1 | 109] && 
    Count[g[[2 ;; e[[1]], 2 ;; e[[2]]]], 0, 2] == 1,
   ++n;
   h~AppendTo~e;
   g[[## & @@ e]] = 1
   ];
  ];
(
    c = #;
    If[e = c + #; g[[## & @@ e]] < 1,
       g[[## & @@ e]] = 2
       ] & /@ Join @@ {m, -m}) & /@ h;
ArrayPlot[g, ImageSize -> 109, PixelConstrained -> True, 
 Frame -> 0 > 1]

아직 골프를 치지 않았습니다. 왜냐하면 필요가 없었기 때문입니다. 누군가가 실제로 나와 관계하고 있음을 증명하면 그렇게 할 것입니다.

알고리즘은 기본적으로 109x109 이미지의 왼쪽 상단 모서리에서 플러드 필을 수행하고 (라인을 허용하기 위해 1 픽셀 씩 오프셋) 1009 셀에 플러드가 발생하면 테두리를 중지하고 표시합니다. 당신은 색상이 우리에게 달려 있다고 말 했으므로 배경은 흰색이고 선은 검은 색이며 내부는 회색입니다 (필요한 경우 소수의 문자에 대해 회색을 제거 할 수 있음).

홍수 채우기는 상당히 제한되어 있지만 구멍에 대해 걱정할 필요가 없습니다. 이러한 제약 조건을 완화하면 아마도 (아직 알려지지 않은) 점수가 크게 높아질 것입니다.

나는 지금 점수에 하한을 두려고 노력할 것이다.


시도해 볼 수 있도록 CDF 파일 을 제공 할 수 있습니까?
jsh

1
@jsh 이것을 시도
마틴 엔더

난수에 의존하는 모든 솔루션은 유효성을 검사하기 위해 무차별 대입이 필요하다고 생각합니다. 픽셀 단위로 픽셀을 검사하는지 확실하지 않지만 각 출력을 단색 비트 맵 (작은 파일 크기)에 저장하고 해시를 비교할 수 있습니다. 이미지 비교 속도가 빠르다고 생각합니다.
stokastic

@stokastic 저는 현재 매우 순진 해시 (모든 픽셀 좌표의 합)를 만들고 있으며 충돌 함을 자세히 확인하고 있습니다. 문제는 충돌 검사에 사용하는 접근 방식이 아무리 정교하더라도 생성 방법이 너무 느려서 합리적인 시간 내에 몇 개의 10k 또는 100k 시드 이상을 해결할 수 없다는 것입니다. 그래도 알고리즘 속도를 상당히 높이는 몇 가지 방법이 있으므로 어느 시점에서 알고리즘을 살펴볼 수 있습니다.
Martin Ender

@ MartinBüttner 이미 테스트했거나 수학이 지원하지는 않지만 곧바로 파일 해시가 더 빠를 수 있습니다. 시도하지 않았다면 제안하십시오.
stokastic

1

파이썬 2, 점수> 10 ^ 395

그것은 매우 느리고 실제로 n = 0 이외의 결과를 얻지 못했지만 테스트하려는 경우 SIZE(픽셀 수)와 BOUND경계 사각형의 최대 측면 길이 를 테스트 하려면 많은 결과를 얻을 수 있습니다. 생산량을 계산하고 계산하는 것은 매우 어려웠습니다. 나는 내가 제공하는 하한이 정확하다고 확신하지만 실제 수는 상당히 클 것으로 생각하고 나중에 개선하려고 시도 할 수 있습니다.

import sys
import pygame
sys.setrecursionlimit(1100)

def low(s):
    return min(sum(e[1] for e in s[:i+1]) for i in range(len(s)))
def high(s):
    return max(sum(e[1] for e in s[:i+1])+s[i][0] for i in range(len(s)))

BOUND = 109
SIZE = 1009

def gen(n,t=0):
    if n <= (BOUND-t)*BOUND:
        for i in range(1,min(n,BOUND)):
            for r in gen(n-i,t+1):
                a,b=r[0]
                for x in range(max(1-a,high(r)-low(r)-BOUND),i):
                    yield [(i,0),(a,x)]+r[1:]
        yield [(n,0)]

def create(n):
    g=gen(SIZE)
    for i in range(n+1):shape=g.next()
    s=pygame.Surface((BOUND+2,BOUND+2))
    l=low(shape);x=0
    for y,(t,o) in enumerate(shape):
        x+=o;pygame.draw.line(s,(255,255,255),(x-l+1,y+1),(x-l+t,y+1))
    out=[]
    for x in range(BOUND+2):
        for y in range(BOUND+2):
            if all((0,0,0)==s.get_at((x+dx,y+dy))for dx,dy in[(-1,0),(1,0),(0,-1),(0,1)]if 0<=x+dx<BOUND+2 and 0<=y+dy<BOUND+2):
                out.append((x,y))
    for x,y in out:
        s.set_at((x,y),(255,255,255))
    pygame.image.save(s,"image.png")

2
당신은 이미지를 줄 수 있습니까 n=0? 또한 10 ^ 395를 달성하는 방법을 설명 할 수 있습니까?
justhalf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.