Sakelar mana yang aktif?

12

pengantar

Anda duduk bersama rekan kerja, makan siang, dan membual kepadanya tentang proyek terbaru dan konon terbesar yang pernah Anda kerjakan. Menjadi muak dan lelah dengan pertunjukkan egoisme Anda yang terus-menerus, ia memberi Anda tantangan agar Anda bisa diam. Menjadi orang yang egois dan bahagia, Anda tentu saja menerima (karena Anda harus menerima setiap tantangan). The tantangan , karena ia / dia menjelaskan itu, diberi masukan dari blok teks yang mengandung 1 atau lebih dari masing-masing karakter di !@#$^&*, keluaran dalam format wajar koordinat saklar (es) yang / yang "on".

Menurut rekan kerja Anda, sakelar adalah $, dan sakelar diklasifikasikan sebagai "aktif" jika dan hanya jika memenuhi setidaknya 1 dari kriteria berikut:

  1. Dikelilingi oleh semua ^. Begitu...

    ^^^
    ^$^
    ^^^
    

    menghasilkan sakelar "on".

  2. Dikelilingi oleh semua &. Begitu...

    &&&
    &$&
    &&&
    

    menghasilkan sakelar "on".

  3. Ini sepenuhnya tertutup pada setidaknya dua sisi dengan *. Contohnya,

    ***
    &$&
    ***
    

    menghasilkan saklar "on", tetapi

    &*&
    &$&
    &*&
    

    tidak, karena saklar tidak sepenuhnya tertutup oleh dua sisi oleh *s.

  4. Setidaknya ada 1 !dan / atau 1 @di setiap sudut di sekitarnya. Ini tidak masuk hitungan jika salah satu dari ini tidak ada di sudut. Begitu...

    !&&
    ^$@
    @&!
    

    menghasilkan sakelar "on", karena setidaknya ada 1 !dan / atau @di setidaknya 1 sudut (dalam kasus di atas, ada 2 !s valid dan 1 valid @di 3 sudut). Dan...

    &!&
    ^$@
    ^!&
    

    tidak tidak , meskipun ada 2 !dan 1 @, karena tidak satupun dari mereka berada di salah satu sudut.

  5. 1 atau lebih tidak# berada di sisi mana pun di sekitar sakelar, kecuali setidaknya 1 mengelilingi sakelar. Dengan kata lain, jika ada setidaknya 1 hadiah di satu sisi, itu mengesampingkan semua aturan lain, kecuali ada juga hadiah. Karena itu:&#&

    #&*
    *$*
    !**
    

    menghasilkan "on" switch, meskipun #ada, karena ada di &sekitar switch, dan mengikuti setidaknya 1 aturan di atas. Namun, jika tanda seru tidak ada seperti itu:

    #&*
    *$*
    ***
    

    Switch akan dimatikan, karena tidak mengikuti setidaknya salah satu aturan di atas. Oleh karena itu, meskipun sebuah saklar mungkin dikelilingi oleh a #dan a &, itu masih akan mati kecuali mengikuti satu atau lebih dari aturan-aturan ini. Selain itu, harus selalu ada rasio> = 1: 1 antara &s dan #s agar sakelar valid. Contohnya,

    #&!
    *$*
    **#
    

    masih akan menjadi saklar yang tidak valid, meskipun mengikuti 1 dari aturan ini, karena ada 2 #s, tetapi hanya 1 &, dan karenanya bukan rasio> = 1: 1 antara &s dan #s. Untuk membuat ini valid, Anda harus menambahkan 1 atau lebih tambahan &ke tepi mana pun untuk menyeimbangkan jumlah keluar #dan &masuk, mungkin seperti:

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

    Akhirnya...

    #^^
    ^$*
    @^!
    

    menghasilkan "off" switch, meskipun mengikuti 1 atau lebih dari aturan di atas, karena mengandung setidaknya 1 #di sekitarnya, dan tidak ada &untuk mengimbangi itu.

  6. Switch yang valid hanya akan berada di dalam input, dan oleh karena itu, setiap valid $harus dikelilingi sepenuhnya oleh 8 karakter yang valid. Misalnya, jika seluruh input adalah:

    *$*
    !$!
    !!!
    

    bagian atas $jelas bukan saklar yang valid karena saklar berada di tepi, dan karena itu saklar tidak sepenuhnya dikelilingi oleh 8 karakter yang valid. Dalam hal ini, sakelar seharusnya tidak dipertimbangkan. Namun, sakelar di tengah benar-benar valid, dan nyatanya "aktif", karena sakelar tersebut memenuhi setidaknya satu dari persyaratan di atas.

Untuk menunjukkan, pertimbangkan blok karakter ini:

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

yang dapat kita beri label untuk koordinat seperti itu, memanggil sumbu vertikal ydan sumbu horizontal x:

y

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

  123456789 x

Koordinat harus selalu dikembalikan dalam (x,y)format, mirip dengan kotak koordinat dua dimensi. Sekarang, sakelar mana yang aktif? Baiklah, pertama mari kita temukan semuanya. Kita sudah dapat melihat bahwa ada 1 di baris paling atas, dan satu lagi di paling bawah. Namun, itu secara otomatis no-ops, karena mereka tidak sepenuhnya dikelilingi oleh 8 karakter.

Berikutnya adalah yang di baris 2. Secara khusus, yang ini:

#^^
#$$
^!$

Kita dapat melihat bahwa ada 3 $tanda dalam hal ini, tetapi kami hanya ingin fokus pada yang di tengah, dan, seperti yang mungkin Anda lihat, itu sudah tidak valid, karena ada 2 #s di sekitarnya tanpa &s untuk menyeimbangkannya di luar. Selain itu, ini bahkan tidak mengikuti aturan apa pun, jadi meskipun itu adalah saklar yang valid, itu akan "tidak aktif".

Berikutnya adalah satu lagi di baris 2:

^^$
$$*
!$!

Sekali lagi, hanya fokus pada sakelar di tengah. Sakelar ini "aktif", karena memiliki setidaknya 1 !di setidaknya 1 sudut. Koordinat yang satu ini adalah (5,2).

Pindah, kami akhirnya pindah ke saklar terakhir. Yang ini juga ada di baris kedua dan muncul seperti ini:

$#!
*$&
!@&

dan, seperti yang mungkin Anda lihat, yang ini juga merupakan saklar yang valid, meskipun ada yang #mengelilinginya, karena ada 2 lainnya &untuk mengimbangi itu #. Selain itu, ia juga memiliki setidaknya 1 !di setidaknya 1 sudut, dan karena itu tidak hanya saklar yang valid, tetapi juga "aktif". Koordinat sakelar ini adalah (7,2).

Kami akhirnya mencapai akhir, dan telah menemukan 2 sakelar "on" di seluruh blok pada teks. Koordinatnya adalah (5,2)dan (7,2), yang merupakan jawaban terakhir kami, dan seperti apa hasilnya. Namun, input ini sangat sederhana. Input bisa menjadi jauh lebih besar, karena tidak ada batasan seberapa besar blok teks bisa didapat. Misalnya, inputnya bahkan bisa berupa 200x200blok teks acak .

Pengaduan

  • Celah Standar dilarang.

  • Tidak mungkin ada built-in untuk ini, tapi kalau-kalau ada (melihat Anda Mathematica), penggunaan built-in yang secara langsung menyelesaikan ini dilarang.

Kasus uji:

Diberikan dalam format 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]]
^!!#&#&&&#*^#!^!^@!$
&$$^*$^$!#*&$&$#^^&$

Selebihnya datang segera

catatan tambahan

  • Anda dapat mengasumsikan bahwa input akan selalu dalam bentuk blok lengkap (yaitu persegi panjang atau persegi)
  • Tidak akan pernah ada karakter lain dalam input selain yang masuk !@#$^&*.

Ingat, ini adalah sehingga kode terpendek menang!

R. Kap
sumber
12
Tampaknya agak lama dan sewenang-wenang.
orlp
@ Atlp Itulah tujuan saya. Bagaimanapun juga itu adalah tantangan. Mengapa Anda mengatakan itu sewenang-wenang?
R. Kap
6
@ R.Kap Tidak ada pembenaran untuk aturan apa pun; mereka tampaknya dibuat untuk menambah kerumitan tanpa alasan.
Dana Gugatan Monica
6
@QPaysTaxes Apa pembenaran yang dibutuhkan ini? Ini yang dibuat untuk kepentingan tantangan. Itu adalah sebuah tantangan, dan sebuah tantangan secara harfiah bisa berupa apa saja . Yang dibutuhkan hanyalah seperangkat aturan, input, dan output apa yang harus didasarkan pada aturan itu.
R. Kap
1
Saya tidak mengatakan saya setuju, saya menjelaskan mengapa itu terlihat sewenang-wenang. Ambil tantangan saya yang paling populer sebagai contoh: Jika Anda menghapus semua konteks dan hanya berkata, "Anda diberi serangkaian string. Berdasarkan lekukan, kelompokkan mereka, kocok kelompoknya, kemudian kocok kelompok interiornya, tetapi pertahankan anggota dari kelompok interior di bagian bawah jika ada ", itu tidak masuk akal. Namun, karena memiliki konteks, semua aturan dan batasan aneh itu setidaknya berpura-pura masuk akal.
Dana Gugatan Monica

Jawaban:

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

Ini mendefinisikan fungsi fyang melakukan tugas yang diberikan.

faubi
sumber
2

JavaScript (ES6), 363 339 312 309 298 byte

Ini adalah fungsi yang mengambil input sebagai string dan mengembalikan daftar koordinat. Ini dibagi menjadi 2 bagian utama: transformasi sakelar menjadi sepasang koordinat dan karakter sekitarnya, dan tanda centang 'is it on' berdasarkan aturan tantangan pada karakter sekitarnya.

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

Cobalah online!

Mengambil input sebagai daftar string

Mencetak output sebagai pasangan koordinat x, y pada setiap baris

TFeld
sumber