Укладіть 1009 пікселів


24

Вихід - це форма, яка охоплює 1009 пікселів.

  • Форма повинна мати вигляд єдиної, замкнутої непересічної петлі.

Введення - це додатне ненульове ціле число.

  • Кожен вхід повинен отримати унікальний вихід - тобто кожен вихід повинен бути унікальним від результатів, створених за допомогою нижчого вводу.

Перемога визначається найбільшим лімітом введення:

  • Ліміт введення вашої заявки вважається на 1 меншим, ніж найнижчий вхід, який дає не унікальний або недійсний вихід.
  • Наприклад, якщо для вводу 1, 2 або 3 виробляється дійсний і унікальний вихід, але не 4, то межа введення становить 3.

Існує обмеження в 1009 байт для вихідного коду. Якщо є нічия, запис із найменшою кількістю байтів виграє.


Обмеження та уточнення:

  • Максимальний розмір форми - 109 на 109 пікселів. Розмір включає лінію, яка використовується для малювання фігури.
  • Лінія постійної ширини.
  • Вкладений простір повинен бути повністю закритий рядком - ви не можете використовувати межу файлу зображень.
  • Вкладене 1009 пікселів відноситься лише до закритого простору. Він не включає рядок.
  • Вихід - це зображення.
  • Більш ніяких графічних обмежень немає - наприклад, щодо кольору, товщини ліній тощо.
  • Унікальність виходу стосується лише вкладеного простору. Зміни в рядку або інші графічні зміни не мають значення, якщо вкладений простір не є унікальним.
  • Переклад форми не унікальний. Обертання, відображення та будь-які інші перетворення вважаються унікальними.
  • Вихід повинен бути відтвореним - той самий вхід завжди даватиме однаковий вихід
  • Не повинно бути співвідношення між результатами, послідовними чи іншими.
  • Поза межами "вхідної межі" для подання не визначений вихід.
  • Не допускається жодне інше введення чи отримання зовнішніх даних.
  • Рядок повинен бути безперервним - тобто пікселі повинні торкатися (торкаючись кутових значень).
  • Піксель - це найменша одиниця "малювання", що використовується вашим методом малювання, і не обов'язково відповідає піксельному екрану.

Приклади:

  • Ось приклад правильної форми:

    введіть тут опис зображення

  • Наступні фігури недійсні:

    недійсний1 недійсний2 недійсний3

EDIT: Дотик до рядка:

  • Закритий простір повинен бути безперервним, що визначається як дотики пікселів. Торкання кутів рахується.
  • Рядок не може закрити пробіл із зовнішньої сторони. Це зображення, розміщене @Sparr, ілюструє цей момент - лише перша форма в кожному рядку є дійсною:

    зворушливий

  • Зовнішні сторони лінії можуть торкатися, але не таким чином, що закриває простір.

  • Дотикові лінії можуть не перетинатися - наприклад, дві дотикові лінії товщиною 1 пікселя мали б комбіновану товщину 2 пікселя, ніколи 1 пікс.

Що з обертаннями однакової форми? Чи відрізняються вони?
Мартін Ендер

Якщо я виймаю шматок з боку форми, чи добре мати передній (чорний) рядок шириною в один піксель? Або вона повинна бути шириною 3 пікселів, щоб вхідна та вихідна лінія не торкалися? або добре, щоб вона мала 2 пікселі в ширину, тому вхідна та вихідна лінія торкаються, але не перетинаються?
Рівень річки Св.

Ще кілька запитань: 1. Чи може межа малюнка 109x109 виступати однією межею форми? 2. Якщо товщина лінійки залежить від мене, чи можу я просто сказати, що це 200 пікселів, щоб форма була просто білими пікселями на чорному зображенні? 3. Чи пов'язана форма, якщо її пікселі торкаються лише кута? 4. Я не великий шанувальник обмеження характеру. Багато мов може використовувати 3/4 цього лише для встановлення точних специфікацій виводу.
Мартін Ендер

2
Питання, як ти отримав 1009?
Клавдіу

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.


Дуже хороша. Проста ідея, добре виконана. Не буде виграшним балом, але встановлює хорошу планку для подальших записів.
Спарр

... * 2, asRotations [...] 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(але не, якщо він є 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 цифр викликають хвилястість щупалець.

введіть тут опис зображення

Технічні характеристики

А. Відповідь на точку 3 Мартіна: "Чи пов'язана форма, якщо дотик її пікселя лише уздовж кута?" було "так", тому я розумію, що моя відповідь відповідає. Тим не менш, якщо ви чергуєте (наприклад) 999-х і 000-х у кожному ряду, це виглядає дуже зайнято.

B. Якщо ми розглянемо це як прямокутник із відсіками, виведеними збоку, то можна побачити, що я дозволив три пікселі між кожною парою сусідніх щупалець, щоб переконатися, що чорна лінія навколо зовнішньої сторони ніколи не торкається себе. Немає конкретного правила щодо цього (я сподіваюся, що мої причини запитання є більш зрозумілими з огляду на мою відповідь.) Якщо рядку дозволено торкатися себе на ВНУТРІ фігури, я можу перемістити щупальця разом і використовувати менше пікселів для вертикальна смуга (і так зробить щупальця трохи довше.) Однак, стало б дуже заплутаним визначення очей, чи був піксель всередині або поза формою, тому я вважаю, що моя інтерпретація того, що зовні чорна лінія ніколи не повинна торкатися сама найкраща.

C. Основний BBC в цьому режимі екрану розглядає 2х2 квадратних пікселів екрана як один піксель. Я залишив це як є, тому що це допомагає перегляду, якщо форма не надто крихітна. Кожен з цих базових пікселів BBC розглядається як поле з логічними одиницями 4х4. З самого початку розробники основної програми BBC мали передбачення усвідомити, що дозвіл екрана одного дня збільшиться, тому вони зробили логічну роздільну здатність вищою за фізичну.


Відповідь: Відповідь залишається "так", хоча зараз я бачу, що це трохи дивно. В. Зараз я бачу вашу думку і внесли зміни, щоб уточнити, вибачте за плутанину.
jsh

С: Це не проблема. Піксель зараз визначається як найменша використана одиниця малюнка.
jsh

6

Mathematica, 496 байт, Оцінка: big-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 В даний час я будую дуже наївний хеш (сума всіх координат пікселів), а потім я детально перевіряю бійки, що стикаються. Проблема полягає в тому, як би не був складний підхід, який я використовую для перевірки зіткнень, метод генерації настільки повільний, що я навіть не зможу вирішити більше ніж кілька кілограмів на 10 000 або 100 тис. За розумну кількість часу. Існує кілька способів значно прискорити алгоритм, але, я думаю, тому я можу розібратися в цьому в якийсь момент.
Мартін Ендер

@ MartinBüttner Ви, ймовірно, вже тестували його (або математика не підтримує його), але прямий хеш файлів може бути швидшим. Просто пропозиція, якщо ви цього не пробували.
стокастик

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.