Mật khẩu mạnh mẽ chống lại các giám mục


13

Đừng nhầm lẫn với Mật ong Giám mục Goodness !

Đưa ra một chuỗi, trả lời (trung thực / giả hoặc hai giá trị nhất quán) nếu nó tạo thành một mật khẩu mạnh đối với các giám mục .

Mật khẩu mạnh đối với các giám mục nếu đó là một chuỗi bao gồm các chữ cái xen kẽ (in a-h) và chữ số (in 1-8) sao cho mỗi cặp ký tự có thể được hiểu là một hình vuông trên bàn cờ và nếu bạn đặt một con tốt màu trắng trên mỗi hình vuông có tên trong mật khẩu, không có cách nào để một giám mục trắng đi du lịch, trong bất kỳ số lần di chuyển liên tiếp nào, từ bất kỳ ô vuông nào trong hàng đầu tiên ( 1) đến bất kỳ ô vuông nào trong hàng ( 8) cuối cùng .

Ví dụ

Mật khẩu mạnh mẽ chống lại các giám mục

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

Ví dụ, a1b1c1d1e1f1g1a8b8c8d8e8f8g8tương ứng với vị trí foob4b5d4d5f4f5g3h5tương ứng với vị trífoo

Mật khẩu yếu chống lại giám mục

  • a4c4e4g4g5d6f6e3d2b2 (hình thành tốt nhưng không mạnh mẽ - cảm ơn Jo King vì ví dụ này!)
  • b1c1d1e1f1g1h1a8b8c8d8e8f8g8 (hình thành tốt nhưng không mạnh)
  • h4g4f4e4c4b4a4c3 (hình thành tốt nhưng không mạnh)
  • d4 (hình thành tốt nhưng không mạnh)
  • b4b5d4d5f4f5g2h5 (hình thành tốt nhưng không mạnh)
  • correct horse battery staple (hình thành)
  • 1a1b1c1d1e1f1g8a8b8c8d8e8f8g (hình thành)
  • a (hình thành)
  • aa (hình thành)

1
Giám mục đi màu gì?
Hiện thân của sự thiếu hiểu biết

2
Trường hợp thử nghiệm thứ 2 của bạn mâu thuẫn với thông số kỹ thuật của bạn. Bạn cũng cần giải thích làm thế nào " mỗi cặp nhân vật có thể được hiểu là một hình vuông trên bàn cờ ".
Xù xì

1
a1b2c3d4d5f5f4g3g4h2b5 không mạnh đối với các giám mục, vì một giám mục có thể đến h5, sau đó đi xuống d1
Hiện thân của sự

2
@TRITICIMAGVS, Ourous: Tôi đã làm rõ rằng cả những con tốt và giám mục đều là người da trắng, vì vậy không được phép bắt (hoặc tiếp đất, hoặc di chuyển qua, hoặc nhảy qua).
Quuxplusone

1
Ngoài ra, bạn có thể thêm một ví dụ cho một trong những trường hợp thử nghiệm trung thực. Bởi vì tôi hiểu rằng các ô vuông của mật khẩu chứa đầy những con tốt trắng, nhưng tôi không hiểu vị giám mục trắng được đặt ở đâu. Và nếu bất cứ nơi nào là tốt, tại sao có thể không nó đi để mỗi hàng 1thông qua 8trong trường hợp thử nghiệm đầu tiên? Nó không thể di chuyển đến từng cột, vì acột chứa đầy những con tốt, nhưng nó có thể di chuyển đến từng hàng mà không gặp vấn đề gì, phải không? Tôi có cảm giác mình đang thiếu thứ gì đó ..: S
Kevin Cruijssen

Câu trả lời:


4

Ruby, 115 182 163 byte

->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]}

Hãy thử trực tuyến!

Trả về 1cho mạnh và nilyếu. (+67 byte là để tính đến "quay lui.")

->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
}

Một vài thủ thuật đã được sử dụng:

  • Thay vì phạm vi số 0..99, chúng tôi sử dụng phạm vi chuỗi'00'..'99' để số được tự động đệm sang 2 chữ số và được xâu chuỗi . Điều này làm cho giới hạn kiểm tra rất ngắn - khớp với regex /[09]/.

  • Bên trong hàm trợ giúp, trong khi xây dựng danh sách tọa độ mới [x-11, x-9, x+9, x+11], chúng tôi đồng thời gán z[x]cho 9trong quá trình, đây là một giá trị trung thực (đánh dấu ô vuông đã truy cập).

  • Trong dòng cuối cùng, chúng tôi muốn kiểm tra xem mảng z[81,9]không chứa 9. Chúng tôi thực hiện điều này bằng cách xóa tất cả các phiên bản của 9( z[81,9]-[9]), sau đó yêu cầu phần tử thứ 9 của mảng kết quả ( [8]). Vì chúng ta biết mảng ban đầu có 9 phần tử, nếu có bất kỳ phần tử nào bị xóa, chúng ta sẽ nhận được nil, trong khi nếu tất cả chúng vẫn còn, chúng ta sẽ nhận phần tử cuối cùng của mảng (luôn luôn xảy ra 1).


2

Python 2 , 330 318 313 309 370 byte

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

Hãy thử trực tuyến!

Hãy thử phiên bản thực tế trực tuyến! (bản gốc có thể mất 4 ^ 32 thao tác để kiểm tra hoàn toàn, tôi đề nghị sử dụng thao tác này - cùng số byte)

Không phải là một giải pháp siêu ngắn - Tôi không thể tìm ra cách làm cho phiên bản hàm lambda của g ngắn hơn chính g.

-4 byte nhờ Quuxplusone

+61 byte chiếm tỷ lệ quay lại (cảm ơn vì đã chỉ ra Jo King và các mẹo chơi gôn)


Đẹp. q=r=1sẽ ngắn hơn q=1 r=1, phải không? Và if r:ngắn hơn if r>0:.
Quuxplusone

2

Con trăn 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)

Hãy thử trực tuyến!

Điều này hoạt động bằng cách "lấp đầy lũ." Đầu tiên chúng ta tạo một danh sách acác ô vuông liền kề với các ô vuông khác, theo chiều ngang. Sau đó, chúng tôi tạo ra một bộ xloại trừ (dựa trên mật khẩu). Sau đó, chúng tôi khởi tạo một tập hợp rcác ô vuông có thể tiếp cận, bắt đầu chỉ là hàng đầu tiên (trừ mọi loại trừ) và liên tục "tràn" ra ngoài từ đó, 99 lần, là quá đủ. Cuối cùng, chúng tôi kiểm tra xem liệu có bất kỳ hình vuông nào trong hàng cuối cùng kết thúc trong tập hợp có thể tiếp cận của chúng tôi không. Nếu vậy, chúng tôi có một mật khẩu yếu! Nếu không, chúng tôi có một mật khẩu mạnh.

Nhược điểm, có lẽ không đủ tiêu chuẩn (tôi không biết quy tắc thông thường ở đây): Nếu mật khẩu không đúng định dạng (chẳng hạn như "ghim pin ngựa chính xác"), thì chúng tôi sẽ ném ngoại lệ thay vì quay lại False. Nhưng chúng tôi luôn trả lại Trueiff mật khẩu mạnh!

Trừ đi 16 byte nhờ Jo King. Chúng tôi đặt nội tuyến aở một nơi mà nó được sử dụng và liên tục gấp một số phép toán.

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 cảm ơn! Vẫn còn khoảng trắng trước hai forgiây mà tôi không thể thấy cách xóa. Tôi thấy rằng thay thế range(99)bằng repr(f)các tác phẩm trên máy cục bộ của tôi nhưng không phải trên trình thông dịch của tio.run ... nhưng sau đó tôi thấy rằng nó [1]*99vẫn ngắn hơn! Vì vậy, đã lưu thêm 4 byte.
Quuxplusone

khoảng trắng trước hai forgiây mà tôi không thể thấy cách xóa - Ôi! Rõ ràng Python coi 33forlà hai mã thông báo (trong khi đó for33sẽ là một mã thông báo). Ngày hôm nay tôi đã học. Trừ đi 2 byte nữa, sau đó.
Quuxplusone

1

Sạch , 285 byte

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))

$[]

Hãy thử trực tuyến!

$[]$ :: [[Int]] [Char] -> Bool sáng tác với lập luận đầu tiên, đưa ra \ [Char] -> Bool.

Hàm hoạt động bằng cách tiêu thụ chuỗi hai ký tự cùng một lúc, ngay lập tức trả về false nếu chuỗi có định dạng không hợp lệ ngay khi thấy phần không hợp lệ. Khi chuỗi đã được xử lý, nó đặt một giám mục trên mỗi ô vuông trống ở một bên của bảng và di chuyển chúng theo mọi cách có thể 64 lần và kiểm tra xem có bất kỳ vị trí cuối nào nằm trong hàng đích không.


Có vẻ để trả lại không chính xác Truecho a1b1c1d1e1f1g1? Không phải là tôi hiểu bất cứ điều gì về cách nó hoạt động. :)
Quuxplusone

2
@Quuxplusone Tôi bị rắm não và nghĩ rằng các giám mục trắng chỉ sử dụng hình vuông màu trắng. Tôi cũng đã thêm một lời giải thích.
giờ 48 phút

1

Ngôn ngữ Wolfram (Mathicala) , 339 316 358 353 345 byte

-23 byte nhờ @Doorknob.

+42 byte kế toán để quay lại.

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]

Hãy thử trực tuyến!

Tôi viết lại hầu hết những điều này để giải thích cho việc quay lại, tôi nghĩ có thể có một cách dễ dàng hơn để xác định biểu đồ g, Mathicala có GraphData[{"bishop",{8,8}}]biểu đồ cho tất cả các di chuyển mà một giám mục có thể thực hiện trên bàn cờ ( Biểu đồ Giám mục ), nhưng biểu đồ này bao gồm các kết nối hơn nữa hơn hàng xóm chéo gần nhất. Nếu ai biết một cách ngắn hơn để làm điều đó cho tôi biết. Tín dụng cho việc xây dựng đồ thị đi đến câu trả lời MathicalaSE này .

Trả về Truemật khẩu mạnh, Falsecho mật khẩu yếu / không đúng định dạng. Lưu ý rằng đối với hầu hết các mật khẩu không đúng định dạng, nó sẽ tạo ra một loạt các thông báo lỗi và sau đó trả về False. Nếu điều này không phù hợp với các quy tắc thì chúng có thể bị triệt tiêu bằng cách thay đổi f[n_]:=...thành f[n_]:=Quiet@...chi phí 6 byte.

Ung dung:

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]

Phá vỡ:

p[m_]:=StringPartition[#,m]& 

Đưa ra một đối số chuỗi và chia nó thành một danh sách các chuỗi có độ dài m.

Check[...,False]

Trả về Falsenếu có bất kỳ thông báo lỗi nào được tạo ra, đó là cách chúng tôi bắt được các chuỗi không định dạng (nghĩa là chúng được định dạng tốt, chắc chắn sẽ tạo ra lỗi xuống dòng).

(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@ 
        p[UpTo@2]@n));

Lấy chuỗi các vị trí cầm đồ và tách nó sao cho "a2h5b"trở thành {{"a","2"},{"h","5"},{"b"}}, sau đó LetterNumbersẽ chuyển đổi chữ cái thành một số ( a -> 1, v.v.) và FromDigitschuyển đổi số thành số nguyên. Nếu chuỗi không được hình thành tốt, bước này sẽ tạo ra một lỗi sẽ bị bắt bởi Check, quay trở lại False. Hai số này sau đó được chuyển đổi thành một số nguyên tương ứng với một hình vuông trên bảng.

r = GridGraph[{8, 8}];
g = Graph[
     Sort /@ UndirectedEdge @@@ 
          Position[Outer[EuclideanDistance@## &, #, #, 1], 
           N@Sqrt@2] &@GraphEmbedding@r // Union]~VertexDelete~w;

Xây dựng biểu đồ của tất cả các cạnh đường chéo lân cận gần nhất với các vị trí cầm đồ đã bị xóa.

s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];

Đây là danh sách các đỉnh bắt đầu và kết thúc không có người ở

m=0
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]

Vòng lặp trên các đỉnh bắt đầu và kết thúc, cho mỗi cặp FindPathsẽ là một danh sách các đường dẫn giữa chúng. Nếu không có đường dẫn giữa chúng, nó sẽ là một danh sách trống, vì vậy Length@trả về 0. Nếu không có đường dẫn nào cả, thì msẽ bằng không, và chúng ta quay lại True, nếu không thì quay lại False.


Một vài lời khuyên: TrueFalsecó thể 1>00>1tương ứng. p[1]@#&/@tương đương với chỉ p@1/@. Sequence@@có thể được thay thế bằng ##&@@. Thay vì {LetterNumber[#[[1]]],FromDigits[#[[2]]]}&/@, bạn có thể sử dụng {LetterNumber@#,FromDigits@#2}&@@@.
Doorknob

@Doorknob cảm ơn! Chơi gôn mã đang dạy tôi tất cả những điều mới về Mathicala. Tôi vẫn không hiểu 100% p@1/@, nhưng tôi thấy ý tưởng chung. Tôi cho rằng p@1 = StringPartition[#,1]&, nó hơi khó hiểu với tôi, tôi đoán bởi vì pcó hai đối số theo hai cách khác nhau, một m_và hai là #...&, tôi đoán đây chỉ là vấn đề ưu tiên. Nó có ý nghĩa mặc dù điều đó p@m = p[m].
Kai

Nó có cho tôi là tốt! Sự thay đổi chính là ở chỗ, đối với bất kỳ hàm fnào có một đối số duy nhất, f@#&đều có hành vi giống như chỉ f- ở đây, fp[1]. (Sau đó, tôi đã thay đổi []ký hiệu thành @, luôn luôn giống nhau ngoại trừ quyền ưu tiên.)
Doorknob

@JoKing thật là sai lầm, điều này phức tạp hơn tôi nghĩ, phải xem xét cả những chuyển động ngược. Cảm ơn
Kai

@JoKing đã viết một tài khoản mới để quay lại.
Kai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.