Những công tắc nào được bật?


12

Giới thiệu

Bạn đang ngồi với đồng nghiệp, ăn trưa và khoe với anh ấy / cô ấy về dự án mới nhất và được cho là lớn nhất mà bạn đang thực hiện. Phát ốm và mệt mỏi với việc thể hiện bản ngã liên tục của bạn, anh ấy / cô ấy đưa ra cho bạn một thử thách chỉ để bạn im lặng. Là người ích kỷ và vui vẻ, bạn dĩ nhiên chấp nhận (vì bạn phải chấp nhận từng thử thách). Các thách thức , như anh / cô ấy giải thích đó là, đưa ra một đầu vào của một khối văn bản có chứa 1 hay nhiều của mỗi nhân vật trong !@#$^&*, đầu ra trong bất kỳ định dạng hợp lý tọa độ của công tắc (es) đó là / là "on".

Theo đồng nghiệp của bạn, công tắc là một $và công tắc được phân loại là "bật" nếu và chỉ khi nó đáp ứng ít nhất 1 trong các tiêu chí sau:

  1. Nó được bao quanh bởi tất cả ^. Vì thế...

    ^^^
    ^$^
    ^^^
    

    dẫn đến một công tắc "bật".

  2. Nó được bao quanh bởi tất cả &. Vì thế...

    &&&
    &$&
    &&&
    

    dẫn đến một công tắc "bật".

  3. Nó được bao phủ hoàn toàn trên ít nhất hai mặt với *. Ví dụ,

    ***
    &$&
    ***
    

    dẫn đến một công tắc "bật", nhưng

    &*&
    &$&
    &*&
    

    không, vì công tắc không được bao phủ hoàn toàn ở hai bên bởi *s.

  4. Có ít nhất 1 !và / hoặc 1 @ở bất kỳ góc nào xung quanh nó. Điều này không được tính nếu một trong hai không nằm trong một góc. Vì thế...

    !&&
    ^$@
    @&!
    

    dẫn đến một công tắc "bật", vì có ít nhất 1 !và / hoặc @ít nhất 1 trong số các góc (trong trường hợp trên, có 2 !s hợp lệ và 1 hợp lệ @ở 3 góc). Và ...

    &!&
    ^$@
    ^!&
    

    không không , mặc dù có 2 !s và 1 @, vì không ai trong số họ là trong bất kỳ của các góc.

  5. 1 hoặc nhiều #không trên bất kỳ bên xung quanh việc chuyển đổi, trừ khi ít nhất 1 &bao quanh công tắc. Nói cách khác, nếu có ít nhất 1 #món quà ở một bên, nó sẽ ghi đè tất cả các quy tắc khác, trừ khi có một &món quà. Vì thế:

    #&*
    *$*
    !**
    

    dẫn đến một công tắc "bật", mặc dù #tồn tại, vì có một &công tắc xung quanh và nó tuân theo ít nhất 1 trong các quy tắc trên. Tuy nhiên, nếu dấu chấm than không có mặt như vậy:

    #&*
    *$*
    ***
    

    Công tắc sẽ tắt, vì nó không tuân theo ít nhất một trong các quy tắc trên. Do đó, mặc dù một công tắc có thể được bao quanh bởi a #và a &, nó vẫn sẽ bị tắt trừ khi nó tuân theo một hoặc nhiều quy tắc này. Ngoài ra, phải luôn có tỷ lệ> = 1: 1 giữa &s và #s để công tắc có hiệu lực. Ví dụ,

    #&!
    *$*
    **#
    

    sẽ vẫn là một công tắc không hợp lệ, mặc dù nó tuân theo 1 trong các quy tắc này, vì có 2 #s, nhưng chỉ có 1 &, và do đó không phải là tỷ lệ> = 1: 1 giữa &s và #s. Để làm cho điều này hợp lệ, bạn phải thêm 1 hoặc nhiều &s vào bất kỳ cạnh nào để cân bằng số lượng #s và &s, có thể như vậy:

    #&!
    *$&
    &*#
    
    3:2 ratio between &s and #s
    

    Cuối cùng ...

    #^^
    ^$*
    @^!
    

    dẫn đến một công tắc "tắt", mặc dù nó tuân theo 1 hoặc nhiều quy tắc trên, vì nó chứa ít nhất 1 #xung quanh nó và không có gì &để làm mất cân bằng.

  6. Các công tắc hợp lệ sẽ chỉ được bên trong một đầu vào, và do đó, mỗi hợp lệ $phải được bao bọc hoàn toàn bởi bất kỳ 8 của ký tự hợp lệ. Chẳng hạn, nếu toàn bộ đầu vào là:

    *$*
    !$!
    !!!
    

    đỉnh $chắc chắn không phải là một công tắc hợp lệ vì công tắc nằm ở một cạnh và do đó công tắc không được bao quanh hoàn toàn bởi 8 ký tự hợp lệ. Trong trường hợp này, chuyển đổi thậm chí không nên được xem xét. Tuy nhiên, công tắc ở giữa là hoàn toàn hợp lệ và thực tế là "bật", vì nó đáp ứng ít nhất một trong các yêu cầu trên.

Để chứng minh, hãy xem xét khối ký tự này:

!@#^^$#!@
!@#$$*$&@
@$^!$!@&&

mà chúng ta có thể gắn nhãn cho tọa độ như vậy, gọi trục dọc yvà trục ngang x:

y

3 !@#^^$#!@
2 !@#$$*$&@
1 @$^!$!@&&

  123456789 x

Các tọa độ phải luôn được trả về theo (x,y)định dạng, tương tự như lưới tọa độ hai chiều. Bây giờ, công tắc nào được bật? Chà, trước tiên hãy tìm tất cả. Chúng ta có thể thấy rằng có 1 ở hàng trên cùng và một cái khác ở dưới cùng. Tuy nhiên, đó là tự động không có ops, vì chúng không được bao quanh hoàn toàn bởi 8 ký tự.

Tiếp đến là một trong hàng 2. Cụ thể, cái này:

#^^
#$$
^!$

Chúng ta có thể thấy rằng có 3 $dấu hiệu trong đó, nhưng chúng ta chỉ muốn tập trung vào một dấu hiệu ở giữa, và, như bạn có thể thấy, nó đã không hợp lệ, vì nó có 2 #giây xung quanh mà không có &s để cân bằng chúng ngoài. Ngoài ra, điều này thậm chí không tuân theo bất kỳ quy tắc nào, vì vậy ngay cả khi đó là một công tắc hợp lệ, nó sẽ bị "tắt".

Tiếp đến là một số khác trong hàng 2:

^^$
$$*
!$!

Một lần nữa, chỉ tập trung vào công tắc ở giữa. Công tắc này là "bật", vì nó có ít nhất 1 !trong ít nhất 1 góc. Các tọa độ của cái này là (5,2).

Tiếp tục, cuối cùng chúng tôi cũng chuyển sang công tắc cuối cùng. Cái này cũng ở hàng thứ hai và xuất hiện như vậy:

$#!
*$&
!@&

và, như bạn có thể thấy, cái này cũng là một công tắc hợp lệ, mặc dù có một #xung quanh nó, vì có 2 cái khác &để mất cân bằng #. Ngoài ra, nó cũng có ít nhất 1 !trong ít nhất 1 góc, và do đó, không chỉ công tắc hợp lệ mà còn "bật". Các tọa độ của chuyển đổi này là (7,2).

Cuối cùng chúng tôi đã đi đến cuối cùng và đã tìm thấy 2 công tắc "bật" trong toàn bộ khối đó trên văn bản. Tọa độ của chúng là (5,2)(7,2), đó là câu trả lời cuối cùng của chúng ta, và đầu ra nên là gì. Tuy nhiên, đầu vào này rất đơn giản. Các đầu vào có thể lớn hơn rất nhiều , vì không có giới hạn về mức độ lớn của khối văn bản có thể nhận được. Ví dụ, đầu vào thậm chí có thể là một 200x200khối văn bản ngẫu nhiên .

Chống chỉ định

  • Lỗ hổng tiêu chuẩn bị cấm.

  • Có thể không thể tích hợp sẵn cho việc này, nhưng chỉ trong trường hợp có (nhìn vào Mathicala), việc sử dụng các công cụ tích hợp trực tiếp giải quyết vấn đề này đều bị cấm.

Các trường hợp thử nghiệm:

Đưa ra trong định dạng string input -> [array output]:

@#$$&^!&!# 
@*&!!^$&^@
$!#*$@#@$!   ->  [[7,3],[9,2]]
*@^#*$@&*#

#^&!$!&$@@#&^^&*&*&&
!^#*#@&^#^*$&!$!*^$$
#^#*#$@$@*&^*#^!^@&* -> [[19,3],[15,3],[8,2]]
#$@$!#@$$^!#!@^@^^*#

@!@!^&*@*@
*$*^$!*&#$
@$^*@!&&&#
**$#@$@@#!  -> [[2,8],[5,8],[6,6],[9,3]]
##*&*#!^&^
$&^!#$&^&@
^^!#*#@#$*
$@@&#@^!!&
#@&#!$$^@$


!!@##!$^#!&!@$##$*$#
$^*^^&^!$&^!^^@^&!#!
@*#&@#&*$!&^&*!@*&** -> [[9,4],[9,3]]
^!!#&#&&&#*^#!^!^@!$
&$$^*$^$!#*&$&$#^^&$

Sắp có thêm

Ghi chú bổ sung

  • Bạn có thể giả định rằng đầu vào sẽ luôn ở dạng một khối hoàn chỉnh (nghĩa là hình chữ nhật hoặc hình vuông)
  • Sẽ không bao giờ có bất kỳ nhân vật nào khác trong đầu vào hơn những nhân vật trong !@#$^&*.

Hãy nhớ rằng, đây là một để mã ngắn nhất sẽ thắng!


12
Có vẻ hơi dài và tùy tiện.
orlp

@orlp Đó là những gì tôi sẽ làm. Dù sao đó cũng là một thử thách. Tại sao bạn nói nó tùy tiện?
R. Kap

6
@ R.Kap Không có lời biện minh cho bất kỳ quy tắc nào; họ dường như tạo nên sự phức tạp mà không có lý do.
Vụ kiện của Quỹ Monica

6
@QPaysTaxes Điều này cần gì? Những điều này được tạo nên cho lợi ích của thách thức. Đó một thách thức, và một thách thức có thể là bất cứ điều gì theo nghĩa đen . Tất cả những gì nó thực sự cần là một bộ quy tắc, đầu vào và đầu ra nên dựa trên những quy tắc đó.
R. Kap

1
Tôi không nói là tôi đồng ý, tôi đang giải thích lý do tại sao nó có vẻ độc đoán. Lấy ví dụ về thử thách phổ biến nhất của tôi : Nếu bạn loại bỏ tất cả bối cảnh và chỉ nói: "Bạn được cung cấp một chuỗi các chuỗi. Dựa trên thụt lề, nhóm chúng, xáo trộn các nhóm, sau đó xáo trộn các nhóm bên trong, nhưng giữ các thành viên của các nhóm nội thất ở phía dưới nếu chúng tồn tại ", điều đó sẽ không có nhiều ý nghĩa. Tuy nhiên, vì nó có bối cảnh, tất cả những quy tắc và hạn chế kỳ lạ đó ít nhất là giả vờ có ý nghĩa.
Vụ kiện của Quỹ Monica

Câu trả lời:


2

Haskell, 304 byte

import Data.List
s!c=sum[1|a<-s,a==c]
f t|Just w<-elemIndex '\n't,h<-t!'\n'=[c|c<-mapM(\a->[2..a-1])[w,h],s<-[(\[x,y]->t!!((h-y-1)*(w+1)+x))<$>mapM(\a->[a-2..a])c],s!!4=='$',foldr1(-)((s!)<$>"#&")<1,or$("@!"/="@!"\\map(s!!)[0,2..8]):zipWith(\c i->all(==c)$(s!!)<$>[0..8]\\(4:i))"^&**"[[],[],[1,7],[3,5]]]

Điều này xác định chức năng fthực hiện các nhiệm vụ nhất định.


2

JavaScript (ES6), 363 339 312 309 298 byte

Đây là một hàm lấy đầu vào là một chuỗi và trả về một danh sách tọa độ. Nó được chia thành 2 phần chính: chuyển đổi các công tắc thành một cặp tọa độ và các ký tự xung quanh, và kiểm tra 'có phải là' dựa trên các quy tắc của thử thách đối với các nhân vật xung quanh.

a=>[...a].map((z,p,m)=>(y-=z==B,z)=='$'&&(r=m[p-n-2]+m[p-n]+m[p+n]+m[p+n+2]+m[p-n-1]+m[p-1]+m[p+1]+m[p+n+1],r=r[L]<9?r:'')[T]`&`[L]>=r[T]`#`[L]&&(/(\^|&){8}|\*{4}(.\*\*.|\*..\*)/.exec(r)||/!|@/.exec(r.substr(0,4)))&&[1+(p-(w-y))%n,y],y=w=a[T='split'](B='\n')[L='length'],n=a.search(B)).filter(e=>e)

2

Python 2 , 299 297 279 275 261 259 byte

m=input()
R=range
h=len(m)
for y in R(h-2):
 for x in R(len(m[0])-2):
	a=''.join(m[y+o][x:x+3]for o in R(3))
	if(a.count('&')>=a.count('#'))*(a[:4]+a[5:]in('^'*8,'&'*8)or'*'*6in(a[:3]+a[6:],a[::3]+a[2::3])or'!'in a[::2]or'@'in a[::2])*a[4]=='$':print x+2,h+~y

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

Lấy đầu vào là một danh sách các chuỗi

In đầu ra dưới dạng một cặp tọa độ x, y trên mỗi dòng

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.