1009ピクセルを囲む


24

出力は、1009ピクセルを囲む形状です。

  • 形状は、単一の閉じた、交差しないループの形をとる必要があります。

入力はゼロ以外の正の整数です。

  • 各入力は一意の出力を生成する必要があります。つまり、各出力は、より低い入力を使用して生成された出力とは一意である必要があります。

勝利は、最大入力制限によって決定されます。

  • 提出物の入力制限は、一意でない、または無効な出力を与える最低の入力よりも1少ないと見なされます。
  • たとえば、4ではなく1、2、または3の入力に対して有効で一意の出力が生成される場合、入力制限は3です。

ソースコードには1009バイトの制限があります。ドローがある場合、バイト数が最も少ないエントリが優先されます。


制限と説明:

  • シェイプの最大サイズは109 x 109ピクセルです。サイズには、図形の描画に使用される線が含まれます。
  • 線は一定の幅です。
  • 囲まれたスペースは、行で完全に囲まれている必要があります-画像ファイルの境界は使用できません。
  • 囲まれた1009ピクセルは、囲まれたスペースのみを指します。行は含まれません。
  • 出力は画像です。
  • それ以上のグラフィック制限はありません-色、線の太さなど。
  • 出力の一意性は、囲まれたスペースのみを指します。囲まれたスペースが一意でない場合、ラインの変更またはその他のグラフィックの変更は関係ありません。
  • 形の翻訳はユニークではありません。回転、反射、およびその他の変換は一意と見なされます。
  • 出力は再現可能でなければなりません—同じ入力は常に同じ出力を与えます
  • 連続的であろうとなかろうと、出力間に関係がある必要はありません。
  • 提出の「入力制限」以外には、定義済みの出力はありません。
  • 他の入力や外部データの取得は許可されていません。
  • 線は連続している必要があります。つまり、ピクセルが接触する必要があります(コーナーカウントに接触する)。
  • ピクセルは、描画方法で使用される「描画」の最小単位であり、必ずしも画面ピクセルに対応するわけではありません。

例:

  • 有効な形状の例を次に示します。

    ここに画像の説明を入力してください

  • 次の形状は無効です。

    無効1 無効2 無効3

編集:行タッチ:

  • 囲まれたスペースは連続している必要があり、これはピクセルに触れることとして定義されます。触れるコーナーは重要です。
  • 線は、外側のスペースを囲むことはできません。@Sparrが投稿したこの画像は、この点を示しています-各行の最初の形状のみが有効です。

    感動

  • 線の外側が接触する場合がありますが、スペースを囲む方法ではありません。

  • 接触する線は重ならない場合があります。たとえば、2つの接触する1ピクセルの太い線の合計の太さは2ピクセルで、1ピクセルではありません。

同じ形状の回転はどうですか?それらは明確ですか?
マーティンエンダー14

シェイプの側面から噛み付いた場合、前景(黒)の線を1ピクセル幅にしても大丈夫ですか?それとも、それは3ピクセルの幅でなければならないので、着信回線と発信回線は接触しませんか?または、2ピクセルの幅にして、着信回線と発信回線が接触しても大丈夫ですか?
レベルリバーセント14

その他の質問:1. 109x109の画像の境界線は、図形の境界線として機能しますか?2.線の太さが私に任せている場合、200ピクセルだと言えますか。そのため、形状は黒の画像の白のピクセルになりますか。3.ピクセルが角に沿ってのみ接触している場合、形状は接続されていますか?4.私はキャラクター制限の大ファンではありません。多くの言語では、正確な出力仕様を設定するために、その3/4を使用する場合があります。
マーティンエンダー14

2
質問、どうやって1009を手に入れましたか?
クラウディ14

1
これらのうち、有効で穴のない形状はどれですか?i.imgur.com/FSV0nHz.png
スパー

回答:


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


非常に素晴らしい。シンプルなアイデア、うまく実行されます。勝ち点ではありませんが、それ以降のエントリーには良い基準を設定します。
スパー14

... * 2としてRotations [...] count as unique.
-edc65

@ edc65:対称ではないため、実際には* 4です。
ちょうど半分14年

19

BBCベーシック、スコア10 ^ 288(ゼロがカウントされない場合はマイナス1)

http://sourceforge.net/projects/napoleonbrandy/から通訳者をダウンロードしてください(私の通常のBBC基本インタープリターではなく、十分な長さの文字列をサポートしていません)。

多くの情報をエンコードするには、多くの境界線が必要です。それは薄い形を意味します。左側の49ピクセルの垂直バーから始め、96ピクセルの触手を10個追加します。各触手は、@ ellのソリューションと同様の方法で96ビット、合計960ビットをエンコードできます。

BBC Basicはこれほど大きな数を処理できないため、最大288桁の10進数が文字列として入力され、3桁の10進数の各セットが10ビットの2進数に変換されます。次に、各ビットを使用して、触手のうちの1つを1ピクセルずつ小刻みに動かします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.マーティンのポイント3に対する答えは、「ピクセルのタッチがコーナーに沿っている場合にのみ形状が接続されているかどうか」「はい」だったので、私の答えが遵守されていることを理解しています。それでも、すべての行で(たとえば)999と000を交互にすると、非常に混雑します。

B.側面から噛み付いた長方形としてこれを見ると、外側の丸い黒い線が接触しないように、隣接する触手の各ペア間に3ピクセルを許可したことがわかります。これに特定のルールはありません(質問の理由が私の答えに照らしてより明確であることを望みます。)線が形状の外側でそれ自体に触れることを許可されている場合、触手を一緒に動かし、垂直バー(したがって、触手を少し長くします。)ただし、ピクセルがシェイプの内側にあるか外側にあるかを目で判断するのは非常に混乱するので、黒い線の外側は絶対に触れないでください。それ自体が最高です。

C.この画面モードの基本的なBBCは、2x2の正方形の画面ピクセルを単一のピクセルとして扱います。形状が小さすぎない場合に表示するのに役立つため、これをそのままにしました。これらのBBC基本ピクセルのそれぞれは、4x4論理ユニットのボックスと見なされます。BBCベーシックの開発者は、当初から画面の解像度が1日で向上することを理解していたため、物理的な解像度よりも論理的な解像度を高くしました。


A:答えは「はい」のままですが、今では少し奇妙に見えます。B.私はあなたの要点を理解し、明確にするために編集を行いました。混乱して申し訳ありません。
jsh 14年

C:それは問題ではありません。ピクセルは、使用される描画の最小単位として定義されるようになりました。
jsh 14年

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 14


乱数に依存するすべてのソリューションでは、検証にブルートフォースが必要だと思います。ピクセルごとのチェックを実行しているかどうかはわかりませんが、各出力を単色ビットマップ(小さなファイルサイズ)に保存し、ハッシュを比較してみてください。画像比較で得られる速度と同じくらい速いと思います。
確率論的14

@stokastic現在、非常に素朴なハッシュ(すべてのピクセル座標の合計)を作成しています。次に、衝突するビンを詳細にチェックしています。問題は、私が衝突チェックにどれほど高度なアプローチを使用しても、生成方法が非常に遅いため、妥当な時間内に数千または10万以上のシードを解決することさえできないことです。ただし、アルゴリズムを大幅に高速化する方法はいくつかあると思うので、ある時点で検討するかもしれません。
マーティンエンダー14

@MartinBüttnerおそらく既にテスト済みです(または、数学がサポートしていません)が、ファイルハッシュをまっすぐにしたほうが速いかもしれません。あなたがそれを試していないなら、ただの提案。
ストカスティック14

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を達成する方法を説明できますか?
ちょうど半分14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.