감독에게 강력한 암호


13

Password Bishop Goodness 와 혼동하지 마십시오 !

주교에 대해 강한 암호를 구성하는 문자열이 있다면 (거짓 / 거짓 또는 두 개의 일관된 값) 응답하십시오 .

각 문자 쌍이 체스 판에서 정사각형으로 해석 될 수 있도록 교대 문자 ( )와 숫자 () 로 구성된 문자열 인 경우 주교에 대해 암호가 강력 합니다. 암호에서, 백인 주교가 연속적으로 많은 수의 이동으로 첫 번째 ( ) 행의 정사각형에서 마지막 ( ) 행의 정사각형으로 이동할 수있는 방법이 없습니다 .a-h1-818

감독에 대한 강력한 암호

  • a1b1c1d1e1f1g1h1
  • a8b8c8d8e8f8g8h8
  • a1b2c3d4d5f5f4g3g4h2b5
  • h4g4f4e4c4b4a4c3e3
  • a1b1c1d1e1f1g1a8b8c8d8e8f8g8
  • b4b5d4d5f4f5g3h5

예를 들어 a1b1c1d1e1f1g1a8b8c8d8e8f8g8위치 푸b4b5d4d5f4f5g3h5해당 하고 위치 에 해당합니다.푸

감독에게 약한 암호

  • a4c4e4g4g5d6f6e3d2b2 (잘 구성되었지만 강력하지는 않습니다.이 예에 대해 Jo King에게 감사드립니다!)
  • b1c1d1e1f1g1h1a8b8c8d8e8f8g8 (잘 형성되었지만 강하지는 않음)
  • h4g4f4e4c4b4a4c3 (잘 형성되었지만 강하지는 않음)
  • d4 (잘 형성되었지만 강하지는 않음)
  • b4b5d4d5f4f5g2h5 (잘 형성되었지만 강하지는 않음)
  • correct horse battery staple (불완전한)
  • 1a1b1c1d1e1f1g8a8b8c8d8e8f8g (불완전한)
  • a (불완전한)
  • aa (불완전한)

1
감독님은 어떤 색 사각형을 사용하십니까?
무지의 실시

2
마지막 두 번째 테스트 사례가 사양과 모순됩니다. 또한 " 각 문자 쌍이 체스 판에서 사각형으로 해석 될 수있는 방법 " 도 설명해야합니다 .
얽히고 설킨

1
주교 후, H5에 도착 D1에 가서 할 수 있기 때문에 a1b2c3d4d5f5f4g3g4h2b5은 주교에 대한되지 강하다
무지의 실시 예

2
@TRITICIMAGVS, Ourous : 전당포와 주교가 모두 하얗다는 점을 분명히 했으므로 상대방을 붙잡거나 착륙하거나 넘어갈 수 없습니다.
Quuxplusone

1
또한 실제 테스트 사례 중 하나에 대한 예를 추가 할 수 있습니까? 암호의 제곱은 흰색 폰으로 채워져 있음을 이해하지만 흰색 감독이 어디에 있는지 이해하지 못합니다. 어떤 장소 괜찮 있다면, 왜 각 행에 여행 할 수 1를 통해 8첫 번째 테스트 케이스에? a기둥이 완전히 폰으로 채워져 있기 때문에 각 기둥으로 이동할 수 없지만 문제없이 각 행으로 이동할 수 있습니다. 내가 뭔가 느낌 누락 한 .. : S
케빈 Cruijssen

답변:


4

루비 115 182 163 바이트

->s{z=('00'..'99').map{|x|x=~/[09]/||s[(x[1].ord+48).chr+x[0]]};(11..18).map &g=->x{z[x]||[x-11,x-9,x+z[x]=9,x+11].map(&g)};s=~/^([a-h][1-8])*$/&&(z[81,9]-[9])[8]}

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

1강약에 nil대한 반환 . (+67 바이트는 "역 추적"을 고려하기위한 것입니다.)

->s{
 z=                             # this is the board
 ('00'..'99').map{|x|           # coordinates are described as y*10 + x
  x=~/[09]/||                   # truthy if out of bounds...
  s[(x[1].ord+48).chr+x[0]]     # ...or impassable
 }                              # now only the passable squares are falsey
 (11..18).map                   # for each x position at y=1,
  &g=->x{                       # call helper function on that square
   z[x]||                       # if the square is passable (i.e. falsey),
    [x-11,x-9,x+z[x]=9,x+11]    # mark it impassable by setting to 9 (truthy)
     .map(&g)                   # call helper recursively for each neighbor
  }
 s=~/^([a-h][1-8])*$/           # make sure the input was valid,
 &&(z[81,9]-[9])[8]             # and check that the last row was never reached
}

사용 된 몇 가지 트릭 :

  • 숫자 범위 대신 문자열 범위를 0..99사용 하여 숫자가 자동으로 2 자리로 왼쪽 패딩되고 문자열'00'..'99' 화됩니다. 이로 인해 범위 검사가 매우 짧아 정규식과 일치 /[09]/합니다.

  • 도우미 함수 내에서 새 좌표 목록을 작성하는 동안 프로세스에서 [x-11, x-9, x+9, x+11]동시에 할당 z[x]됩니다 9.이 값은 참된 값입니다 (방문한 사각형 표시).

  • 마지막 줄에서 배열에 z[81,9]가 포함되어 있지 않은지 확인하고 싶습니다 9. 9( z[81,9]-[9]) 의 모든 인스턴스를 제거한 다음 결과 배열 ( [8]) 의 9 번째 요소를 요청 하여이 작업을 수행합니다 . 배열에 원래 9 개의 요소가 있다는 것을 알고 있기 때문에 제거 된 요소가 있으면을 얻습니다 nil. 그러나 모든 요소가 남아 있으면 배열의 마지막 요소 (항상 1)가 나타납니다.


2

파이썬 (2) , 330 (318) 313 309 370 바이트

import numpy as n
b=n.ones([8,8])
q=r=1
s=input()
l=len(s)
def g(x,y=0,p=0):
    if b[y,x]and p<32:
        if y<7:
            if x<7:
                g(x+1,y+1,p+1)
                if y:g(x+1,y-1,p+1)
            if x:
                g(x-1,y+1,p+1)
                if y:g(x-1,y-1,p+1)
        else:global q;q=0
for i in range(l/2):
    x=ord(s[2*i])-97;y=ord(s[2*i+1])-49
    if y>8or y<0 or l%2or x>8or x<0:r=0
    if r:b[7-y,x]=0
map(g,range(8))
print q&r

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

실용적인 버전을 온라인으로 사용해보십시오! (원본은 완전히 확인하기 위해 4 ^ 32 작업이 필요할 수 있습니다.이 바이트 수를 사용하는 것이 좋습니다.

매우 짧은 해결책은 아닙니다 .g의 람다 함수 버전을 g보다 짧게 만드는 방법을 알 수 없었습니다.

Quuxplusone 덕분에 -4 바이트

역 추적을 설명하는 +61 바이트 (Jo King과 골프 팁을 지적 해 주셔서 감사합니다)


좋은. q=r=1보다 짧을 q=1 r=1까요? 그리고 if r:보다 짧습니다 if r>0:.
Quuxplusone

2

파이썬 2 , 490 476 474

def f(p):
 a=[set(ord(c)-33 for c in s)for s in"* )+ *, +- ,. -/ .0 / \"2 !#13 \"$24 #%35 $&46 %'57 &(68 '7 *: )+9; *,:< +-;= ,.<> -/=? .0>@ /? 2B 13AC 24BD 35CE 46DF 57EG 68FH 7G :J 9;IK :<JL ;=KM <>LN =?MO >@NP ?O BR ACQS BDRT CESU DFTV EGUW FHVX GW JZ IKY[ JLZ\\ KM[] LN\\^ MO]_ NP^` O_ R QS RT SU TV UW VX W".split()];x=set((ord(p[i+1])-49)*8+ord(p[i])-97 for i in range(0,len(p),2))
 r=set(range(8))-x
 for i in range(99):r=set().union(*[a[c]for c in r])-x
 return all(c<56 for c in r)

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

이것은 "홍수 채우기"로 작동합니다. 먼저 우리 a는 어느 정사각형이 어느 정사각형에 인접 해 있는지를 감독별로 목록 으로 만듭니다 . 그런 다음 x비밀번호를 기반으로 한 일련 의 제외를 만듭니다 . 그런 다음 r첫 번째 행 (제외 제외)으로 시작하여 도달 할 수있는 사각형 세트 를 초기화하고 99 번 이상 반복적으로 "홍수"합니다. 마지막으로, 마지막 행의 사각형 중 하나가 도달 가능한 집합에 있는지 확인합니다. 그렇다면 암호가 약합니다! 그렇지 않은 경우 강력한 암호가 있습니다.

단점, 아마도 실격입니다 (여기서는 일반적인 규칙을 모르겠습니다) : 암호가 잘못 구성되어 있으면 (예 : "올바른 말 배터리 스테이플") 반환하는 대신 예외가 발생합니다 False. 그러나 True암호가 강력하면 항상 반환 합니다!

Jo King 덕분에 마이너스 16 바이트. 우리는 a그것이 사용되는 한 곳에서 인라인 하고 일부 수학을 상수로 접습니다.

def f(p):
 x=set(ord(p[i])-489+8*ord(p[i+1])for i in range(0,len(p),2));r=set(range(8))-x
 for i in[1]*99:r=set().union(*[[set(ord(k)-33for k in s)for s in"* )+ *, +- ,. -/ .0 / \"2 !#13 \"$24 #%35 $&46 %'57 &(68 '7 *: )+9; *,:< +-;= ,.<> -/=? .0>@ /? 2B 13AC 24BD 35CE 46DF 57EG 68FH 7G :J 9;IK :<JL ;=KM <>LN =?MO >@NP ?O BR ACQS BDRT CESU DFTV EGUW FHVX GW JZ IKY[ JLZ\\ KM[] LN\\^ MO]_ NP^` O_ R QS RT SU TV UW VX W".split()][c]for c in r])-x
 return all(c<56for c in r)

@JoKing 감사합니다! 두 가지 앞에 공백이있어 for제거하는 방법을 볼 수 없었습니다. 나는 대체하는 것을 발견 range(99)하여 repr(f)내 로컬 컴퓨터에서 작동하지만 tio.run의 통역에 ...하지만 난 그 발견 [1]*99어쨌든 짧았다! 따라서 4 바이트가 더 절약되었습니다.
Quuxplusone

for제거하는 방법을 볼 수없는 2 초 전의 공백 – 아! 분명히 파이썬은 33for두 개의 토큰으로 취급 됩니다 (단 for33하나의 토큰 일 수도 있음). 오늘 나는 배웠다. 그러면 2 바이트 더 빼십시오.
Quuxplusone

1

클린 , 285 바이트

import StdEnv,Data.List
$_[_]=1<0
$a[x,y:l]=case[[u,v]\\u<-[0..7],v<-[0..7]|u==toInt x-97&&v==toInt y-49]of[p]= $[p:a]l;_=1<0
$a _=all(\[_,y]=y<7)(iter 64(nub o\e=e++[k\\[u,v]<-e,p<-[-1,1],q<-[-1,1],k<-[[abs(u+p),abs(v+q)]]|all((<>)k)a&&all((>)8)k])(difference[[e,0]\\e<-[0..7]]a))

$[]

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

$[]$ :: [[Int]] [Char] -> Bool첫 번째 인수로 구성되어 \ [Char] -> Bool있습니다.

이 함수는 문자열을 한 번에 두 문자 씩 소비하여 문자열이 유효하지 않은 부분을 보자 마자 유효하지 않은 형식이면 즉시 false를 반환하여 작동합니다. 줄이 가공되면, 보드의 한쪽에있는 모든 빈 사각형에 감독을 배치하고 가능한 모든 방법으로 64 번 움직여서 끝 위치가 목표 행에 있는지 확인합니다.


에 잘못 반환 True되는 것 같습니다 a1b1c1d1e1f1g1? 그것이 어떻게 작동하는지에 대해서는 아무것도 이해하지 못합니다. :)
Quuxplusone

2
@Quuxplusone 나는 두뇌 방귀가 있었고 백인 주교는 흰색 사각형 만 사용했다고 생각했습니다. 나는 또한 설명을 추가했다.
OUurous

1

볼프람 언어 (티카) , 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. 경로가 전혀 없으면 m0이되고을 반환하고 True, 그렇지 않으면를 반환 False합니다.


몇 가지 팁 : True그리고 False될 수 1>00>1각각. p[1]@#&/@그냥와 같습니다 p@1/@. Sequence@@로 교체 할 수 있습니다 ##&@@. 대신을 {LetterNumber[#[[1]]],FromDigits[#[[2]]]}&/@사용할 수 있습니다 {LetterNumber@#,FromDigits@#2}&@@@.
Doorknob

@Doorknob 감사합니다! 코드 골프는 Mathematica에 관한 모든 종류의 새로운 것을 가르쳐줍니다. 나는 여전히 100 % 이해하지 p@1/@못하지만 일반적인 생각을 봅니다. 내 생각 p@1 = StringPartition[#,1]&은 약간 때문에 추측 나에게 혼란, p두 개의 인수를 두 가지 방법으로, 하나 걸리는 m_등 다른 #...&,이 단지 우선 순위의 문제입니다 같아요. 그래도 의미가 p@m = p[m]있습니다.
Kai

그것은 또한 나를 위해있다! 주요 변화는 어떤 기능을위한 것이가 f하나의 인자를, f@#&단지와 같은 동작을 가지고 f- 여기 f입니다 p[1]. (그런 다음 []표기법을로 변경 @했는데, 우선 순위를 제외하고 항상 동일합니다.)
Doorknob

끔찍한 @JoKing, 이것은 내가 처음 생각했던 것보다 더 복잡합니다. 감사합니다
Kai

@JoKing은 역 추적을 설명하는 새로운 것을 작성했습니다.
Kai
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.