ล้อมรอบ 1009 พิกเซล


24

เอาท์พุทเป็นรูปร่างที่ล้อมรอบ 1009 พิกเซล

  • รูปร่างต้องอยู่ในรูปแบบของวงรอบเดียวที่ปิดและไม่ตัดกัน

ข้อมูลเข้าเป็นจำนวนเต็มบวกที่ไม่เป็นศูนย์

  • แต่ละอินพุตจะต้องให้ผลลัพธ์ที่ไม่ซ้ำกันนั่นคือแต่ละเอาต์พุตต้องไม่ซ้ำกันจากที่สร้างขึ้นโดยใช้อินพุตที่ต่ำกว่า

ชัยชนะถูกตัดสินโดยขีด จำกัด อินพุตที่ใหญ่ที่สุด:

  • ขีด จำกัด การป้อนข้อมูลของการส่งของคุณถือเป็น 1 น้อยกว่าการป้อนข้อมูลต่ำสุดที่ให้ผลลัพธ์ที่ไม่ซ้ำกันหรือไม่ถูกต้อง
  • ตัวอย่างเช่นหากมีการสร้างเอาต์พุตที่ถูกต้องและไม่ซ้ำกันสำหรับอินพุต 1, 2 หรือ 3 แต่ไม่ใช่ 4 ขีด จำกัด อินพุตของคุณคือ 3

มีขีด จำกัด 1009 ไบต์บนซอร์สโค้ด หากมีการจับสลากรายการที่มีจำนวนไบต์น้อยที่สุดชนะ


ข้อ จำกัด และการชี้แจง:

  • ขนาดสูงสุดของรูปร่างคือ 109 คูณ 109 พิกเซล ขนาดรวมถึงเส้นที่ใช้ในการวาดรูปร่าง
  • บรรทัดมีความกว้างคงที่
  • พื้นที่ที่ถูกล้อมรอบจะต้องล้อมรอบด้วยเส้นทั้งหมด - คุณไม่สามารถใช้ขอบเขตของไฟล์ภาพได้
  • ล้อมรอบ 1009 พิกเซลหมายถึงพื้นที่ที่ล้อมรอบเท่านั้น มันไม่รวมถึงสาย
  • เอาท์พุทเป็นภาพ
  • ไม่มีข้อ จำกัด ด้านกราฟิกเพิ่มเติม - เช่นสีความหนาของเส้นเป็นต้น
  • เอกลักษณ์ของเอาท์พุทอ้างอิงถึงพื้นที่ปิดล้อมเท่านั้น การเปลี่ยนแปลงในบรรทัดหรือการเปลี่ยนแปลงแบบกราฟิกอื่น ๆ นั้นไม่เกี่ยวข้องหากพื้นที่ที่อยู่ภายในนั้นไม่ซ้ำกัน
  • การแปลรูปร่างไม่ซ้ำกัน การหมุนการสะท้อนกลับและการเปลี่ยนแปลงอื่น ๆ นับเป็นเอกลักษณ์
  • เอาต์พุตจะต้องทำซ้ำ - อินพุตเดียวกันจะให้เอาต์พุตเดียวกันเสมอ
  • ไม่จำเป็นต้องมีความสัมพันธ์ระหว่างเอาต์พุตติดต่อกันหรืออย่างอื่น
  • นอกเหนือจาก 'ขีด จำกัด อินพุต' ของการส่งไม่มีการกำหนดเอาต์พุต
  • ไม่อนุญาตให้ป้อนหรือดึงข้อมูลภายนอกอื่น ๆ
  • บรรทัดต้องต่อเนื่อง - เช่นพิกเซลต้องสัมผัส (แตะที่จำนวนมุม)
  • พิกเซลเป็นหน่วย 'การวาด' ที่เล็กที่สุดที่ใช้โดยวิธีการวาดของคุณและไม่จำเป็นต้องสอดคล้องกับพิกเซลหน้าจอ

ตัวอย่าง:

  • นี่คือตัวอย่างของรูปร่างที่ถูกต้อง:

    ป้อนคำอธิบายรูปภาพที่นี่

  • รูปร่างต่อไปนี้ไม่ถูกต้อง:

    invalid1 invalid2 invalid3

แก้ไข: การสัมผัสบรรทัด:

  • พื้นที่ที่ล้อมรอบจะต้องต่อเนื่องซึ่งกำหนดเป็นพิกเซลที่สัมผัส สัมผัสมุมนับ
  • บรรทัดไม่สามารถล้อมช่องว่างใด ๆ ที่ด้านนอกของมัน ภาพนี้โพสต์โดย @Sparr แสดงให้เห็นถึงจุดนี้ - เฉพาะรูปร่างแรกในแต่ละแถวที่ถูกต้อง:

    ประทับใจ

  • ด้านนอกของเส้นอาจสัมผัส แต่ไม่ใช่ในลักษณะที่ล้อมรอบพื้นที่

  • เส้นที่สัมผัสอาจไม่ทับซ้อนกัน - เช่นเส้นหนาสองเส้นที่สัมผัส 1 พิกเซลจะมีความหนารวมกันที่ 2px ไม่เคย 1px

แล้วการหมุนในรูปร่างเดียวกันล่ะ? พวกเขาแตกต่างกันอย่างไร
Martin Ender

ถ้าฉันกัดออกจากด้านข้างของรูปร่างมันจะโอเคที่จะมีความกว้างหนึ่งพิกเซล (สีดำ) หรือไม่? หรือจะต้องมีความกว้าง 3 พิกเซลดังนั้นสายเข้าและขาออกจึงไม่แตะ หรือว่าตกลงที่จะให้มีความกว้าง 2 พิกเซลดังนั้นการรับสายเข้าและขาออกจึงไม่ทับซ้อนกัน?
เลเวลริเวอร์เซนต์

คำถามเพิ่มเติมบางข้อ: 1. เส้นขอบของรูปภาพ 109x109 สามารถทำหน้าที่เหมือนกับขอบเขตหนึ่งของรูปร่างได้หรือไม่? 2. หากความหนาของเส้นขึ้นอยู่กับฉันฉันจะบอกได้ไหมว่ามันคือ 200 พิกเซลเพื่อให้รูปร่างเป็นพิกเซลสีขาวบนภาพสีดำ 3. มีการเชื่อมต่อรูปร่างหรือไม่หากพิกเซลของมันสัมผัสกับมุมเท่านั้น? 4. ฉันไม่ใช่แฟนตัวยงของจำนวนตัวละคร มีหลายภาษาที่อาจใช้ 3/4 ของนั้นเพื่อตั้งค่าคุณสมบัติเอาต์พุตที่แน่นอน
Martin Ender

2
คำถามคุณจะได้รับ 1009 อย่างไร
Claudiu

1
รูปร่างใดบ้างที่ใช้ได้และไร้ค่า i.imgur.com/FSV0nHz.png
Sparr

คำตอบ:


25

Python + Pycairo, 2 100รูปร่าง

เริ่มจากสิ่งที่ชัดเจน

แอนิเมชัน 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 Basic, คะแนน 10 ^ 288 (ลบ 1 หากไม่นับศูนย์)

ดาวน์โหลด interepreter ที่http://sourceforge.net/projects/napoleonbrandy/ (ไม่ใช่ล่ามพื้นฐาน BBC ของฉันตามปกตินั่นไม่รองรับสายยาวพอ)

ในการเข้ารหัสข้อมูลจำนวนมากคุณต้องมีขอบเขตจำนวนมาก นั่นหมายถึงรูปร่างที่บาง ฉันเริ่มต้นด้วยแถบแนวตั้ง 49 พิกเซลทางด้านซ้ายและเพิ่มหนวดสิบพิกเซลที่ 96 พิกเซล หนวดแต่ละตัวสามารถเข้ารหัส 96 บิตในลักษณะที่คล้ายคลึงกับวิธีแก้ปัญหาของ @ ell รวม 960 บิต

เนื่องจาก BBC Basic ไม่สามารถจัดการกับตัวเลขที่มีขนาดใหญ่ได้ดังนั้นจึงมีการป้อนตัวเลขทศนิยมได้มากถึง 288 หลักและแต่ละชุดของตัวเลขทศนิยม 3 ชุดจะถูกแปลงเป็นเลขฐานสอง 10 บิต จากนั้นแต่ละบิตจะใช้ในการกระดิกหนวดหนึ่งอันขึ้นหนึ่งพิกเซลหากเป็น1(แต่ไม่ใช่ถ้าเป็น a 0) โปรแกรมสามารถจัดการได้ถึง 288/3 = 96 ชุดตัวเลข 3 หลักดังกล่าว

    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 หลักทำให้หนวดมีลักษณะเป็นอย่างไร

ป้อนคำอธิบายรูปภาพที่นี่

technicalities

A. คำตอบของมาร์ตินจุดที่ 3 "เป็นรูปร่างที่เชื่อมโยงกันหรือไม่หากสัมผัสกับพิกเซลที่มุมเท่านั้น?" คือ "ใช่" ดังนั้นฉันจึงเข้าใจคำตอบที่ฉันต้องการ อย่างไรก็ตามหากคุณเลือก (เช่น) 999 และ 3,000 ในทุกแถวดูเหมือนว่าจะยุ่งมาก

B. ถ้าเรามองว่านี่เป็นสี่เหลี่ยมจัตุรัสที่กัดออกมาจากด้านข้างคุณจะเห็นว่าฉันอนุญาตสามพิกเซลระหว่างหนวดแต่ละคู่ที่อยู่ติดกันเพื่อให้แน่ใจว่าเส้นสีดำที่อยู่ด้านนอกไม่เคยสัมผัส ไม่มีกฎเฉพาะเกี่ยวกับเรื่องนี้ (ฉันหวังว่าเหตุผลของฉันสำหรับการถามคือชัดเจนในแง่ของคำตอบของฉัน) หากบรรทัดที่ได้รับอนุญาตให้สัมผัสตัวเองบนด้านนอกของรูปร่างฉันสามารถย้ายหนวดเข้าด้วยกันและใช้พิกเซลน้อยลง แถบแนวตั้ง (และทำให้หนวดยาวขึ้นเล็กน้อย) แต่มันจะสับสนมากเมื่อพิจารณาด้วยตาว่ามีพิกเซลอยู่ภายในหรือภายนอกรูปร่างดังนั้นฉันคิดว่าการตีความของฉันที่ด้านนอกของเส้นสีดำไม่ควรสัมผัส ตัวเองดีที่สุด

C. บีบีซีขั้นพื้นฐานในโหมดหน้าจอนี้ใช้พิกเซลหน้าจอ 2x2 เป็นพิกเซลเดียว ฉันออกจากที่นี่ไปเพราะช่วยดูว่ารูปร่างไม่เล็กเกินไปหรือเปล่า แต่ละพิกเซลพื้นฐานของ BBC เหล่านี้ถือเป็นกล่องของหน่วยโลจิคัล 4x4 ตั้งแต่เริ่มต้นผู้พัฒนาของ BBC พื้นฐานมีความสุขุมในการตระหนักว่าความละเอียดหน้าจอหนึ่งวันจะเพิ่มขึ้นดังนั้นพวกเขาจึงทำให้ความละเอียดเชิงตรรกะสูงกว่าความละเอียดทางกายภาพ


ตอบ: คำตอบยังคง "ใช่" แม้ว่าฉันจะเห็นว่าตอนนี้มันแปลกไปหน่อย B. ฉันเห็นประเด็นของคุณแล้วและทำการแก้ไขเพื่อชี้แจงขออภัยในความสับสน
jsh

C: นั่นไม่ใช่ปัญหา ขณะนี้พิกเซลถูกกำหนดให้เป็นหน่วยการวาดที่เล็กที่สุดที่ใช้
jsh

6

Mathematica, 496 ไบต์, คะแนน: large-ish (> 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 (ชดเชยด้วยหนึ่งพิกเซลเพื่อให้เป็นเส้น) และเมื่อฉันท่วมเซลล์ 1009 เซลล์ฉันหยุดและทำเครื่องหมายเส้นขอบ คุณบอกว่าสีนั้นขึ้นอยู่กับเราดังนั้นพื้นหลังเป็นสีขาวเส้นเป็นสีดำและการตกแต่งภายในเป็นสีเทา

เติมน้ำท่วมค่อนข้าง จำกัด แต่เพื่อให้แน่ใจว่าฉันไม่ต้องกังวลเกี่ยวกับหลุม การผ่อนคลายข้อ จำกัด เหล่านี้อาจเพิ่มคะแนนของฉัน (ยังไม่ทราบ) เป็นอย่างมาก

ฉันจะพยายามวางขอบเขตที่ต่ำกว่าในคะแนนตอนนี้


คุณสามารถให้ไฟล์ CDFเพื่อให้ฉันสามารถลองได้หรือไม่
jsh


ฉันคิดว่าวิธีการแก้ปัญหาทั้งหมดที่ขึ้นอยู่กับตัวเลขสุ่มจะต้องมีกำลังดุร้ายเพื่อตรวจสอบ ฉันไม่แน่ใจว่าคุณกำลังตรวจสอบพิกเซลแบบพิกเซลหรือไม่ แต่คุณสามารถลองบันทึกแต่ละเอาต์พุตเป็นบิตแมปขาวดำ (ขนาดเล็ก) และเปรียบเทียบแฮช ฉันคิดว่ามันเร็วเท่าที่คุณจะได้รับสำหรับการเปรียบเทียบภาพ
stokastic

@stokastic ฉันกำลังสร้างแฮชที่ไร้เดียงสามาก (ผลรวมของพิกัดพิกเซลทั้งหมด) จากนั้นฉันก็ตรวจสอบรายละเอียดของถังขยะที่ชนกัน ปัญหาคือไม่ว่าวิธีที่ฉันใช้ในการตรวจสอบการชนนั้นซับซ้อนเพียงใดวิธีการสร้างนั้นช้ามากจนฉันจะไม่สามารถแก้ปัญหาได้มากกว่าเมล็ด 10k หรือ 100k ในเวลาที่เหมาะสม มีหลายวิธีที่จะทำให้อัลกอริทึมเร็วขึ้นอย่างมาก แต่ฉันคิดว่าดังนั้นฉันจึงอาจพิจารณาในบางประเด็น
Martin Ender

@ MartinBüttnerคุณอาจทดสอบแล้ว (หรือ mathematica ไม่สนับสนุนมัน) แต่แฮชไฟล์แบบตรงอาจจะเร็วกว่า เพียงข้อเสนอแนะหากคุณยังไม่ได้ลอง
stokastic

1

Python 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.