1009 piksel dahil


24

Çıktı , 1009 pikseli çevreleyen bir şekildir.

  • Şekil, tek, kapalı, kesişmeyen bir halka şeklini almalıdır.

Giriş , pozitif olmayan sıfır tamsayıdır.

  • Her giriş, benzersiz bir çıktı vermelidir - yani, her çıktı, daha düşük bir girdi kullanılarak oluşturulanlardan benzersiz olmalıdır.

Zafere , en büyük giriş sınırı tarafından karar verilir:

  • Gönderiminizin giriş sınırı, benzersiz olmayan veya geçersiz çıktı veren en düşük girişin 1'den az olarak kabul edilir.
  • Örneğin, 1, 2 veya 3 girişi için geçerli ve benzersiz çıktı üretiliyorsa, ancak 4 değil ise, giriş sınırınız 3'tür.

Kaynak kodunda 1009 bayt sınırı var. Bir beraberlik varsa, en az bayt olan girişi kazanır.


Kısıtlamalar ve açıklamalar:

  • Bir şeklin maksimum boyutu 109 x 109 pikseldir. Boyut, şekli çizmek için kullanılan çizgiyi içerir.
  • Bir çizgi sabit genişliktedir.
  • Kapalı alan tamamen satırla kapatılmalıdır - resim dosyasının sınırlarını kullanamazsınız.
  • Ekteki 1009 piksel yalnızca kapalı alana işaret eder. Çizgiyi içermez.
  • Çıktı bir görüntüdür.
  • Başka grafik kısıtlama yoktur - örneğin renk, çizgi kalınlığı vb.
  • Bir çıkışın benzersizliği sadece kapalı alana atıfta bulunur. Çizgideki değişiklikler veya diğer grafiksel değişiklikler, eklenen alan benzersiz değilse, ilgisizdir.
  • Şeklin çevirisi benzersiz değildir. Rotasyonlar, yansımalar ve diğer dönüşümler benzersiz olarak kabul edilir.
  • Çıktı tekrarlanabilir olmalıdır - aynı girdi her zaman aynı çıktıyı verir
  • Çıktılar arasında ardışık veya başka bir ilişki olması gerekmez.
  • Bir gönderimin 'giriş sınırı' dışında, tanımlanmış bir çıktı yok.
  • Başka hiçbir veri girişi veya harici veri alınmasına izin verilmez.
  • Bir çizgi sürekli olmalıdır - yani pikseller dokunmalıdır (bir köşeye dokunmak önemlidir).
  • Bir piksel, çizim yönteminiz tarafından kullanılan en küçük 'çizim' birimidir ve mutlaka bir ekran pikseline karşılık gelmez.

Örnekler:

  • Geçerli bir şekle bir örnek:

    görüntü tanımını buraya girin

  • Aşağıdaki şekiller geçersiz:

    invalid1 invalid2 invalid3

EDIT: Çizgi dokunmadan:

  • Kapalı alan sürekli olmalı ve dokunma pikselleri olarak tanımlanmalıdır. Köşelere dokunmak önemlidir.
  • Bir çizgi dış tarafındaki boşluğu kapatamaz. @Sparr tarafından gönderilen bu resim bu noktayı gösterir - sadece her satırdaki ilk şekil geçerlidir:

    dokunma

  • Çizginin dış kenarları dokunabilir, ancak alanı kaplayacak şekilde değil.

  • Dokunma çizgileri üst üste gelmeyebilir - örneğin, iki dokunma 1 piksel kalınlığındaki çizgi, 2 piksel, hiçbir zaman 1 piksel olmayan bir kalınlığa sahiptir.

Peki ya aynı şeklin dönmesi? Farklılar mı?
Martin Ender

Şeklin kenarından bir ısırık alırsam, bir piksel genişliğinde bir ön plan (siyah) çizgisi olması sorun olur mu? Yoksa 3 piksel genişliğinde olması gerekiyor, bu yüzden gelen ve giden hat dokunmuyor mu? veya 2 piksel genişliğinde olması uygun mudur, yani gelen ve giden çizgi dokunur, ancak üst üste gelmez mi?
Seviye Nehri St

Bazı sorular: 1. 109x109 görüntünün sınırı şeklin bir sınırı olarak hareket edebilir mi? 2. Çizginin kalınlığı bana bağlıysa, şeklin siyah bir görüntüdeki beyaz pikselleri olması için 200 piksel olduğunu söyleyebilir miyim? 3. Pikselleri yalnızca bir köşe boyunca temas ettiğinde şekil bağlı mı? 4. Karakter sınırının büyük bir hayranı değilim. Kesin çıktı özelliklerini ayarlamak için birçok dilde 3/4 dilini kullanabilir.
Martin Ender

2
Soru, 1009'u nasıl aldın?
Claudiu

1
Bu şekillerden hangisi geçerli ve kutsal değil? i.imgur.com/FSV0nHz.png
Sparr

Yanıtlar:


25

Python + Pycairo, 2 100 şekil

Açık ile başlayalım.

Animasyon 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")

Komut satırındaki numarayı alır ve yazar o.png.


Çok hoş. Basit fikir, iyi idam. Kazanan puan olmayacak, ancak daha fazla giriş için iyi bir bar oluşturur.
Sparr

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

@ edc65: Aslında * 4, çünkü simetrik değil.
justhalf

19

BBC Basic, skor 10 ^ 288 (sıfır sayılmazsa eksi 1)

Tercümanı http://sourceforge.net/projects/napoleonbrandy/ adresinden indirin (her zamanki BBC temel tercümanım değil, bu yeterince uzun bir dizgiyi desteklemiyor.)

Çok fazla bilgiyi kodlamak için çok fazla çevreye ihtiyacınız var. Bu ince bir şekil demektir. Soldaki 49 piksellik dikey bir çubukla başlıyorum ve ona 96 piksellik 10 tentacles ekliyorum. Her dokunaç, 96 bit'i, toplam 960 bit olan @ell'in çözümüne benzer şekilde kodlayabilir.

BBC Basic, bu kadar büyük sayıları işleyemediğinden, bir dize olarak 288 ondalık basamağa kadar bir sayı girilir ve her 3 ondalık basamağın her biri, 10 bitlik bir ikili sayıya dönüştürülür. Daha sonra her bir bit, tentacle'lardan birini bir piksel kadar yukarı doğru oynatmak için kullanılır 1(ancak eğer değilse 0.) Program, 288/3 = 96'ya kadar olan bu 3 basamaklı kümeleri kaldırabilir.

    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

Çıktı

288 basamaklı bir sayı için tipik bir çıktı. 999’un 1111100111’de ikili olduğunu unutmayın. 9 basamaklı kümelerin tentacelerin dalgalanmasına neden olduğunu görebilirsiniz.

görüntü tanımını buraya girin

teknik ayrıntıların

A.Martinin 3 üncü noktasına cevabı "pikselinin sadece bir köşeye dokunması halinde şekli birbirine bağlı mı?" "evet" idi, bu yüzden cevabımın uyduğunu biliyorum. Bununla birlikte, her satırda 999'lar ve 000'leri değiştirirseniz (örneğin), çok meşgul görünüyor.

B. Bunu, dışarıdan alınan ısırıkları olan bir dikdörtgen olarak görürsek, dışarıdaki yuvarlak siyah çizginin kendisine hiç dokunmadığından emin olmak için, bitişik tentacles çifti arasında üç piksele izin verdiğimi görebilirsiniz. Bununla ilgili belirli bir kural yoktur (Umarım sorma nedenim cevabımın ışığında daha açıktır.) Çizginin, şeklin DÜZENİNDE kendi kendine dokunmasına izin verilirse, dokunaçları birlikte hareket ettirebilir ve bunun için daha az piksel kullanabilirim. dikey çubuk (ve böylece dokunaçları biraz daha uzun yapar.) Ancak, bir pikselin şeklin içinde mi yoksa dışında mı olduğunu gözle belirlemek çok kafa karıştırıcı olurdu, bu yüzden yorumumun siyah çizginin dışının asla temas etmemesi gerektiğini düşünüyorum kendisi en iyisidir.

C. Bu ekran modundaki BBC, 2x2 kare ekran pikselini tek piksel olarak değerlendirir. Bunu olduğu gibi bıraktım, çünkü şekli çok küçük değilse izlemeye yardımcı oluyor. Bu BBC temel piksellerinden her biri, 4x4 mantıksal birimler kutusu olarak kabul edilir. Baştan beri, BBC basic geliştiricileri, bir günlük ekran çözünürlüklerinin artacağını öngörme beklentisine sahipti, bu yüzden mantıksal çözünürlüğü fiziksel çözünürlükten daha yüksek hale getirdiler.


C: Cevabı hala "evet" olarak kalıyor, şimdi görmeme rağmen biraz garip. B. Şimdi görüşünüzü anlıyorum ve netleştirmek için bir düzenleme yaptım, karışıklık için üzgünüm.
jsh

C: Bu bir problem değil. Bir piksel şimdi kullanılan en küçük çizim birimi olarak tanımlanmaktadır.
jsh

6

Mathematica, 496 bayt, Puan: büyük ish (> 1157)

Elimdeki alt sınır gülünç derecede düşük, ama henüz kontrol etmek için kaba kuvvetten daha iyi bir yol bulamadım.

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]

Bunu henüz golf oynamadım, çünkü gerek yoktu. Birisi aslında benimle bağlandıklarını kanıtladığında bunu yapacağım.

Algoritma temel olarak 109x109 görüntünün sol üst köşesinden bir taşma dolgusu yapıyor (çizgiye izin vermek için bir piksel kadar ofset) ve 1009 hücrelerini su bastığımda, sınırı durdurup işaretliyorum. Renklerin bize kalmış olduğunu söyledin, böylece arkaplan beyaz, çizgi siyah ve iç gri.

Sel dolgusu oldukça kısıtlıdır ancak bu, delikler hakkında endişelenmeme gerek kalmamamı sağlar. Bu kısıtlamaları gevşetmek, muhtemelen (henüz bilinmeyen) puanımı çarpıcı biçimde artıracak.

Şimdi skoru biraz daha düşük sınırlar koymaya çalışacağım.


Bunu deneyebilmem için bir CDF dosyası sağlayabiliyor musunuz?
jsh


Rasgele sayılara dayanan tüm çözümlerin onaylanması için kaba bir güç gerektireceğini düşünüyorum. Bir piksel piksel piksel kontrol yapıyorsanız emin değilim, ancak her çıktıyı tek renkli bitmap'e (küçük dosya boyutu) kaydetmeyi ve karmaları karşılaştırmayı deneyebilirsiniz. Görüntü karşılaştırmaları için alacağınız kadar hızlı olduğunu hayal ediyorum.
stokastic

@stokastic Ben şu anda çok saf bir karma yapıyorum (tüm piksel koordinatlarının toplamı) ve sonra çarpışan kutuları ayrıntılı olarak kontrol ediyorum. Sorun, çarpışma kontrolü için kullandığım yaklaşım ne kadar karmaşık olursa olsun, üretim yöntemi o kadar yavaştır ki, birkaç 10k veya 100k tohumdan daha makul bir sürede çözemem bile. Algoritmayı önemli ölçüde hızlandırmanın birkaç yolu var, sanırım, bu yüzden bir noktaya bakabilirim.
Martin Ender

@ MartinBüttner Muhtemelen çoktan test ettin (veya mathematica desteklemiyor), fakat dosdoğru bir dosya karması daha hızlı olabilir. Bunu bir daha denemediyseniz sadece bir öneri.
stokastic

1

Python 2, Puan> 10 ^ 395

Aşırı derecede yavaş ve aslında n = 0 dışında bir sonuç alamadım, ancak daha düşük SIZE(piksel sayısı) ve BOUNDsınırlayıcı karenin maksimum kenar uzunluğunu test etmek istiyorsanız ve bunu yapabilmeniz gerekir. sonuç almak için. Kaç tane üreteceğini denemek ve hesaplamak çok zordu; Verdiğim alt sınırın kesin olduğundan eminim, ancak gerçek sayımın önemli ölçüde daha büyük olduğundan şüpheleniyorum ve daha sonra geliştirmeye çalışabilirim.

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
İçin resim verebilir misiniz n=0? Ayrıca 10 ^ 395'e nasıl ulaştığınızı da açıklayabilir misiniz?
justhalf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.