코드 골프 : 카운트 제도


31

이 stackoverflow 질문 에서 영감을 얻은 간단한 콘테스트 :

위성으로 촬영 한 표면 이미지가 제공됩니다. 이미지는 물이 ' .'로, 토지가 ' ' 로 표시된 비트 맵 *입니다. 인접한 그룹이 *섬을 형성합니다. (두 개의 ' *'가 수평, 수직 또는 대각선 이웃이면 인접합니다). 당신의 작업은 비트 맵에 섬의 수를 인쇄하는 것입니다.

싱글 *도 섬으로 계산됩니다.

샘플 입력 :

.........**
**......***
...........
...*.......
*........*.
*.........*

샘플 출력 :

5

우승자는 코드에서 가장 적은 바이트 수의 항목입니다.


나는 논리를 이해하지 못한다. 오른쪽 상단의 별 5 개가 하나의 섬으로 간주되지 않습니까? 그런 다음 예제에는 4 개의 섬이 있습니다.
defhlt

화면이 줄 바꿈되지 않습니다. 각 모서리에 하나의 섬 + 외로운 *
Claudiu

2
그러나 정의에 따르면 섬은 '*'문자 그룹으로, 둘 이상의 의미를 갖습니다.
acolyte

오 페어 포인트. 독립형 *도 섬입니다.
Claudiu

답변:


30

Mathematica 188 185170115130 46 48 자

설명

이전 버전에서는 체스 판 거리가 1 인 위치 그래프를 만들었습니다. GraphComponents그런 다음 구성 요소 당 하나의 아일랜드 수를 공개했습니다.

현재 버전 은 물리적으로 인접한 MorphologicalComponents지역 인 어레이에서 클러스터의 클러스터를 찾고 번호를 지정 하는 데 사용 합니다 1. 그래프는 불필요하기 때문에 코드의 경제가 엄청납니다.


암호

Max@MorphologicalComponents[#/.{"."->0,"*"->1}]&

Max@MorphologicalComponents[#/.{"."->0,"*"->1}]&[{{".", ".", ".", ".", ".", ".", ".", ".", ".", "*", "*"}, {"*", "*", ".", ".", ".", ".", ".", ".", "*", "*", "*"}, {".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."}, {".", ".", ".", "*", ".", ".", ".", ".", ".", ".", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", "*", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", ".", "*"}}]

5


작동 원리

데이터는 배열로 입력됩니다. Mathematica에서이 목록은 목록입니다.

입력 배열에서 데이터는 대체에 의해 1와 로 변환됩니다.0

/.{"."->0,"*"->1}

여기서는 대체 규칙 /.ReplaceAll따르는 접미사 형식입니다 . 이것은 본질적으로 배열을 흑백 이미지로 변환합니다. 함수를 적용하기 만하면됩니다 Image.

Image[{{".", ".", ".", ".", ".", ".", ".", ".", ".", "*", "*"}, {"*", "*", ".", ".", ".", ".", ".", ".", "*", "*", "*"}, {".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."}, {".", ".", ".", "*", ".", ".", ".", ".", ".", ".", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", "*", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", ".", "*"}} /. {"." -> 0, "*" -> 1}]

섬

흰색 사각형은 값이 1 인 셀에 해당합니다.

아래 그림은 접근법이 사용하는 몇 가지 단계를 보여줍니다. 입력 행렬에는 1및 만 포함됩니다 0. 출력 행렬은 각 형태소 클러스터에 숫자를 레이블로 지정합니다. (입력 및 출력 매트릭스를 모두 감싸서 MatrixForm2 차원 구조를 강조했습니다.)

MorphologicalComponents1s를 각 셀의 클러스터 번호에 해당하는 정수로 바꿉니다 .

가공

Max 가장 큰 클러스터 번호를 반환합니다.


섬 표시

Colorize 각 섬을 고유하게 채색합니다.

채색하다


v를 MorphologicalComponents원 하기 때문에 v7에서 작성된대로 작동하지 Image않지만 v9에서도 그렇지 않아야 Max@MorphologicalComponents[d/.{"."->0,"*"->1}]합니까? 즉, 교체가 먼저 완료 되었습니까? Max교체가 완료되기 전에 사라질 것입니까?
Mr.Wizard

@ Mr.Wizard가 맞습니다. 46자는 올바른 숫자입니다.
Murta

@ Mr.Wizard MorphologicalComponents를 적용하기 전에 교체가 수행됩니다. 우선 순위 여야합니다.
DavidC

안녕하세요 @DavidCarraher, 내 요점은 "->"에 관한 것이 아니라 표현 Max@MorphologicalComponents@d/.{"."->0,"*"->1}이 작동하지 않는다는 것 Max@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}]입니다.
Murta

9

루비 1.9 (134 121 113 110)

stdin의 맵 또는 맵의 파일 이름을 첫 번째 명령 행 인수로 가져 와서 섬 수를 stdout에 인쇄합니다. 기본 재귀 플러드 필 사용. 개선은 언제나처럼 환영합니다!

c=0
gets$!
c+=1while(f=->i{9.times{|o|$_[i]=?.;f[o]if$_[o=i+(o/3-1)*(~/$/+1)+o%3-1]==?*&&o>0}if i})[~/\*/]
p c

다윗의 색상 화와 마찬가지로, 당신은 또한 변경하여 다른 섬을 표시 할 수 있습니다 $_[i]=?.$_[i]=c.to_sp cputs$_당신이 뭔가를 줄 것이다 :

.........00
11......000
...........
...2.......
3........4.
3.........4

(적어도 숫자가 다 떨어질 때까지!)

일부 테스트 사례 :

.........**
**......***
...........
...*.......
*........*.
*.........*

5

......*..**....*
**...*..***....*
....*..........*
...*.*.........*
*........***....
*.....*...***...
*.....*...*....*
****..........**
*.........*.....

9

*

1

****
****
....
****

2

**********
*........*
*.******.*
*.*....*.*
*.*.**.*.*
*.*.**.*.*
*.*....*.*
*.******.*
*........*
**********


8
나는 마지막 시험을 좋아한다. 상자 안에서 생각!
Mr Lister

1

C, 169 자

stdin에서 맵을 읽습니다. 재귀 플러드 필 기능이 개선 된 r(j)것처럼 보이지만 운 이 없었습니다.

c,g,x,w;char m[9999];r(j){if(m[j]==42)m[j]=c,r(j+1),r(j+w-1),r(j+w),r(j+w+1),c+=j==g;}main(){while((m[x++]=g=getchar())+1)w=g<11*!w?x:w;for(;g++<x;)r(g);printf("%i",c);}

1

파이썬 2, 223 203 바이트

20 자 공백과 불필요한 괄호를 제거 해준 Step HenArnold Palmer 에게 감사합니다 !

s=input()
c=[(s.index(l),i)for l in s for i,v in enumerate(l)if'*'==v]
n=[set([d for d in c if-2<d[0]-v[0]<2and-2<d[1]-v[1]<2])for v in c]
f=lambda x,p=0:p if x&n[p]else f(x,p+1)
print len(set(map(f,n)))

목록 이해를 사용하면 바이트 수가 줄어들 수 있지만 크게 개선되지는 않았다고 생각했습니다.

여기에서 시도하십시오.

나는 n (이웃) 목록 ​​주위에서 그것을 자르려고 노력했지만 성공하지 못했습니다. 다른 사람이 해당 섹션에 대한 아이디어를 가질 수 있습니다.


PPCG에 오신 것을 환영합니다! 여기 217 바이트 일부 공간을 제거하여이. 파이썬 파서는 정말 관대하다 : P
Stephen

필요한 것보다 더 많은 공백이 있습니다. 사이의 공백을 제거 (s.index(l),i)하고 for, enumerate(l)if, -v[0])<2and, p=0:p,와 bool(x&n[p])else. 주변에 2 개의 그룹이 있기 때문에 인쇄 명세서에 필요한 것보다 더 많은 괄호가 있습니다 set. 편집 : StepHen에 의한 박동은 모바일에서 일을하는 것이 이상적이지 않습니다.
아놀드 파머

@StepHen과 내 제안을 결합하고 조건을 약간 변경하는 203 바이트 .
아놀드 파머

도와 주셔서 감사합니다! 파이썬의 leniency는 나를 놀라게한다
:)

0

펄 5 , 100 바이트

98 바이트의 코드 + -p0플래그의 경우 2 바이트

/.*/;$@="@+"-1;$~="(.?.?.{$@})?";(s/X$~\*/X$1X/s||s/\*$~X/X$1X/s)&&redo;s/\*/X/&&++$\&&redo}{$\|=0

온라인으로 사용해보십시오!

도전에 대한 나의 대답 의 적응 (또는 오히려 단순화) 얼마나 많은 구멍? . 이 코드가 다른 답변에서 어떻게 작동하는지에 대한 설명을 찾을 수 있습니다 (설명하기에는 약간 길기 때문에 전체 설명을 다시 입력하지 않는 것이 좋습니다).


0

파이썬 2, 233 바이트

다른 답변에 비해 너무 깁니다. 이 질문에 대한 나의 대답의 항구 .
온라인으로 사용해보십시오

A=input()
c=0
X=len(A[0])-1
Y=len(A)-1
def C(T):
 x,y=T
 if A[y][x]<'.':A[y][x]='.';map(C,zip([x]*3+[min(x+1,X)]*3+[max(x-1,0)]*3,[y,min(y+1,Y),max(y-1,0)]*3))
while'*'in sum(A,[]):i=sum(A,[]).index('*');c+=1;C((i%-~X,i/-~X))
print c

0

자바 스크립트, 158 바이트

function f(s){w=s.search('\n');t=s.replace(RegExp('([*@])([^]{'+w+','+(w+2)+'})?(?!\\1)[*@]'),'@$2@');return t!=s?f(t):/\*/.test(s)?f(s.replace('*','@'))+1:0}

132 바이트에 대한 비경쟁 ES6 답변 (언어 게시일 과제) :

f=s=>s!=(s=s.replace(RegExp(`([*@])([^]{${w=s.search`
`},${w+2}})?(?!\\1)[*@]`),`@$2@`))?f(s):/\*/.test(s)?f(s.replace(`*`,`@`))+1:0

얼마나 많은 구멍에 대한 내 대답의 포트 ? (그렇습니다. 나는 두 명의 다른 사람들이 그들의 답변을 포팅하는 것을 보았 기 때문에 악 대차에 뛰어 들고 있습니다.)


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