Mathematica, 180 바이트
(f=Flatten@#;p=Partition)[If[Tr[1^VertexComponent[r~Graph~Cases[##&@@p[#,2,1]&/@Join[g=p[r,5],g],{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" ":>a<->b],#]]<3,f[[#]],"x"]&/@(r=Range@25),5]&
설명:
(f=Flatten@#;p=Partition)[
If[
Tr[1^VertexComponent[
r~Graph~Cases[
##&@@p[#,2,1]&/@Join[g=p[r,5],g],
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" ":>a<->b
],
#
]]<3,
f[[#]],
"x"
]&/@(r=Range@25),
5
]&
5x5
배열 을 받아들이는 순수한 함수 . 접미사 전치 연산자를 나타내는
3 바이트 개인용 문자 입니다.U+F3C7
\[Transpose]
(f=Flatten@#;p=Partition)
: 입력 목록을 평평하게하여에 저장합니다 f
. 설정 p = Partition
하고 돌려줍니다.
g=p[r,5]
: 배열입니다 {{1,2,3,4,5}, ..., {21,22,23,24,25}}
(이것이로 r
설정 되었기 때문입니다 Range@25
).
Join[g=p[r,5],g]
:의 행과 열 목록 g
.
p[#,2,1]&
: 겹치는 #
길이의 하위 목록 으로 목록을 분할하는 순수한 기능 ; 즉,에서 인접한 쌍의 목록입니다 .2
1
#
##&@@p[#,2,1]&
:를 반환한다는 점을 제외하면 위와 동일합니다 Sequence
.
##&@@p[#,2,1]&/@Join[g=p[r,5],g]
:의 행과 열의 이전 기능을 매핑 g
하여에 인접한 모든 항목의 목록을 얻습니다 g
. 내 직감은 더 짧은 방법이 있다고 말합니다.
r~Graph~Cases[...]
: 정점이 정수 1, ..., 25
이고 g
입력 배열에서 동일한 대응하는 항목이있는 인접한 항목 사이의 가장자리 인 그래프 (이외의 " "
)
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: 패턴과 일치 {a,b}
하도록 f[[a]] == f[[b]]
(동일 입력 배열의 값)는 어느 동일하지 " "
. 바이트 A = f[[a]]
를 저장하도록 설정하십시오 1
.
...:>a<->b
: 모든 경기를 a에서 b까지의 방향이없는 가장자리로 바꿉니다.
VertexComponent
: 첫 번째 인수 (그래프)에서 두 번째 인수 (정점)의 연결된 컴포넌트를 반환합니다.
Tr[1^VertexComponent[...]]
: 연결된 구성 요소의 크기입니다. 1
에서 바이트를 저장합니다 Length@VertexComponent[...]
.
If[Tr[...]<3,f[[#]],"x"]&
: 항목 소요 순수 기능 #
의를 g
. 연결된 컴포넌트의 크기가보다 작 으면 3
입력의 해당 항목으로 교체하십시오. 그렇지 않으면로 교체하십시오 "x"
.
(f=Flatten@#;p=Partition)[...,5]
: 마지막으로 결과를 5x5
배열로 바꿉니다.