1kB 코드로 객관적으로 별이 빛나는 밤을 페인트하십시오.


242

참고 : Anders Kaseorg는 그의 큰 답변에 관심을 끌기 위해 지금까지 합격을 받았지만 도전은 결코 끝나지 않았습니다! 기본 제공 압축을 사용하지 않고 최고 점수를 얻는 사람에게는 여전히 400 포인트 현상금이 있습니다.

아래는 386x320반 고흐의 별이 빛나는 밤의 PNG 표현입니다.

여기에 이미지 설명을 입력하십시오

목표는이 이미지를 1024 바이트 이하의 코드로 최대한 가깝게 재현하는 것입니다. 이 문제를 해결하기 위해 이미지의 근접성은 아래 설명 된대로 RGB 픽셀 값의 제곱 차이로 측정됩니다.

이것은 입니다. 점수는 아래의 검증 스크립트를 사용하여 계산됩니다. 가장 낮은 점수가 이깁니다.

코드는 다음 제한 사항을 준수해야합니다.

  • 완전한 프로그램이어야합니다
  • 내 컴퓨터에서 실행되는 아래 유효성 검사 스크립트가 읽을 수있는 형식으로 이미지를 출력해야합니다. 이 스크립트는 Python의 PIL 라이브러리를 사용하며 png, jpg 및 bmp를 포함한 다양한 파일 형식을 로드 할 수 있습니다 .
  • 입력이 필요없고 파일을로드하지 않는 완전히 자체 포함되어야합니다 (라이브러리 가져 오기 제외)
  • 언어 나 라이브러리에 Starry Night를 출력하는 기능이 포함 된 경우 해당 기능을 사용할 수 없습니다.
  • 결정적으로 실행하여 매번 동일한 출력을 생성해야합니다.
  • 출력 이미지의 크기는 386x320
  • 의심의 여지를 피하기 위해 유효한 답변은 일반적인 PPCG 규칙에 따라 프로그래밍 언어를 사용해야합니다 . 이미지 파일뿐만 아니라 이미지를 출력하는 프로그램이어야합니다.

일부 제출은 코드에 의해 생성 될 수 있습니다. 이 경우 제출에 사용 된 코드를 답변에 포함 하고 작동 방식을 설명하십시오. 위의 제한 사항은 제출 한 1kB 이미지 생성 프로그램에만 적용됩니다. 코드를 생성하는 데 사용 된 코드에는 적용되지 않습니다.

채점

점수를 계산하려면 출력 이미지와 위의 원본을 가져와 RGB 픽셀 값을 0에서 1 사이의 부동 소수점 숫자로 변환하십시오. 픽셀의 점수는 (orig_r-img_r)^2 +(orig_g-img_g)^2 + (orig_b-img_b)^2즉, 두 이미지 사이의 RGB 공간에서 제곱 거리입니다. 이미지의 점수는 해당 픽셀의 점수의 합입니다.

다음은이 계산을 수행하는 Python 스크립트입니다. 불일치 또는 모호한 경우 최종 점수는 내 컴퓨터에서 실행되는 해당 스크립트에 의해 계산 된 점수입니다.

점수는 출력 이미지를 기준으로 계산되므로 손실 형식을 사용하는 경우 점수에 영향을줍니다.

점수가 낮을수록 좋습니다. 원래 별이 빛나는 밤 이미지의 점수는 0입니다. 천문학적으로 동점 일 가능성이없는 경우 가장 많은 표를 얻은 답이 승자를 결정합니다.

보너스 목표

답변은 내장 압축을 사용하는 솔루션에 의해 지배 되었기 때문에 다른 기술을 사용하는 답변에 대해 일련의 바운티를 수여했습니다. 다음은 내장 압축을 사용하지 않는 답변이 전체적으로 1 위를 차지할 경우 수여되는 400 포인트 의 현상금입니다 .

이전에 수여 된 보너스 바운티는 다음과 같습니다.

  • nneonneo의 답변에 100 포인트 현상금이 수여되었으며 당시에 는 내장 압축을 사용하지 않은 최고 점수의 답변이었습니다. 수여 당시 4852.87 점을 받았습니다. 존경 사용하여 nneonneo 이길 수있는 용감한 시도했다 2012rcampion로 이동 언급 보로 노이 다듬기에 따라 접근 방식을 5076 점을 기록, 누구의 Sleafar에 끝 부분까지 이기고, 5052 점, 유사한 방법을 사용하여 nneonneo.

  • Strawdog의 입장 에서 200 포인트 현상금이 수여되었습니다 . 이는 기본 제공 비 압축 답변 중에서 1 위를 차지한 최적화 기반 전략으로 수여되었습니다. 인상적인 영리한 방법으로 4749.88 점을 얻었습니다.

채점 / 검증 스크립트

다음의 파이썬 스크립트는 위의 이미지와 같은 폴더에 이름을 붙여야 ORIGINAL.png하며 폼의 명령을 사용하여 실행 해야합니다 python validate.py myImage.png.

from PIL import Image
import sys

orig = Image.open("ORIGINAL.png")
img  = Image.open(sys.argv[1])

if img.size != orig.size:
    print("NOT VALID: image dimensions do not match the original")
    exit()

w, h = img.size

orig = orig.convert("RGB")
img = img.convert("RGB")

orig_pix = orig.load()
img_pix = img.load()

score = 0

for x in range(w):
    for y in range(h):
        orig_r, orig_g, orig_b = orig_pix[x,y]
        img_r, img_g, img_b = img_pix[x,y]
        score += (img_r-orig_r)**2
        score += (img_g-orig_g)**2
        score += (img_b-orig_b)**2

print(score/255.**2)

기술 노트 : 이미지 유사성의 객관적인 측정은 까다로운 작업입니다. 이 경우에는 누구나 더 쉽게 구현할 수있는 방법을 선택했습니다.

리더 보드


5
Windows에서 파이썬 요구 사항을 설치하는 데 문제가있었습니다. 더 안전한 옵션 (베개를 사용하는 것입니다 pip unistall PIL다음 pip install pillow)과의 첫 번째 줄을 변경 from PIL import Image.
mınxomaτ

2
@tepples 반대 방향으로 가고 로그가 아닌 것, 예 :)
hobbs

6
단일 답변이 아직 그레이 스케일 출력 작업을 시도하지 않은 것에 놀랐습니다. 각 픽셀의 채널을 평균하면 2800과 같은 점수를 얻을 수 있으며 데이터의 1/3 만 압축하면 오류가 적습니다.
Martin Ender

3
@ MartinBüttner 당신은 아마도 이미지의 평균 푸른 색으로 그레이 스케일 이미지에 가중치를 부여함으로써 더 잘 할 수 있습니다. 나는 이것을 생각하지 않았다.
Nathaniel

3
@Nathaniel은 충분히 말하지 않았지만이 질문은 정말 훌륭합니다! ;-)
Pierre Arlaud

답변:


109

Pyth (내장 압축 없음), 점수 4695.07 4656.03 4444.82

Pyth의 유일한 이미지 관련 기능은 RGB 트리플의 매트릭스를 이미지 파일로 작성하기위한 내장 기능입니다. 여기서 미친 아이디어 는 이미지를 나타내는 ( x , y ) ↦ ( r , g , b ) 함수 에서 작은 심층 신경망 을 훈련시키고 각 픽셀의 좌표에서 실행하는 것입니다.

계획

  1. C ++로 커스텀 백프로 퍼 레이션 루프를 작성하십시오.
  2. 그것이 얼마나 느린 지 저주하십시오.
  3. Tensorflow를 배우십시오.
  4. Black Friday 거래를 사용하여 아픈 GPU로 새 데스크톱을 구축하십시오.
  5. 신경망을 압축하는 방법에 대한 문헌을 조사하고 그렇게하십시오.
  6. 신경망에 과적 합을 피하는 방법에 대한 문헌을 조사하고 그 반대를 수행하십시오.

현재 네트워크는 45 개의 시그 모이 드 뉴런으로 구성되며, 각 뉴런은 x , y 입력 및 모든 이전 뉴런에 연결되며 마지막 세 뉴런은 r , g , b 로 해석됩니다 . 일괄 처리없이 Adam 알고리즘을 사용하여 학습했습니다. 1125 연결에 가중치를 부여하는 매개 변수 는 확률 적 양자화 의 변형을 사용하여 93 개의 가능한 값 범위 (93 2 개의 가능한 값 을 갖는 상수 항 제외 )로 양자화됩니다 . 1 차 변형은 양자화 된 매개 변수의 기울기를 0으로 설정하는 것입니다.

결과

산출

코드

하여 부호화 1,023 바이트 xxd(디코드 xxd -r). 이 도전이 발표되었을 당시 의 Pyth2016-01-22 버전을 사용 했습니다. Pyth에서 직접 코드를 실행할 수 있지만 PyPy3 ( pypy3 pyth starry.pyth)의 Pyth 는 약 3 분 안에 9 배 빠르게 실행됩니다. 출력 이미지가에 기록됩니다 o.png.

00000000: 4b6a 4322 05d4 7bb1 06f8 6149 da66 28e3  KjC"..{...aI.f(.
00000010: 8d17 92de a833 9b70 f937 9fc6 a74e 544d  .....3.p.7...NTM
00000020: 1388 e4e5 1d7e 9432 fe38 1313 3c34 0c54  .....~.2.8..<4.T
00000030: 89fe 553b 83a3 84bb 08c8 09fe 72be 3597  ..U;........r.5.
00000040: b799 34f8 8809 4868 feb8 acde 2e69 34e6  ..4...Hh.....i4.
00000050: 1c1a c49a 27f0 f06a 3b27 0564 178a 1718  ....'..j;'.d....
00000060: 1440 e658 e06a c46d aa81 ac3f c4b7 8262  .@.X.j.m...?...b
00000070: 398a 39e3 c9b7 6f71 e2ab 37e0 7566 9997  9.9...oq..7.uf..
00000080: 54eb eb95 0076 0adf 103c f34c 0b4e e528  T....v...<.L.N.(
00000090: a2df 6b4a 7a02 011a 10a9 2cf0 2edc 9f6f  ..kJz.....,....o
000000a0: 33f3 5c96 9e83 fadb a2fa 80fc 5179 3906  3.\.........Qy9.
000000b0: 9596 4960 8997 7225 edb1 9db5 435e fdd8  ..I`..r%....C^..
000000c0: 08a6 112f 32de c1a5 3db8 160f b729 649a  .../2...=....)d.
000000d0: 51fa 08e8 dcfa 11e0 b763 61e6 02b3 5dbb  Q........ca...].
000000e0: 6e64 be69 3939 b5b2 d196 5b85 7991 bda5  nd.i99....[.y...
000000f0: 087a f3c0 6b76 b1d0 bb29 f7a4 29a3 e21a  .z..kv...)..)...
00000100: 3b1b 97ae 1d1b 1e0f f3c7 9759 2458 c2db  ;..........Y$X..
00000110: 386f 5fbb a166 9f27 2910 a1b5 cfcc d8db  8o_..f.').......
00000120: afaf bdb4 573d efb1 399b e160 6acf e14b  ....W=..9..`j..K
00000130: 4c6b 957a 245a 6f87 63c7 737d 6218 6ab2  Lk.z$Zo.c.s}b.j.
00000140: e388 a0b3 2007 1ddf b55c 7266 4333 f3a2  .... ....\rfC3..
00000150: d58f d80b a3a6 c6c1 d474 58f3 274b 6d32  .........tX.'Km2
00000160: 9d72 b674 7cc4 fdf6 6b86 fb45 1219 cc5c  .r.t|...k..E...\
00000170: 7244 396d 1411 d734 a796 ff54 cf1f 119d  rD9m...4...T....
00000180: 91af 5eab 9aad 4300 1dae d42e 13f8 62a1  ..^...C.......b.
00000190: a894 ab0b 9cb1 5ee2 bb63 1fff 3721 2328  ......^..c..7!#(
000001a0: 7609 34f5 fcfe f486 46e9 dfa8 9885 4dac  v.4.....F.....M.
000001b0: f464 3666 e8b9 cd82 1159 8434 95e8 5901  .d6f.....Y.4..Y.
000001c0: f0f5 426c ef53 6c7e ad28 60f6 8dd8 edaa  ..Bl.Sl~.(`.....
000001d0: 8784 a966 81b6 dc3a e0ea d5bf 7f15 683e  ...f...:......h>
000001e0: 93f2 23ae 0845 c218 6bdc f47c 08e8 41c2  ..#..E..k..|..A.
000001f0: 950e f309 d1de 0b64 5868 924e 933e 7ab8  .......dXh.N.>z.
00000200: dab7 8efb b53a 5413 c64b 48e6 fc4d 26fe  .....:T..KH..M&.
00000210: 594a 7d6b 2dd0 914e 6947 afa7 614d b605  YJ}k-..NiG..aM..
00000220: 8737 554e 31bc b21c 3673 76bf fb98 94f8  .7UN1...6sv.....
00000230: 1a7d 0030 3035 2ce6 c302 f6c2 5434 5f74  .}.005,.....T4_t
00000240: c692 349a a33e b327 425c 22e8 8735 37e1  ..4..>.'B\"..57.
00000250: 942a 2170 ef10 ff42 b629 e572 cd0f ca4f  .*!p...B.).r...O
00000260: 5d52 247d 3e62 6d9a d71a 8b01 4826 d54b  ]R$}>bm.....H&.K
00000270: f26f fe8e d33d efb5 30a8 54fb d50a 8f44  .o...=..0.T....D
00000280: a3ac 170a b9a0 e436 50d5 0589 6fda 674a  .......6P...o.gJ
00000290: 26fb 5cf6 27ef 714e fe74 64fa d487 afea  &.\.'.qN.td.....
000002a0: 09f7 e1f1 21b6 38eb 54cd c736 2afa d031  ....!.8.T..6*..1
000002b0: 853c 8890 8cc0 7fab 5f15 91d5 de6e 460f  .<......_....nF.
000002c0: 4b95 6a4d 02e4 7824 1bbe ae36 5e6c 0acd  K.jM..x$...6^l..
000002d0: 0603 b86c f9fd a299 480f 4123 627e 951f  ...l....H.A#b~..
000002e0: a678 3510 912c 26a6 2efc f943 af96 53cd  .x5..,&....C..S.
000002f0: 3f6c 435c cbae 832f 316c e90e 01e7 8fd6  ?lC\.../1l......
00000300: 3e6d d7b4 fffb cd4a 69c7 5f23 2fe7 bf52  >m.....Ji._#/..R
00000310: 3632 3990 17ed 045a b543 8b79 8231 bc9b  629....Z.C.y.1..
00000320: 4452 0f10 b342 3e41 6e70 187c 9cb2 7eb5  DR...B>Anp.|..~.
00000330: cdff 5c22 9e34 618f b372 8acf 4172 a220  ..\".4a..r..Ar. 
00000340: 0136 3eff 2702 dc5d b946 076d e5fd 6045  .6>.'..].F.m..`E
00000350: 8465 661a 1c6e b6c8 595f 6091 daf2 103b  .ef..n..Y_`....;
00000360: 23ab 343a 2e47 95cf 4218 7bf5 8a46 0a69  #.4:.G..B.{..F.i
00000370: dabb 4b8d 7f9b b0c1 23b1 c917 839c 358c  ..K.....#.....5.
00000380: b33c de51 e41c e84d 12bf 8379 f4c5 65fa  .<.Q...M...y..e.
00000390: 0b65 7fe7 e1a0 fb0e 30f4 a7d2 b323 3400  .e......0....#4.
000003a0: 15e8 8a48 5d42 9a70 3979 7bba abf5 4b80  ...H]B.p9y{...K.
000003b0: b239 4ceb d301 89f8 9f4d 5ce6 8caa 2a74  .9L......M\...*t
000003c0: ca1b 9d3f f934 0622 3933 2e77 6d6d 2b4a  ...?.4."93.wmm+J
000003d0: 4b73 4d3e 332e 574a 615a 6332 3536 685e  KsM>3.WJaZc256h^
000003e0: 3463 732a 4c2d 3436 2e29 4a5a 3138 3739  4cs*L-46.)JZ1879
000003f0: 5b32 3739 6b33 6429 3338 3620 3332 30    [279k3d)386 320

작동 원리

KjC"…"93
  C"…"     convert the long binary string to an integer in base 256
 j    93   list its base 93 digits
K          assign to K

.wmm+JKsM>3.WJaZc256h^4cs*L-46.)JZ1879[279k3d)386 320
  m                                               320  map for d in [0, …, 319]:
   m                                          386        map for k in [0, …, 385]
     JK                                                    copy K to J
                                      [279k3d)             initialize value to [3*93, k, 3, d]
           .WJ                                             while J is nonempty, replace value with
                         *L      Z                           map over value, multiplying by
                              .)J                              pop back of J
                           -46                                 subtract from 46
                        s                                    sum
                       c          1879                       divide by 1879
                     ^4                                      exponentiate with base 4
                    h                                        add 1
                c256                                         256 divided by that
              aZ                                             append to value
         >3                                                last three elements of the final value
       sM                                                  floor to integers
.w                                                     write that matrix of RGB triples as image o.png

훈련

마지막 훈련을 진행하는 동안 나는 훨씬 느린 양자화 일정을 사용했고 그 속도와 학습 속도를 대화식으로 조정했지만 사용한 코드는 대략 다음과 같습니다.

from __future__ import division, print_function
import sys
import numpy as np
import tensorflow as tf

NEURONS, SCALE_BASE, SCALE_DIV, BASE, MID = 48, 8, 3364, 111, 55

def idx(n):
    return n * (n - 1) // 2 - 3

WEIGHTS = idx(NEURONS)
SCALE = SCALE_DIV / np.log(SCALE_BASE)
W_MIN, W_MAX = -MID, BASE - 1 - MID

sess = tf.Session()

with open('ORIGINAL.png', 'rb') as f:
    img = sess.run(tf.image.decode_image(f.read(), channels=3))
y_grid, x_grid = np.mgrid[0:img.shape[0], 0:img.shape[1]]
x = tf.constant(x_grid.reshape([-1]).astype(np.float32))
y = tf.constant(y_grid.reshape([-1]).astype(np.float32))
color_ = tf.constant(img.reshape([-1, 3]).astype(np.float32))

w_real = tf.Variable(
    np.random.uniform(-16, 16, [WEIGHTS]).astype(np.float32),
    constraint=lambda w: tf.clip_by_value(w, W_MIN, W_MAX))

quantization = tf.placeholder(tf.float32, shape=[])
w_int = tf.round(w_real)
qrate = 1 / (tf.abs(w_real - w_int) + 1e-6)
qscale = 0
for _ in range(16):
    v = tf.exp(-qscale * qrate)
    qscale -= ((1 - quantization) * WEIGHTS - tf.reduce_sum(v)) / \
        tf.tensordot(qrate, v, 1)
unquantized = tf.distributions.Bernoulli(
    probs=tf.exp(-qscale * qrate), dtype=tf.bool).sample()
num_unquantized = tf.reduce_sum(tf.cast(unquantized, tf.int64))
w = tf.where(unquantized, w_real, w_int)

a = tf.stack([tf.ones_like(x) * 256, x, y], 1)
for n in range(3, NEURONS):
    a = tf.concat([a, 256 * tf.sigmoid(
        tf.einsum('in,n->i;', a, w[idx(n):idx(n + 1)]) / SCALE)[:, None]], 1)
color = a[:, -3:]
err = tf.reduce_sum(tf.square((color - 0.5 - color_) / 255))

train_step = tf.train.AdamOptimizer(0.01).minimize(err, var_list=[w_real])

sess.run(tf.global_variables_initializer())

count = 0
quantization_val = 0
best_err = float("inf")

while True:
    num_unquantized_val, err_val, w_val, _ = sess.run(
        [num_unquantized, err, w, train_step],
        {quantization: quantization_val})
    if num_unquantized_val == 0 and err_val < best_err:
        print(end='\r\x1b[K', file=sys.stderr)
        sys.stderr.flush()
        print(
            'weights', list(w_val.astype(np.int64)),
            'count', count, 'err', err_val)
        best_err = err_val
    count += 1
    print(
        '\r\x1b[Kcount', count, 'err', err_val,
        'unquantized', num_unquantized_val, end='', file=sys.stderr)
    sys.stderr.flush()
    quantization_val = (1 - 1e-4) * quantization_val + 1e-4

심상

이 그림은 x , y 좌표 의 함수로 45 개 뉴런의 활성화를 보여줍니다 . 클릭하면 확대됩니다.

뉴런 활성화


네트워크에 컨볼 루션 레이어를 추가하는 것을 고려한 적이 있습니까? 나는 더 시끄러운 미학을 얻는 것이 더 나을 것이라고 생각합니다. 또는 [x ^ 2, y ^ 2] 또는 [x % 5, y % 5]와 같은 추가 수동 제작 기능을 사용하여 이러한 패턴을 얻을 수 있습니다.
Steven H.

4
@StevenH. 아마도? 컨볼 루션 네트워크에 대한 직관을 많이 개발하지는 않았지만 그 선을 따라 뭔가 시각적으로 결과를 향상시킬 수 있지만이 도전에 사용 된 픽셀 차이 오류 메트릭을 향상시키기 위해서는 훨씬 더 인코딩해야한다고 가정합니다. 시끄러운 패턴을 원본과 상당히 정확하게 정렬 할 수 있습니다.
Anders Kaseorg

9
세상에, 이거 대단해요! 나는 누군가가 딥 뉴럴 네트워크 접근 방식을 사용하기를 바라고 있었고, 당신은 정말로 그것을하기 위해 여분의 마일을 갔다. 이것은 의심의 여지없이 모든 답변을 가장 멋지게 보입니다. 답변에주의를 끌기 위해 최소한 일시적으로 녹색 확인 표시를합니다.
Nathaniel

2
@Nathaniel 지금까지 나는 동일한 비 양자화 네트워크 (현재 약 4350 점)를 훈련하고 있지만 양자화 전략을 조정하기 위해 노력하고 있습니다. 이 업데이트의 개선의 대부분은 각 뉴런의 상수 항에 1 자리 대신 2 자리를 할당하는 것에서 비롯되었습니다.
Anders Kaseorg

1
훈련에이 시간이 얼마나 걸렸습니까 (양자화 무시)?
orlp

116

매스 매 티카, 14125.71333

"a.png"~Export~ConstantImage[{28,34,41}/95,{386,320}]

이 이미지를 저장합니다 :

a.png.


28
@ThomasWeller 방금 각 채널의 평균을 취했습니다.
LegionMammal978

33
@AlexA. 다른 답변은 없었으므로 시작하기 위해 간단한 참조 솔루션을 만들기로 결정했습니다. 비 심각한 제출물은 원래의 모든 흰색 픽셀 아이디어
LegionMammal978

63
이 도전에서 점수가 낮을 수록 좋다는 것을 사람들이 알기를 바랍니다 .
Calvin 's Hobbies

47
@AlexA. 동의하지 않습니다. 이것은 간단한 솔루션 일 경우에 유효합니다. 너무 높게 평가되지 않았거나 몇 가지 답변 중 하나 인 경우 제거해야 할 전화가 있는지 의심 스럽습니다.
Calvin 's Hobbies

35
개인적으로 이것은 이것이 질문의 정신 안에있는 훌륭한 답변이라고 생각합니다.
Nathaniel

110

자바, 7399.80678201

이것은 몇 학기 전의 수치 계산 수업에서 다항식 보간법을 사용하여 에베레스트 산의 실루엣을 그리는 프로젝트를 생각 나게했습니다. 그것은 MATLAB에서 이루어졌지만 MATLAB을 좋아하지 않기 때문에 Java에서 일하기로 결정했습니다. 기본 개념은 다항식 보간을 위해 "스마트"포인트 (여기서는 "랜덤"으로 표시)를 선택한다는 것입니다. 내가 남은 몇 바이트로, 나는 별이 그려 질 수있는 방법을 만들었습니다. 점수를 높이기 위해 코드를 압축하고 하단에 다항식을 추가 할 수 있습니다.

편집 : 다항식을 추가하고 변경하고 모든 별을 추가했습니다. 내 이전 점수는 9807.7168935였습니다. 보시다시피 크게 향상되었습니다. 불행히도 코드는 모든 별을 얻기 위해 마지막 몇 바이트를 짜서 그룹에 제공해야하기 때문에 가독성이 떨어졌습니다.

import java.awt.image.*;
public class Y{public static void main(String[]a)throws Exception{
int w=386;int[]s={5819,18,5530,9,8644,7,11041,16,21698,14,22354,40/**/,4326,4,29222,14,40262,9,56360,8,59484,12,65748,24};
double[][]p={{-1},{88},{85,0.284,-0.0064,2.028e-5},{128,0.18},{180,0.674,-0.00473,6.65e-6},{240,-0.181},{272,-0.1167},{273,0.075},{3270,-95.57,0.7},{854,-9.83,0.0381}};
int[]c={-12561790,-11439717,-10981487,-11836288,-9600372,-13088667,-13287091,-13354436,-14275540,-14736605};
int o=p.length;BufferedImage b=new BufferedImage(w,320,1);
int i=0;for(;i<o;i++)
{if(i==o-2)for(int j=0;j<s.length;j+=2)for(int l=0;l<w*320;l++)if((l%w-s[j]%w)*(l%w-s[j]%w)+(l/w-s[j]/w)*(l/w-s[j]/w)<s[j+1]*s[j+1])

b.setRGB(l%w, l/w,j<s.length/2+1?j==10?-5788556:-8944525:-7036782);

for(int l=0;l<w*320;l++){int m=0;for(int y=0;y<p[i].length;y++)m+=Math.pow(l%w,y)*p[i][y];if(l/w>m)b.setRGB(l%w,l/w,c[i]);}
}
javax.imageio.ImageIO.write(b,"png",new java.io.File("o.png"));
}
}

9807.7168935 포인트 : 7399.80678201 포인트 :
제출 이미지

새로운 제출 이미지


5
깔끔하다! PPCG에 오신 것을 환영합니다!
Mego

4
이것을 Groovy로 변환하면 상용구의 일부를 벗겨서 몇 가지 작업을 더 할 수 있습니다.
chrylis -on strike-

3
그것은 좋은 오래된 촉수의 날의 소개에서 온 것처럼 보입니다 .
moooeeeep

13
실제로 도전에서 '객관적'이라는 용어를 작성하여, 그리기 개체에 대한 한
프로토 타입을

3
그리기 개체 솔루션에서 이것은 실제로 가장 좋은 것입니다.
Trilarion

91

Python3.4 +, 4697.26

ImageMagick 답변과 동일한 방법을 사용했지만 다음 매개 변수를 사용했습니다.

convert ORIGINAL.png -filter Lanczos2 -resize x32 - | pngquant --speed 1 -f 20 > i

이 매개 변수를 사용하여 다음 1003 바이트 Python 프로그램을 생성했습니다 (@kennytm의 출력 방법에 대한 개선 사항을 찾지 못했습니다).

import base64,io,PIL.Image
PIL.Image.open(io.BytesIO(base64.b85decode('iBL{Q4GJ0x0000DNk~Le0000d0000W2m=5B0H%16zW@LLJWxzjMIIp@MPHIFJ#$E2f;B{2CoMBscAryil4g95I81|Zh@Ln<KPWOvf|rw@ter+yW3aV*evEZoY;v=uM0+bp*#H0nK}keGRCobZkq5FQAq+ze25eH(F!#UfO3bFOD)N&<AyN0%G0qy;d5u*~Ym6yks#+BaTB}6=d_2Z;Vzlk&;0~~Hy_i{>+fAa)ZE?UH1H4;-#jy7d<b%%Vecw3+`%q(!07-C(^lrsAlm_hcKIHhG&w-n|TvQA6gffYd`#$#lIaq_aH#b${0Rr~{_dXIXm(EsD=KF%BDY~EjjR!sA$`(cljOEjUsu$E%b-uF%pXA;tc+?QOHOg1TfuI?XhSeXYZ9>3XUzpreH6$%YFH{Ofn-d0cv*IqjHQQU+M=7PX5(65sP+;Sbo9=+q2n+8p!-Vw8kW>i%<+}8cQmp`7FKsM?maF*)_e&%vv>nKK;O9GnTVux79!MU;XJ(P4OxFsdP$0<JBn1vPFS#C^=MtEd4K#KWfKgNUS4R-<e)-d?qU?a%g3wBDo2O@CR|#C_9XJLv7TEYbh}4|ri%<P>OPRyX9b--+5K2xN0yhh}oR+t?_naKqIwRUjV<bqt&A9{``7{7G;88q{R8t-~qEriF@LeuTcV}g0x*{|NCUjH^IW_2VS#ngo0;)A8{!h?a6_~1|sx=8kcHC;BrkG+))LLgje9A;921P%7)U^m<Ugv<kAte9fZUa4$W^i)!NGB(M$&qu%TOOqPB^PW9T<Y?FV(GmvdNZJ&G2hY#uH^@ah#eF6sjt;LYY<+_4}trV444*z;!N%*2#R9%)CbWUy<g$^9|zqjA?NsQ`UPFmBW7cjo=pG%002ovPDHLkV1f'))).convert().resize((386,320),1).save('o.png')

이 이미지를 생성합니다 :

별이 빛나는 밤, 압축


3
분명히 기본 64, 85 또는 무엇이든 대신 256 바이트를 사용하여 데이터를 저장하는 것이 좋습니다.
feersum

@feersum 기본 인코딩보다 더 나은 방법으로 파이썬 파일에 이진 데이터를 저장하는 방법을 모르겠습니다.
orlp

점수 확인 및 검증-이것이 현재의 승자입니다.
Nathaniel

13
@Nathaniel 오늘만 요청 했으므로 아직이 답변 (또는 답변)에 허용 된 답변을 표시하지 않는 것이 좋습니다. 사람들이 답변을 수락하면 컨테스트가 끝났다고 가정하지 않을 수 있습니다. 나는 대답을 받아들이 기 전에 적어도 일주일이나 두 시간을 기다리는 것이 가장 좋다고 생각합니다.
Calvin 's Hobbies

1
예, 제거 할 수 있습니다 1에서 latin1와에서 공백 저장 import *이상을. 그러나 우선 순위가 아닌 골프는 (1024 바이트보다 작기 때문에).
nneonneo

88

파이썬 3, 5701.31 점

import base64,io,PIL.Image
PIL.Image.open(io.BytesIO(base64.b85decode('iBL{Q4GJ0x0000DNk~Le0000I0000D2m$~A04pr1P5=M`lSxEDRCrzu%wJF2MgRctyYrpz&VS-04oPU$02O1RYA2$KKm9YcYEUcDJyh+N==-F7oxW_3ecQvNY1*VQwC-UKjIkjQ8wn&8)Ukt&?VNpg?HBmL%~#(%>G5yhoON#6r~Pv6ekHzgk~o3d4gyuJL`u_K5Ca>QWmKD%@0G*T5|2ap)6YJolVN{skh#D2-J*z9sSwJGT&-<XKaADxALs3bTgxl>{_=mG9vyzZf!umCPV=nDpY_PnlC(U%vg$wXwH`cZEO(oS$M*5D=xu#wxzx3!2Zo>s9W*kYzx=A=N>*_{sW%pHRqD>^@zKSEq$TGjvKY#BrP)@HRR163l}43&{y(F((e1rtc2!^X2mO6y&o}IoM9kipbs;pk<JuNalW`QGD9ugFJ{UH3_MAMEM)%9DOccA@Z&M+Kv__Mexy}qD>itE08H7@&wK|if_I*zRFxSRUz9?^ZFg`m^?krP_gDeQ=7dy{4cvhr8><E*y5|gu_xM_1{!!*9Udz<+_jw1Qn_8z|8D0lw?VUSJ>bv`&qy7v&oe)U74a}D9r0<?Kbh$WO6X2sFFvtPgeQELMW#a8ZE``e1>Z20f*zxY<|S}V_D!tCjlc()f7Q<cT<xpz%u5MkbZ`g)qD@ZpQEom%VU&+p<WAef3W^P20qpiYIF)WfEkB@uUOn2ZrL7{m3tn}q|oboY^-PGxZcw3I>uj1fd$ZJs(Vr6?~D<kd795dbx^Ypn(<BaJBRu5S{v9QF?lgFv8^lE5$vMH@2~1P&$UXmDz~jMc9@hDb6+sUt-RA3a?K08cLC;5>#H%1mH_FaU0|12sV9)OKBnxI$()5d@YBM2xYIb)G!>9@_oL00000NkvXXu0mjf'))).resize((386,320),1).save('a.png')

18 × 13 PNG 이미지에서 간단히 크기를 조정하십시오.

여기에 이미지 설명을 입력하십시오


70

자바, 8748.95

다른 접근법 :

주어진 지점에서 Voronoi Diagram 을 계산하는 클래스를 만들었습니다 . 이 포인트 세트는 Apache BOBYQAOptimizer 의 입력으로 사용되는 매개 변수 세트로 사용됩니다 . 옵티마이 저의 평가 기능은 포인트를 가져 와서 그로부터 보로 노이 다이어그램을 만듭니다. 보로 노이 영역은 원본 이미지의 해당 영역의 평균 색으로 채색됩니다.

최적화 프로세스는 다음과 같습니다.

별이 빛나는 밤 애니메이션

최종 이미지는 다음과 같습니다.

별이 빛나는 밤

8748.95 점을 획득했습니다

(이것은 내 자신의 기능으로 측정되었지만 평가 스크립트와 동일해야합니다)

이 과정의 결과는 8 점 세트와 해당 색상입니다. (점수가 높을수록 결과가 좋지 않지만 실제로 광범위하게 시도하지는 않았습니다).

결과 코드는 다음과 같습니다 (죄송합니다, 1kB 제한으로 짜려면 약간 골프를 쳤습니다).

import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import javax.imageio.ImageIO;

class V { public static void main(String[] args) throws Exception {
BufferedImage i = new BufferedImage(386,320,2); f(i, Arrays.asList(
    275,159,247,237,46,115,108,313,244,267,59,116,94,111,219,166
),Arrays.asList(
    -10127225,-13022618,-11310968,-14341589,-13551293,-14209747,-11311484,-10915442
)); ImageIO.write(
i, "png", new File("x.png"));}static void f(BufferedImage i, List<Integer> p, 
List<Integer> c){int x,y,r=0; Point q = new Point(), a=new Point(); for (y=0; 
y<i.getHeight(); y++) { for (x=0;x<i.getWidth(); x++) { q.x=x; q.y=y; double 
d = 1e10;; for (int j=0; j<p.size(); j+=2) { a.x=p.get(j); a.y=p.get(j+1);
double s = q.distance(a); if (s < d) { d = s; r = j/2; } } i.setRGB(q.x, q.y, 
c.get(r));}}}}

(나는 더 나은 결과를 얻을 수있는 쉬운 방법이 있지만 ... 어쨌든 재미있었습니다 ...)

편집하다:

의견에 대한 답변으로, 더 많은 수의 점이있는 그러한 보로 노이 이미지의 예술적 스타일과 관련하여 : 이것은 실제로 흥미로워 보이고 일부 이미징 도구는 실제로 이것을 "모자이크 필터"로 제공합니다 (예 : 김프모자이크 필터 ( 이것은 가장자리 등을 강조하는 옵션을 제공하지만).

다음은 256 개의 별이있는 별이 빛나는 밤 이미지의 예입니다. (이것들은 무작위로 선택되지만 더 많은 포인트를 가질수록 최적화로 달성 할 수있는 개선은 사라질 것입니다).

이것은 단지 호기심을 위해 (1kB에 맞지 않기 때문에) 콘테스트의 일부 가 아닙니다.

별이 빛나는 밤 모자이크


5
+1 보로 노이는 좋은 생각입니다. 더 많은 포인트로 이미지가 주관적으로 말하면 꽤 좋아 보일 것입니다 (적어도 아트 스타일은 흥미로워 야합니다). 마음에 들지 않으면 조금 시도해 볼 것입니다.
neocpp

@neocpp 나는 짧은 단락과 더 많은 포인트를 가진 예제 이미지를 추가했습니다.
Marco13

import java.util.*;실제로 모든 가져 오기 클래스를 별표로 변경 하여 몇 바이트를 더 압축 할 수 있습니다 .
Chloe

@Chloe 나는 이것을 어느 정도 시도했다 : 점수를 10 또는 12로 늘리면 결국 점수 가 낮아진다 . 옵티 마이저를 조정하여 더 높은 점수 를 얻 거나 코드를 더 골프화 한 다음 14 점을 사용할 수 있습니다 (현재 옵티 마이저 구성으로 더 높은 점수를 얻음). 그러나 너무 많은 자유도가 있습니다. 이것을 철저히 탐구합니다. 나는 단지이 보로 노이가 깔끔한 아이디어라고 생각하고 합리적인 노력으로 "좋은"결과를 얻으려고 노력했습니다.
Marco13

최적화가 어떻게 작동하는지 잘 모르겠지만 (결정 론적이지만) 속도가 빠르면 임의의 시작 벡터로 몇 가지 경우를 실행하는 데 도움이 될 수 있습니다. 적어도 8 포인트로 GA를 실행했을 때 게시 된 것보다 몇 백 포인트 낮은 솔루션을 지속적으로 발견했으며 포인트 수를 늘리면 더 나은 솔루션을 생산하는 것처럼 보였습니다.
neocpp

64

AutoIt , 9183.25 7882.53

최신 정보

따라서 (취한) 유아처럼 이미지를 다시 그리는 것이 모든 버전의 이미지를 저장하는 것보다 효과적이라는 것이 밝혀졌습니다. ( 어쨌든 이전 솔루션 보다 효과적 입니다).

요소를 그리는 모든 선은 점수를 낮추는 데 중요합니다. 모든 변경 사항이 점수에 큰 영향을 미치기 때문에 (약 20 ~ 100 포인트)이 프로그램은 극히 사소한 수정으로 7000보다 훨씬 낮은 점수를 달성 할 수 있다고 생각합니다. 이 프로그램은 processingGDI를 사용하여 그리기 위해 간결한 함수 이름을 제공하는 그래픽 라이브러리를 사용 합니다.

이 솔루션에는 임의성이 포함되므로를 사용하여 상수 값을 0사용하여 PRNG를 시드합니다 SRandom(0). 왜 0입니까? n<=100내가 시도한 다른 것보다 최대 50 점 높기 때문에 .

캔버스는 공백으로 시작됩니다 #587092.

바닥 생성

이미지의 아랫 부분 ( 점으로 인해 정확히 233px로 시작 함 )은 정확히 int(1e4*2.9)타원으로 채워집니다 . 여기에서 요소 (또는 요소의 소수점 이하 자릿수)를 변경하면 수백 점씩 점수를 줄이고 증가시킬 수 있습니다. 몇 번의 시도 후 나는 2.9를 위해 정착했다. 당연히 시간이 조금 걸립니다 (몇 초).

5 색 팔레트가 제공됩니다.

Dim $3=[0x202526,0x48555A,0x394143,0x364458,0x272E3A]
For $n=1 To 1e4*2.9
$c=$3[$6(0,4,1)]
pen($2,$c,$c)
$4($2,$6(0,386),$6(233,320),4,3)
Next

바닥에 얼룩

바닥 영역 내부에 대비되는 액센트를 설정하는 데 4 개의 타원이 사용됩니다 ( $4에 대한 함수 포인터 ellipse()임).

pen($2,0x1E221F,0x1E221F)
$4($2,44,44,37,290)
$4($2,40,200,99,130)
$4($2,245,270,30,20)
$4($2,355,165,30,20)

하늘에서 악센트 생성

타원에 비해 너무 많이 늘어난 하늘의 중요한 색상 영역을 나타 내기 위해 두꺼운 펜을 사용하여 일부 선을 그립니다.

$4($2,333,193,50,31)
pensize($2,10)
pen($2,0x24292E,0x24292E)
move($2,0,250)
linestep($2,386,175)
pen($2,0x9FAC9C,0x9FAC9C)
$4($2,333,120,66,33)
move($2,215,190)
linestep($2,340,140)

픽셀 무게

위의 후에는 모두 헹구고 바이트가 부족해질 때까지 반복합니다. 그런 다음 유효성 검사 방법을 속이기 위해 흐림이 적용됩니다. 무차별 대입으로, 반경이 정확히 20 인 것이 최상의 결과를 제공하는 것으로 결정되었습니다. 이것은 약 1.5k (!)의 라운드로 점수를 향상시킵니다.

최종 이미지

유아 그리기

코드, 985 바이트

#include<ScreenCapture.au3>
#include<GDIPlus.au3>
#include<processing.au3>
SRandom(0)
$4=ellipse
$6=Random
$1=GUICreate(0,386,320)
color(0x587092)
$2=size(0,0)
Dim $3=[0x202526,0x48555A,0x394143,0x364458,0x272E3A]
For $n=1 To 1e4*2.9
$c=$3[$6(0,4,1)]
pen($2,$c,$c)
$4($2,$6(0,386),$6(233,320),4,3)
Next
pen($2,0x1E221F,0x1E221F)
$4($2,44,44,37,290)
$4($2,40,200,99,130)
$4($2,245,270,30,20)
$4($2,355,165,30,20)
pen($2,0x506E9B,0x506E9B)
$4($2,333,193,50,31)
pensize($2,10)
pen($2,0x24292E,0x24292E)
move($2,0,250)
linestep($2,386,175)
pen($2,0x9FAC9C,0x9FAC9C)
$4($2,333,120,66,33)
move($2,215,190)
linestep($2,340,140)
$4($2,105,145,40,40)
$4($2,315,15,70,70)
$4($2,215,15,30,30)
pen($2,-1,0xB6A73F)
$4($2,330,30,40,40)
$4($2,20,5,20,20)
$4($2,115,155,30,30)
GUISetState()
Sleep(99)
_GDIPlus_Startup()
$5=_GDIPlus_BitmapCreateFromHBITMAP(_ScreenCapture_CaptureWnd("",$1,1,26,386,345,0))
_gdiplus_ImageSaveToFile($5,_GDIPlus_BitmapApplyEffect($5,_GDIPlus_EffectCreateBlur(20))&".png")

오래된 답변

이것은 10x8 px 그림을 구성하는 80 개의 색상 값을 저장합니다. 이 원본 그림의 점수는 10291입니다. 10x8은 40px의 픽셀 화 요소이므로 반지름 40px를 사용하여 가우시안 블러를 적용하여 점수를 낮 춥니 다. 이것이 스크립트가 9183.25를 달성하는 방법입니다.

이것은 저장된 데이터입니다.

원시 데이터

생성 된 파일은 True.png입니다.

그림

프로그램 길이 는 998 바이트 입니다.

#include<ScreenCapture.au3>
#include<GDIPlus.au3>
$1=GUICreate(0,386,320)
$4=0
For $3=0 To 7
For $2=0 To 9
GUICtrlSetBkColor(GUICtrlCreateLabel("",$2*40,$3*40,40,40),Dec(StringSplit("1B2A56,3D5183,39487B,3E4D7E,313C72,2B375B,333C6F,6E7A8F,878D8A,868985,4E6590,344992,344590,3E5793,485C9C,6A7BA0,525C65,637B8F,96A48D,92A0A0,758087,465D84,3D5C94,4A6387,496498,6A83A4,778F97,607A8F,6A8498,727E6E,72878D,65747E,586D83,71889D,476792,57708B,68899E,7A959A,708892,808789,728282,4C5747,415458,5C778B,5A6E80,4C6C94,63848E,656D6F,6A7687,75858F,434E63,29343D,263036,4C574D,6B747A,506895,2D4871,1D2F46,3D4C46,434E7A,2B2D2A,151B1D,282723,121727,23312F,26343C,213537,1E282E,414861,444F45,887E6B,434133,262216,352D26,3E3522,34322E,444040,352F36,444551,3F4047",",",3)[$4]))
$4+=1
Next
Next
GUISetState()
Sleep(2e3)
_GDIPlus_Startup()
$5=_GDIPlus_BitmapCreateFromHBITMAP(_ScreenCapture_CaptureWnd("",$1,1,26,386,345,0))
_gdiplus_ImageSaveToFile($5,_GDIPlus_BitmapApplyEffect($5,_GDIPlus_EffectCreateBlur(40))&".png")

8
답변에 취한 유아 부분을 테스트 하지 않았기를 바랍니다 .
mgarciaisaia 2016 년

5
+1. 원본을 base64로 인코딩하는 도구를 사용하는 데 어려움이 없습니다. 게으른 해결책처럼 보입니다. 이것에 , 나는 포인트를 줘!
Chris Cirefice

1
또한, 나는이 도전과 관련이없는 오토 트레이서를 만들었습니다. 출력은이 그림에 매우 적합하며 품질 저하없이 가능한 가장 작은 SVG입니다. 어떤 작게를 할 수있는 경우 SVG를 어떤 더 나를 핑하시기 바랍니다.
mınxomaτ

1
3 바이트 만 절약 할 수 있지만 1e4*2.9같지 29e3않습니까?
2012rcampion

1
글쎄, 당신이 저장하는 모든 바이트는 다른 프리미티브를 추가하는 데 더 가깝습니다. 그래도 최적화에 사용하는 것이 좋습니다.
2012rcampion

45

Windows BAT 파일, 4458.854 점

echo QlBH+yAAgwKCQAADkkdARAHBcYMSAAABJgGvBVKInJKSe4D9mGo5+oRwrhSlmmqeYK22qun5kDzV+UZhRPdtXWSME8ABlNItkdoM5b0O7jO01KMnUbhSa4GAKq6U/AWBh8J4Od/O0RKwm2Bj1lAWi3yfWb9AB14B9/aml7juRU0fQTVS9LUQxE1eXTfp6f2SdBh9Ibyk3CNjdpEGdZLsuSPaQUP0vWnqtxyBsYQW1orBqzSh4zWFscTx5OMxA4FAw1/Y+/xx+TEUkogp4oykebVfCTFJYFRW6KZ+tvUOb5nFgrIuYbNrZcnWehWOK3rL7i2qCYJ2TnSlwKt4WL04zXve3ggGxAWlD/N6YCchdgS8zaZfVxouhwjbwc1Pb/KAajfGQlv7xHhj42ClMPGeqEZrriJTlLX8GUXpt8RP0LlbVR+PtgPRFerFRzJwTB5ThASKsaKt4LLSQqCXjgJvL2epSQaxq2IJkLelVTqate10dIngfVJqUL2r7omvwQ6N9DWi3ZiF6cRc4PMdPp4Ovo7nM/dlOn1CQ1sOp3mrP12EhGdiGvRsEqdt/jHC1roK5yJVv/L2bAOxK1EJ8qJqaApF7W1VY5htmci8C10UE5iTiBYcPzh8oxPUqXp9+wXgRsDY2sdIo6hOvp8IC9jQXkbDK2lJZjJvcwklTSFah/yqf6biaIOLTtHpEonH1jYXOS4dPzt6oNExlmJztgVFjbqlnB7k3i/mm2UL4+IPjgMMOmH+fwluY+cDA2zG+QtVDGwhSaEEvS9B7L2VkayIuEXKpk9pu/58xwlw4/xQOJE1QGVvSi6uL7DEH4qsumBOGAs50DRu2pCSGfa4c+wn3M0DuFM1p/iRFnq+aNk2PsPc00k8EI5i4QOt/+ac+zKmgEztiz7yI+FzIVKGnn32wLkHVu1ei3VhkWhMy8xlUTAq+fBreWQY > s.b64
certutil -decode s.b64 s.bpg
bpgdec.exe -o stnight.png s.bpg

프로그램 크기는 1024 바이트입니다.
base64로 인코딩 된 BPG 이미지에서 PNG로 변환합니다.
사용 Certutil.exe를 (표준 Windows 유틸리티)와 bpgdec.exe 라이브러리와 같은 이미지 디코더를.

압축:

  1. 원본 이미지가 흐려졌습니다 (가우시안 블러 필터, 반경 2 픽셀).
  2. 결과는 bpgenc.exe (Quantizer = 50)를 사용하여 BPG로 인코딩되었습니다.
  3. 이진 이미지가 Base64로 변환되었습니다.

별이 빛나는 밤


2
새로운 승자가있는 것 같습니다! (이것은 틀림없이 사양을 충족합니다.)
Nathaniel

9
이 시점에서 수상자들은 골프 규칙을 따르는 프로그램이 사소한 방법으로 어떤 방법 으로든 원본의 좋은 이미지 압축을 찾는 것처럼 보입니다. 다시 말해,이 이미지의 Kolmogorov 복잡성에 대해 더 나은 아이디어를 가진 사람은 아무도 없습니다. 이 답변이 Adam의 것보다 "나에게 덜 생생하게"보이는 것이 흥미 롭습니다.
Steve Jessop

5
@SteveJessop 그래, 부끄러운 일이야, 난 정말 도전이 될 것이라고 상상했던 것이 아닙니다. 대부분 상용 압축 방법을 사용하지 않고 도전 과제에 붙여 넣는 것을 잊어 버린 규칙을 작성했기 때문입니다. 나는 알고리즘 적으로 흥미로운 답변을 인정하는 도전을 제기하는 데 정말로 관심이 있으며, 이것으로부터 교훈을 얻었습니다.
Nathaniel

3
@Nathaniel : 예, 문제는 BPG (또는 모든 이미지 라이브러리)에 이미지 압축 해제에 유용한 작업을 구현하는 k 및 k 코드가 포함되어 있다고 생각합니다.이 질문의 규칙에 따라 모두 무료로 사용할 수 있습니다. 처음부터 시작하여 1k 코드에 대한 전문 지식을 얻는 것은 큰 요구입니다. 그러나 하나의 특정 이미지 만 처리하면된다는 이점이 그다지 중요하지 않다는 점을 여전히 흥미 롭습니다.
Steve Jessop

1
@SteveJessop 또한 내장 압축을 사용하지 않는 항목들 중 가장 좋은 것은 저해상도 래스터 이미지를 저장 한 다음 흐리게 처리하는 것입니다. 흥미로운 최적화 기반 솔루션은 실제로 경쟁 할 수 없습니다. 그러나이 모든 것이 실제로 소스 이미지의 속성 일 수 있습니다. Starry Night에는 상당히 균일 한 색상의 넓은 영역이 많이 포함되어 있으며 이미 모양이 다소 흐려서 이러한 기술에 이상적입니다. 고대 비가 많은 이미지를 선택한 경우 다른 솔루션이 더 효과적 일 수 있습니다.
Nathaniel

42

C ++ 11, 7441.68126105 6997.65434833 5198.16107651

더 많은 업데이트

나는 Perl의 타원을 너무 좋아서 C ++ 11에서 시도해야했습니다. 나는 원시 문자열을 사용하여 바이트를 거기에 넣었지만 잠시 동안 예상 점수와 생성 된 코드와 약간의 불일치를 얻었습니다. g ++은 이것을 0x0a (New Line)로 변환하기 때문에 실제로 원시 0x0d (캐리지 리턴)를 넣을 수 없습니다. 솔직히이 생성 된 소스가 얼마나 합법적인지 잘 모르겠지만, 몇 대의 컴퓨터에서 컴파일되고 작동합니다.

또한 GA가 정지 된 것처럼 보이는 적응 형 차원 검색 알고리즘 을 사용하여 로컬 최소값을 연마하고 운이 좋으면 다른 우물에 빠질 수있었습니다.

이것으로 C ++ 11은 놀랍게도 경쟁력있는 점수를 제공합니다 (처음 추측했던 것보다 훨씬 낫습니다) ... 유일한 포함으로 fstream 으로이 작업을 수행 할 수 있다는 것이 놀랍습니다.

텍스트 (예, 줄 바꿈은 실제 소스에 있습니다 ... 제거 할 수 있다고 생각합니다) :

#include <fstream>
#define U unsigned
int main(){
auto *d=reinterpret_cast<const U char*>(R"(<<gibberish>>)");
U a=320,b=386,n=*d++;
char m[a*b*3]{0};
for(U i=0;i<n;i++,d+=7){long x=2*d[0],y=2*d[1],w=2*d[2],h=2*d[3];
for(U r=0;r<a;r++){for(U c=0;c<b;c++){long u=c-x,v=r-y;
if((w*w*v*v+h*h*u*u)<=w*w*h*h){auto *p=m+3*(r*b+c);*p++=d[4];*p++=d[5];*p=d[6];}}}}
std::ofstream f{"e.ppm",std::ios::binary};f<<"P6\n386 320\n255\n";for(U i=0;i<a*b*3;i++){f<<m[i];}
return 0;}

16 진 덤프 :

00000000: 2369 6e63 6c75 6465 203c 6673 7472 6561  #include <fstrea
00000010: 6d3e 0a23 6465 6669 6e65 2055 2075 6e73  m>.#define U uns
00000020: 6967 6e65 640a 696e 7420 6d61 696e 2829  igned.int main()
00000030: 7b0a 6175 746f 202a 643d 7265 696e 7465  {.auto *d=reinte
00000040: 7270 7265 745f 6361 7374 3c63 6f6e 7374  rpret_cast<const
00000050: 2055 2063 6861 722a 3e28 5222 2851 1274   U char*>(R"(Q.t
00000060: 5134 8c86 6c7f 2ea0 3638 4c8b c001 c126  Q4..l...68L....&
00000070: 6e84 9500 480b 2964 778f 0196 5c09 353d  n...H.)dw...\.5=
00000080: 346f 476e 6433 4581 0f02 0509 9798 4d12  4oGnd3E.......M.
00000090: 0110 0362 7482 6300 4d1f 2631 645b 213d  ...bt.c.M.&1d[!=
000000a0: 187e 835c 6f84 333d 2c3e 4f9d 71bb 1e22  .~.\o.3=,>O.q.."
000000b0: 2d3d 1f4f 0248 2424 235f 577e 1f71 8990  -=.O.H$$#_W~.q..
000000c0: b314 3a89 404a 5920 1202 0c23 242a 8e01  ..:.@JY ...#$*..
000000d0: 6d30 3645 7145 86b0 082c 3543 4d42 1f52  m06EqE...,5CMB.R
000000e0: 6879 7c7a 336d 1a37 4c82 b876 b606 3146  hy|z3m.7L..v..1F
000000f0: 70a1 015e 0b38 4b7f 0e46 a916 4360 8550  p..^.8K..F..C`.P
00000100: 1623 0930 407c bf13 6e73 4556 6252 9837  .#.0@|..nsEVbR.7
00000110: 4326 2c31 7d81 3303 2e3c 526c 4123 4b37  C&,1}.3..<RlA#K7
00000120: 4758 bd6f 8b0a 2d3c 6000 0006 1b2c 3a6b  GX.o..-<`....,:k
00000130: a83a 134f 4254 6649 590e 174a 6986 3833  .:.OBTfIY..Ji.83
00000140: 0a29 3245 8695 1d27 583e 507f 963c 2b33  .)2E...'X>P..<+3
00000150: 2f3d 6fb6 191f 6752 5f63 b09e 5b0c 3239  /=o...gR_c..[.29
00000160: 4021 4b20 1941 5c87 ab18 1c1e 4a5f 8c35  @!K .A\.....J_.5
00000170: 9d19 311d 211e af4b 3327 4f64 986c 2712  ..1.!..K3'Od.l'.
00000180: 573b 4b73 b733 a718 5f76 9ca9 2919 2163  W;Ks.3.._v..).!c
00000190: 7e9e 8147 8914 8996 726b 1c17 1670 807b  ~..G....rk...p.{
000001a0: 5038 930e 6279 94b0 351d 3086 9b8e ba40  P8..by..5.0....@
000001b0: c10e 3449 6721 4002 232f 394e 22a0 0e74  ..4Ig!@.#/9N"..t
000001c0: 2b2f 2c09 3d0e 1666 7e97 0570 2e05 526d  +/,.=..f~..p..Rm
000001d0: 8a68 1e2f 0a40 5586 bf5d 150c 2022 2e5e  .h./.@U..].. ".^
000001e0: 260e 4b3a 4a7d a368 3807 4c63 972b 5707  &.K:J}.h8.Lc.+W.
000001f0: 2e41 5a79 865e 3c06 2326 3927 9d0e 411d  .AZy.^<.#&9'..A.
00000200: 211d c030 9b16 657f 9666 2434 0a5f 7592  !..0..e..f$4._u.
00000210: 873b 0a1d 8895 89a9 432e 0aa2 aa95 af1d  .;......C.......
00000220: 1212 aab1 7c80 5833 162c 3758 834d 3117  ....|.X3.,7X.M1.
00000230: 718b 9579 2a06 163e 5381 8439 3b0c 5172  q..y*..>S..9;.Qr
00000240: 9d54 3a16 1538 4e73 8c4f 1f0e 8fa2 9ab0  .T:..8Ns.O......
00000250: 200b 07b8 a946 5e40 1e19 5971 9457 5028   ....F^@..Yq.WP(
00000260: 125b 779b bb49 1a07 a1ad a022 7b0a 421f  .[w..I....."{.B.
00000270: 231f 585e 200f 5f77 8a41 5b0e 136a 8089  #.X^ ._w.A[..j..
00000280: 9ca0 9d01 5648 3a40 550c 0c9f a89e 7841  ....VH:@U.....xA
00000290: 2a19 566f 9429 2229 3b0a 5520 613d 3332  *.Vo.)");.U a=32
000002a0: 302c 623d 3338 362c 6e3d 2a64 2b2b 3b0a  0,b=386,n=*d++;.
000002b0: 6368 6172 206d 5b61 2a62 2a33 5d7b 307d  char m[a*b*3]{0}
000002c0: 3b0a 666f 7228 5520 693d 303b 693c 6e3b  ;.for(U i=0;i<n;
000002d0: 692b 2b2c 642b 3d37 297b 6c6f 6e67 2078  i++,d+=7){long x
000002e0: 3d32 2a64 5b30 5d2c 793d 322a 645b 315d  =2*d[0],y=2*d[1]
000002f0: 2c77 3d32 2a64 5b32 5d2c 683d 322a 645b  ,w=2*d[2],h=2*d[
00000300: 335d 3b0a 666f 7228 5520 723d 303b 723c  3];.for(U r=0;r<
00000310: 613b 722b 2b29 7b66 6f72 2855 2063 3d30  a;r++){for(U c=0
00000320: 3b63 3c62 3b63 2b2b 297b 6c6f 6e67 2075  ;c<b;c++){long u
00000330: 3d63 2d78 2c76 3d72 2d79 3b0a 6966 2828  =c-x,v=r-y;.if((
00000340: 772a 772a 762a 762b 682a 682a 752a 7529  w*w*v*v+h*h*u*u)
00000350: 3c3d 772a 772a 682a 6829 7b61 7574 6f20  <=w*w*h*h){auto 
00000360: 2a70 3d6d 2b33 2a28 722a 622b 6329 3b2a  *p=m+3*(r*b+c);*
00000370: 702b 2b3d 645b 345d 3b2a 702b 2b3d 645b  p++=d[4];*p++=d[
00000380: 355d 3b2a 703d 645b 365d 3b7d 7d7d 7d0a  5];*p=d[6];}}}}.
00000390: 7374 643a 3a6f 6673 7472 6561 6d20 667b  std::ofstream f{
000003a0: 2265 2e70 706d 222c 7374 643a 3a69 6f73  "e.ppm",std::ios
000003b0: 3a3a 6269 6e61 7279 7d3b 663c 3c22 5036  ::binary};f<<"P6
000003c0: 5c6e 3338 3620 3332 305c 6e32 3535 5c6e  \n386 320\n255\n
000003d0: 223b 666f 7228 5520 693d 303b 693c 612a  ";for(U i=0;i<a*
000003e0: 622a 333b 692b 2b29 7b66 3c3c 6d5b 695d  b*3;i++){f<<m[i]
000003f0: 3b7d 0a72 6574 7572 6e20 303b 7d         ;}.return 0;}

C ++ 11 타원


이 답변은 이전 답변의 여러 접근 방식을 결합합니다. 아래에서 설명 할 것입니다. 불행히도 944 949 문자 (에 따라 wc -c) 에 맞게 프로그램을 골프화해야 하므로 더 이상 C ++처럼 보이지 않습니다 (사과 이것은 도전의 규칙에 위배됩니다. 곧 개선을 위해 노력하겠습니다). 나는 처음에 이것을 계획하지 않았기 때문에 여전히 완전히 해독 할 수는 없으며 여전히 낮은 교수형 과일이 많이 있습니다.

업데이트 된 결과

유전자 알고리즘을 더 오래 실행하면 약간 더 나은 결과를 얻을 수 있습니다. 그러나 수렴이 크게 둔화되었다는 점을 감안할 때이 특정 방법이 아마도 시작되기 시작했다고 생각합니다 (또는 나는 약간의 지역 최소에 빠졌습니다). 나는 최종 프로그램을 더 몇 개의 직사각형으로 짜기 위해 더 골프를 쳤다 (최대 게놈 크기가 증가한 것을 제외하고는 발전기는 동일하게 유지됨).

개인 간 교차를 구현하면 문제가 지역 최소 수준 인 경우 도움이 될 수 있지만 한동안 같은 범위에 머물러 있다고 가정하면 사각형의 수만큼 얻을 수 있다고 생각하기 시작했습니다.

#include <fstream>
#include <vector>
#define q operator
#define s struct
#define k return

using o=std::ofstream;using i=int;s C{unsigned char r,g,b;};void q<<(o &z,C &c){z<<c.r<<c.g<<c.b;}s R{i x,y,w,h;C c;};s P{P(i a,i b):w(a),h(b),p(w*h){}C &q()(i x,i y){k p[y*w+x];}i w,h;std::vector<C> p;};void q<<(o &z,P &p){z<<"P6\n"<<p.w<<" "<<p.h<<"\n255\n";for(i n=0;n<p.w*p.h;n++){z<<p.p[n];}}i main(){R a{0,0,386,320,{73,87,116}};P p(386,320);for(auto r:
{a
,{0,174,385,145,{48,56,65}}
,{0,33,322,201,{97,123,144}}
,{289,26,96,136,{152,167,153}}
,{114,62,225,128,{128,150,151}}
,{46,74,116,245,{33,38,36}}
,{150,17,224,63,{170,172,109}}
,{85,41,125,158,{70,94,122}}
,{125,197,260,37,{59,77,118}}
,{109,78,105,138,{111,132,145}}
,{76,94,309,33,{88,115,148}}
,{176,17,139,160,{86,111,148}}
,{213,228,172,35,{62,79,97}}
,{0,11,270,89,{75,94,130}}
}
){for(i x=0;x<r.w;x++){for(i y=0;y<r.h;y++){p(r.x+x,r.y+y)=r.c;}}}o f{"a.ppm",std::ios::binary};f<<p;k 0;}

여기에 이미지 설명을 입력하십시오

보로 노이 버전, 7331.92407536, 989 자

GA 코드와 함께 Marco13의 Voronoi Idea 를 사용 했습니다 . 이것은 내가 바랐던 것처럼 실제로 효과가 없었습니다. 직사각형보다 몇 점 더 짜낼 수있었습니다. 중첩으로 인해 직사각형의 잠재적으로 분리 된 특성이 점수에 약간 도움이된다고 생각합니다. 어쨌든, 나는 첫 번째 출품작과 비슷한 점수에도 불구하고 실제로 이것이 훨씬 더 좋아 보이는 방식을 좋아합니다.

#include <fstream>
#include <vector>
#define q operator
#define s struct
#define k return
using i=int;using o=std::ofstream;s C{unsigned char r,g,b;};void q<<(o &z,C &c){z<<c.r<<c.g<<c.b;}s P{i x,y;C c;P q-(P r){k {x-r.x,y-r.y,{0,0,0}};}i q*(P r){k x*r.x+y*r.y;}i q^(P r){P d=(*this-r);k d*d;}};s X{X(i a,i b):w(a),h(b),p(w*h){}C &q()(i x,i y){k p[y*w+x];}i w,h;std::vector<C> p;};void q<<(o &z,X &p){z<<"P6\n"<<p.w<<' '<<p.h<<"\n255\n";for(i n=0;n<p.w*p.h;n++){z<<p.p[n];}}i main(){P a{101,108,{72,89,122}};X p(386,320);for(i y=0;y<p.h;y++){for(i x=0;x<p.w;x++){P c(a),d{x,y,{0,0,0}};for(auto g:{a,{0,314,{48,56,58}},{182,135,{89,112,144}},{108,262,{34,39,41}},{357,221,{64,78,102}},{251,289,{50,60,75}},{129,161,{108,128,142}},{375,1,{83,104,137}},{44,161,{95,120,144}},{316,254,{53,65,85}},{47,161,{37,43,41}},{373,37,{159,167,121}},{313,138,{87,115,152}},{264,0,{71,88,130}},{314,141,{128,148,153}}}){i m=c^d;i n=g^d;if(n<m){c=g;}}p(x,y)=c.c;}}o f("v.ppm",std::ios::binary);f<<p;k 0;}

보로 노이 GA

이전 결과, 7441.68126105, 944 자

#include <iostream>
#include <fstream>
#include <vector>
#define q operator
#define s struct
#define k return

using o = std::ostream; using i = int; s C{i r;i g;i b;}; o &q<<(o &z,C &c){z<<(char)c.r<<(char)c.g<<(char)c.b;k z;} s R{i x;i y;i w;i h;C c;};s P{P(i a,i b):w(a),h(b){p.reserve(w*h);}C &q()(i x,i y){k p[y*w+x];}i w;i h;std::vector<C> p;}; o &q<<(o &z,P &p){z<<"P6\n"<<p.w<<" "<<p.h<<"\n255\n";for(i n=0;n<p.w*p.h;n++){z<<p.p[n];}k z;} i main() { R a{0,0,386,320,C{89,109,129}}; P p(386,320); for (auto r:
{
a
,{48,31,334,288,C{46,55,66}}
,{1,237,169,81,C{35,40,40}}
,{348,48,37,115,C{126,147,155}}
,{165,20,217,68,C{169,173,113}}
,{106,2,209,217,C{98,120,143}}
,{206,199,178,62,C{61,79,108}}
,{11,31,113,48,C{65,83,129}}
,{239,84,109,106,C{108,132,152}}
,{0,78,326,42,C{86,110,142}}
,{47,0,248,55,C{64,79,121}}
}
) { for(i dx=0;dx<r.w;dx++){for(i dy=0;dy<r.h;dy++){p(r.x+dx,r.y+dy)=r.c;}} } std::ofstream f("a.ppm"); f << p; k 0; }

다른 항목들과 마찬가지로 프로그램은 겹치는 사각형을 그립니다. 형식이 간단하기 때문에 이진 PPM을 사용합니다 (출력은 a.ppm이지만 SE는 PPM을 좋아하지 않기 때문에 png 버전을 업로드했습니다). 그리고 완전히 결정적입니다.

내 출력의 PNG 버전

설명

PPM을 생성하면 상용구 코드가 많이 들었습니다. 골프 후에도 너무 많은 사각형을 가질 수 없었습니다. 점수를 더 높이기 위해 여기에 몇 가지를 더 넣을 수 있습니다.

진짜 마술은 사각형의 목록입니다. Wolfgang의 답변과 유사하게 나는 이것을 찾기 위해 유전자 알고리즘을 사용했습니다. 실제로 개인 간 재조합은 아직 일어나지 않지만 돌연변이는 여전히 발생하고 피트니스에 의한 토너먼트 스타일 순위는 다음 라운드에서 최고의 유기체를 유지하기 때문에 실제로는 구현이 크게 불완전합니다. 마지막 라운드에서 가장 좋은 개인의 사본이 다음 라운드에 보관되므로 Elitism도 사용되므로 가장 적합한 유기체는 항상 이전 라운드와 같이 적합합니다.

어제 시작한 이후 Wolfgang의 코드를 너무 자세히 보지 않았지만 색상도 다양하게 허용하여 점수 차이를 설명 할 수 있습니다.

검색 공간을 작게 유지하기 위해 사각형 위치 만 보았습니다. 색상은 소스 이미지가 있기 때문에 해당 사각형에서 보이는 픽셀의 채널당 평균으로 계산됩니다 (제곱 거리를 최소화하기 때문에 특정 사각형에 대해 더 나은 방법은 없다고 생각합니다).

계속해서 작업하면 다음 몇 가지 편집에 github 저장소를 넣을 것입니다.하지만 현재 (단일 파일) 코드는 pastebin 입니다. C ++ 11 모드에서 컴파일하십시오 (부록, 일회성조차도 지저분합니다).

별이 빛나는 밤의 P3 PPM 이미지도 필요합니다 ORIGINAL.ppm. 이 GitHub Gist 에서 파일을 다운로드 할 수 있습니다 .


PPCG에 오신 것을 환영합니다! 계속해서 원본 이미지의 P3 PPM 버전을 GitHub Gist에 업로드 했으므로 게시물의 링크를 편집 해 드리겠습니다.
Mego

3
유전자 알고리즘 사용시 +1 GA가 결국이 도전에서 승리하기를 바라고 있습니다.
Nathaniel

"#include <fstream>"을 잃고 마지막에 "std :: cerr << p"를 사용하면 몇 바이트를 더 얻을 수 있습니다.
시조

@Eponymous 고마워, 그러나 실제로 그것을 강화시킬 수있는 다른 것들이 있습니다 (예 : 색상 구조 i r,g,b를 별도로 대신 선언 할 수 있으며 많은 공간을 버릴 수 있습니다). 프로그램이 파일을 직접 생성해야하는지 또는 stdout / stderr 로의 파이프 연결이 올바른지 확실하지 않습니다.
neocpp

왜 공간이 #include <fstream>있습니까? 또한, 줄 바꿈을 삭제하고 C ++에서 어쨌든 세미콜론을 필요로하기 때문에 한 줄에 모두 넣어
고양이

41

ImageMagick, 4551.71

다음 옵션을 사용하여 ImageMagick '프로그래밍'언어를 사용합니다 (이스케이프해야 할 수도 있음 !).

convert i -resize 386x320! o.png

다음 968 바이트 소스 파일 (16 진 덤프로 제공됨)을 가정하십시오.

00000000: 89 50 4E 47 0D 0A 1A 0A - 00 00 00 0D 49 48 44 52 | PNG        IHDR|
00000010: 00 00 00 30 00 00 00 28 - 08 03 00 00 00 8F 59 89 |   0   (      Y |
00000020: 43 00 00 00 3C 50 4C 54 - 45 1E 22 1F 5D 73 88 3B |C   <PLTE " ]s ;|
00000030: 51 8A 38 48 60 51 6F 9C - 30 41 7C 38 40 41 49 63 |Q 8H`Qo 0A|8@AIc|
00000040: 8E 27 2E 3A 63 7C 9B 42 - 56 79 29 36 5C 74 8C A1 | '.:c| BVy)6\t  |
00000050: 74 89 8B 8D A0 97 4E 5C - 62 A4 AF 9E B0 B4 79 84 |t     N\b     y |
00000060: 8F 70 B3 A3 3C C0 50 80 - E6 00 00 03 47 49 44 41 | p  < P     GIDA|
00000070: 54 78 01 65 91 07 16 C3 - 28 0C 44 25 9A A8 C6 71 |Tx e    ( D%   q|
00000080: EE 7F D7 FD C2 5B B3 F3 - 1C EA 7C 15 22 A3 EB D2 |     [    | "   |
00000090: 5E 47 D4 38 46 B0 A5 21 - E7 AE AA 9D 79 8C D1 63 |^G 8F  !    y  c|
000000a0: 8E 21 F4 6E 66 81 2F 77 - 19 F6 7C 9F 36 46 7E 94 | ! nf /w  | 6F~ |
000000b0: 61 3D D0 28 58 CE 39 F8 - 22 9C B1 63 D7 B6 D4 0C |a= (X 9 "  c    |
000000c0: 60 3D 4F CB 98 63 1E 99 - 33 7D 1E DC 28 70 A1 21 |`=O  c  3}  (p !|
000000d0: E4 90 C1 75 5E D7 E7 BA - 96 4A 0E AD B5 90 47 CD |   u^    J    G |
000000e0: 88 70 39 E8 66 66 63 00 - CB CE CA 6C 5D 1F 04 22 | p9 ffc    l]  "|
000000f0: 83 5B 0E EB 01 88 F6 8A - 08 2F D0 07 9B D4 A6 FB | [       /      |
00000100: BF DF CF 0D 10 5E A0 EC - DD F3 2B 8A 3B 4B 53 35 |     ^    + ;KS5|
00000110: C0 9C 5F E0 0B 03 40 82 - 03 EC E7 BB 33 EA 96 30 |  _   @     3  0|
00000120: D2 B9 33 DE 01 B2 34 4F - 7C 74 49 78 55 F7 F7 FB |  3   4O|tIxU   |
00000130: 30 9B 29 2F 35 E7 4C AD - A5 30 3A 70 4B 29 5D FF |0 )/5 L  0:pK)] |
00000140: 00 BC FB C9 D0 55 3D 54 - C2 AF A8 29 61 5B 1F FA |     U=T   )a[  |
00000150: 5C 0B 62 DE 10 C8 81 44 - 5F 00 99 E0 44 55 5D 8B |\ b    D_   DU] |
00000160: 55 27 AE 13 59 79 CC 99 - AC AD FB 00 F4 D0 74 69 |U'  Yy        ti|
00000170: 0F 21 96 86 56 6B B3 47 - 32 21 6C D6 CC D6 9A 64 | !  Vk G2!l    d|
00000180: A0 D0 CF E9 79 49 9A 6B - E2 53 51 CC 30 71 D0 86 |    yI k SQ 0q  |
00000190: 61 61 6F 88 25 40 48 EB - BA EE EB 9A 4D D4 9A 6B |aao %@H     M  k|
000001a0: CB 66 D4 67 C5 B3 4F 7C - 73 B6 D0 ED 34 C6 07 37 | f g  O|s   4  7|
000001b0: FD 58 3C 0E A5 14 D9 73 - 1A 80 01 BC 57 3C 55 07 | X<    s    W<U |
000001c0: 20 87 85 03 1C 4E A6 4B - 15 80 37 31 3D FE A4 CD |     N K  71=   |
000001d0: 12 00 0E 83 41 E9 55 37 - 7D 01 2D 55 A2 F1 B6 39 |    A U7} -U   9|
000001e0: 78 25 FA BE 18 94 CE B5 - DA 89 7E D4 AE 5B 3C 77 |x%        ~  [<w|
000001f0: 33 11 29 3D C6 11 0E 00 - 11 08 6E AA 2C F5 64 82 |3 )=      n , d |
00000200: 98 B4 7D DF 72 35 F2 6C - 41 31 52 30 51 D0 3C A5 |  } r5 lA1R0Q < |
00000210: E0 A7 1A 42 E0 C6 8E FB - 05 4C 3F 4F 71 A0 73 3C |   B     L?Oq s<|
00000220: 79 39 E4 98 92 83 EC 6F - 2F 13 EF 91 50 2D FF 89 |y9     o/   P-  |
00000230: 03 C5 D2 89 32 79 75 A2 - 78 A7 86 19 86 F9 3E F5 |    2yu x     > |
00000240: 30 0A 55 EB F3 54 CF E0 - 3D DD 9F FB B6 DC 9B BF |0 U  T  =       |
00000250: 7F 27 03 52 0D CD BD 73 - AE 5D 8A 84 4E A8 2E 28 | ' R   s ]  N .(|
00000260: 9A 5E B7 FF FD 6A 28 99 - 03 CA 13 AB AE FB C2 DF | ^   j(         |
00000270: 1A 75 54 21 77 B6 28 A8 - F4 3E 4F 5A 7A 34 3E 6B | uT!w (  >OZz4>k|
00000280: 58 2F E4 5A 6B EE 5A 85 - 6F AD 65 2F 50 63 57 F7 |X/ Zk Z o e/PcW |
00000290: 2F 7C 48 DD 06 30 8F D8 - D7 51 91 34 CE 1A 00 8A |/|H  0   Q 4    |
000002a0: B1 37 6E 9E 67 BD C3 0B - CE A9 AA BD D4 3A A2 4B | 7n g        : K|
000002b0: B4 11 69 0B 22 DF 6E C4 - C4 89 D5 5D 7D 8C 41 DE |  i " n    ]} A |
000002c0: 1E BD 98 68 C9 EB 14 55 - 1E FA 2F 40 88 D9 68 55 |   h   U  /@  hU|
000002d0: 4D 93 B9 3D 43 54 9F 79 - CC 23 93 40 6F 4D E5 25 |M  =CT y # @oM %|
000002e0: 44 76 37 9C 91 21 C6 9C - 63 1C D5 CD C1 F8 52 6B |Dv7  !  c     Rk|
000002f0: 9E A1 1B E1 1A 56 E4 23 - 36 A2 7A D0 DE F3 89 DD |     V #6 z     |
00000300: 51 EC D1 BC C8 BD A5 12 - 20 47 F9 47 E3 6D 0F 20 |Q        G G m  |
00000310: E2 27 4B 89 85 FD 8E BA - 11 40 C5 21 FF 52 45 A5 | 'K      @ ! RE |
00000320: 6F 9E 6C 13 D9 75 8C 3E - E9 01 D0 2F 80 89 A2 08 |o l  u >   /    |
00000330: 0A 30 4A 2D C0 F8 B5 E3 - 2F DC 93 42 FE 8D D4 81 | 0J-    /  B    |
00000340: CB 0B E1 02 23 33 16 F2 - BD 59 A4 94 01 20 3F 39 |    #3   Y    ?9|
00000350: 64 97 B2 2B D1 11 0E 47 - F6 AE 85 E6 C4 C7 5F 80 |d  +   G      _ |
00000360: 8F 42 36 76 21 60 F5 64 - 7E 72 24 67 2F BF 44 45 | B6v!` d~r$g/ DE|
00000370: EE 78 B7 91 74 A7 95 4D - 06 2E E0 7F 45 A0 78 10 | x  t  M .  E x |
00000380: D6 83 9A CA 8E 75 17 9C - 00 05 FD 1F 70 95 57 70 |     u      p Wp|
00000390: B4 79 BA 97 53 1B AA BF - 39 DC 56 98 10 AF 73 DA | y  S   9 V   s |
000003a0: 06 72 B7 50 9D 0B E2 5F - 10 6E 54 DF 5F 8C 4C 48 | r P   _ nT _ LH|
000003b0: 3C E9 FE 03 71 28 35 5B - 5B 36 D8 64 00 00 00 00 |<   q(5[[6 d    |
000003c0: 49 45 4E 44 AE 42 60 82 -                         |IEND B` |
000003c8;

이 이미지를 생성 :

별이 빛나는 밤-압축


입력 파일을 어떻게 생성했는지 궁금 할 것입니다. 대답은 다소 간단합니다. Lanczos 필터를 사용하여 48x40으로 크기를 조정하고 20 색 인덱스 팔레트를 사용하여 결과 PNG를 최적화하십시오.

convert ORIGINAL.png -filter Lanczos2 -resize x40 - | pngquant --speed 1 -f 20 > i
optipng -o7 -strip all i && advdef -z -4 -i 1024 i

사용 convert, pngquant, optipngadvdef.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Doorknob

1
참고로, 내 대답=(tail +2 $0)트릭을 사용하여 ImageMagick 스크립트와 PNG 입력 파일을 모두 포함하는 단일 ZSH 스크립트를 만들 수 있습니다.
nneonneo

40

파이썬 2, 4749.88

1018 바이트

저를 제외하고는 모두 지금이 문제를 잊었을 것입니다 ....

이 문제는 특히 이미지 압축 알고리즘을 사용하는 접근법이 확실히 주도적이지만 미학적 관점에서 불만족 스럽다는 점이 명백해지면서 너무나 많은 관심을 끌었습니다. 일련의 드로잉 프리미티브 최적화를 기반으로 한 접근 방식은 코드 미학적 관점에서 다소 만족 스러웠지만 5000 점 이상으로 차단 된 것으로 보입니다.

기성품 이미지 압축을 사용하지 않은 nneonneo의 방법은 5000 마크를 능가하지만 작은 이미지를 인코딩하고 업 스케일링하여 그렇게합니다.

다음은 드로잉 프리미티브 만 사용하고 최적화 방법으로 자동 생성되며 4749.88의 점수를 얻도록 관리하는 프로그램입니다.

import cv2 as v,numpy as n,struct
z=n.ones((320,386,3),'u1')
z[:]=145,106,81
z[226:]=80,67,56
s='v\n#{~X©s"¾|ën²ºÉ¬ª·.v"4Á=ð.yv>ä;¦>t?ÞC°GòS¾ó[pQ¹,g]xgQÒWµló´:eX K² }w¯hVZ[ÂbD¹t¦\n§1±"}¼e®`h¸B½qò¥èJÕN©²f­J¦ü   ³|©t|   \rÕ5SO©¾zP±¤Od\rÆ¥L©|¸B{I¯Öb~¯½ÒdzQ½}}D«s\x8ewxK    ^pMz2L5`mce|ÙvlRcnJqw3|ÿGZ:s4\r]r.  ÝX,(\n*÷¹òW@Àà´IºäQ,pfuQhØvTzDÂ\\NnbSbº |!1o0»5,fSñ8¿-VÇ4}¡$y   ­S(Y³ek.MÌ  wdvB\n r³UƨJÒ^<©èf#}<©lux6º}\0SÑP{\0TBÏx°A~w00ÃU)\x8e\n½Iá\0TòKUVmWOTæ¢ynLrXYKº\npkJWÀw«g"Sh4kIg"|[pÞ££ì$OH\\³>°nu9|6Õ¼¡.A2qrÀ\\ZýzE{mwG]+YHÃèrälT·¥DNN\0T'
m,h=512,62
for a,b,c,d,r in[struct.unpack('HHBBB',s[7*i:7*i+7])for i in range(92)]:
 x,y=a/m-h,b/m-h
 for k in range(h):v.circle(z,(a%m-h+x*k/h,b%m-h+y*k/h),r,n.clip((.9*c+.9*d-120,c-.3*d+41,.9*c-.6*d+80),0,255),-1)
v.imwrite('a.png',v.blur(z,(9,9)))

이것은 다음과 같습니다

드로잉 결과

코드의 16 진수 덤프 :

0000000: efbb bf69 6d70 6f72 7420 6376 3220 6173  ...import cv2 as
0000010: 2076 2c6e 756d 7079 2061 7320 6e2c 7374   v,numpy as n,st
0000020: 7275 6374 0a7a 3d6e 2e6f 6e65 7328 2833  ruct.z=n.ones((3
0000030: 3230 2c33 3836 2c33 292c 2775 3127 290a  20,386,3),'u1').
0000040: 7a5b 3a5d 3d31 3435 2c31 3036 2c38 310a  z[:]=145,106,81.
0000050: 7a5b 3232 363a 5d3d 3830 2c36 372c 3536  z[226:]=80,67,56
0000060: 0a73 3d27 8076 5c6e 0523 8414 9d7b 7e58  .s='.v\n.#...{~X
0000070: a973 22be 7ceb 6eb2 8416 ba05 c9ac aa8b  .s".|.n.........
0000080: 13b7 2e76 0522 8434 c13d f08a 2e95 0e79  ...v.".4.=.....y
0000090: 763e e43b a60b 3e74 3fde 43b0 0b9e 9247  v>.;..>t?.C....G
00000a0: f253 be0e 0cf3 5b70 51b9 1a2c 675d 7889  .S....[pQ..,g]x.
00000b0: 850f 6719 51d2 57b5 116c 05f3 909a 940c  ..g.Q.W..l......
00000c0: b405 3a65 58a0 114b b220 7d77 af0b 6856  ..:eX..K. }w..hV
00000d0: 835a 5bc2 1562 44b9 749b a65c 6e90 0701  .Z[..bD.t..\n...
00000e0: a731 9807 9107 b122 7dbc 1265 05ae 6068  .1....."}..e..`h
00000f0: b80c 42bd 71f2 9ca5 01e8 4ad5 4e8d a90e  ..B.q.....J.N...
0000100: 1291 b266 93ad 0c4a a6fc 9e9a 8d09 b37c  ...f...J.......|
0000110: a974 937c 095c 72d5 3553 4fa9 1d9d 94be  .t.|.\r.5SO.....
0000120: 7a50 b10e a44f 8064 851e 5c72 8fc6 a54c  zP...O.d..\r...L
0000130: 8ba9 0f81 7cb8 421c 7b07 49af d662 7eaf  ....|.B.{.I..b~.
0000140: 1abd d264 7a51 bd0b 7d87 7d44 ab73 0b8c  ...dzQ..}.}D.s..
0000150: 5c78 3865 7778 874b 095e 704d 7a91 3207  \x8ewx.K.^pMz.2.
0000160: 4c35 606d 0b63 0865 7cd9 769e 6c0b 5263  L5`m.c.e|.v.l.Rc
0000170: 8b6e 9a82 0b4a 7113 7733 9c0b 9f7c ff86  .n...Jq.w3...|..
0000180: 479b 0b5a 143a 7334 9d5c 7282 965d 722e  G..Z.:s4.\r..]r.
0000190: 9509 dd58 2c9d 288c 5c6e 2a1f f796 938c  ...X,.(.\n*.....
00001a0: 07b9 f20f 5792 8907 40c0 e0b4 49ba 02e4  ....W...@...I...
00001b0: 9c51 9d2c 8a0e 7066 7551 1168 03d8 7654  .Q.,..pfuQ.h..vT
00001c0: 7a88 4406 c25c 5c4e 6e95 0101 6253 1c8f  z.D..\\Nn...bS..
00001d0: 62ba 097c 2131 6f30 8803 bb35 2c8b 6685  b..|!1o0...5,.f.
00001e0: 0753 f138 bf2d 9306 56c7 347d 909c 0295  .S.8.-..V.4}....
00001f0: a124 8b79 a009 ad53 2885 1c59 01b3 656b  .$.y...S(..Y..ek
0000200: 892e 860b 4dcc 9988 8da0 099e 7764 769f  ....M.......wdv.
0000210: 425c 6ea0 8572 86b3 550b c6a8 904a 908a  B\n..r..U....J..
0000220: 05d2 5e92 9a3c a905 e866 237d 3ca9 0b6c  ..^..<...f#}<..l
0000230: 7578 3681 ba07 7d80 9304 5c30 5302 97d1  ux6...}...\0S...
0000240: 507b 5c30 5401 4280 cf78 b083 0696 417e  P{\0T.B..x....A~
0000250: 7730 920b 30c3 5589 295c 7838 655c 6ebd  w0..0.U.)\x8e\n.
0000260: 49e1 865c 3054 01f2 984b 5501 5602 086d  I..\0T...KU.V..m
0000270: 574f 0154 03e6 a279 828c 9d07 926e 4c72  WO.T...y.....nLr
0000280: 8a58 038c 8459 884b ba5c 6e70 846b 4a57  .X...Y.K.\np.kJW
0000290: c008 9077 9180 ab67 0b22 5368 9734 8911  ...w...g."Sh.4..
00002a0: 1a6b 4967 2284 067c 815b 8570 9306 de9c  .kIg"..|.[.p....
00002b0: a38a 8ba3 08ec 244f 485c 5cb3 083e b06e  ......$OH\\..>.n
00002c0: 7539 7c0c 36d5 bc86 94a1 042e 4132 859c  u9|.6.......A2..
00002d0: 9a01 7172 c05c 5c04 5a01 fd7a 457b 6d91  ..qr.\\.Z..zE{m.
00002e0: 0611 7747 8d5d 9708 2b59 9548 c38c 01e8  ..wG.]..+Y.H....
00002f0: 72e4 6c54 b706 a544 4e4e 5c30 5401 270a  r.lT...DNN\0T.'.
0000300: 6d2c 683d 3531 322c 3632 0a66 6f72 2061  m,h=512,62.for a
0000310: 2c62 2c63 2c64 2c72 2069 6e5b 7374 7275  ,b,c,d,r in[stru
0000320: 6374 2e75 6e70 6163 6b28 2748 4842 4242  ct.unpack('HHBBB
0000330: 272c 735b 372a 693a 372a 692b 375d 2966  ',s[7*i:7*i+7])f
0000340: 6f72 2069 2069 6e20 7261 6e67 6528 3932  or i in range(92
0000350: 295d 3a0a 2078 2c79 3d61 2f6d 2d68 2c62  )]:. x,y=a/m-h,b
0000360: 2f6d 2d68 0a20 666f 7220 6b20 696e 2072  /m-h. for k in r
0000370: 616e 6765 2868 293a 762e 6369 7263 6c65  ange(h):v.circle
0000380: 287a 2c28 6125 6d2d 682b 782a 6b2f 682c  (z,(a%m-h+x*k/h,
0000390: 6225 6d2d 682b 792a 6b2f 6829 2c72 2c6e  b%m-h+y*k/h),r,n
00003a0: 2e63 6c69 7028 282e 392a 632b 2e39 2a64  .clip((.9*c+.9*d
00003b0: 2d31 3230 2c63 2d2e 332a 642b 3431 2c2e  -120,c-.3*d+41,.
00003c0: 392a 632d 2e36 2a64 2b38 3029 2c30 2c32  9*c-.6*d+80),0,2
00003d0: 3535 292c 2d31 290a 762e 696d 7772 6974  55),-1).v.imwrit
00003e0: 6528 2761 2e70 6e67 272c 762e 626c 7572  e('a.png',v.blur
00003f0: 287a 2c28 392c 3929 2929                 (z,(9,9)))

여기에서 이전에 사용 된 여러 가지 트릭을 사용합니다.

  • 블러를 사용하여 최종 점수를 조금 올리십시오.
  • 원시 바이트를 파이썬 코드로 크 래밍 (이 스레드의 앞부분에서 제안한 것처럼 간단하지는 않지만 백 슬래시와 널보다 더 많은 문자를 이스케이프해야합니다. 자세한 내용은 여기 코드를 참조하십시오).
  • 색 공간을 2 차원으로 압축 흥미롭게도이 별이 빛나는 밤 이미지는 RGB 공간에서 거의 평면입니다.

첫 번째 기본 요소로 수평선을 배치하여 이미지를 두 개의 다른 색상 블록으로 나눕니다. 그 후 기본 프리미티브로 두 점 사이에서 드래그 한 원을 사용했습니다. 이것은 모호한 것처럼 보였지만 7 바이트로 표현할 수있었습니다. 검색 프로세스에는 가이드 패턴 검색을 사용했습니다. 기본 요소를 교대로 추가하고 매개 변수를 최적화하여 진행됩니다. 흐릿한 부호있는 오류가 가장 높은 지점에 기본 요소가 추가됩니다. 매개 변수는 작은 도메인에 대해 철저한 라인 최적화를 통해 최적화됩니다. 40 개에서 50 개의 프리미티브가 추가되고 개별적으로 최적화됩니다. 그런 다음, 스코어를 가장 적게 돕는 프리미티브를 버림으로써 프리미티브 목록이 크기로 정리됩니다.

이것은 여전히 nneonneo의 점수를 이길 수 없습니다. 이 점수를 극복하기 위해 두 번째 단계 최적화가 필요했습니다.이 단계는 여러 필터링 레벨 각각에서 프리미티브를 추가하고 프리미티브를 버려서 생성 된 프로그램을 크기로 줄입니다. 나에게 정말로 흥미로운 것은 이것을 다른 이미지에 적용한다는 아이디어였다. 나는 그것을 다른 몇 가지 이미지에 적용하고 여기 내 블로그 에 그려지는 기본 요소에 대한 자세한 내용과 애니메이션을 제공 합니다 .

이것을 생성하는 데 사용 된 두 개의 프로그램은 실제로 Stack Exchange 게시물에서 허용되는 공간에는 맞지 않지만 github에 있습니다 : https://github.com/str4w/starrynight/tree/StackExchange

starrynight가 먼저 실행 된 후 stage2optimization이 수행됩니다. 결과 프로그램도 같은 디렉토리에 있습니다.


4
훌륭한 답변입니다. 매우 기쁘게 생각합니다. 내가 게시 한 보너스 규칙에 따르면, 압축되지 않은 다른 응답이 그 전에 점수를 이길 수 없다고 가정하면 약 1 주일에 200 점 현상금이 나옵니다.
Nathaniel

3
CG.SE에 오신 것을 환영합니다! 좋은 첫 포스트!
Arcturus

이것은 우수하다. 흐림 효과가 너무 잘 놀랍니다. 출력에 몇 가지 블러 매개 변수를 시도했지만 펄 솔루션이 5k 미만이 될 수는 있지만 불행히도 쉽게 적용 할 수는 없습니다.
neocpp

1
블러는 최적화 중에 켜져 있으며 (반경은 최적화 가능한 매개 변수 임), 선택된 각 기본 요소는 블러와 함께 발견됩니다. 이로 인해 흐림이 더 중요하게 보일 수 있습니다. 블러가 강제로 해제 된 상태에서 다시 최적화 된 경우 해당 값 중 일부가 복구 될 수 있습니다. 그러나 점수는 블러가없는 것보다 전반적으로 전반적으로 더 낫습니다.
Strawdog

37

MATLAB, 5388.3 점

압축 기능이 내장되어 있지 않습니다. 각 픽셀이 하나의 인쇄 가능한 문자로 표현 될 수 있도록 색 농도가 줄어 듭니다. 해상도가 줄어 듭니다. 그런 다음 문자열로 하드 코딩됩니다. 코드 자체는 전체 프로세스를 반대로합니다. 크기 조정 작업은 Lanczos 3 보간 커널을 사용하고 있습니다.

imwrite(imresize(reshape('@<8BJJME<NI=388?WI9:IMKNDFRA48;?::65BG<E<478441;>4IC>;5011012313:6IFLF:=>8532313@<4AOI6M\M>22322M><JCECVhZM72312C@AL>HMJNQH44504B8FGBIDF=LE6:738>4@IDFAEAMH9:<69<B>HHNEB>OA;<<99AV?@DFFCCN98<58<?@;G@?IFMQ67;44>=8;XJ?IIKQ89875@>?ABC@ECNM9>:88;AL[TBBCN^F5><7=6F`hgXAI_T==C@;:9Iehh\?RdB5FFD9;7DX]^OD]]66CCA:9:EB?HQSUNFURE7<:A[O@AOUUWNP[J7;=A>?;<JL?G>6;<542=C7JHC?9122113435?<KMTOAFG>642325FB;JWP?U`SB33333SCCRKMN\h_U;4422HDHRFPTSUWQ:7633G>KNKQMOGTM:?858C8EPLOINKUP@@>:<AGDPOVMKHVGAB?;9E[FGKMOMMV?>C89<DFBMIGPPUX:<B84>B<A]SHPQSY<@>:6ADFIKMJOLUV>E?;>=HTb[LMOVdM:EB:@8Odde_NTc\ACIF@=;QfebaLYhG7OLI<>:I^aaXN`a78JGF>;<PRUVX\\YUVYQ?@<:OX[TY``VZZ]X?A:<LQOOUQA?>:=?5219LG@KK?:01///2323JSLV`ZNPQC741223PTVZ\RO]\YE12211SUUXRU]^Z_XA3210QOUUS[^^]VUI<930RSTVY[WZVXSFF;57SQSZZ]WXZVVMF>;<SUT\[`YWWWQPHC<:NOTWZZYZVWNLK>9:SSQSXUX]]XFJK<6>ROTX\YZ][[INB>:CSY^^^Y\[YXMNBACAUZ[ZZ]^\^PKPH?D?YSAFXaa^^HVSKEAAWMK<V^\bJ@`SJC@9TYWQ\Y[^:@[KFE@;'-40,R,C,3)/86,[320,386],'lanczos3'),'t.png')

여기에 이미지 설명을 입력하십시오


30

zsh + bpgdec, 4159.061760861207

예, 다른 BPG 솔루션입니다. 나는 이것이 기본적으로 BPG가 현재 사용 가능한 최고의 이미지 압축 유틸리티임을 증명하는 역할을한다고 생각합니다. yallie의 독창적 인 BPG 솔루션 보다 개선 된 것으로 생각하십시오 .

파일의 길이는 1024 바이트입니다. 그것은 라인으로 구성

exec bpgdec =(tail -n+2 $0)

뒤에 원시 BPG 출력

bpgenc -c ycbcr -f 444 -q 48 -m 12 -e jctvc ORIGINAL.png -o 1.bpg

16 진에서는 다음과 같습니다.

0000000: 6578 6563 2062 7067 6465 6320 3d28 7461  exec bpgdec =(ta
0000010: 696c 202d 6e2b 3220 2430 290a 4250 47fb  il -n+2 $0).BPG.
0000020: 7000 8302 8240 0003 9242 5003 9242 5044  p....@...BP..BPD
0000030: 09c1 9095 8112 0000 0001 4401 c190 9581  ..........D.....
0000040: 1603 7000 0001 2609 ae0b 30e7 6016 6a97  ..p...&...0.`.j.
0000050: 9ad3 4192 8fd0 7000 0003 0000 0300 0003  ..A...p.........
0000060: 0000 0300 0003 0000 04cc 0000 0126 01af  .............&..
0000070: 0598 fd99 91f9 e8bf 2220 79ef 4ad2 83ea  ........" y.J...
0000080: 517b d6ec e17c d59d 4b3d ea16 82a3 bfa3  Q{...|..K=......
0000090: b8f6 5c75 1c55 c959 d1e2 cf13 e10c 183f  ..\u.U.Y.......?
00000a0: 2495 60c0 5b65 971f 8e7c 453d b2e4 fa80  $.`.[e...|E=....
00000b0: 89dc f5e4 0010 8347 4d3a bb07 5baa 95f3  .......GM:..[...
00000c0: ac52 eca1 4e2a 3452 1493 b896 e9fb 4d5f  .R..N*4R......M_
00000d0: 4605 0bbf 14f6 ec00 4291 05d6 263b f524  F.......B...&;.$
00000e0: a321 613c ad89 06d7 4983 29d9 f1d2 7acc  .!a<....I.)...z.
00000f0: 5550 65d3 f33b d195 eedd a509 9750 f9ae  UPe..;.......P..
0000100: bcbc f3b5 3380 c8db 0c1b e932 1a52 2d10  ....3......2.R-.
0000110: f77a f967 5e62 a766 7ee4 a076 a85b dacf  .z.g^b.f~..v.[..
0000120: 4177 3136 0a73 62b5 76d2 efc4 5de0 f9a6  Aw16.sb.v...]...
0000130: ea4a d15a 7e7b 0e31 7f06 851d a2cf 0680  .J.Z~{.1........
0000140: 114f 57bb 7477 4217 34b6 afae 71c0 020e  .OW.twB.4...q...
0000150: b4ea 0725 348e 7dd6 00f7 adbb f7d5 c2fc  ...%4.}.........
0000160: 3e36 8138 2420 1751 cf5a cb8a 6fb1 0e26  >6.8$ .Q.Z..o..&
0000170: d5f8 5df6 cdc3 07b5 76dd 2593 170f e9b7  ..].....v.%.....
0000180: 07db ad63 3746 9639 f707 8581 2a16 b9a1  ...c7F.9....*...
0000190: 3563 c292 a112 d7c1 2d25 9461 99c4 990e  5c......-%.a....
00001a0: f917 2346 dc6f 51a5 fdc0 3a44 2f4f b0c9  ..#F.oQ...:D/O..
00001b0: 15e9 7d88 d386 47aa b705 e97c f2ee c419  ..}...G....|....
00001c0: e078 9aa3 b574 645a 631a 678a b7c7 6e69  .x...tdZc.g...ni
00001d0: 4bd4 e8df b657 d56e 9351 8750 63c2 141c  K....W.n.Q.Pc...
00001e0: e3bb 8305 33ad 3362 08e8 d4b0 c5a8 af67  ....3.3b.......g
00001f0: 9695 63a0 ae96 a6fd 00a1 0105 eca5 db9e  ..c.............
0000200: 27ce d2fb c8ea 7457 2f38 5fd0 080a 2ac7  '.....tW/8_...*.
0000210: 4919 6b6a 424d ef1e 02c4 3607 de31 7c0f  I.kjBM....6..1|.
0000220: 7cb0 c90a 609b bbc1 7ae5 8d17 7fd3 406e  |...`...z.....@n
0000230: 8df7 81f8 fb51 7366 beb2 fb62 51e3 58ce  .....Qsf...bQ.X.
0000240: 55d5 8a28 a63b 7b31 0ede bdc2 9d13 04a2  U..(.;{1........
0000250: c039 de93 638d 6c68 c3d3 e762 36ed 4ae2  .9..c.lh...b6.J.
0000260: a3be 781b 150a 7b82 9f0b 0a14 17b7 ade1  ..x...{.........
0000270: 687a c84f 5a2f 88d1 a141 76fe bf7b c220  hz.OZ/...Av..{. 
0000280: 6189 8424 d7e3 3595 882f 1ec9 a363 3501  a..$..5../...c5.
0000290: 3056 f6f9 dced 2b37 733b 8659 f5e9 93f9  0V....+7s;.Y....
00002a0: fa5b 419a cb78 e0ef d7b4 1e83 7fce 4383  .[A..x........C.
00002b0: 7eee 10af 2baa 1445 eb06 d75c 4220 53f9  ~...+..E...\B S.
00002c0: 34fd 76c0 2117 f916 f3b7 f599 0977 2562  4.v.!........w%b
00002d0: 085d a2d4 74c1 2e6c 0a21 5ccf 6a9f c045  .]..t..l.!\.j..E
00002e0: 91e0 de66 29af de27 af2b f673 8cb5 b2ea  ...f)..'.+.s....
00002f0: b070 31fd b81f 8db1 8e25 3243 31a0 ca08  .p1......%2C1...
0000300: e801 e4b6 df72 4029 16b2 a712 7ee4 c2e6  .....r@)....~...
0000310: acaa f84c d17d 3d46 65d5 8226 bd65 da45  ...L.}=Fe..&.e.E
0000320: 3cac 95d8 ed0e 1153 7587 09ec d745 4f50  <......Su....EOP
0000330: ba4c 314b 4ac3 b6b7 4964 1ee8 e321 c029  .L1KJ...Id...!.)
0000340: 7ae2 4630 fe05 ddd1 f68e 5646 857d e8fb  z.F0......VF.}..
0000350: 601e 453f e53e fe0d 0c5e 5da6 4a03 f6d9  `.E?.>...^].J...
0000360: c59b 0b7f b2de f354 21bb c0c5 8bb9 dfa1  .......T!.......
0000370: f3e5 76a7 bbce 175e cc27 125f dd9b adc2  ..v....^.'._....
0000380: cd79 d2c0 43f1 6df4 203a d3c4 9b25 7fea  .y..C.m. :...%..
0000390: 1905 7620 01bf a477 8c0e 9145 1d30 86d5  ..v ...w...E.0..
00003a0: 598d 7f40 ad72 603e c90f 5a62 db09 1161  Y..@.r`>..Zb...a
00003b0: a36d bbfc 020a 9835 7fc7 a468 4c36 5120  .m.....5...hL6Q 
00003c0: 01fc 705e 64d4 4e62 3c52 48a5 42fb 6361  ..p^d.Nb<RH.B.ca
00003d0: 2496 21ff 321b 2b7b 3016 7a56 1ea6 18f9  $.!.2.+{0.zV....
00003e0: e52f 318a 80cb 237c f3c8 a46c b747 794e  ./1...#|...l.GyN
00003f0: e8c1 77c2 7eb3 ef5b 60fb ad03 a4e6 ee40  ..w.~..[`......@

결과 파일은 out.png( bpgdec기본 위치)이며 다음과 같습니다.

bpgdec에서 별이 빛나는 밤의 근사치

나는 bpg단지 996 바이트로 나무의 왼쪽, 왼쪽 및 오른쪽의 날카로운 윤곽을 정확하게 재구성 했다는 것이 놀랍 습니다. 그것은 교회 첨탑에 대한 통과 가능한 근사치를 가지고 있습니다! 작은 파일 크기에 대해서는 세부 수준이 매우 인상적입니다. 물론 bpgdec그 자체는 작은 프로그램은 아니지만 이미지 압축의 경우 BPG가 JPEG보다 훨씬 뛰어나다는 것이 분명합니다.

이것은를 사용하기 때문에이 bpgdec답변은 현상금에 적합하지 않습니다.


편집 : GNU와 호환되도록 -n인수가 추가되었습니다 .tailtail


그거 멋지다. 좋은 것!
bjornl

작동하지 않습니다 tail: cannot open ‘+2’ for reading. 오류가 발생했습니다 . 우분투에서는 -n +21025 바이트 = /
orlp

와! 나는 BPG가 그렇게 훌륭하다는 것을 몰랐다.

@ orlp : -n+2정확히 1024 바이트에 넣을 수 있어야한다고 생각합니다. 시도하고 작동하는지 알려주십시오. 호환성을 위해 답변을 변경하겠습니다.
nneonneo

1
@Lembik, BPG의 최고 기준은 HEVC (H.265)입니다. 정적 이미지에 실제로 이전 H.264 (최대 인코딩 설정 사용)를 사용하면 이미 사용 가능한 하드웨어 디코딩을 사용할 수있을뿐만 아니라 좋은 결과를 얻을 수 있습니다. 비디오에서는 압축률이 더 높아야하므로 JPEG 및 MP3와 같이 지연되거나 정체되지 않습니다.
Vi.

27

C, 6641

만을 사용하여 999 바이트 stdio.hmath.h.

d()반지름 값 r..0에 동심원 RGB 색상의 원을 그리는 채워진 원 기능 을 만들었습니다. 여기에는 21 개의 원이 사용됩니다. 더 많은 공백을 제거하면 몇 가지를 더 넣을 수는 있지만 상대적으로 읽기 쉬운 것이 좋습니다.

Difference 모드 에서 Gimp 레이어를 사용하여 거친 원 배치를 알아 냈습니다 . 밝은 반점을 찾아 원을 추가하고 반복하십시오. 중고 Histogram 선택 도구를 사용하는 초기 색상을 결정합니다.

위의 내용을 사용하여 약 7700 점을 얻었지만 색상과 반지름 값을 조정하여 더 잘 할 수 있다고 생각 했으므로 각 값을 -10 .. + 10으로 수정하여 무차별 최적화하는 스캐 폴딩 코드를 작성했습니다. 렌더링, 유효성 검사기 (속도로 C로 다시 작성)를 실행하고 최저 점수를 산출 한 값을 저장합니다. 결국 값 배열을 덤프하여 코드에 다시 붙여 넣고 다시 컴파일합니다. 몇 번의 패스를했는데 점수가 약 1000으로 떨어졌습니다. 그런 다음 스캐 폴딩 코드를 제거했습니다.

서클을 사용한 69930 이미지 여기에 이미지 설명을 입력하십시오

암호,

#include <stdio.h>
#include <math.h>
#define W 386
#define H 320
#define SZ (W*H)
unsigned char I[SZ*3];
void d(int R,int G,int B,int x,int y,int r)
{while (r) {
float p;
for (p=0;p<6.3;p+=(1/(6.3*r))) {
int xo=r*cos(p);
int idx=x+xo+floor(y+r*sin(p))*W;
if ((x+xo<W)&&idx>0&&idx<SZ){I[idx*3]=R;I[idx*3+1]=G;I[idx*3+2]=B;}
}r-=1;
}}
int v[] = {
91,116,143,183,150,356,
52,70,125,48,36,51,
60,77,124,165,-236,303,
159,168,159,129,171,24,
115,132,131,29,14,19,
129,133,90,80,56,14,
157,171,136,352,54,41,
184,161,46,353,57,22,
183,184,119,360,52,15,
90,113,146,183,108,59,
141,158,154,373,224,96,
41,46,62,379,219,56,
51,62,77,352,1400,1204,
62,76,96,354,269,73,
51,62,79,236,271,70,
33,37,35,95,274,65,
36,43,44,68,191,29,
42,50,51,66,142,23,
40,46,44,66,110,11,
40,46,44,68,91,5,
111,128,123,231,30,18,
};
int main(){
int i;for(i=0;i<(21*6);i+=6){d(v[i],v[i+1],v[i+2],v[i+3],v[i+4],v[i+5]);}
FILE *f=fopen("o.ppm","wb");fprintf(f,"P6\n386 320\n255\n");fwrite(I,sizeof(I),1,f);fclose(f);
return(0);}

7
실제 프로그래밍을하는 데 도움이됩니다!
oligofren

이 답변이 정말 마음에 들지만이 특정 원 그리기 기능을 사용한 이유가 있습니까? 명백한 버전 (확인 ((x-xo)*(x-xo) + (y-yo)*(y-yo)) <= (r*r))은 더 짧은 것처럼 보이고에 대한 종속성을 제거 math.h합니다. 이 크기의 이미지를 사용하면 어떤 것도 넘칠 가능성이 없다고 생각합니다.
neocpp

2
@neocpp 나는 원을 그리는 더 간단한 방법이있을 것이라고 생각했지만 아무것도 검색하지 않고 이것을 코딩하고 싶었고 trig 함수를 사용하는 것이 가장 좋았습니다. 당신이 제안하는 알고리즘은 훌륭하고 아마도 빠르지 만 나에게는 분명하지 않았습니다.
jamieguinan

1
내 자신과 같은 알고리즘을 사용할 수 없었기 때문에 흥미 롭습니다. 그것은 스캔 라인 서클 채우기 알고리즘을 다소 생각 나게합니다 (이름은 지금 탈출하지만 많은 포인트를 확인하지 않는 것이 유용합니다). 반경을 줄이려고 노력했기 때문에이 속성에 특별한 속성이 있는지 궁금합니다.
neocpp

1
제안한 기능에 따라 채워진 원 기능을 사용해 보았습니다 ( 참조 ). 170 배 더 빠르게 실행되며 추가 코드 공간으로 다른 원을 추가하고 점수를 6500 이하로 최적화 할 수있었습니다. 재미있는 것들. github.com/jamieguinan/starrynight
jamieguinan

26

Python 3, 5390.25, 998 바이트 점수

시뮬레이션 된 어닐링 프로그램을 사용하여 직사각형을 별이 빛나는 밤의 모양에 맞췄습니다. 그런 다음 가우시안 블러를 사용하여 직선 직사각형 가장자리를 부드럽게 만듭니다.

바이트를 절약하기 위해 사각형 데이터를 밑면 94로 압축했습니다.

from PIL import Image as I,ImageDraw as D,ImageFilter as F
def V(n,f,t):
    z=0;s='';d='''0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_-+={[}]|:;"',<.>/?`~ '''
    for i in n:z=z*f+d.index(i)
    while z:z,m=divmod(z,t);s=d[m]+s
    return s
i=I.new('RGB',(386,320))
K=V("""12XsPc/p^m(:,enp:SN8brwj%!iChDHKj"*445Z.;/8Xj408fV9a7:v$N#cj_WNW7p#t9:](i?S!}yg*D4u$RfpU=}=@Ft^v7$N5O?8eeN%.bT:Q>+AOd3E*R/1PXq.IO,ur3h<`dS)V;e/lj6q'p4s|m>fkk<!jx`EGU~38(0h!(I6P.<[G;m_c^x{kE^hYQUV9kIiS'T:GDRQz -ISW6@cLKz4!e&8LT]kH3'Hj=Zl]rEOyrXlmfG51.K1(5l{:GPb1PL5%.gMmLy;pU3h+zDxpSn@)nJ*#'EOt=Pt.t9z,;D.[r|Prpeu=0%WN+A~KSb(E:gd%o2QfB_K-!xLAN+jXicd**bk'WDq,ue&z]Rb>;DBCFif{zJEDfx3FKqB*?2Qti:(pYSa-uZU,M!^N =bRbZ`}j}P-u-n>lGH|pv>#r"}Eg&c6J&fi.IC@2:L""",94,10)[1:]
e=D.Draw(i)
for X in range(0,len(K),21):
    y=K[X:X+21];x=[]
    for z in range(0,21,3):x+=[int(y[z:z+3])]
    e.rectangle((x[0],x[1],x[2],x[3]),(x[4],x[5],x[6]))
i=i.filter(F.GaussianBlur(radius=5))
i.save('2.png')

여기에 이미지 설명을 입력하십시오


7
이미지 압축에서 객체와 바이트 배열 비교에 +1
프로토 타입

몇 개의 직사각형을 더 넣을 공간이있는 것 같습니다. 블러가 실제로 스코어링에 도움이됩니까? 나는 그렇게 생각하지 않았지만 그렇게하면 시원합니다!
curiousdannii

@curiousdannii 다른 압축, 일반적으로 압축 답변은 흐림 효과를 사용하여 한 영역에 강한 신호를 퍼뜨립니다. 이것이 항상 최선의 방법은 아니지만 고흐에게 감사합니다. 흐리게 처리하면 실제로 점수가 ~ 200 감소합니다.
Magenta

이것은

26

파이썬 2, 5238.59 포인트

아마 내 자신의 답변을 게시 할 시간입니다. 여기 이미지가 있습니다

여기에 이미지 설명을 입력하십시오

코드는 다음과 같습니다

import Image,ImageDraw as D
m=Image.new("RGB",(386,320),"#4b5b6e")
d=D.Draw(m,"RGBA")
s="[string containing unprintable characters]"
for i in range(95):
        x,y,w,h,r,g,b,a=[ord(c)-9for c in s[i::95]]
        x,y=3*x,3*y
        d.ellipse([x-w,y-h,x+w,y+h],fill=(2*r,2*g,2*b,2*a))
m.save("a.png")

또는 16 진수 덤프로 :

0000000: 696d 706f 7274 2049 6d61 6765 2c49 6d61  import Image,Ima
0000010: 6765 4472 6177 2061 7320 440a 6d3d 496d  geDraw as D.m=Im
0000020: 6167 652e 6e65 7728 2252 4742 222c 2833  age.new("RGB",(3
0000030: 3836 2c33 3230 292c 2223 3462 3562 3665  86,320),"#4b5b6e
0000040: 2229 0a64 3d44 2e44 7261 7728 6d2c 2252  ").d=D.Draw(m,"R
0000050: 4742 4122 290a 733d 2228 356e 5220 1c5e  GBA").s="(5nR .^
0000060: 2c7e 451a 7f42 0f4b 261d 5f56 265f 333a  ,~E..B.K&._V&_3:
0000070: 391e 1652 4812 7b79 1b7b 547b 7a58 4f47  9..RH.{y.{T{zXOG
0000080: 1e28 767f 4b1e 344d 244c 7e7e 677e 1a3d  .(v.K.4M$L~~g~.=
0000090: 6355 6968 103a 581e 367d 7e2b 552f 7524  cUih.:X.6}~+U/u$
00000a0: 0e0e 706d 6765 551f 7f2f 616b 6533 4a16  ..pmgeU../ake3J.
00000b0: 7272 7e13 421f 157f 674f 231e 6311 2b1b  rr~.B...gO#.c.+.
00000c0: 5d2e 7353 1425 5b5b 2f11 130f 1146 1166  ].sS.%[[/....F.f
00000d0: 3370 1c43 1339 260e 7f15 1c37 773d 4243  3p.C.9&....7w=BC
00000e0: 6921 1642 721f 5a1b 5a38 5727 1b1c 692d  i!.Br.Z.Z8W'..i-
00000f0: 6028 324f 7f19 4430 7254 6942 1726 5520  `(2O..D0rTiB.&U 
0000100: 1b1a 5441 6037 4651 5948 0e1c 4a4a 202f  ..TA`7FQYH..JJ /
0000110: 2c5a 2d68 4b76 5e35 2320 5b6e 1762 2e78  ,Z-hKv^5# [n.b.x
0000120: 727d 385b 7747 2c17 4f1e 5529 354d 763d  r}8[wG,.O.U)5Mv=
0000130: 504e 4f60 485b 1063 6028 4c58 7473 1d31  PNO`H[.c`(LXts.1
0000140: 543d 364e 494c 1721 6358 3a1f 577f 3f5b  T=6NIL.!cX:.W.?[
0000150: 6452 5a60 3a1a 444e 604f 207a 3d29 357f  dRZ`:.DN`O z=)5.
0000160: 6e75 3946 5b1b 233f 444b 3121 4f20 455b  nu9F[.#?DK1!O E[
0000170: 7f28 6c1d 6655 581d 6415 493d 1e7a 3574  .(l.fUX.d.I=.z5t
0000180: 5b1e 2f34 7e66 7f34 1817 4b2a 2446 624f  [./4~f.4..K*$FbO
0000190: 4162 431e 4d2e 657f 2826 2c3d 2e53 6224  AbC.M.e.(&,=.Sb$
00001a0: 1f1d 363d 2b16 3f1e 107d 3421 354f 1873  ..6=+.?..}4!5O.s
00001b0: 5421 7f15 6b62 3c18 523e 1971 5333 273c  T!..kb<.R>.qS3'<
00001c0: 311d 7347 681c 1713 294c 3d11 6b21 235d  1.sGh...)L=.k!#]
00001d0: 7e49 6212 3d1a 2923 450e 0f50 1936 5114  ~Ib.=.)#E..P.6Q.
00001e0: 3753 5217 1211 0e7a 7f33 7e15 190e 1a0f  7SR....z.3~.....
00001f0: 3a0e 5a6c 1721 1863 623b 5853 1715 7268  :.Zl.!.cb;XS..rh
0000200: 117b 4c24 793f 6929 3c7b 1020 1f2b 4253  .{L$y?i)<{. .+BS
0000210: 4e10 0e0e 1720 3020 0e0e 5613 270f 4c2e  N.... 0 ..V.'.L.
0000220: 630f 3229 420e 561a 0e64 547b 2825 0f44  c.2)B.V..dT{(%.D
0000230: 1f19 7e71 1f3f 3054 0e21 4a38 4556 2044  ..~q.?0T.!J8EV D
0000240: 5761 181e 110e 7e7f 2178 211a 0f11 0f41  Wa....~.!x!....A
0000250: 0e66 6d23 272a 5563 3b50 6e13 167b 6f2b  .fm#'*Uc;Pn..{o+
0000260: 6550 3477 5571 2e50 650e 292b 2055 5d62  eP4wUq.Pe.)+ U]b
0000270: 1425 0f33 1e40 1b11 0e5d 1134 105b 3566  .%.3.@...].4.[5f
0000280: 1242 0e4b 0e5f 2818 685f 753c 3d0e 571c  .B.K._(.h_u<=.W.
0000290: 1e73 7b13 5045 5730 4673 6252 5510 7952  .s{.PEW0FsbRU.yR
00002a0: 6e30 4d0e 3949 4c0f 5b44 1620 1753 7e2a  n0M.9IL.[D. .S~*
00002b0: 7a54 512a 4f0e 6031 5d70 0f16 525e 4c4e  zTQ*O.`1]p..R^LN
00002c0: 534a 1443 5e13 6311 361a 4f10 5a60 6e0f  SJ.C^.c.6.O.Z`n.
00002d0: 3e19 4b2c 5e1d 2d43 5b1d 5441 5f4e 5221  >.K,^.-C[.TA_NR!
00002e0: 520f 6719 5657 5851 3d51 5463 0e60 1912  R.g.VWXQ=QTc.`..
00002f0: 5162 727f 4d70 4c4f 7f1f 5233 4d4c 7d6d  Qbr.MpLO..R3ML}m
0000300: 574f 7f3c 4f4d 4e68 6f7d 3950 513a 695e  WO.<OMNho}9PQ:i^
0000310: 547f 7e2e 7f4c 517a 3a54 6f40 5f6f 3457  T.~..LQz:To@_o4W
0000320: 656d 307f 5e7e 564a 5a7a 3060 7b5b 5d45  em0.^~VJZz0`{[]E
0000330: 7374 4076 786d 7e6d 7f6d 2f62 5373 7e75  st@vxm~m.m/bSs~u
0000340: 607f 767e 7d35 7e4f 767e 7a7f 7b4c 7f7f  `.v~}5~Ov~z.{L..
0000350: 1d22 0a66 6f72 2069 2069 6e20 7261 6e67  .".for i in rang
0000360: 6528 3935 293a 0a09 782c 792c 772c 682c  e(95):..x,y,w,h,
0000370: 722c 672c 622c 613d 5b6f 7264 2863 292d  r,g,b,a=[ord(c)-
0000380: 3966 6f72 2063 2069 6e20 735b 693a 3a39  9for c in s[i::9
0000390: 355d 5d0a 0978 2c79 3d33 2a78 2c33 2a79  5]]..x,y=3*x,3*y
00003a0: 0a09 642e 656c 6c69 7073 6528 5b78 2d77  ..d.ellipse([x-w
00003b0: 2c79 2d68 2c78 2b77 2c79 2b68 5d2c 6669  ,y-h,x+w,y+h],fi
00003c0: 6c6c 3d28 322a 722c 322a 672c 322a 622c  ll=(2*r,2*g,2*b,
00003d0: 322a 6129 290a 6d2e 7361 7665 2822 612e  2*a)).m.save("a.
00003e0: 706e 6722 29                             png")

단순히 긴 문자열을 95 개의 반투명 타원을 그리기위한 매개 변수로 압축 해제합니다.

다른 많은 답변과 마찬가지로 코드는 유전자 알고리즘을 사용하여 생성됩니다. 그것은 내가 고안 한 특정 유형의 유전자 알고리즘을 사용하는데, 이것을 "유전자 풀 알고리즘"이라고 부릅니다. 그러나 다른 누군가가 그것을 발명하여 다른 이름을 부여했을 수도 있습니다. 개인의 개체수를 보유하는 대신, 각 유전자마다 하나씩 95 개의 "유전자 풀"이 있습니다. 각 유전자 풀에는 10000 가지 버전의 유전자가 포함되어 있습니다. 유전자는 하나의 타원에 대한 매개 변수 (위치, 모양, 색상, 알파 및 z 순서의 위치)를 포함합니다. 각 반복에서 우리는 각 95 풀에서 하나의 유전자를 선택하여 두 개의 그림을 만들고, 최저 점수 그림의 유전자는 약간의 돌연변이로 최악의 그림의 유전자를 대체합니다.

나는 며칠이 걸리는 378000 번째 반복까지 그것을 실행했습니다. 그 시점에서 점수는 여전히 내려 가고 있지만 실제로는 느리므로 알고리즘을 변경하지 않으면 이것보다 훨씬 나아질 것입니다.

유전자 알고리즘 코드는 다음과 같습니다.

import Image,ImageDraw as D
import random
import shutil

# note that the below constants have to match "magic numbers" in the rendering code
# that gets output.
gene_length = 8
n_genes = 95

pool_size = 10000

=import numpy as np

orig = Image.open("ORIGINAL.png")
orig = orig.convert("RGB")
orig_pix = orig.load()

def new_pool():
    g = np.random.random((pool_size, gene_length+1))
    for i in range(pool_size):
        x = (ord(encode_char(g[i,0]))-9)*3
        x = np.clip(x,0,387)
        y = (ord(encode_char(g[i,1]))-9)*3
        y = np.clip(y,0,319)
        R, G, B = orig_pix[x,y]
        g[i,4] = R/255.
        g[i,5] = G/255.
        g[i,6] = B/255.
    return g

def mutate_genome(g):
    def mutations():
        return np.random.standard_cauchy(g.shape[0])/50000.

    if np.random.random()<0.1:
        return g

    g[:,4] += mutations() # r
    g[:,5] += mutations() # g
    g[:,6] += mutations() # b
    g[:,7] += mutations() # a
    g[:,8] += mutations() # z order

    # this business is about having mutations that change the left, right, top and
    # bottom of the rectangle, rather than its centre position and size.
    L = g[:,0]*3-g[:,2] + mutations()
    R = g[:,0]*3+g[:,2] + mutations()
    T = g[:,1]*3-g[:,3] + mutations()
    B = g[:,1]*3+g[:,3] + mutations()
    g[:,0] = (L+R)/6 # x
    g[:,1] = (T+B)/6 # y
    g[:,2] = (R-L)/2 # w
    g[:,3] = (B-T)/2 # h

    if np.random.random()<0.15:
        i = np.random.randint(0,n_genes)
#       if np.random.random()<0.5:
        g[i,:] = np.random.random(gene_length+1)
        x = (ord(encode_char(g[i,0]))-9)*3
        x = np.clip(x,0,387)
        y = (ord(encode_char(g[i,1]))-9)*3
        y = np.clip(y,0,319)
        R, G, B = orig_pix[x,y]
        g[i,4] = R/255.
        g[i,5] = G/255.
        g[i,6] = B/255.
    # the Cauchy distribution is heavy-tailed, so this mostly causes very small changes
    # (less than one character), but it can cause very large ones
    g = np.clip(g,0,1)
    return g

def encode_char(a):
    n = int(round(a*113))+14
    if n==ord('"'): n=ord('"')-1
    if n==ord('\\'): n=ord('\\')-1
    return chr(n)

def encode_genome(g):
    # this reorders the genome such that gene i can be accessed with g[i::n_genes]
    # (for golfing purposes in the output code) and makes it a string
    output = [0]*(n_genes*gene_length)
    for i in range(n_genes):
        for j in range(gene_length):
            output[j*n_genes+i] = encode_char(g[i,j])
    output = ''.join(output)
    return output


def fitness(genome, save_filename=None): # actually inverse fitness (lower is better)
    order = np.argsort(genome[:,8])
    genome = genome[order,:]
    s = encode_genome(genome)
    # this is the same image drawing code that appears in the final program
    m=Image.new("RGB",(386,320),"#4b5b6e")
    d=D.Draw(m,"RGBA")
    for i in range(n_genes):
        x,y,w,h,r,g,b,a=[ord(c)-9for c in s[i::n_genes]]
        x,y=3*x,3*y
        d.ellipse([x-w,y-h,x+w,y+h],fill=(2*r,2*g,2*b,a))
    # this is the same code that appears in the scoring/validation script:
    img = m
    if img.size != orig.size:
        print "NOT VALID: image dimensions do not match the original"
        exit()
    w, h = img.size
    img_pix = img.load()
    score = 0.0
    for x in range(w):
        for y in range(h):
            orig_r, orig_g, orig_b = orig_pix[x,y]
            img_r, img_g, img_b = img_pix[x,y]
            score += pow((img_r-orig_r)/255.,2)
            score += pow((img_g-orig_g)/255.,2)
            score += pow((img_b-orig_b)/255.,2)
    if save_filename:
        img.save(save_filename)
    return score

# hex escape function from http://stackoverflow.com/a/13935582/1119340
import string
printable = string.ascii_letters + string.digits + string.punctuation + ' '
def hex_escape(s):
    return ''.join(c if c in printable else r'\x{0:02x}'.format(ord(c)) for c in s)

def make_full_program(genome):
    source = '''import Image,ImageDraw as D
m=Image.new("RGB",(386,320),"#4b5b6e")
d=D.Draw(m,"RGBA")
s="'''
    source += encode_genome(genome)
    source += '''"
for i in range(95):
    x,y,w,h,r,g,b,a=[ord(c)-9for c in s[i::95]]
    x,y=3*x,3*y
    d.ellipse([x-w,y-h,x+w,y+h],fill=(2*r,2*g,2*b,2*a))
m.save("a.png")'''
    return source



# the genetic algorithm code begins here

pool = [new_pool() for i in range(n_genes)]

best_fitness = 10000000
iteration = 0
fittest_genome = None
while (True):
    print iteration
    for iter in range(1000):

        samples = np.random.choice(pool_size, n_genes), np.random.choice(pool_size, n_genes)

        genomes = [0,0]
        for k in [0,1]:
            genome = np.zeros((n_genes, gene_length+1))
            for i in range(n_genes):
                if np.random.random()<0.00002:
                    # very occasionally, draw from the "wrong" pool, so that genes can
                    # be copied across pools
                    genome[i,:] = pool[np.random.randint(0,n_genes)][samples[k][i],:]
                else:
                    genome[i,:] = pool[i][samples[k][i],:]
            genomes[k] = mutate_genome(genome)

        fitnesses = fitness(genomes[0]), fitness(genomes[1])

        if fitnesses[0]<fitnesses[1]:
            winner = 0
            loser  = 1
        else:
            winner = 1
            loser  = 0

        new_fitness = fitnesses[winner]
        new_genome = genomes[winner]

        for i in range(n_genes):
            pool[i][samples[loser],:] = new_genome[i,:]

        if new_fitness<best_fitness:
            print iteration, new_fitness
            best_fitness = new_fitness
            # this is just so you can watch the algorithm at work
            fitness(genomes[winner], "best_so_far.png")
            best_genome = genomes[winner].copy()
            with open("best_so_far.py",'w') as file:
                file.write(make_full_program(genomes[winner]))

        if iteration%100==0:
            # this is just so you can watch the algorithm at work
            new_fitness = fitness(genomes[winner],"latest.png")
        if iteration%1000==0:
            shutil.copy("best_so_far.png", "frames/" + str(iteration) + ".png")

        iteration += 1

마지막으로, 여기에 애니메이션이 있으며 작동중인 알고리즘을 보여줍니다. 1000 회 반복 할 때마다 지금까지 생성 된 최상의 이미지를 보여줍니다. (gif 파일이 너무 커서이 게시물에 포함 할 수 없습니다.)

아마도 (1) ​​nneonneo의 인코딩 트릭을 사용하여 더 많은 데이터를 문자열에 넣을 수 있습니다. (2) 렌더링 코드의 끝에 가우시안 블러를 추가하면 (그러나 느려질 것임) (3) 알고리즘을 더욱 향상시킵니다. 지금은 아주 빠른 점수에 도달하지만 그 후에는 천천히 느리게 변합니다. 초기 수렴 속도를 늦추면 결국 더 나은 결과를 얻을 수 있습니다. 아마도 나는 이런 것들을 어느 시점에서 구현할 것입니다.


2
매우 흥미로운. 다른 상자 기반 답변 중 일부가 투명하게 페인팅하여 개선되는지 궁금합니다.
curiousdannii

허, 방금 내 코드에 끔찍한 버그가 있음을 알았습니다. 최고의 유전자 세트는 한 세대가 아닌 모든 세대마다 95 개의 사본을 만듭니다. (10000의 인구로 너무 빨리 수렴되는 것이 이상하다고 생각했지만 이전에는 버그를 볼 수 없었습니다.) 버그가 수정 된 상태에서 약간 개선 된 버전을 실행하고 있습니다. 더 나은 점수에 도달하는지 봅시다.
Nathaniel

25

별이 빛나는 , 11428.1894502 10904.3079277 10874.1307958

별이 가장 적합한 언어는 아니지만 가장 적합한 언어 일 것입니다.

온라인으로 시도해 볼 수는 있지만 출력이 잘려서 전체 이미지를 얻지 못하는 것 같습니다.

이 프로그램은 압축되지 않은 ppm 파일을 표준 출력으로 출력합니다.

          + +* +* +* +* .        +.          + +* + .        + + +.          +*. +*. + . + +* +* +* +* +*. + .      + + +* +* +* +* +* +* +* +*  + *. + .
 +         + +* +* +* +*        +  *      +* +* +* +*  * +   + `  +         + +        +*.. + . + + +** + +**. + .      + + + + +.*.*. + .  +      + * + ''
  + +   +  `  +       + + + +**. +* +*. + .          + +        +*.. + .         + +* +* +* +* +*. + .  +      + * +  ''
  + +   +   `  + + + +** + +**. + .      + + + +..*. + .      + + +. +* +*.. + .  +      + * +   ''
  + +   +    `  +       + + +* +*. + +**. + . + +  *         + +**. + .      + + +. + +**. +*. + .  +      + * +    ''
  + +   +     `  + + +  *        + +  * *. + .      + + +... + .         + +* +* +* +* +*      + *. + .  +      + * +     ''
  + +   +      `  +            + +.. + .          + +         +*.. + . + + +  **      + *. + .  +      + * +      ''
  + +   + +*       `  +         + + +..  + + .  + + + +.*.  + + .  + + +.*. + .  +      + * +       ''

프로그램 출력은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

설명

필요한 모든 123,520 픽셀의 프로그램을 출력하기 위해 이미지를 8 개의 수평 밴드로 나누고 7 개의 루프를 만들었습니다. 첫 번째는 각 인쇄마다 한 밴드 씩, 마지막 하나는 동일한 색상의 두 밴드를 인쇄합니다. 코드는 헤더로 구성되어 ppm 파일에 형식을 지정하는 방법과 위에서 언급 한 7 개의 루프를 알려줍니다.


25
축하합니다. 여기서 소스 코드 가 여기의 일부 이미지 근사치보다 불행하게도 원본 이미지와 비슷한 솔루션을 발견했습니다 (불행히도 자신의 이미지 포함).
반 시계 회전을 중지

18

파이썬 2, 4684.46

1021 바이트

이것은 몇 가지 다른 답변과 매우 유사한 디코딩 방법을 사용하지만 Python 2에서는 base85 대신 base64로 인코딩 된 데이터입니다.

인코딩 된 데이터는 64x48 WebP 형식 이미지입니다.

import base64,io,PIL.Image
PIL.Image.open(io.BytesIO(base64.b64decode('UklGRqQCAABXRUJQVlA4IJgCAACwDgCdASpAADAAPq1Em0mmI6KhNVYMAMAViWIAuzPZOwHN7eu7dJRv7H7zarBrCdDdER6XhybkFwT3wIGHlB1lUUaJZ57w+Ci3Z2w0PE+D9tZzFgHZn9+j+G1LIP++1WTWsLyD/6BI8VTX65vjcr4wuRD+hALdiK+qZ2uGKsAA/sJyKN4OBmJNGqjinqa8bVjXkcGP9zkVighf75VJT80vMeQrM+pbt3sCEa5W8IkgtQD+65nTwFfzVVylNlvc5LM5iC7pQ675eXJzzfdVZHahQf/RVXIT70DP9mLjG6XCpDGKVGd2k2w4Y//xNFvuDF6W1/Y1BhCeY60/1EPcFJcYPqH8AqaD7gLd0v8U6DjG6OGyFXME33IbTThiRYfs0fLUrOgw6EW52O0VW+TIo5ADqnoup7svrnSY/JykVO2VaVtr2nMc1FHGFxiNEux7NkoYeIwjpxA1hTbOwiEO02fXZGNAS0EfJ1f2jPtjyVbZvia+v3hVR4zWVkDp8+reHS4xMy4KHLPl1TNXtdxxJ+P5rW1mZcg9PqJrN1zafhRdVkFKSiU1+SigOtXZ0Ge5r8lte/uaGImm6FYQH/0g4rMPUh4As/5APXi/+rBu3ULEPu57ELp2ed8zLPPIMdqDHNSNZDPvzVQU2tkJ3RIW4fb7cw4fuqXHSGrRJ3jg70zSutBnPRZIERKti27+8g7QCLdAHlSbnz9Rrrf+N6k9AuUm/T1T0+Hc48A3D/hWbfADPWTK32pUz+9OaI7zF4yIx2rRPd3mRWYPgqKF1pD6pJu5FEj9jowD+9Hy8Jn2yd6WwqWgJY2m+crrZqY4GkqNdJX1DWYgRFJbMCsJxtrGkDEx3SIZyIyNRMIEKvpOrkDJkWAqZ+jXAAAA'))).resize((386,320),1).save('a.png')

여기에 이미지 설명을 입력하십시오

최고의 이미지 크기와 품질 설정을 찾는 데 사용한 코드는 다음과 같습니다. 검색 공간을 제한하여 실행하는 데 몇 분이 걸리지 않습니다.

import base64,io,PIL.Image

def score(orig, img):
    w, h = img.size
    img = img.convert("RGB")

    orig_pix = orig.load()
    img_pix = img.load()

    score = 0

    for x in range(w):
        for y in range(h):
            orig_r, orig_g, orig_b = orig_pix[x,y]
            img_r, img_g, img_b = img_pix[x,y]
            score += (img_r-orig_r)**2
            score += (img_g-orig_g)**2
            score += (img_b-orig_b)**2

    return (score/255.**2)


original = PIL.Image.open('ORIGINAL.png')
original = original.convert("RGB")

lowest_score = 1000000

file_format = '.webp'

for width in range(16, 96, 8):
  for height in range(16, 80, 8):
    small = original.resize((width, height), 2)
    for q in range(70, 50, -1):
        tempFileName = 'a' + file_format;
        small.save(tempFileName, quality=q)
        file = open(tempFileName, 'rb')
        data = file.read()
        data64 = base64.b64encode(data)
        bytes = len(data64) + 109   # Decoding code is 109 bytes
        if (bytes <= 1024):  # Size limit
            decoded = PIL.Image.open(io.BytesIO(data))
            cur_score = score(original, decoded.resize((386,320), 1))
            if (cur_score < lowest_score):
              lowest_score = cur_score
              best_q = q
              best_w = width
              best_h = height
              print 'Best %d x %d q %d (%d) : %.2f' % (best_w, best_h, best_q, bytes, lowest_score)

best_image = original.resize((best_w, best_h), 2)
finalFileName = 'best' + file_format;
best_image.save(finalFileName, quality=best_q)

file = open(finalFileName, 'rb')
data = file.read()
data64 = base64.b64encode(data)

script = open('generated.py', 'wb')
script.write('import base64,io,PIL.Image\n')
script.write('PIL.Image.open(io.BytesIO(base64.b64decode(\'' + data64 + '\'))).resize((386,320),1).save(\'a.png\')')

18

파이썬 2, 5098.24 5080.04 4869.15 4852.87 4755.88589004

내장 감압 기능이 없습니다! PIL의 크기 조정 유틸리티와 수동으로 디코딩 된 16 색 이미지 만 있으면됩니다. 따라서 현상금을받을 자격이 있어야합니다.

이 프로그램에는 비 ASCII 문자가 포함되어 있습니다. 길이는 1024 바이트이며 다음과 같습니다.

from PIL.Image import*
frombuffer('RGB',(40,41),''.join(')9„ ˜§˜ qˆš Vn• 8OŠ Ql‘ §§g ¶¤4 w‡v M]j 8FR AG8 )4V ! 7Jr ).0'.split()[int(c,16)]for c in'»«»ÝýÝßÝßûûÿ¿úª»ÿÿÿºÿûÿÝÝÝÝÝݺÿýÿú™¬ÏÌÿÿû»ýÝÝÝÝÝÝÿÿû»¿üüÌê­ÿÿ¿ÝÝÝÝÝÝÝÿªûÿýʬ©ú»ú¯«ÝÝÝÝÝýÿÿúÿýÝ߯™ú©®üªÝÝÝÝÝÝÿûÚ¬ýÿÿ«ÿÿÌϺÏÝÝÝÝÝßÿû¹¬¯ÿʯÿšüÌÿÌßßÝÝÝßÌúª¯Î¬ÏüΙš™üÌßÝÝÝÝÿί̮îªÿÊîåššÿÿýÝÝÝÝüÿ©®™žª©™ž™™™þLÏÝÝÝÝÿüž®ìî©©™™•U?ÝÝýßìÌÌäîÌäéîž•™©C3=ÝßýþYÌåîîîÌDDDS3TS2Ýßý’5UU9îîÏþÎDS352Ýßù!5RUžÌÏÎÏÌã352ÝÚ©2†("U9™%žÏþUD!#­ÝÚã("&"""9¬Ïÿ’äíÝþ‘SS5!""ÿÿDDíÝþ‘3U4UR#2#­ÜDSÝó!^SEäS35Q+ÝE6oÝõ1N5DER32C)%VoÝù233#UR#"5!HÝÎU2#"3S3U32515SÝ®îE224äE%TR53!2"?ÿNÎE"%E3U2""523""9ÿ^Äå"4U3%S9US335Q"25ÿ#ã%S352"UNUU335U%S#ÿ"8eS233"^DUT5353S#2¯#3.ã233#DDC5S2"#2"2©###ÎU5S5US34S3^Å222.DE3E4X52fa4ÎNÄDS5"ES5R>!U!gwaTDNÉ•56““5"î6#SgwqDD@¦xDE224îS5SwfaDD\0ùiîUYYîîDäDSwÄD@þžîDîîîîãUÌî2gfÄDàüà@@Î8ˆìä3!fvå"PÌàäNI”Dî6hDîTQfÃf ÎîÄ(6„îàX…NND’#Ãf,ÉlĈ9î”îDîDDDTC#UÉ"œÉœä“NI•NìÎîäNUTTî'.encode('hex'))).resize((386,320),3).save('o.png')

그리고 16 진수로 :

0000000: efbb bf66 726f 6d20 5049 4c2e 496d 6167  ...from PIL.Imag
0000010: 6520 696d 706f 7274 2a0a 6672 6f6d 6275  e import*.frombu
0000020: 6666 6572 2827 5247 4227 2c28 3430 2c34  ffer('RGB',(40,4
0000030: 3129 2c27 272e 6a6f 696e 2827 2939 8420  1),''.join(')9. 
0000040: 98a7 9820 7188 9a20 566e 9520 384f 8a20  ... q.. Vn. 8O. 
0000050: 516c 9120 a7a7 6720 b6a4 3420 7787 7620  Ql. ..g ..4 w.v 
0000060: 4d5d 6a20 3846 5220 4147 3820 2934 5620  M]j 8FR AG8 )4V 
0000070: 1d21 1e20 374a 7220 292e 3027 2e73 706c  .!. 7Jr ).0'.spl
0000080: 6974 2829 5b69 6e74 2863 2c31 3629 5d66  it()[int(c,16)]f
0000090: 6f72 2063 2069 6e27 bbab bbdd fddd dfdd  or c in'........
00000a0: dffb fbff bffa aabb ffff ffba fffb ffdd  ................
00000b0: dddd dddd ddba fffd fffa 99ac cfcc ffff  ................
00000c0: fbbb fddd dddd dddd ddff fffb bbbf fcfc  ................
00000d0: ccea adff ffbf dddd dddd dddd ddff aafb  ................
00000e0: fffd caac a9fa bbfa afab dddd dddd ddfd  ................
00000f0: ffff faff fddd dfaf 99fa a9ae fcaa dddd  ................
0000100: dddd dddd fffb daac fdff ffab ffff cccf  ................
0000110: bacf dddd dddd dddf fffb b9ac afff caaf  ................
0000120: ff9a fccc ffcc dfdf dddd dddf ccfa aaaf  ................
0000130: ceac cffc ce99 9a99 fccc dfdd dddd ddff  ................
0000140: ceaf ccae eeaa ffca eee5 9a9a ffff fddd  ................
0000150: dddd ddfc ffa9 ae99 9eaa a999 9e99 9999  ................
0000160: fe4c cfdd dddd ddff fc9e aeec eeee aaba  .L..............
0000170: a9a9 9999 9555 3fdd ddfd dfec cccc e4ee  .....U?.........
0000180: cce4 e9ee 9e95 99a9 4333 3ddd dffd fe59  ........C3=....Y
0000190: cce5 eeee eecc 4444 4453 3354 5332 9ddd  ......DDDS3TS2..
00001a0: dffd 9235 5555 39ee eecf fece 4453 3335  ...5UU9.....DS35
00001b0: 3211 9ddd dff9 2113 3552 559e cccf cecf  2.....!.5RU.....
00001c0: cce3 3335 3212 9ddd daa9 3286 1228 2255  ..352.....2..("U
00001d0: 3999 259e cffe 5544 2123 addd dae3 1128  9.%...UD!#.....(
00001e0: 2226 2211 1212 2222 39ac cfff 92e4 eddd  "&"...""9.......
00001f0: fe91 1112 5353 3521 2211 1111 221a ffff  ....SS5!"..."...
0000200: 4444 eddd fe91 1111 3355 3455 5223 3211  DD......3U4UR#2.
0000210: 1123 addc 4453 9ddd f321 1611 5e53 45e4  .#..DS...!..^SE.
0000220: 5333 3551 1112 2bdd 4536 6fdd f531 1111  S35Q..+.E6o..1..
0000230: 4e35 4445 5233 3243 1111 1129 2556 6fdd  N5DER32C...)%Vo.
0000240: f932 1112 3333 2355 5223 2235 2111 1111  .2..33#UR#"5!...
0000250: 1348 8fdd ce55 3223 2233 5333 5533 3235  .H...U2#"3S3U325
0000260: 3111 1111 3553 9ddd aeee 4532 3234 e445  1...5S....E224.E
0000270: 2554 5235 3321 1111 3222 3fff 4ece 4522  %TR53!..2"?.N.E"
0000280: 2545 3355 3222 2235 3233 2211 1222 39ff  %E3U2""523".."9.
0000290: 5ec4 e522 3455 3325 5339 5553 3333 3551  ^.."4U3%S9US335Q
00002a0: 2232 35ff 23e3 2553 3335 3222 554e 5555  "25.#.%S352"UNUU
00002b0: 3333 3555 2553 23ff 2238 6553 3233 3322  335U%S#."8eS233"
00002c0: 5e44 5554 3533 3533 5323 32af 2333 2ee3  ^DUT5353S#2.#3..
00002d0: 3233 3323 4444 4335 5332 2223 3222 32a9  233#DDC5S2"#2"2.
00002e0: 2323 23ce 5535 5335 5553 3334 5311 1113  ###.U5S5US34S...
00002f0: 335e 04c5 3232 322e 4445 3345 3458 1235  3^..222.DE3E4X.5
0000300: 3266 6112 34ce 4ec4 4453 3522 4553 3552  2fa.4.N.DS5"ES5R
0000310: 3e21 1255 2167 7761 5444 4ec9 9505 3536  >!.U!gwaTDN...56
0000320: 9393 3522 ee36 2353 1167 7771 4444 40a6  ..5".6#S.gwqDD@.
0000330: 7844 4532 1212 3234 ee53 3553 1177 6661  xDE2..24.S5S.wfa
0000340: 4444 5c30 f969 04ee 5559 59ee ee44 e444  DD\0.i..UYY..D.D
0000350: 5311 7716 11c4 4440 fe9e ee44 eeee eeee  S.w...D@...D....
0000360: e355 ccee 3211 6766 11c4 44e0 fce0 0440  .U..2.gf..D....@
0000370: 0e0e 40ce 3888 ece4 3321 6676 11e5 2250  ..@.8...3!fv.."P
0000380: cce0 e44e 4994 44ee 3668 44ee 5451 1666  ...NI.D.6hD.TQ.f
0000390: 11c3 6620 ceee c428 3684 eee0 5885 4e4e  ..f ...(6...X.NN
00003a0: 4492 1111 23c3 662c c96c c488 39ee 94ee  D...#.f,.l..9...
00003b0: 44ee 4444 4454 4323 55c9 229c c99c e493  D.DDDTC#U.".....
00003c0: 4e49 954e ecce eee4 4e55 5454 ee27 2e65  NI.N....NUTT.'.e
00003d0: 6e63 6f64 6528 2768 6578 2729 2929 2e72  ncode('hex'))).r
00003e0: 6573 697a 6528 2833 3836 2c33 3230 292c  esize((386,320),
00003f0: 3329 2e73 6176 6528 276f 2e70 6e67 2729  3).save('o.png')

이 사진을 생성합니다 :

프로그램 출력

이 프로그램은 NUL과 백 슬래시를 피하는 한 기본적으로 원시 바이트를 Python 소스 코드에 넣을 수 있다는 사실을 남용합니다.

프로그램 자체는 16 개 항목 팔레트 ( |구분 된 문자열)와 40x41 16 색 이미지 (픽셀 당 4 비트로 인코딩되고 abusing으로 디코딩 됨 .encode('hex'))로 구성됩니다. 바이 큐빅 필터를 사용하여 이미지 크기를 적절한 크기로 조정하면됩니다.

실제 이미지는 ImageMagick으로 생성되었습니다.

convert -filter Cosine -resize 40x41\! ../../ORIGINAL.png +dither -alpha off -colors 18 -compress none im.bmp

팔레트 및 이미지 데이터는 생성 된 BMP로부터 추출되었다. (IM은 사용하지 않는 항목을 자동으로 삽입하므로 ImageMagick에서 18 색을 요청합니다.)

이진 데이터의 이스케이프 문자 수를 줄이기 위해 팔레트를 약간 재정렬했으며, 전체 이진을 1024 바이트에 맞추기 위해 최종 이진 데이터를 조금씩 편집했습니다.


편집 : 코드를 약간 골퍼하고 ImageMagick에서 17 가지 색상을 요청하여 정확도를 향상 시켰습니다.

편집 : 디더링을 비활성화하면 점수 가 크게 향상되었습니다. 현재 5000 점 이하로 점수가 매겨졌으며 상용 압축 알고리즘과 경쟁이 치열 해지고 있습니다!

편집 : 추가 -filter Cosine하면 또 다른 크기가 향상됩니다. UTF-8 BOM 트릭에 대한 @primo 덕분에 공격적인 골프를 통해 그림에 다른 행을 추가하여 점수를 향상시킬 수있었습니다.


2
이진 데이터를 저장하기 위해 파이썬 인코딩을 악용하기 위해 +1.
Brian Minton

2
@ 2012rcampion : !실제로 인쇄 할 수없는 문자가 양면에 있습니다. 풀 컬러는 #1d211e약간 푸르스름한 어두운 회색입니다.
nneonneo

2
축하합니다. 현상금이 이깁니다!
Nathaniel

3
도움이된다면 #coding:latin줄을 UTF-8 바이트 순서 표시 (0xEF, 0xBB, 0xBF) 로 바꿀 수 있습니다 .
primo February

2
@primo : 당신의 팁과 좀 더 공격적인 골프 덕분에 추가 행에서 뛸 수 있었고, 점수는 약 40 점 향상되었습니다. 개선 된 ImageMagick 명령과 결합하여 거의 100 포인트가 향상되었습니다.
nneonneo

16

zsh + FLIF + ImageMagick, 4358.14

BPG가 손실이 많은 코덱으로 스포트라이트를 훔치면서 @nneonneo의 zsh 트릭을 사용하여 PNG 대신 FLIF 를 사용하는 무손실 고급 접근 방식을 개선 했습니다. ImageMagick은 여기에서 업 스케일러로만 사용됩니다.

16 진수 덤프 (이번에 는 마지막 답변에서 비표준 xxd이라는 것을 알지 못했습니다 hexdump)

00000000: 666c 6966 203d 2874 6169 6c20 2d6e 202b  flif =(tail -n +
00000010: 3320 2430 2920 6f2e 706e 670a 6578 6563  3 $0) o.png.exec
00000020: 2063 6f6e 7665 7274 206f 2e70 6e67 202d   convert o.png -
00000030: 7265 7369 7a65 2033 3836 7833 3230 2120  resize 386x320! 
00000040: 6f2e 706e 670a 464c 4946 3331 0044 0038  o.png.FLIF31.D.8
00000050: e113 7e24 321e fb1e 4df6 d7e0 cfa8 f513  ..~$2...M.......
00000060: e1fa 32fb cf01 c186 dc85 efb3 2ea7 9415  ..2.............
00000070: d1de e100 680a e7c9 455c 42c6 2283 9d32  ....h...E\B."..2
00000080: b06c b863 71ce 7c2b 9cd6 be17 3610 0ebd  .l.cq.|+....6...
00000090: 01ed c8c5 7b9b d687 3821 e3a5 6e47 846c  ....{...8!..nG.l
000000a0: 12b6 9346 d2a6 2760 eef0 f558 caea 260d  ...F..'`...X..&.
000000b0: c8d5 b0e0 f09c 53a1 df70 7277 9b79 02a9  ......S..prw.y..
000000c0: 2813 2292 4f65 8fbc 97cc ea65 51ea d933  (.".Oe.....eQ..3
000000d0: 3989 4efe 2d86 23cd 1142 8f02 ff29 edd1  9.N.-.#..B...)..
000000e0: 3f5d ae15 a973 0cc9 3750 f55c ec0b 2870  ?]...s..7P.\..(p
000000f0: c292 7085 8a38 1a5c d525 aa82 3a70 cb89  ..p..8.\.%..:p..
00000100: 0513 0a8a 7bba cfb7 461c ff14 c160 06b6  ....{...F....`..
00000110: 67ae 3570 a2d1 d056 83e2 36b7 3ca4 d3c4  g.5p...V..6.<...
00000120: 46a0 b5ca 4722 848a 2328 2f25 95b3 2cde  F...G"..#(/%..,.
00000130: 8c0a 9acb dee4 5ef3 9693 e1ef cf7d 0578  ......^......}.x
00000140: abb3 c853 f6f0 29e4 2d25 cf80 ec3a e91e  ...S..).-%...:..
00000150: 3863 5401 26e3 af1c 3691 15b2 a0b8 fc16  8cT.&...6.......
00000160: c773 ffdc bbac 078d c4ea 8b9a 2763 29a8  .s..........'c).
00000170: 1faa 598d eeff 3492 45eb c79d c014 b75c  ..Y...4.E......\
00000180: 61dd 1cf4 64d6 ebe8 9c9a 2825 ed65 aa94  a...d.....(%.e..
00000190: 2b86 d197 233d b45c 5f8a cc52 1752 7357  +...#=.\_..R.RsW
000001a0: e508 fa96 cb9d cab5 e4fa 02d9 0290 4aec  ..............J.
000001b0: 0173 3520 b9b0 a9ac 4d59 23c7 7dac e26d  .s5 ....MY#.}..m
000001c0: 4140 9bb6 f32a 795f 3ff1 2808 1718 0ba0  A@...*y_?.(.....
000001d0: ceae b37b de22 cee7 8c34 0fb3 b8ef 081d  ...{."...4......
000001e0: 9baa 29c8 341c 6f71 a0d4 4bc7 0699 fdb0  ..).4.oq..K.....
000001f0: 08a7 372b 65c1 a57f 6600 edd7 dc4a a698  ..7+e...f....J..
00000200: 102d 06ea 7c07 b5de b187 8d03 27a0 7fe9  .-..|.......'...
00000210: 1820 4409 d0d1 a939 4fb7 8697 18ed 5de0  . D....9O.....].
00000220: 4015 57ba d209 1620 648f 6aff bbbc b010  @.W.... d.j.....
00000230: a957 3c54 9a2e e9bb d552 9436 e73a 216f  .W<T.....R.6.:!o
00000240: 7e14 945c 9af0 49ef 29db c559 1184 b29c  ~..\..I.)..Y....
00000250: b0bc 8838 2c6d c695 e68e 0857 5998 8580  ...8,m.....WY...
00000260: 720d 0b19 dd46 929b e327 e6ee e182 b52e  r....F...'......
00000270: 09d6 b06d c8e5 fd3c 862b e729 eccd 52d6  ...m...<.+.)..R.
00000280: 0300 cacc 5cbb e08f 9314 75df 8576 410c  ....\.....u..vA.
00000290: 6c7d 49bc fab2 a130 da4a ca40 ae1d 2677  l}I....0.J.@..&w
000002a0: 3f5e c6a4 3bf1 5d1e 4819 0015 e2ca b349  ?^..;.].H......I
000002b0: 9b90 783c 8e33 4571 4b5d c436 45b6 d20b  ..x<.3EqK].6E...
000002c0: cdf2 7fcc 6a24 f2d9 82b3 8740 26a1 f6ec  ....j$.....@&...
000002d0: e134 00e1 5ef0 a519 b6a9 055a b0d6 6e10  .4..^......Z..n.
000002e0: 7330 cb51 7042 a472 c3f1 3f70 e161 fde7  s0.QpB.r..?p.a..
000002f0: 4cd0 4dd6 a887 a977 9cab 11a3 5860 b88c  L.M....w....X`..
00000300: 6c26 75f3 fa55 802a a38c 81e0 7519 8233  l&u..U.*....u..3
00000310: 0e86 f5db 4c70 7c22 9c4c 5ba1 602a 530d  ....Lp|".L[.`*S.
00000320: 5b74 9c67 718e 471f e69a 2258 d207 cd93  [t.gq.G..."X....
00000330: 0c92 0c1f 1aa1 2201 7906 d3dd 4e58 ab9d  ......".y...NX..
00000340: e13e 3b9f 870c a69d 5cb2 80d9 6b83 6cd0  .>;.....\...k.l.
00000350: e3df 8a96 7217 0e07 e654 0633 5e52 fb5d  ....r....T.3^R.]
00000360: 76a4 6e05 33c8 bc5b 7bf1 9819 5c05 3705  v.n.3..[{...\.7.
00000370: 3ea6 cf51 3bcf 031a d103 9117 4622 da77  >..Q;.......F".w
00000380: 6018 ddbf fd6f 5a17 989b 1938 2a37 a326  `....oZ....8*7.&
00000390: 0fa1 1507 9d1f 8fee 6116 2dc6 653b ed48  ........a.-.e;.H
000003a0: 3543 4ff8 77b3 d1c7 41b3 0fc2 a6d6 7bee  5CO.w...A.....{.
000003b0: a2dc f047 fae4 da02 c055 25b6 2cd1 0e51  ...G.....U%.,..Q
000003c0: b382 fede ab22 1927 ac66 b8a4 8cf1 094d  .....".'.f.....M
000003d0: e0cb 9288 a105 cb3e dbb0 4e04 e110 68fb  .......>..N...h.
000003e0: 78d0 c36f 390a db12 ba16 b055 a367 bacf  x..o9......U.g..
000003f0: 20                                        

별표, FLIF로 압축

다른 스크립트를 사용하여 스크립트를 생성했습니다.

convert ORIGINAL.png -filter Lanczos2 -resize x56 - | pngquant --speed 1 -f 10 > i.png
flif -N i.png o.flif
echo 'flif =(tail -n +3 $0) o.png' > genstarry.sh
echo 'exec convert o.png -resize 386x320! o.png' >> genstarry.sh
cat o.flif >> genstarry.sh
zsh genstarry.sh

3
손실이없는 코덱과 손실이없는 코덱을 구분하는 데 반대하고 싶습니다. png 자체가 손실이없는 경우에도 전체 인코딩이 가장 손실이 많습니다. 그러나 실제로는 잘 작동합니다. 사실 현지화 된 아티팩트 가 있는 최고 점수의 BPG 보다 훨씬 나아 보입니다 .
반 시계 회전을 중지

15

매스 매 티카, 5076.54

정확히 1024 바이트의 무게로, 나는 마침내 nneonneo의 점수를 이겼습니다 ... 그가 한 시간 전에 그것을 개선 할 때까지 = (

"기성품"압축 알고리즘을 사용하지 않습니다.

f=IntegerDigits[FromDigits[ToCharacterCode@#-32,95],#2]~Partition~#3&;Image[Array[Nearest[f["GYWh6t@/0EwgZTWL9+IfA51 Qn0&q3k2eb[cFp{iDJp\\8:_I9v~0-035)!z^br^=,Jy.0X.wnXr\"&A'l3N$\"rHVD]ANb<[c-HyQ3k]\\/F.L)^F[FsTe]>9=Y MBP@-Y7,U1n2PgeTYL|d^@s%)|vDUsI63?3+5zt`4;0}7 L )pg$G\"S=.e`n@d0Qpb-<L@zy'cH<KJhG4D0+DluH1hvFZ%6<>w,2uQJQhD\\@-bq=OChgV}r[^o\\h/1w!5_{SVjv0a1\"?j.z%tRxXX$cC2[@K){*eQ/|$W%[{kFXnmL'EnM`-zs$OyS]mnL$]Qu,AIN%~n}zG{SD[q<v%IP3Tp]\"1Gu0?|L=XB =6n+]mAU20rDZ|F&V#(h? xxJeK^}e}% n6MaNqA*\"vitzT8e=:>&YxNb'&Wiw\\yjJ#l^",409,2]-11->(#+{51,-41}&/@f["<Z? ZN7Mc{N{gJm}@.U'336)10$MTyi $D3Y@,r$g\"vk)~rU-]=G?dQJ0j*V~VTLz!yVCU~]=>VrrN<{ROjqTvLl!s)/8B{\\xpJ.8\"R~)A.1xA9{ ab8oq8bSoyJ:P_7OXdr@(&H>vp~sjV+M^1'Js;g&@2t/1Z)Xj=dwnLnm1Fd?`dpQ3AN>)n@!+cL'^j}N(c%~~F06||Vci{L_O*K>5i[>20mf8>WYKKuk\\T7d}L?xHDuS^GNr:o/(yq KvH=KEQX[e&faTh0&Ra+B0<9PLB)WPAe8\\#B$oo.AtrM\\*\"=1JZ0s/CBz{e9;8aH|w-#N_l>a.^@/M`[* };@#l)C(lXG=CVL:]?D@W=(3k{o.`jBG#g-33LX&lE+WHI",231,2]).{{0.479,0.574,0.664},{0.591,0.349,-0.727}},{##}][[1]]&,{320,386}],"Byte"]

여기에 이미지 설명을 입력하십시오

  • Voronoi 셀의 색상과 중심은 전체 ASCII 범위를 사용하여 base-95로 인코딩됩니다.
  • 공간을 절약하기 위해 RGB 큐브의 2 차원 부분 공간으로 색상이 표현됩니다.

(나중에 더 나은 설명)


당신이 현상금을 얻지 못해서 너무 안타깝습니다. 저는 이런 접근 방식을 취하기를 바라고있었습니다. 나는 이것이 어떻게 생산되었는지에 대한 설명을 고대하고 있습니다.
Nathaniel

@Nathaniel 나는 몇 시간마다 현상금을 놓쳤을 수도 있습니다. 내 옵티마이
저가

글쎄, 당신은 운이 좋을 수도 있습니다. 비 압축 기반 답변 중에서 최적화 기반 접근 방식이 먼저 발생하면 이미 두 번째 현상금을 발표했습니다. (업데이트 된 질문 텍스트를 참조하십시오.)
Nathaniel

Heh, 나는 Sleafar를이기려고 나갔다 (그리고 그의 점수가 당신보다 낮기 때문에 그는 어쨌든 승리했을 것이다). 내가 만든 변경 (디더링 비활성화)이 큰 영향을 미쳤다는 사실에 놀랐습니다.
nneonneo 2019

Voronoi 및 RGB 큐브의 하위 평면을 사용하는 경우 +1 Voronoi 다이어그램을 최적화하기 위해 codegolf.stackexchange.com/q/50299/8478 의 답변을 사용해 보셨습니까 ? (물론 시각적 유사성을 목표로하고 있었기 때문에 객관적인 오류를 최소화하지는 않았으므로 YMMV는 그 중 일부는 꽤 좋은 결과를 얻을 수 있다고 생각합니다.) 또한 RGB 큐브를 통해 한 줄만 사용하여 사용할 수 있습니다. 보로 노이 세포의 두 배?
Martin Ender

15

HTML / JavaScript, 10855.83 8000.55 (± ~ 5, 브라우저 기반)

브라우저 나 GPU의 차이로 인해 점수가 약간 다를 수 있습니다.

캔버스 데이터를 이미지로 저장하려면> 다른 이름으로 이미지 저장을 마우스 오른쪽 버튼으로 클릭해야하지만, 이것이 유일한 상호 작용입니다.

김프를 사용하여 특정 영역을 선택하고 평균을 찾았습니다. 특히 색상 선택 도구와 "계층 차이"기능 이 매우 유용했습니다.


시도 # 1 (10855.83)

http://i.imgur.com/bdvz7Qz.png

<canvas width="386" height="320" id="c">
<script>
var canvas = document.getElementById("c");
var context = canvas.getContext("2d");
context.fillStyle="#2c3e84";
context.fillRect(0,0,386,320);

context.fillStyle="#517a9c";
context.fillRect(0,80,386,150);

context.fillStyle="#1d201d";
context.beginPath();
context.moveTo(33, 319);
context.lineTo(63, 26);
context.lineTo(97, 200);
context.lineTo(179, 319);
context.closePath();
context.fill();

context.fillStyle="#acae6e";
context.beginPath();
context.arc(355,52,35,0,6.3);
context.fill();

context.beginPath();
context.moveTo(0,0);
context.lineTo(300,150);
</script>

시도 # 2 (8000.55)

여기에 이미지 설명을 입력하십시오

<canvas width="386" height="320" id="c">
<script>
var canvas = document.getElementById("c");
var context = canvas.getContext("2d");

function f(x,y,w,h,c)
{
    context.fillStyle="#"+c;
    context.fillRect(x,y,w,h);
}

//Top area
f(0,0,386,250,"607391");
f(0,0,215,48,"415084");
f(298,160,41,28,"9cab9b");

//Bottom area
f(0,250,386,70,"414f5d");

//Middle
f(200,200,188,56,"313f68");
f(133,223,67,27,"2c3955");
f(223,177,74,23,"869999");
f(322,131,64,29,"a9b4a4");
f(354,164,32,32,"26293a");

//Sun outer
f(318,17,67,70,"adaf7b");

//Star
f(107,148,45,44,"a1a9a1");


//Foreground mountain
f(45,210,88,168,"222420");
f(45,130,42,104,"222421");
f(58,20,18,112,"222421");
</script>

20
"컨텍스트"대신 단일 문자를 사용하고 불필요한 공백을 제거한 경우 이미지에 세부 사항을 추가 할 공간이있을 수 있습니다.
trichoplax

13

스칼라, 6003.56

993 자 수입품 중 하나는 스칼라 이미지 라이브러리 입니다. 두 번째 가져 오기는 기본 91 인코더 입니다.

object T extends App {
import com.github.libxjava.io._, com.sksamuel.scrimage._
val a = "vuk:eJs4+BAAN/<MCG4DAA#TAAAA8FMAAA<cPjTTAAJ7oG]t>um^8Wm}ozBAn|m(qVi2Yt+j8GnHAD%FaO,BjL2c%w%z,M+OyQy9eR0wkSXUa1|1pm1$?XSrkFs(;9/]Vk3<%.^UVyt~_Pnh?n7;[v06@I`oB{.2OCGT/*v/pS|`XN5.rp1`5)M$wy49cuk0G=%lVCEbxW{^Wd*{JR]hZM>S0$&Eo1,wk6]/WkAK:{$}d__nf_YZ&qRlB;<S5T8OVF3C^}$*PYcqn$SvGU[8Q69kFgT#/l@+7)l><x&|XNO&eajx.0k^mY)MvyQ4sQoqvY7MpyaPJ@u_O&9[@$dr1c>(!QUN+:&F#ZZSX*LxcCIR)&,,0=T:1&IuG[r|yQ>[)oFJTvpvRaM5Z6#oGj^%6Xqqn[Uo2AoeoEuvt2A7_N7TL)9_+[oq^J_3gwqhg$^#+{n[cW(0H}cP\"ek=a34Cpt:u]Sab;~&;FlT_iy6fMw`F>z(MQ^}vvoAy?@XxV26Se8:FT)T]]N2KH`b4%l_Zuu@y=0fTH1WeQ58~~[(QAKYhf]^Bel^[Tb44/G96&^2O@_6L072:)lRpMDZYMB]i9GM]t?t0%Wq99/0Ti=gjDi6]P7b3:dU$N0e&1Z?PaY`Hb`h7l)%N`fsuzV;/x`Uce.8:?K[@0|ckpCe/emO7!8^~eZsN[$)iOZ0zYW4VE]K5?RbO|GYzx<a2C!:*]<PuzpsIie8#+x[5U6xZ\"e}k7y[5JVQ5z:]ZR2Gds&g^+U=LJ:hR*KFgJ[YF<<Av}L8WcAAA6yQMFGPe=hnB"
Image(new Base91().decode(a.getBytes)).scaleTo(386, 320, ScaleMethod.Lanczos3).output("a.png")
}

이것은 base91 데이터입니다.

여기에 이미지 설명을 입력하십시오


네, 방금 죄송합니다 :)
monkjack

이것은 993 문자처럼 보인다
Downgoat

그렇습니다. 업데이트되었습니다.
monkjack

호기심에서 객체 내부로 가져 오기를 갖는 것이 중요합니까?
Carcigenicate

아니요, 생각하고 복사하고 붙여 넣기가 더 쉬웠습니다
monkjack

13

자바, 12251.19 점

import java.awt.*;
import java.awt.image.*;
public class Y{
    static Graphics2D g;
    static void rect(int...p){g.fillRect(p[0],p[1],p[2],p[3]);}
    static void col(int...p){g.setColor(new Color(p[0],p[1],p[2]));}
    public static void main(String[]a)throws Exception{
        BufferedImage b=new BufferedImage(386,320,1);
        g=(Graphics2D)b.getGraphics();
        col(77,98,119);
        rect(0,0,386,320);
        col(82,98,128);
        rect(11,0,386,57);
        col(186,159,80);
        rect(333,43,24,24);
        col(73,90,104);
        rect(0,282,386,50);
        col(76,97,95);
        rect(0,292,60,30);
        col(55,65,72);
        rect(34,130,91,190);
        rect(32,143,97,190);
        rect(46,193,99,190);
        rect(40,32,50,110);
        rect(45,20,43,110);
        javax.imageio.ImageIO.write(b,"png",new java.io.File("out.png"));
    }
}

이 Mathematica answer을 기반으로 하지만 더 많은 사각형이 있습니다. 나중에 계속 수정하겠습니다.

결과 :

여기에 이미지 설명을 입력하십시오

일부 이전 버전 :

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오


11
SE는 링크를 삽입하여 이미지를 클릭하면 전체 크기로 개별적으로 볼 수 있습니다.
Calvin 's Hobbies

@ Calvin'sHobbies 그러나 이러한 이미지는 전체 크기가 게시물에 완벽하게 들어갈 정도로 작습니다.
SuperJedi224

7
모든 화면 / 창 크기에 반드시 해당되는 것은 아닙니다.
Calvin 's Hobbies

1
이것이
바로이

13

Python 2 (내장 압축 없음), 점수 4497.730

이것은 이전 답변 과 동일한 수동으로 디코딩 된 16 색 이미지 접근 방식을 사용 하지만 이번에는 실제로 점수 를 크게 향상시키기 위해 그라디언트 강하 최적화 전략을 적용했습니다 . 이전 제출물은 4755.886 점을 기록한 반면, 새로운 제출물은 250 점을 초과하여 더 나은 점수를 얻었으며이 과정에서 많은 내장 압축 방식을 능가했습니다.

이전과 마찬가지로 최종 프로그램의 길이는 정확히 1024 바이트입니다. 실제로 최적화 알고리즘의 원시 출력에는 이스케이프 처리 된 4 바이트 ( \0) 가 포함되었으며 바이트 수를 1024 바이트로 줄이기 위해 "퍼지"해야했습니다. 퍼지가 없으면 1028 바이트 프로그램의 점수는 4490.685-7 점입니다.

기본 아이디어는 팔레트와 데이터를 함께 최적화하는 것입니다. 단일 반복에서 팔레트의 모든 조정 (기본적으로 일부 색상 구성 요소에서 1이 다른 모든 수정 된 팔레트)을 검색하고 점수를 가장 향상시키는 수정 된 팔레트를 선택하십시오. 그런 다음 데이터의 모든 조정 (한 픽셀이 다른 팔레트 항목으로 변경되는 모든 수정 된 인덱스 배열)을 검색하고 점수를 낮추는 수정을 선택합니다 (여기서는 내가 신경 쓰지 않기 때문에 가장 신경 쓰지 않습니다) 매번 25000 개가 넘는 조정의 전체 공간을 열매없이 검색하고 싶습니다.)

마지막으로 최종 프로그램 출력을 생성 할 때 최종 출력에 필요한 백 슬래시 수를 최소화하기 위해 팔레트를 재정렬하는 또 다른 최적화 패스를 실행합니다 (예 : 아래 표시된 프로그램의 경우 16 진 테이블 "0e3428916b7df5ca"를 사용하여 팔레트가 재정렬 됨).

이 접근 방식은 이전의 순진한 ImageMagick 접근 방식에 비해 수치적이고 지각적인 개선을 가져 왔습니다. 이전 제출 결과 :

이전 제출의 결과

그리고 새로운 제출 결과 :

새로운 제출의 결과

새로운 최적화 기반 접근 방식은 훨씬 더 세밀하고 정확한 색 재현을 제공합니다.

최종 프로그램의 16 진 덤프는 다음과 같습니다.

0000000: efbb bf66 726f 6d20 5049 4c2e 496d 6167  ...from PIL.Imag
0000010: 6520 696d 706f 7274 2a0a 6672 6f6d 6275  e import*.frombu
0000020: 6666 6572 2827 5247 4227 2c28 3430 2c34  ffer('RGB',(40,4
0000030: 3129 2c27 272e 6a6f 696e 2827 b39b 2620  1),''.join('..& 
0000040: b4b9 7e20 2634 8120 5567 7520 3547 7320  ..~ &4. Ugu 5Gs 
0000050: 242e 5620 1c1f 1b20 7890 a420 4348 3d20  $.V ... x.. CH= 
0000060: 9fae a420 3a52 8e20 262b 3220 7d90 7f20  ... :R. &+2 }.. 
0000070: 3a49 5720 4a67 9720 5d79 9c27 2e73 706c  :IW Jg. ]y.'.spl
0000080: 6974 2829 5b69 6e74 2863 2c31 3629 5d66  it()[int(c,16)]f
0000090: 6f72 2063 2069 6e27 8388 88b6 86b6 6b66  or c in'......kf
00000a0: 6bb8 b8b8 8888 dd8b bbbb bb8d b688 bb66  k..............f
00000b0: 6666 6666 b68d bdb6 bb88 33bd 5b55 bb68  ffff......3.[U.h
00000c0: b888 b66b 6666 6666 66bb 6688 88d8 bbb5  ...kfffff.f.....
00000d0: 553d 868b bb8b 6666 666b 6666 66b6 3d68  U=....fffkfff.=h
00000e0: bb66 5dd4 8363 b8bd dbd8 6666 66b6 66b6  .f]..c....fff.f.
00000f0: bbbb bbb6 d666 6bd6 f3bd d3d4 b5dd 666b  .....fk.......fk
0000100: 6666 6666 b668 63d5 66b8 5bd8 66bb 5b5b  ffff.hc.f.[.f.[[
0000110: 884b b66b 666b 666b 686d 8d85 dbb6 dd4b  .K.kfkfkhm.....K
0000120: 5b33 6db5 b5bd 6b6b 6b66 66bb d5b3 dddb  [3m...kkkff.....
0000130: bad4 58b5 d435 3b33 b555 6b66 6666 66bb  ..X..5;3.Ukffff.
0000140: 5346 db84 d45d bbbd 54d7 4d3b 5bbb b6b6  SF...]..T.M;[...
0000150: 6666 66b5 6bd3 d4f3 eddd 4333 c5d3 3c83  fff.k.....C3..<.
0000160: b2a5 5666 6666 66b6 b534 84d5 4444 b8b8  ..Vffff..4..DD..
0000170: b383 8333 3ffe 7666 66b6 6b42 2555 2eaa  ...3?.vff.kB%U..
0000180: 5b4a 4343 ad33 3388 43fe f666 b6d6 64e3  [JCC.33.C..f..d.
0000190: 564f d534 4455 aaea aaef ffee e737 3666  VO.4DU.......76f
00001a0: 6bb6 c73e ef3a f352 445b b25a eaee ffee  k..>.:.RD[.Z....
00001b0: ff79 3666 6b63 7c73 f3ec ee34 b55b 53b6  .y6fkc|s...4.[S.
00001c0: 5baf eee3 3717 3666 6dda 3fc1 ccc3 cc3a  [...7.6fm.?....:
00001d0: f333 7e34 bbb2 feea 7c7e d666 6ddf 99f3  .3~4....|~.fm...
00001e0: c7c1 c717 c777 7f77 f35b b6bb 374a 4666  .....w.w.[..7JFf
00001f0: be49 9999 aeee fac9 cc99 997c c79b 5bbb  .I.........|..[.
0000200: a3ae 4666 bad9 9197 e7ae fae4 acf3 ef99  ..Ff............
0000210: 9cf7 d6b5 4afe 3666 bf79 9099 a5ef af4a  ....J.6f.y.....J
0000220: ee77 ce49 999f 7b66 aeec 1b66 be39 1999  .w.I..{f...f.9..
0000230: a474 a2ef a7ef fcaf 1979 997c 7ee1 1b66  .t.......y.|~..f
0000240: baf7 999f efff 7cee e77e 7ffa 7999 9999  ......|..~..y...
0000250: 1eac c666 d4fe f7ff 7fff feff eeff e7ef  ...f............
0000260: a919 1999 f3ae a6b6 d4a5 aef7 ecf4 44a3  ..............D.
0000270: 7aa4 a7fe fe79 9199 e777 76b6 e4b4 ae77  z....y...wv....w
0000280: 7f4e ffef 3977 9fee f7ee 7719 9777 f36b  .N..9w....w..w.k
0000290: e45e 4e7f fafe ff7a eec3 3eef feff eaa1  .^N....z..>.....
00002a0: f7f7 3f66 9f5f ceef fe7a e777 aeaa ee3e  ..?f._...z.w...>
00002b0: efee fefe caae c766 77fc 1aff f7ff 7f77  .......fw......w
00002c0: edea eeea faff faff ef9f e7d6 7fff c547  ...............G
00002d0: 37ef fef7 4eaa affe e7ff 77ff fcf7 c7dd  7...N.....w.....
00002e0: 7e9f ff64 e3ef a7fa faef fffa ee19 197f  ~..d............
00002f0: fcf5 2abf f7fc f774 aaa3 e74e 7a3c 77ee  ..*....t...Nz<w.
0000300: ff11 119c ca54 a2ba 2aef f3cc af3f 7ee7  .....T..*....?~.
0000310: f2c1 17ae f110 5c30 17ea aa2a b3c3 2eef  ......\0...*....
0000320: fc33 3fee f745 7ccf ef91 1001 09aa 2aaa  .3?..E|.......*.
0000330: bc0c 2a4e e717 97f7 fa5a affe ef91 1011  ..*N.....Z......
0000340: 1c2a aa2a 6c03 2a44 fea3 3444 24e4 4aa2  .*.*l.*D..4D$.J.
0000350: ee91 0111 195a aa4a 6434 222a 52d4 4422  .....Z.Jd4"*R.D"
0000360: 4f3e 5542 e7c1 1011 9c5a 2a2a 6522 4aa2  O>UB.....Z**e"J.
0000370: a222 a254 7ccc 454e ef9c 1101 174a 77a2  .".T|.EN.....Jw.
0000380: b224 2aa4 2c32 aa42 700c aa45 ea39 c111  .$*.,2.Bp..E.9..
0000390: 9c57 c072 545a 5ecc e0ca 4522 ecce a4a4  .W.rTZ^...E"....
00003a0: a34f 991c cf5f 0175 5315 5acc f4a4 ae44  .O..._.uS.Z....D
00003b0: aa34 ea34 aafa 2ffc ee54 7f4b 5345 2a3c  .4.4../..T.KSE*<
00003c0: a4a3 33aa 4554 445e a4e3 f4ea 4427 2e65  ..3.ETD^....D'.e
00003d0: 6e63 6f64 6528 2768 6578 2729 2929 2e72  ncode('hex'))).r
00003e0: 6573 697a 6528 2833 3836 2c33 3230 292c  esize((386,320),
00003f0: 3129 2e73 6176 6528 276f 2e70 6e67 2729  1).save('o.png')

여전히 개선의 여지가 있습니다. 예를 들어 간단한 히스토그램은 일부 색상이 거의 사용되지 않음을 보여줍니다.

 6: 203
15: 167
14: 154
11: 152
10: 145
 7: 120
 4: 110
 3: 107
 5: 85
 9: 77
12: 77
13: 66
 1: 56
 8: 54
 2: 49
 0: 18

이것은 균형이 잡힌 팔레트가 효율성을 향상시킬 수 있음을 시사하며 5 위 BPG 솔루션을 포착하기에 충분할 것입니다. 그러나이 최적화 방법 (또는 실제로 H.265의 특별한 기계를 포함하지 않는 모든 것)이 BPG 구현을 처음으로 잡을 수 있다고 의심합니다.


11

펄, 5955.96878124 5149.56218378

"인쇄 불가능한 횡설수설"접근 방식을 살펴보면 Perl에서도 시도 할 수 있다고 결정했습니다. 다시 말하지만, 나는 실제로 Perl을 알지 못하므로 이것이 향상 될 수 있다고 확신합니다 (실제로 가장 명백한 개선, 알파 채널을 생략하여 타원 당 7 바이트로 줄이면 이미 다음 버전에 구현되었습니다) 나는 여전히 그 코드의 다른 부분을 연구하고 있으며, 팝 / 푸시 사업 전체가 더 골프화 될 수 있다고 생각합니다.

이진 모드에서 DATA 섹션을 쉽게 열 수있는 방법을 알 수 없었기 때문에 이것이 실제로 Windows 시스템에서 작동한다고 생각하지 않습니다 (테스트 할 수 없음).하지만 Linux 시스템에서는 작동했습니다.

기본적으로 동일한 GA 코드를 계속 사용하여 만들 수있었습니다.

use GD;
$X=GD::Image->new(386,320,1);
@r=do{$/=\8;<DATA>;};
foreach $r(@r){@x=unpack"CCCCI",$r;$c=pop@x;map{$_*=2}@x;push@x,$c;$X->filledEllipse(@x)}
open $h,">","p.png" or die "$!";
binmode $h;
print $h $X->png;
close($h);
__END__
<<unprintable gibberish>>

xxd 출력은 다음과 같습니다.

0000000: 7573 6520 4744 3b0a 2458 3d47 443a 3a49  use GD;.$X=GD::I
0000010: 6d61 6765 2d3e 6e65 7728 3338 362c 3332  mage->new(386,32
0000020: 302c 3129 3b0a 4072 3d64 6f7b 242f 3d5c  0,1);.@r=do{$/=\
0000030: 383b 3c44 4154 413e 3b7d 3b0a 666f 7265  8;<DATA>;};.fore
0000040: 6163 6820 2472 2840 7229 7b40 783d 756e  ach $r(@r){@x=un
0000050: 7061 636b 2243 4343 4349 222c 2472 3b24  pack"CCCCI",$r;$
0000060: 633d 706f 7040 783b 6d61 707b 245f 2a3d  c=pop@x;map{$_*=
0000070: 327d 4078 3b70 7573 6840 782c 2463 3b24  2}@x;push@x,$c;$
0000080: 582d 3e66 696c 6c65 6445 6c6c 6970 7365  X->filledEllipse
0000090: 2840 7829 7d0a 6f70 656e 2024 682c 223e  (@x)}.open $h,">
00000a0: 222c 2270 2e70 6e67 2220 6f72 2064 6965  ","p.png" or die
00000b0: 2022 2421 223b 0a62 696e 6d6f 6465 2024   "$!";.binmode $
00000c0: 683b 0a70 7269 6e74 2024 6820 2458 2d3e  h;.print $h $X->
00000d0: 706e 673b 0a63 6c6f 7365 2824 6829 3b0a  png;.close($h);.
00000e0: 5f5f 454e 445f 5f0a b252 8e38 3a27 2400  __END__..R.8:'$.
00000f0: 6a48 8c5d 888b 7a00 328e 7684 6c3b 2b00  jH.]..z.2.v.l;+.
0000100: 6063 8e3d 5635 2a00 a996 bf59 8650 3b00  `c.=V5*....Y.P;.
0000110: b26c 1f0f 9b6b 5500 ae19 297e 855d 4a00  .l...kU...)~.]J.
0000120: ae92 af3e 665d 4b00 be8c 480c 3a2c 2500  ...>f]K...H.:,%.
0000130: b465 5d06 432a 2400 b29a 202d 4332 2b00  .e].C*$... -C2+.
0000140: c178 1517 5e58 4c00 5d3e 907a 704b 3900  .x..^XL.]>.zpK9.
0000150: 7754 b903 2921 2000 9148 621e 99a7 a500  wT..)! ..Hb.....
0000160: aa41 6421 9ba3 9600 124d b44f 8e6f 5400  .Ad!.....M.O.oT.
0000170: 7f88 1f53 512e 2400 5c33 6c97 5b33 2800  ...SQ.$.\3l.[3(.
0000180: 2a4e 8a3e 918b 7400 a231 3c51 9489 7000  *N.>..t..1<Q..p.
0000190: 7a0c 9f11 8f8e 7700 817f 4c20 644d 3b00  z.....w...L dM;.
00001a0: 9742 5229 9eab 9d00 0884 a218 4435 2b00  .BR)........D5+.
00001b0: 749f 834a 4937 2e00 6b2a 8d5d a07b 5b00  t..JI7..k*.].{[.
00001c0: 8626 3b6b 9165 4900 aa20 3b2f 88ab 9c00  .&;k.eI.. ;/....
00001d0: 8c36 6920 9f76 5500 573e 8359 9979 6000  .6i .vU.W>.Y.y`.
00001e0: 2f1d c08d 8d76 6100 2a9a b216 313d 3400  /....va.*...1=4.
00001f0: 034d 1d18 8b63 4400 b69f 181a 3839 3200  .M...cD.....892.
0000200: 1412 302d 854b 3600 080a 931a 6b3a 2c00  ..0-.K6.....k:,.
0000210: 6400 902b 8b65 5000 003f 321b a088 6e00  d..+.eP..?2...n.
0000220: 1c4d 1f0b 779e 8f00 8127 1f0d 8897 8900  .M..w....'......
0000230: 5d96 6c16 6057 5100 7537 4c1b 9064 4900  ].l.`WQ.u7L..dI.
0000240: 2da0 6403 6482 8600 3a45 6e07 866b 5000  -.d.d...:En..kP.
0000250: 453f 5c5b 3a37 3100 3659 610f 865a 3f00  E?\[:71.6Ya..Z?.
0000260: bb24 361b 8dac 9b00 b01d 161d 58ae b700  .$6.........X...
0000270: 3c65 5031 785f 4800 330c 5b6f 834b 3700  <eP1x_H.3.[o.K7.
0000280: 4e23 539b 8961 4a00 5926 2c19 9c8c 7c00  N#S..aJ.Y&,...|.
0000290: 3031 980d 9479 6200 2708 431c 8184 7300  01...yb.'.C...s.
00002a0: a89d 1e02 2f26 2300 205f 0d74 2727 1e00  ..../&#. _.t''..
00002b0: bf33 210f 997b 5c00 1d60 0670 9476 5f00  .3!..{\..`.p.v_.
00002c0: 1f71 107c 292c 2700 5113 940e 7f47 3500  .q.|),'.Q....G5.
00002d0: 7140 4906 9881 6b00 3614 0e3e 8648 3400  q@I...k.6..>.H4.
00002e0: 940a 0f68 9979 5d00 3471 1229 2223 2200  ...h.y].4q.)"#".
00002f0: 3060 031c 614b 3600 5908 830b 7c73 6200  0`..aK6.Y...|sb.
0000300: 2706 1239 5488 8700 468a 683d 2226 2400  '..9T...F.h="&$.
0000310: 4774 1715 6949 3400 5d9c 4a37 3c3f 4000  Gt..iI4.].J7<?@.
0000320: 5f51 3438 8c6b 5000 4c4e 3d48 8771 5800  _Q48.kP.LN=H.qX.
0000330: 2488 1385 1e22 1e00 5979 3417 5134 2700  $...."..Yy4.Q4'.
0000340: 5030 5622 937d 6700 6c23 1c1c 9672 5c00  P0V".}g.l#...r\.
0000350: 2543 0126 2224 1f00 8c8d 7a01 9171 6600  %C.&"$....z..qf.
0000360: 4932 1012 6341 2d00 3341 1515 7a54 3a00  I2..cA-.3A..zT:.
0000370: 3893 2849 1f22 1f00 798f 7f11 4b3f 3500  8.(I."..y...K?5.
0000380: 6890 4e1d 3530 2b00 6d7b 2b21 6347 3700  h.N.50+.m{+!cG7.
0000390: 4e54 3222 9ca5 9a00 2705 2224 7243 3500  NT2"....'."$rC5.
00003a0: 7705 4c31 7d49 3900 915c 2d0b 9697 8100  w.L1}I9..\-.....
00003b0: 4e3d 221e 9874 5a00 748e 1118 3831 2d00  N="..tZ.t...81-.
00003c0: bf68 340d 9666 5000 9529 0848 9a68 4c00  .h4..fP..).H.hL.
00003d0: 2003 0466 3c2d 2900 5a49 1c4c 916e 5400   ..f<-).ZI.L.nT.
00003e0: 6c60 6008 8e8b 7500 4696 2219 1c20 1d00  l``...u.F.".. ..
00003f0: 7906 1165 8052 3f00 740e 1412 7c7d 6c00  y..e.R?.t...|}l.

어떤 이미지를 생성 :

여기에 이미지 설명을 입력하십시오

점수가 나아지더라도 이미지가 다소 나빠 보인다는 점이 흥미 롭습니다. 추가 타원이 너무 많아서 더 간단한 이미지를 시각적으로 다루기가 더 쉽습니다.

이전 결과

use GD;
$X=GD::Image->new(386,320);
sub c{$X->colorAllocate(@_);};
sub e{$X->filledEllipse(@_);};
e(0,7,9,4,c(98,122,142));
e(352,168,130,61,c(38,41,57));
e(313,296,319,213,c(44,56,92));
e(281,71,240,257,c(99,127,149));
e(55,266,372,67,c(41,55,96));
e(39,15,281,130,c(55,73,128));
e(235,149,226,90,c(136,156,152));
e(81,55,29,29,c(129,133,89));
e(183,139,285,65,c(58,79,108));
e(368,261,177,130,c(75,97,145));
e(283,270,386,88,c(70,86,99));
e(271,11,322,58,c(86,104,129));
e(254,78,185,200,c(90,116,151));
e(29,16,34,35,c(119,135,130));
e(195,311,297,189,c(51,69,98));
e(234,19,150,89,c(58,75,126));
e(286,313,286,108,c(49,56,68));
e(232,30,40,31,c(114,130,122));
e(375,145,106,32,c(159,172,160));
e(59,16,21,141,c(43,53,90));
e(66,135,21,108,c(39,45,43));
e(353,53,84,80,c(167,172,117));
e(196,122,150,137,c(86,110,145));
e(101,320,284,185,c(48,55,59));
e(79,193,73,114,c(36,42,42));
e(106,310,126,191,c(31,35,33));
e(119,169,70,56,c(128,144,150));
open $h,">","p.png" or die "$!";
binmode $h;
print $h $X->png;
close($h);

여기에 이미지 설명을 입력하십시오

jamieguinan의 답변을 본 후 Perl에서 GD 라이브러리에 액세스 할 수 있기 때문에 타원을 그리기 기본 요소로 사용했습니다. 나는 Perl 전문가가 아니므로 어떤 제안이라도 유용 할 것이다. 내 C ++ 답변 에서 수정 된 유전자 알고리즘을 사용했습니다 .

그것은 잘 작동하는 것 같지만 솔직히 점수에 약간 실망했습니다. 몇 개의 타원이 최적의 위치에 있지 않다는 것을 쉽게 알 수 있기 때문에 조금 더 오래 달릴 수 있습니다. 그러나 지금까지도 사각형 기반 솔루션에 비해 내 눈이 더 좋아 보입니다.


뛰어난 이미지. 나는 타원을 사용하여 비슷한 것을 연구하고 있습니다. (아직 게시되지 않음) 그러나 내 GA는 별표를 표시하기 위해 하나의 타원을 거의 사용하지 않으며 대신 배경에 여러 개의 어두운 별이 겹치는 밝은 별을 선택합니다. 왜 당신이 이것을 발견하고 내 것이 아닌지 궁금합니다.
Nathaniel

1
@ Nathaniel 나는 일부 실행 에서이 작업도 수행한다는 것을 알았습니다. 프로그램 크기에 따라 약간의 페널티 (점수 증가)를 사용하는데, 이는 더 적은 타원을 사용하는 솔루션을 선호하기위한 것입니다. 나는 그것이 작동하는지 정말로 모른다. 그러나 그것을 구현 한 이래로 나는 "멀티 타원 별"을 많이 보지 못했다.
neocpp

9

배쉬 + Netpbm, 4558.5 4394.1

업데이트 : FIASCO 대신 SPIHT를 사용하여 점수를 향상 시켰습니다.

SPIHT 는 계층 트리에서 파티션 분할 설정의 약어입니다. 매우 효율적인 웨이블릿 기반 이미지 압축 형식입니다.

원래 PNG를 분기별로 축소 한 다음 Netpbm v. 10.68 pngtopnm에서 PNM으로 변환 한 다음 헤더를 제거하고 RAW 데이터를 SPIHT로 변환 하여 913 바이트 이미지 파일을 얻었습니다. 그런 다음을 사용하여 RAW로 다시 변환 한 다음을 사용하여 PNM 형식으로 변환하고을 사용하여 뒤집고 원래 크기로 업 스케일링 하고 PNM 파일로 저장하여 PIL에서 읽습니다. 내 스크립트는 다음과 같습니다 (1KB).codecolr in.raw out.spi 80 96 0.95decdcolr -s out.spi out.raw 0.95rawtoppm -bgr 96 80pamflip -tbpamscale -xsize 386 -ysize 320 -filter sinc

0000000: 6465 6364 636f 6c72 202d 7320 3c28 7461  decdcolr -s <(ta
0000010: 696c 202d 6e2b 3220 2430 2920 3e28 7261  il -n+2 $0) >(ra
0000020: 7774 6f70 706d 202d 6267 7220 3936 2038  wtoppm -bgr 96 8
0000030: 307c 7061 6d66 6c69 7020 2d74 627c 7061  0|pamflip -tb|pa
0000040: 6d73 6361 6c65 202d 7879 6669 6c6c 2033  mscale -xyfill 3
0000050: 3836 2033 3230 202d 6669 6c74 6572 2073  86 320 -filter s
0000060: 696e 633e 6f75 7429 2030 2e39 350a 6f00  inc>out) 0.95.o.
0000070: a060 206d 7997 f801 b8af b544 5f71 c411  .` my......D_q..
0000080: bba5 e80c a148 0424 72b8 67b5 bd41 3fce  .....H.$r.g..A?.
0000090: 4f43 8d78 9086 b69a ee32 c8ff ffd7 18f9  OC.x.....2......
00000a0: ffff ffff ffff ffff ff7b f326 e0d5 d0f1  .........{.&....
00000b0: 06b5 529f 9335 59cd 76c8 7a3c 0159 fc29  ..R..5Y.v.z<.Y.)
00000c0: 3cee ffff 7f48 caf9 6e59 3f8e 8a35 52e0  <....H..nY?..5R.
00000d0: 6b6c ad59 6d00 47cc 3934 488f aff6 5119  kl.Ym.G.94H...Q.
00000e0: 072b 0d9d deb8 ea10 11df d078 5db7 abc6  .+.........x]...
00000f0: 78df d367 1d58 71f9 ff2b 5163 7652 182e  x..g.Xq..+QcvR..
0000100: b774 e25d 3341 1d52 c607 a936 528c 1a55  .t.]3A.R...6R..U
0000110: e04e 8d15 0759 0035 74fb 60dd a644 05fb  .N...Y.5t.`..D..
0000120: 9ea8 8383 5838 cf25 6315 9a73 a600 8d6d  ....X8.%c..s...m
0000130: 958c 43ae 57da 1bd0 f38e aca0 68ba 7b9d  ..C.W.......h.{.
0000140: 29b1 1bf4 0f1c aecb 86a9 6b85 e4d7 4a22  ).........k...J"
0000150: 6b08 22c4 edc2 de62 6ced 8c9d c923 5ff9  k."....bl....#_.
0000160: ead2 1be7 4201 92a2 402a 4ab2 0d50 8984  ....B...@*J..P..
0000170: 8a59 f25d 768e 05c6 11d8 990f bddc 2552  .Y.]v.........%R
0000180: 2ae8 ddd0 5cca 2c73 61eb 12af ac19 ae20  *...\.,sa......
0000190: cc0f 2fcb 7a11 d4d5 7e16 66d6 f581 d81d  ../.z...~.f.....
00001a0: 98a5 c5bf b63c 7f74 6a1d 1d63 3fdc c9f4  .....<.tj..c?...
00001b0: 506a 5b22 c7ec d67c 46d1 0965 9a09 bbb3  Pj["...|F..e....
00001c0: 89ed a733 d1fd d114 0013 21cf add0 16ee  ...3......!.....
00001d0: 88fa 1880 59df b39c e1aa d710 e441 3424  ....Y........A4$
00001e0: 3852 a46b 3e36 2566 f0b0 bee0 9d8f 9285  8R.k>6%f........
00001f0: 391b 1d8e 870a c1c9 645a 721e 4a0b d4c8  9.......dZr.J...
0000200: 2182 4393 2b1c 7fc8 d1cb 4f31 0290 cd11  !.C.+.....O1....
0000210: 2446 5eb1 9d26 4df0 dbe4 a71b 4caa 102a  $F^..&M.....L..*
0000220: 81e5 6f34 d1a3 0614 6f79 8fc4 cd06 d365  ..o4....oy.....e
0000230: fc38 29f4 a72e 31cd 532a 670d 06f2 4bb8  .8)...1.S*g...K.
0000240: f1ae f2ef e2f6 7543 3f8d 9f74 30ce dcba  ......uC?..t0...
0000250: 662f 3ea2 e9bf a895 f29b b17c e472 b4dd  f/>........|.r..
0000260: 3bbd 0ed6 50f9 eadf 85cb 7648 882f 0f22  ;...P.....vH./."
0000270: 829e 723a 2c87 5740 f890 4724 1fe8 58e7  ..r:,.W@..G$..X.
0000280: 5375 f9db a740 c166 e098 c4c2 3d9b dad3  Su...@.f....=...
0000290: e92b bf71 1e87 0437 1396 0fbf 8eed 2ef8  .+.q...7........
00002a0: 7d5f 6767 1bf9 826a 2692 c9e5 78aa 724a  }_gg...j&...x.rJ
00002b0: ceb6 7486 2a60 8698 35b3 20cf bd43 ea65  ..t.*`..5. ..C.e
00002c0: 39a7 b415 233c b945 eed0 0db8 18df ee0c  9...#<.E........
00002d0: df0d 3719 5c74 fa56 7ec9 588d 22c4 6dbc  ..7.\t.V~.X.".m.
00002e0: 6823 4536 2614 f9e0 40cd beb8 1aff 5f17  h#E6&...@....._.
00002f0: c6b2 5710 18e2 1c93 34b3 d219 9c83 d11f  ..W.....4.......
0000300: 6125 fedb 975b 51a7 c9fc 23f7 7733 fa0e  a%...[Q...#.w3..
0000310: 970d 9c2d 8fc3 8edd 4bf9 db23 eff1 434e  ...-....K..#..CN
0000320: d54f 1f2a d51a ddf1 a5a6 9687 8afa 8973  .O.*...........s
0000330: 43c1 8292 c2e1 ef0c 71dd f7de 0986 9f93  C.......q.......
0000340: 3dd5 f200 b3dd f709 7ab3 dad3 7d5d a522  =.......z...}]."
0000350: 0730 62a9 e817 4f56 b5b3 a216 edb9 8b90  .0b...OV........
0000360: 52c0 c10c 9f8a f7f5 6500 1ee1 347b a756  R.......e...4{.V
0000370: 0566 21f6 0290 4282 55eb 0788 b508 a5e7  .f!...B.U.......
0000380: 6971 85e9 f512 da0f ee34 3725 fb62 4f8d  iq.......47%.bO.
0000390: 4bc2 8f19 78ee 4db6 e9db f84d 8e09 66f7  K...x.M....M..f.
00003a0: 9a0c 5826 4075 e173 4f77 4652 6ef7 94ea  ..X&@u.sOwFRn...
00003b0: f2ac 935b 836a 887b 3aa8 8516 1a10 8098  ...[.j.{:.......
00003c0: b4f2 5e19 fd63 5ba5 c9b5 940d c2b0 0d9c  ..^..c[.........
00003d0: ae03 9e07 44ae edeb 9339 ca27 f7a9 f395  ....D....9.'....
00003e0: 1dca 317b 93ce eb79 02cf 006b 6ab0 16dd  ..1{...y...kj...
00003f0: 1854 17d6 1e95 5a39 2881 204d 1cdd 040a  .T....Z9(. M....

다음은 출력 PNG입니다.

SPIHT에서 복원 된 이미지

아래는 더 쉬운 답변입니다.


FIASCO 는 Fractal Image and Sequence COdec의 약어로 손실 프랙탈 압축을 매우 효율적으로 구현합니다.

원래 PNG를 분기별로 축소 한 다음 Netpbm v. 10.68 pngtopnm에서 PNM으로 변환 한 다음 FIASCO로 변환 하여 969 바이트 이미지 파일을 얻었습니다. 그런 다음을 사용하여 PNM으로 다시 변환하고을 사용 하여 원래 크기로 업 스케일 하고 PNM 파일로 저장 한 다음 PIL에서 읽습니다. 내 스크립트는 다음과 같습니다 (1KB).pnmtofiasco -q=14 -z=3fiascotopnmpamscale -xyfill 386 320

0000000: 6669 6173 636f 746f 706e 6d3c 2874 6169  fiascotopnm<(tai
0000010: 6c20 2d6e 2b32 2024 3029 7c70 616d 7363  l -n+2 $0)|pamsc
0000020: 616c 6520 2d78 7966 696c 6c20 3338 3620  ale -xyfill 386
0000030: 3332 303e 6f2e 706e 6d0a 4649 4153 434f  320>o.pnm.FIASCO
0000040: 0a6f 2e66 636f 0001 0040 0040 000f ffff  .o.fco...@.@....
0000050: e70b 0140 2803 0280 2463 5a00 ab40 0000  ...@(...$cZ..@..
0000060: 005e 44f8 62cb a400 4461 e539 a199 2d9c  .^D.b...Da.9..-.
0000070: b01f 01fe 9327 7fea 572c e1c3 5652 e81a  .....'..W,..VR..
0000080: a86f 85d2 7617 762f 6746 6e4d 30af 7673  .o..v.v/gFnM0.vs
0000090: 2266 86fd eea4 0ef0 3996 8c37 e86e 663e  "f......9..7.nf>
00000a0: dc9d 85cc 2e76 80e1 53ac a466 fa66 a19a  .....v..S..f.f..
00000b0: 8268 7a8a 9d84 596c f5b3 a99e c4c8 292f  .hz...Yl......)/
00000c0: 11ec f5d5 8c38 b3a4 4c34 e848 5e4e f00f  .....8..L4.H^N..
00000d0: bc72 e118 412e 3fa1 9a96 0452 95c4 5378  .r..A.?....R..Sx
00000e0: fba4 e181 438b 5a67 90ee cfd6 47ea 59fc  ....C.Zg....G.Y.
00000f0: bfdc 3615 fc5c 4976 c1d0 50d0 aadc 1462  ..6..\Iv..P....b
0000100: fc50 89ab abde bede fc38 4329 838f d649  .P.......8C)...I
0000110: 8998 57ae e122 c13b b4a5 7110 0e2f de80  ..W..".;..q../..
0000120: 338b bf2f 9e61 2bfd 6401 13f8 2621 06e9  3../.a+.d...&!..
0000130: 3acd 8085 f0e0 2002 9d4f e445 f6e7 18f3  :..... ..O.E....
0000140: 19a4 4649 3a00 d223 1547 45a7 d097 06fb  ..FI:..#.GE.....
0000150: 9a25 119e 978b 88b8 d8fe 87d8 43c5 4d89  .%..........C.M.
0000160: 61ea 8314 99a1 1046 5c13 1026 375e cff2  a......F\..&7^..
0000170: 9c12 fca6 ebab 23fe 707f 2d18 82af 7302  ......#.p.-...s.
0000180: df00 57c7 5a43 3818 4787 5f7a 0d0c 53b5  ..W.ZC8.G._z..S.
0000190: cc11 c562 840b 11f3 9ad3 c938 9e58 9af1  ...b.......8.X..
00001a0: 40a2 6aab ac36 8a0c d5e6 fc8b b1a7 8dfc  @.j..6..........
00001b0: 4bb9 5404 6468 c037 a862 f313 6e6b d330  K.T.dh.7.b..nk.0
00001c0: a88c 8ef0 cd60 4c67 3232 9a08 3d46 2a45  .....`Lg22..=F*E
00001d0: 7eb0 5d80 c2ba f302 a50d 234c 2e81 bb3f  ~.].......#L...?
00001e0: 4123 a172 d9a7 87ff 5289 fca4 f9f6 788b  A#.r....R.....x.
00001f0: 587e 1021 5ead ae02 4eb5 891a 0a89 2a2a  X~.!^...N.....**
0000200: 8b0f a66c a494 a63b 4e2d 3a83 a991 bc9d  ...l...;N-:.....
0000210: 8d3c e129 e074 7028 9647 d8e6 e216 f109  .<.).tp(.G......
0000220: 8664 ba00 7cb3 76ed ac31 68fe b179 9b22  .d..|.v..1h..y."
0000230: 40f0 4fde 6e43 2f1f fe7d bf05 7ac5 b05d  @.O.nC/..}..z..]
0000240: 8be6 9ab1 c63b 6977 b019 0b5d 75dc 923c  .....;iw...]u..<
0000250: e36c 55c7 e8d1 9395 75e5 cf8a 8af0 2757  .lU.....u.....'W
0000260: 9b6a 837c 108c 2660 8360 8c4e 17da 8f06  .j.|..&`.`.N....
0000270: e6f7 a31c 2df4 f8e6 c1e9 cc03 7a1e 9c95  ....-.......z...
0000280: d1a3 e0bc 1514 c46c cfc1 8f2a 1b3e 2ff1  .......l...*.>/.
0000290: beea b692 45be d8e0 a0ab c3a6 5722 9602  ....E.......W"..
00002a0: bce0 0859 4939 0506 9a03 9373 0af7 5331  ...YI9.....s..S1
00002b0: e050 fa65 e927 ab84 dd3e 4f78 ef60 c881  .P.e.'...>Ox.`..
00002c0: 8220 a924 d201 d212 8720 9b24 3099 6613  . .$..... .$0.f.
00002d0: bc23 57b9 dc91 f9d4 2416 1470 7d47 8c01  .#W.....$..p}G..
00002e0: c8dd 4a9b 1140 bdaa 7679 2943 696d 7b74  ..J..@..vy)Cim{t
00002f0: acc4 ab69 36b3 ce4b 67c8 8d1c 95ad 4eef  ...i6..Kg.....N.
0000300: 738b fd00 0f83 77c0 513d a114 615c c007  s.....w.Q=..a\..
0000310: bd08 2bc0 6717 f35c 0125 4379 03ce e36b  ..+.g..\.%Cy...k
0000320: 5be5 d087 b50e b47f 96bf 3593 73d8 c8a2  [.........5.s...
0000330: 5d6f 5fb5 7c7d ed7b 3814 e844 6f11 5ff2  ]o_.|}.{8..Do._.
0000340: c2d3 55c3 961e 4ccd e45b 39a7 cd2f f9d0  ..U...L..[9../..
0000350: c218 a9eb a0c5 b38d f1aa b279 6854 e47e  ...........yhT.~
0000360: a988 3876 5302 a832 0093 e10e c225 4278  ..8vS..2.....%Bx
0000370: c760 f39d bd1f b941 fc98 03bf 5082 d39c  .`.....A....P...
0000380: f97b 06a8 cc7f 75bf 2496 8660 c553 29e9  .{....u.$..`.S).
0000390: 0a11 463c cd8d 6ba4 93b2 ed22 2ce8 8b58  ..F<..k....",..X
00003a0: 84b9 c243 3e18 7948 8a73 0547 23aa 9991  ...C>.yH.s.G#...
00003b0: 8629 a135 669c 294e f0ce ed95 975d 085d  .).5f.)N.....].]
00003c0: 68ba 566c f6f9 f555 2d68 b3da 91a8 9234  h.Vl...U-h.....4
00003d0: e284 d7e5 25a0 6618 3a5f f649 a3c8 f089  ....%.f.:_.I....
00003e0: 2514 6c21 9119 e4e4 5bba c1f1 49f1 16d0  %.l!....[...I...
00003f0: 979a 88b1 3513 23ae 84e6 9080 82a9 7f0a  ....5.#.........

실제로, 나는 Windows cmd에서 이것을 먼저 했지만 스크립트는 1KB에 맞지 않았습니다. 그런 다음에 다시 썼습니다 bash. 다음은 출력 PNG입니다.

FIASCO에서 복원 된 이미지


두 개의 답변을 한 게시물에 포함시키는 대신 다른 답변을 추가해야한다고 생각합니다.
anatolyg

@anatolyg 이것은 두 가지 답변이 아니며 두 가지 버전의 한 가지 방법이며 다른 버전을 사용하여 개선됩니다.
niutech

9

루비, 7834.38

이것은 재미 있었다!

루비 생성기 프로그램을 사용하여 다음과 같이 루비 스크립트를 작성했습니다.

  • 흰색 386x320 직사각형을 그립니다.
  • 사각형을 목록에 넣으십시오. 루비 파일을 빌드하여 해당 사각형 목록을 생성하십시오 (이 초기 경우에는 하나만)
  • 생성 된 루비 파일이 1024 바이트 미만인 동안 :

    • 가장 높은 점수를받은 사각형에 대한 목록 검색
    • 사각형을 가로와 세로로 반으로 줄이십시오.
    • 목록에서 해당 사각형을 더 낮은 점수로 교체하십시오.
    • 루비 파일을 빌드하여 해당 사각형 목록을 생성하십시오.

내 스코어링 알고리즘은 무작위로 많은 색상을 샘플링하고 ORIGINAL.png와 가장 작은 차이를 생성하는 색상을 선택합니다. 확률이 높으므로 스크립트를 여러 번 다시 실행하여 최저 점수 결과를 선택했습니다.

지금까지 내 최고의 스크립트는 다음과 같습니다.

require 'chunky_png'
def r(w,x,y,z,k)
c=k*256+255
$p.rect(w,x,y,z,c,c)
end
$p=ChunkyPNG::Image.new(386,320,255)
r(97,160,192,199,7374989)
r(0,80,48,159,7045519)
r(193,160,289,199,6716560)
r(0,220,192,239,2963277)
r(338,80,385,159,8623770)
r(0,0,48,79,4938368)
r(49,0,96,79,4212844)
r(193,240,385,259,3756895)
r(193,260,385,279,3094854)
r(290,0,313,159,5271706)
r(314,0,337,159,8555664)
r(290,160,337,199,7570058)
r(338,160,385,199,3883603)
r(193,0,289,39,4674429)
r(193,40,289,79,5398918)
r(0,240,96,319,2566701)
r(97,240,192,319,2041898)
r(193,200,289,239,3424622)
r(290,200,385,239,4348033)
r(97,80,144,159,6124943)
r(145,80,192,159,5926550)
r(97,0,192,39,4609663)
r(97,40,192,79,5334923)
r(193,280,385,299,3619650)
r(193,300,385,319,3815999)
r(49,80,96,119,5334650)
r(49,120,96,159,2767683)
r(0,200,96,219,3951445)
r(97,200,192,219,5860985)
r(0,160,48,199,5468034)
r(49,160,96,199,2503733)
r(193,80,289,119,5599124)
r(193,120,289,159,6189974)
r(338,0,385,39,7900038)
r(338,40,385,79,11317092)
$p.save('o.png')

다음 이미지를 생성하여 7834 점을 얻었습니다.

제레미의 출전 : 7834 점

내 알고리즘이 어떻게 작동하는지 확인하려면 사각형을 나누는 방법을 보여주는 애니메이션 GIF가 있습니다.

제레미의 작품 : 건축 방식

내 코드는 https://github.com/jrotter/starry_night_contest의 GitHub에 있습니다.


1
문제에 다른 접근 방식을 취한 +1 올바르게 이해하면 각 사각형을 덮는 영역의 평균 색상으로 각 사각형을 채우면 약간의 노력을 절약하고 정확성을 얻을 수 있습니다. 원본에서 제곱 거리를 최소화하기 때문입니다.
Nathaniel

페어 포인트. 나는 반복 알고리즘에 더 집중하고 각 단계에서 점수 매기기에 대해 너무 열심히 생각하지 않았습니다. 나는 평균을 시도하는 것을 고려했지만, (제곱하게) 그것이 제곱 거리에 어떤 영향을 미치는지 확실하지 않았으며 결코 테스트하지 않았습니다.
제레미

7

자바, 9215.38294502

Base64로 인코딩 된 문자열 (368 자 포함)에서 크기가 8x6 픽셀 (!) 인 GIF로 이미지를 읽고이를 쌍방향으로 확대합니다.

import java.awt.*;
import java.awt.image.*;
import static java.awt.RenderingHints.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
class S
{
    public static void main(String[] a) throws Exception
    {
        BufferedImage r=new BufferedImage(386, 320, 2);
        Graphics2D g=r.createGraphics();
        g.setRenderingHint(KEY_INTERPOLATION,VALUE_INTERPOLATION_BILINEAR);
        g.drawImage(ImageIO.read(new ByteArrayInputStream(Base64.getDecoder().decode("R0lGODlhCAAGAPUAABMXFxIfHxQZGBcZHRgcGRwfKhssIB0iMC4kGicwOy06PzA6OS8zSjY7SztHQThZVzJCcFdgUFJhdFZrfSo7ny1AgC9Mjz1XjT1ZqkRNgUFVj0BeiEJUmEFhjkJtnlJwnGd8mXF+gmF9plyGqW6Gk26KmHSJmnuSn32Zl6C1e7u/dYGNkYCVnZOahI6gmYaiuhMXFxMXFxMXFxMXFxMXFxMXFxMXFxMXFxMXFxMXFxMXFxMXFxMXFxMXFxMXFxMXFywAAAAACAAGAEUIOQBfZMBQwYQGFCkoEACQQIKDBxFIGOAA4sIHES0ghJjQwQKLESpWLDjhwUWJDQ0UBBCAYEABBgcCAgA7"))), 0, 0, 386, 320, null);
        g.dispose();
        ImageIO.write(r, "PNG", new File("RESULT.PNG"));
    }        
}

편집 : 의견의 요청에 따라 결과 가이 이미지에 표시됩니다.

별이 빛나는 밤


2
이미지를 게시 할 수 있습니까?
Nathaniel

7

파이썬 3, 5797.125628604383

압축 프로그램은 먼저 이미지의 비트를 자른 다음베이스 2를베이스 36으로 변환합니다.

디코딩 프로그램은이 작업을 반대로 수행하고 이미지 크기를 조정합니다.

from PIL.Image import new
K=bin(int('29zoubbejrojv5nc2c09w8008mmc93di8nsq75g5ep83xtelg14ua2jvhm6ez5gry7isq1g82qvqezkbvl0ibovc6kltldjgklqeg7g5oyfefamfrvei712jnrd8a2ften12xme2bfh654a6r8kfe5xtckpxxt60pujhs02r0zt9a733ofmyhsprmxw9max72f9az1cpsa48szbbi3cl0ah4tusuuin49vtzambzv8omzfa0lt9wkot1p17trvvvvwmrf31g14vvs59ea3uo3k2ycgibgxwnd7qbv6enrynzwhng30thklvk4mvrhf66ba0gqnyf0do6xn9xfjker8fnpr79zac6tsowm6oohszjc16k3a8iisv7yj7i67aq6r7f629zldmv9l816azzu96jikqaw02icsv9b79yy73gbvw0scid9266hph04m6nb3lae5a59d6djauw38i1wtd7qqn17uxugi4r52y0cfpjsb444uj30gih7jmek26uhdn41w2b2g0y34xl1kgxegkjtj6iq1u3k3zk34qtw76hysxj6jl7qrj908pa5vcao6m4i4m2h8sg4ir10mh1y315bakfag611ilwy7y569jh18ydabo5zgdyr7m5vcc9dqxj63nu2s67urqui8gnqu9u40hahyehqu9ugtqf8ab0m1v4fu5pr88k6ch7ep0echekocg78za1f74ladjgm',36))[3:]
a=[]
for x in range(0,len(K),18):
    Y=K[x:x+18]
    y=[Y[0:6],Y[6:12],Y[12:18]]
    for x in range(0,3):
        y[x]=int(y[x],2)*8
    a.append(tuple(y))
i=new('RGB',(16,13))
i.putdata(a)
i.resize((386,320),1).save('2.png')

여기에 이미지 설명을 입력하십시오


모호한 똥!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.