첨부 , 51 바이트
{[3,3]&Rotate[Sample[{Sum@_=_2}&_\BinBelow@8]'_,4]}
온라인으로 사용해보십시오!
설명
Galen의 J / APL answer 와 유사하게 , 기본 기술은 정확한 수의 광산으로 1과 0의 배열을 생성하고, 끝에 입력을 추가하여 입력을 삽입하고, 입력이 중심에 놓 이도록 배열을 회전시키는 것입니다. 3x3 매트릭스로 재구성.
1 부 : 이진 배열 생성
이 작업을 수행하는 데는 여러 가지 방법이 있지만 나는 주로 두 가지 유형, 즉 무차별 대입과 선택에서 발생했습니다.
기본 무차별 대입 방법은 다음과 같습니다.
NestWhile[{Random[8&2]},0,{Sum@_/=_2}&_]
이것은 8 이진 숫자 ( Random[8&2]
) 의 임의의 배열을 생성 하는 반면 그 합은 입력과 동일하지 않습니다 {Sum@_/=_2}&_
. 다음은 코드에서 강조된 부분이 "작동하게하기"때문에 약간 장황합니다.
NestWhile[{Random[8&2]},0,{Sum@_/=_2}&_]
^ ^^^^^ ^^^^
그리고 나는 그 아이디어를 버렸다.
선택이 더 흥미 롭습니다. 기본 개념은 BaseBelow[b, n]
내장 을 사용하여 b
너비 의 모든 기본 정수 목록 n
(숫자 배열)을에서까지로 생성 0
하는 것 b^n-1
입니다. 예를 들어, BaseBelow[3, 2]
너비가 2 인 모든 3 진 정수를 생성합니다.
A> BaseBelow[3, 2]
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
우리는 특히 BaseBelow[2, 8]
폭 8의 모든 이진 정수에 사용 합니다. 이들은 모든 길이의 가능한 모든 지뢰밭을 나타냅니다. 이것이 첫 번째 단계입니다.
두 번째 단계는 N
1이있는 모든 배열을 선택하는 것 N
입니다. 여기서는 입력 위치 입니다. 첫 번째 아이디어는이 영어 문장을 직접 Attache로 번역하는 것이 었습니다.
Chunk[SortBy[Sum,BaseBelow[2,8]],Sum]@N@1
그러나이 방법은 앞서 언급 한 방법보다 1 바이트 길어 졌을뿐만 아니라 반복성이 높으며 아직 무작위 화되지도 않았습니다. 물론, BaseBelow
호출 방식을 재구성하여 1 바이트를 절약 할 수 는 있지만 접근법을 사용하는 것은 가치가 없습니다.
그래서 나는 하나의 돌로 두 마리의 새를 죽이고 Shuffle
기반 접근법을 사용하기로 결정했습니다 . 다음은 길이 N
가 유효한 모든 지뢰밭을 무작위로 제공합니다 .
{Sum@_=_2}&N\Shuffle[BaseBelow&8!2]
그런 다음해야 할 일은 첫 번째를 선택하는 것입니다. 그러나 더 잘 할 수 있습니다. 확실히 Sample
필터링 된 배열을 사용하는 것이 더 좋을까요? 이 접근 방식은 다음과 같습니다.
Sample[{Sum@_=_2}&_\BaseBelow[2,8]]
우선 순위가 너무 높기 BaseBelow&8!2
때문에 골프 를 되돌려 야했습니다 \
. 그렇지 않으면, 나는 그 바이트를 잘라 냈습니다.
Sample[{Sum@_=_2}&_\2&BaseBelow@8]
(여기서 이차원 함수를 간결하게 호출하는 또 다른 방법을 발견 x&f@y
했습니다 f[x, y]
.
그러나 이것에도 불구하고, 나는에 대한 별칭이 2&BaseBelow
존재 한다는 것을 기억했습니다 BinBelow
. 그래서 나는 그것을 사용했다 :
Sample[{Sum@_=_2}&_\BinBelow@8]
이것은 원하는 지뢰밭을 생성합니다. 나는 이것이 거의 최적이라고 확신합니다.
2 부 : 배열 형성
앞서 언급했듯이, 사용한 기술은 J / APL 답변과 비슷하므로 너무 자세하게 설명하지 않습니다. MINEFIELD
마지막 섹션의 결과 라고 가정 하십시오. 그러면 기능은 다음과 같습니다.
{[3,3]&Rotate[MINEFIELD'_,4]}
MINEFIELD'_
지뢰밭을 원래 입력과 연결하여 _
다음과 같은 결과를 얻습니다 .
[1, 0, 0, 0, 1, 0, 0, 1, 3]
그런 다음 Rotate[MINEFIELD'_,4]
이 목록 4
을 왼쪽으로 회전 하여 가운데를 배치하십시오.
[1, 0, 0, 1, 3, 1, 0, 0, 0]
마지막 단계는 [3,3]&
목록을 3x3 행렬로 재구성하는 데 사용 됩니다.
1 0 0
1 3 1
0 0 0
1
와0
?