볼프람 언어 (티카) , 339 (316) 358 353 345 바이트
@Doorknob 덕분에 -23 바이트
역 추적을 설명하는 +42 바이트
p[m_]:=StringPartition[#,m]&;l=Range@8;f[n_]:=Check[w=(8#2+#1-8)&@@@({LetterNumber@#,FromDigits@#2}&@@@(p@1/@p[UpTo@2]@n));g=Graph[Sort/@UndirectedEdge@@@Position[Outer[EuclideanDistance@##&,#,#,1],N@Sqrt@2]&@GraphEmbedding@GridGraph@{8,8}//Union]~VertexDelete~w;c:=#~Complement~w&;m=0;Do[m+=Length@FindPath[g,i,j],{i,c@l},{j,c[l+56]}];m==0,0>1]
온라인으로 사용해보십시오!
나는 그래프 정의하는 쉬운 방법이있을 수있다 생각, 역 추적을 위해 계정이 대부분 재 작성 g
, 매스 매 티카는이 GraphData[{"bishop",{8,8}}]
감독은 체스 판 (에 할 수있는 모든 이동의 그래프이다 주교 그래프 ,)하지만,이 그래프는 더 연결을 포함 가장 가까운 대각선 이웃보다. 누구든지 짧은 방법을 알고 있다면 알려주십시오. 그래프 구성에 대한 크레딧은 이 MathematicaSE 답변으로 갑니다 .
True
강력한 암호, False
약한 / 잘못된 형식의 암호를 반환 합니다. 잘못 구성된 대부분의 비밀번호에 대해 많은 오류 메시지가 생성 된 다음을 반환 False
합니다. 규칙에 맞지 않으면 6 바이트의 비용 으로 변경 f[n_]:=...
하여 억제 할 수 있습니다 f[n_]:=Quiet@...
.
언 골프 드 :
p[m_] := StringPartition[#, m] &;
f[n_] :=
Check[
w = (8 #2 + #1 -
8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
r = GridGraph[{8, 8}];
g = Graph[Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],N@Sqrt@2] &@
GraphEmbedding@r // Union]~VertexDelete~w;
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
m = 0;
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
, False]
고장:
p[m_]:=StringPartition[#,m]&
문자열 인수를 가져 와서 각 길이의 문자열 목록으로 나눕니다 m
.
Check[...,False]
False
오류 메시지가 생성되는 경우 반환 합니다. 이는 잘못된 형식의 문자열을 잡는 방법입니다 (예 : 문자열이 올바르게 구성되어 있다고 가정하면 오류가 발생합니다).
(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
폰 위치의 문자열을 가져와 "a2h5b"
가 되도록 분리 {{"a","2"},{"h","5"},{"b"}}
한 다음 LetterNumber
문자를 숫자 ( a -> 1
등) FromDigits
로 변환하고 숫자를 정수로 변환합니다. 문자열이 제대로 구성되지 않으면이 단계에서 오류가 발생하여 Check
를 반환 하고 를 반환 False
합니다. 그런 다음이 두 숫자는 보드의 사각형에 해당하는 정수로 변환됩니다.
r = GridGraph[{8, 8}];
g = Graph[
Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],
N@Sqrt@2] &@GraphEmbedding@r // Union]~VertexDelete~w;
폰 위치가 삭제 된 가장 가까운 이웃 대각선 가장자리의 그래프를 구성합니다.
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
이들은 비어있는 시작 정점과 끝 정점의 목록입니다.
m=0
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
시작 정점과 끝 정점의 루프는 각 쌍에 대한 FindPath
경로 목록이됩니다. 그들 사이에 경로가 없으면 빈 목록이되므로를 Length@
반환합니다 0
. 경로가 전혀 없으면 m
0이되고을 반환하고 True
, 그렇지 않으면를 반환 False
합니다.