Вложите 1009 пикселей


24

Вывод - это форма, которая охватывает 1009 пикселей.

  • Форма должна принимать форму единой замкнутой непересекающейся петли.

На входе положительное ненулевое целое число.

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

Победа определяется самым большим входным лимитом:

  • Предел ввода вашего представления считается на 1 меньше, чем самый низкий вход, который дает неуникальный или иначе недействительный вывод.
  • Например, если действительный и уникальный вывод создается для входа 1, 2 или 3, но не 4, ваш предел ввода равен 3.

Для исходного кода существует ограничение в 1009 байт. Если есть ничья, выигрывает запись с наименьшим количеством байтов.


Ограничения и уточнения:

  • Максимальный размер фигуры составляет 109 на 109 пикселей. Размер включает в себя линию, используемую для рисования фигуры.
  • Линия имеет постоянную ширину.
  • Закрытое пространство должно быть полностью заключено в линию - вы не можете использовать границу файла изображения.
  • Вложенные 1009 пикселей относятся только к закрытому пространству. Это не включает в себя строку.
  • Выходное изображение.
  • Больше никаких графических ограничений нет - например, по цвету, толщине линий и т. Д.
  • Уникальность вывода относится только к замкнутому пространству. Изменения в строке или другие графические изменения не имеют значения, если закрытое пространство не является уникальным.
  • Перевод формы не уникален. Вращения, отражения и любые другие преобразования считаются уникальными.
  • Вывод должен быть воспроизводимым - один и тот же ввод всегда будет давать одинаковый вывод
  • Не должно быть связи между выходами, последовательными или иными.
  • За пределами «входного предела» представления нет определенного вывода.
  • Никакой другой ввод или извлечение внешних данных не допускается.
  • Линия должна быть непрерывной - то есть пиксели должны касаться (касание угла считается).
  • Пиксель - это наименьшая единица «рисования», используемая вашим методом рисования, и не обязательно соответствует пикселю экрана.

Примеры:

  • Вот пример правильной формы:

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

  • Следующие фигуры недопустимы:

    invalid1 invalid2 invalid3

РЕДАКТИРОВАТЬ: Касание строки:

  • Закрытое пространство должно быть непрерывным, что определяется как касание пикселей. Касание углов имеет значение.
  • Линия не может ограничивать пространство на своей внешней стороне. Это изображение, опубликованное @Sparr, иллюстрирует эту точку - допустимы только первые фигуры в каждой строке:

    трогательный

  • Внешние стороны линии могут касаться, но не таким образом, чтобы охватывать пространство.

  • Соприкасающиеся линии могут не перекрываться - например, две соприкасающиеся линии толщиной 1 пиксель будут иметь общую толщину 2 пикселя, а не 1 пиксель.

А как насчет вращений одинаковой формы? Они различны?
Мартин Эндер

Если я отведу кусочек со стороны фигуры, нормально ли будет иметь переднюю (черную) линию шириной в один пиксель? Или он должен быть шириной 3 пикселя, чтобы входящая и исходящая линии не касались? или это нормально, чтобы иметь ширину 2 пикселя, чтобы входящая и исходящая линии касались, но не перекрывались?
Уровень Река St

Еще несколько вопросов: 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, поскольку это не симметрично.
Половина

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 цифр вызывают волнистость щупалец.

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

Технические детали

A. Ответ на пункт 3 Мартина "связана ли форма, если ее пиксель касается только по углу?" было "да", так что я понимаю, что мой ответ соответствует. Тем не менее, если вы чередуете (например) 999 и 000 в каждом ряду, это выглядит очень занятым.

Б. Если мы рассмотрим это как прямоугольник с укусами, вынутыми из стороны, вы увидите, что я разрешил три пикселя между каждой парой соседних щупалец, чтобы черная линия вокруг снаружи никогда не касалась себя. В этом отношении нет конкретного правила (я надеюсь, что причина моего запроса будет более ясной в свете моего ответа.) Если линии позволено касаться ВНЕ фигуры, я мог бы сдвинуть щупальца вместе и использовать меньше пикселей для вертикальная черта (и, следовательно, сделать щупальца немного длиннее). Однако было бы очень сложно определить на глаз, был ли пиксель внутри или снаружи фигуры, поэтому я думаю, что моя интерпретация заключается в том, что внешняя сторона черной линии никогда не должна касаться Сам по себе лучший.

C. BBC basic в этом режиме экрана обрабатывает квадрат экрана размером 2x2 как один пиксель. Я оставил это как есть, потому что это помогает просматривать, если форма не слишком мала. Каждый из этих основных пикселей BBC рассматривается как блок из 4x4 логических единиц. С самого начала разработчики BBC basic имели возможность предвидеть, что разрешение экрана за один день увеличится, поэтому они сделали логическое разрешение выше физического.


Ответ: Ответ остается "да", хотя я вижу, что сейчас это немного странно. Б. Теперь я понимаю вашу точку зрения и внес изменения, чтобы прояснить, извините за путаницу.
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 (смещение на один пиксель, чтобы учесть линию), и когда я залил 1009 ячеек, я останавливаюсь и отмечаю границу. Вы сказали, что цвета зависят от нас, поэтому фон белый, линия черная, а внутренняя часть серая (при необходимости я могу удалить серый для нескольких символов).

Заполнение наводнения довольно ограничено, но это гарантирует, что мне не придется беспокоиться о дырах. Ослабление этих ограничений, вероятно, значительно увеличит мою (пока неизвестную) оценку.

Я постараюсь поставить некоторые более низкие оценки на счет сейчас.


Вы можете предоставить файл CDF, чтобы я мог попробовать это?
2003 года


Я думаю, что все решения, которые зависят от случайных чисел, потребуют грубой силы для проверки. Я не уверен, что вы делаете проверку попиксельно, но вы можете попробовать сохранить каждый вывод в монохроматическом растровом изображении (небольшой размер файла) и сравнить хэши. Я полагаю, это так же быстро, как вы получите для сравнения изображений.
стокастик

@stokastic В настоящее время я создаю очень наивный хеш (сумма всех пиксельных координат), а затем подробно проверяю сталкивающиеся корзины. Проблема в том, насколько бы изощренным не был подход, который я использую для проверки столкновений, метод генерации настолько медленный, что я даже не смогу решить более 10 000 или 100 000 семен за приемлемое количество времени. Есть несколько способов значительно ускорить алгоритм, хотя, я думаю, поэтому я мог бы рассмотреть это в какой-то момент.
Мартин Эндер

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

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?
Половина
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.