자바 스크립트 (ES6) 135 133 125 122
f=s=>s.split(" ")[e="every"]((l,i,a)=>[...l][e]((c,j)=>!(-[-1,0,k=1][e]((y,m,q)=>q[e](x=>k+=(a[i+y]||0)[j+x]=="X"))-c+k)))
함수에 문자열로 입력을 제공하십시오.
f("XX4X2 5X6X4 XX6XX 4XX54 2X4XX");
자세한 내용은 아래 이전 버전을 참조하십시오. 새 버전은 for
루프를 every
호출로 대체하고 대신 변수 e="every"
를 사용하여 수행 someArray[e](...)
합니다.someArray.every(...)
.
또한, 카운터는 k
지금에 인덱싱 1
때문에 것을 k+=...
유지하기 위해, 표현은 항상 truthy입니다 every
루프 실행. 우리 는 연산에 의해 반환 된 결과 (숫자에 의해 강제되는 ) 를 1
빼서 그 여분 을 제거합니다 .true
1
every
[-1,0,k=1][e](...)
구 버전:
f=s=>s.split(" ").every((l,i,a)=>[...l].every((c,j)=>{q=[-1,k=0,1];for(y of q)for(x of q)k+=(a[i+y]||0)[j+x]=="X";return c=="X"||k==c}))
공백과 주석이있는 코드 :
f=s=>s.split(" ") // split on spaces
.every((l,i,a)=> // for every line
// l: line string, i: line number, a: whole array
[...l].every((c,j)=>{ // for every character
// c: character, j: index in string
q=[-1,k=0,1]; // define counter k=0 and q=[-1,0,1]
for(y of q) // use q to loop adjacent spaces
for(x of q)
k+= // add the following boolean to k:
(a[i+y] // from line number i+y...
||0) // (or a dummy zero, to prevent lookups on undefined)
[j+x] // ...get index j+x from the above value...
=="X"; // ...and compare it to "X"
return !(k-c) // after the loop, this character passed if
// the char equals the number of counted X's (so k-c is 0)
// or it is an X itself (so `k-c` is NaN)
})
)
JavaScript every
배열 메소드는 콜백을 가져와 콜백을 배열의 모든 요소에 적용합니다. 콜백이 잘못된 값을 every
반환 하면 호출이를 반환합니다 false
.
JS의 부울은 추가의 일부일 때 1 또는 0으로 강제됩니다. 각 주변 공간에 대해 값을 비교 한 부울 결과를 "추가" X
한 다음 해당 값을 k
표현식 의 카운터 에 추가합니다 k += (... == "X")
. 따라서로 계산 하고로 계산 하기 때문에 k
주변 X
의 개수를 포함 합니다.true
1
false
0