낙하산


16

다음은 배와 스틸 슈트 의 5 가지 이미지입니다 .

A : B : C : D : E :배 A 배 B 배 C 배 D 배 E

이것들은 썸네일 일뿐입니다.

(나는 Algodoo 로 이것을 만들었다 .)

이 이미지 클래스에는 항상 다음과 같은 속성이 있습니다.

  1. 그것들은 항상 흰색 배경을 가진 400 × 400 픽셀입니다. (SE 이미지가 손실 압축되므로 정확하게 흰색이 아닐 수 있습니다.)
  2. 그들은 1에서 4 개의 동일한 배를 가지고 있으며, 각각은 거의 모든 방향으로 회전하고 위치합니다.
  3. 그들은 이미지의 하단에 도달하는 하나의 수직 강철 슈트를 가지고 있습니다.
  4. 슈트의 하단을 제외하고 슈트 및 배 경계 상자 ( 경계 상자 예 )는 이미지 경계를 절대로 터치하거나 벗어나지 않습니다.
  5. 배의 경계 상자는 서로 겹치거나 슈트와 겹치지 않습니다.
  6. 배는 B , CD 에서처럼 슈트의 경사 부분 아래에있을 수 있습니다 . (슈트의 경계 상자가 배의 경계 상자와 겹칠 수 있습니다.)
  7. 슈트의 모든 바운딩 박스가 그 위에 자유롭게 장착 될 수있는 충분한 공간이 있고 ( "적합하게 맞지 않는"경우는 테스트되지 않음) 컬럼 부분의 일부가 보이는 한 슈트는 수평 및 수직 위치를 가질 수 있습니다.

도전

그러한 이미지를 가져 와서 같은 장소에 슈트가있는 다른 400x400 이미지를 출력하는 프로그램을 작성하십시오. 그러나 배가 재배치되어 모두 슈트 위에 있습니다 (따라서 그것에 빠지고 주스를 마실 수 있습니다).

출력 이미지의 요구 사항은 다음과 같습니다.

  1. 입력 이미지의 모든 배는 깔때기의 왼쪽과 오른쪽 가장자리 사이에서 슈트 위에 있도록 재배치해야합니다. (가장자리가 이상 하지 않습니다 .)
  2. 각 배는 반드시 회전 각도를 유지해야합니다. (따라서 배를 자르지 말고 잘라 내야합니다.)
  3. 배는 서로 또는 슈트와 겹치거나 닿아서는 안됩니다. (배 경계 상자 는 겹칠 수 있습니다.)
  4. 배는 이미지 경계를 건드 리거나 벗어나지 않아야합니다.

다음은 5 개의 샘플 이미지에 유효한 출력 예입니다.

A : B : C : D : E :밖으로 A 밖으로 B 밖으로 C 밖으로 D 밖으로 D

이것들은 썸네일 일뿐입니다.

E 에 대한 입력 이미지 는 이미 유효한 출력이지만 기술적으로 필요하지 않을 때 배를 재배 열하는 것은 괜찮습니다.

세부

  • stdin / command line / function call을 통해 이미지의 파일 이름 또는 원시 이미지 데이터를 가져옵니다.
  • 선택한 이름의 파일로 이미지를 출력하거나 원시 이미지 파일 데이터를 표준 출력으로 출력하거나 단순히 이미지를 표시하십시오.
  • 일반적인 무손실 이미지 파일 형식을 사용할 수 있습니다.
  • 그래픽 및 이미지 라이브러리가 사용될 수 있습니다.
  • 여기저기서 몇 개의 잘못된 픽셀 (손실 또는 무언가로 인한)은 큰 문제가 아닙니다. 시각적으로 잘못된 것을 말할 수 없다면 아마 괜찮을 것입니다.

바이트 단위의 가장 짧은 코드가 이깁니다. Tiebreaker는 최고 투표 게시물입니다.


칸 아카데미 계정이 있는데이 문제를 해결하기에 완벽 해 보입니다. 칸 아카데미에서 해결할 수 있습니까? 하나의 합병증 만 있습니다 : 외부 이미지는 허용되지 않습니다. 다행히 나는 통해 이미지를 실행할 수있는 칸 아카데미 친화적 인 데이터로 변환 할 수 있습니다. 이것이 허용됩니까?
BobTheAwesome 2016 년

@BobTheAwesome JavaScript 답변을 게시 하시겠습니까? 400x400 이미지를 입력하고 출력해야하지만 괜찮습니다. KA에서 작업 한 방식을 보여주기 위해 작업을 게시 할 수 있지만 400x400 이미지에서 작동하지 않으면 승자로 인정하지 않을 수 있습니다.
Calvin 's Hobbies

완벽한 우연의 일치; 칸 아카데미는 Javascript + Pjs에 대한 기본 400x400px 캔버스를 가지고 있습니다.
BobTheAwesome 2016 년

아니!! 400x400 이미지에서 Imagenator가 매우 느립니다 !!
BobTheAwesome 2016 년

답변:


6

파이썬 2.7, 636 바이트

import sys;from PIL.Image import*
_,m,R,I,p,H=255,400,range,open(sys.argv[1]).convert('RGB'),[],0
w,h=I.size;W,A,P,L=(_,_,_),[(x,y)for x in R(w)for y in R(h)],I.load(),I.copy()
try:
 while 1:
    s,x,y,X,Y=[[a for a in A if P[a][0]<50][0]],m,m,0,0
    while s:c=(a,b)=s.pop();x,y,X,Y=min(x,a),min(y,b),max(X,a),max(Y,b);P[c]=W;s+=[n for n in[(a+1,b),(a,b+1),(a-1,b),(a,b-1)]if n in A and P[n]!=W]
    p+=[((x,y,X,Y),X-x,Y-y)]
except:0
def G(a):r,g,b=P[a];return r==g==b and r<_
g=[a for a in A if G(a)]
(z,t),W=g[0],max([x for x,y in g]);t-=1
for r,w,h in p:
 if z+w>W:z,_=g[0];t-=H;H=0
 I.paste(L.crop(r),(z,t-h,z+w,t));z+=w;H=max(h,H)
I.show()

편집 : 이제 이미지를 처리하기 전에 알파 채널을 제거하고 필요한 경우 여러 행에 배를 정렬합니다.

제작 된 이미지 :

ㅏ 비 씨 D와 E

수직 배 (내 컴퓨터에서 약 3 분 소요)가있는 경우 :

테스트 케이스 세로


1
이미지가 전후입니까? 그렇다면 당신이 BE에 대해 잘못된 것들을 취했다고 생각합니다 ...
Sp3000

왼쪽에 이미지를 입력하고 오른쪽에 이미지를 출력합니다. 크기 조정 및 복사 붙여 넣기로 인해 픽셀이 완벽하지는 않습니다. 스크립트의 작동 방식에 대한 힌트 만 제공합니다.
dieter

모든 배가 수평 이라면이 효과 있습니까?
Calvin 's Hobbies

실제로 아니오 ... 두 가지 이유로 :이 특정 이미지에는 알파 채널이 있으므로 스크립트를 수정하여 이미지를 먼저 변환하기 때문에 무한 루프에 빠집니다. > 다시 넣어 - 나는 여러 행에 맞 춥니 다 배는 그 코드를 제거하는 또 다른 이유를
다이어트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.