Apakah ini perampokan?
Backstory
Anda memiliki toko perhiasan kecil di pinggiran kota. Pinggiran kota terlalu padat penduduk, sehingga toko Anda hanya memiliki satu karakter yang cocok untuk jalanan yang sibuk.
Baru-baru ini, ada banyak kasus perampokan di lingkungan sekitar, dan Anda takut perampok juga akan datang untuk mendapatkan hadiah Anda.
Karena itu, Anda memasang kamera pengintai untuk menjaga toko. Tapi ada satu masalah besar : Kamera tidak berbunyi bip atau alarm .
Anda memutuskan untuk memprogram alarm keamanan sendiri. Ini akan melengkapi alat-alatnya dan (semoga) membuat toko kecil Anda aman dan terlindungi.
Tugas
Kamera pengawas Anda akan memetakan toko Anda seperti ini:
WI J E WIni adalah masukan Anda, yang dapat Anda ambil dari STDIN atau dari argumen baris perintah. Setiap huruf memiliki arti yang berbeda.
- W melambangkan sebuah dinding . Perampok dan penyusup tidak bisa melewatinya.
- E berarti karyawan . Ini adalah makhluk yang dikenali kamera. Jika mereka melihat penyusup, mereka akan segera membunyikan alarm sebelum perampok dapat melakukan apapun. (Mereka dapat melihat penyusup jika tidak ada dinding , permata , penyusup atau karyawan lain di antaranya) Mereka juga cenderung diam.
- J berarti permata . Ini adalah barang yang dicari para perampok dan penyusup.
- Maksud saya penyusup . Mereka kemungkinan besar adalah perampok. Tujuan mereka adalah untuk mencuri (setidaknya satu dari) perhiasan toko.
- Tentu saja, Anda dapat membuat legenda peta Anda sendiri untuk menghemat byte kode.
Berdasarkan masukan, Anda perlu menulis program (atau fungsi) yang melakukan hal berikut:
- Jika penyusup dapat dengan bebas meletakkan tangan mereka di atas permata ATAU karyawan dapat melihat penyusup :
- Cetak nilai kebenaran. ("1", "True", "Alert")
- Agar benar-benar waspada, cetak karakter lonceng ASCII. (Ini memiliki kode ASCII 7. Ketika dicetak, ini memainkan suara ting di banyak komputer dan implementasi)
- Dalam sebagian besar implementasi, ada tidak bisa menjadi ting suara, jadi hati-hati!
- Dalam beberapa kasus di mana bel sama sekali tidak dapat dicetak, cetaklah tanda seru ('!') Sebagai gantinya. (Mencetak tanda seru mungkin lebih sulit diterapkan dalam beberapa bahasa)
- Lain:
- Cetak nilai yang salah. ("0", "False", "Quiet")
- Jika penyusup dapat dengan bebas meletakkan tangan mereka di atas permata ATAU karyawan dapat melihat penyusup :
Toko tidak membungkus .
Yah, komputer Anda berjalan lambat jika Anda menjalankan terlalu banyak byte. Cobalah untuk memprogram kode Anda sesingkat mungkin. (
code-golf)
Contoh tes
STDIN: EXAMPLE STDOUT:
WI J E W 1(BEL)
WIWWJWE W 0
E I J I E 1(BEL)
I W J E 0
I E W E E 1(BEL)
IIIIEIIII 1(BEL)
JJJJEJJWI 0
Catatan: "(BEL)" mengacu pada karakter bel, bukan string.
Semoga berhasil!
Jawaban
Jelly , 10 8 byte
ḟ⁶OIA7fỌ
Program lengkap yang mencetak string kosong (falsey) jika semuanya baik atau karakter bel jika tidak (karakter bel juga benar).
Memasukkan:
Wall W
Employee X
Jewel J
Intruder Q
Cobalah secara online!
Atau lihat rangkaian pengujian (footer pertama menerjemahkan karakter dari contoh dan memanggil Tautan untuk setiap baris).
Bagaimana?
ḟ⁶OIA7fỌ - Main Link: list of characters in "W QJX"
⁶ - a space character
ḟ - filter-discard (remove any spaces)
O - to ordinals (e.g. "WXQJ" -> [87,88,81,74])
I - incremental differences (e.g. [87,88,81,74] -> [1,-7,-7])
...possible values are: -14 -13 -7 -6 -1 0 1 6 7 13 14
-7 and 7 indicate an intruder (Q) is next to a jewel (J) or employee (X)
A - absolute values
7 - seven
f - filter keep ([7] if any of the values are 7 else [])
Ọ - cast to characters (bell character in a list or an empty list)
- implicit print
...single-element lists print their element
while empty lists print an empty string
Brachylog , 17 12 10 byte
-5 byte dengan tidak membedakan antara Karyawan dan Permata
-2 byte menggunakan penjumlahan, bukan perkalian, jadi saya mendapatkan 7 untuk \ a gratis
Ubin kosong -, penyusup juga manusia h, permata masih Jpermata, karyawan toko e, dan dinding >ditutup. Di Brachylog, predikat yang berhasil adalah nilai kebenaran. Jadi bisa berupa nilai sebagai output ( BEL) atau penyatuan gagal, direpresentasikan sebagai false..
ạ%₉ᵐs+7g~ạ
Cobalah secara online!
Ini semua dilakukan jadi bytes modulo 9 ạ%₉ᵐmap (empty) => 0, I => 5, J => 2, E => 2, W => 8. Dengan ini, kita dapat menjumlahkan setiap subset dari elemen yang berurutan s+dan memeriksa apakah salah satunya adalah 7( I J, ie 5+0+0+2atau E I, ie 2+0+0+5). Karena petak kosong dipetakan 0, nilainya tidak berubah, begitu pula urutannya. Juga 7 tidak bisa dibuat oleh elemen lain. Jika satu subset cocok, kembalikan convert 7 ke byte ~gạ, yaitu \a.
05AB1E , 7 byte
áÇ¥Ä7Ãç
Port of @JonathanAllan 's Jelly jawaban , jadi pastikan untuk upvote dia juga!
Seperti jawabannya, saya menggunakan W= wall; J= permata; X= karyawan; Q= penyusup.
Mengeluarkan satu atau beberapa karakter BEL dalam daftar sebagai nilai kebenaran atau daftar kosong sebagai nilai falsey.
Cobalah secara online atau verifikasi semua kasus pengujian .
Penjelasan:
á # Only keep the letters of the (implicit) input-string (removes spaces)
Ç # Convert each character to its codepoint integer
¥ # Get the forward difference between each codepoint pair
# (one of: [-14,-13,-7,-6,-1,0,1,6,7,13,14])
Ä # Take the absolute value of each difference
7Ã # Only keep all 7s in the list
ç # And convert those 7s (if any) to an ASCII character with this codepoint
# (after which the resulting list is output implicitly as result)
Python 3 , 52 byte
Digunakan #sebagai pengganti untuk ruang kosong dan sebagai pengganti Wuntuk dinding. Output adalah string kosong sebagai nilai falsey dan karakter bel untuk input yang benar.
lambda s:any({*'I#'}<{*g,'#'}for g in s.split())*''
Cobalah secara online!
JavaScript (ES6), 33 28 byte
5 byte disimpan berkat @DomHastings!
Harapkan epermata, dan karakter yang ditentukan dalam tantangan untuk item lainnya.
Yang tidak dapat dicetak BELdiloloskan di bawah ini.
s=>/E *I|I *E/i.test(s)&&'\7'
Cobalah secara online!
AWK , 47 \$\cdots\$ 27 26 byte
Menghemat 2 3 7 8 byte berkat Dominic van Essen !!!
Memiliki karakter bel yang tidak dapat dicetak dalam tanda kutip.
$0=/[EJ] *I|I *[EJ]/?"":0
Cobalah secara online! (Dengan bel yang bisa dicetak)
Jika ada kemungkinan bahaya di tangan, keluarkan karakter bel (kebenaran) atau keluaran 0 (salah) sebaliknya.
perl -pl, 26 byte
$_=/I *[EJ]|[EJ] *I/?"^G":0
Cobalah secara online!
Karena sulit untuk memasukkan karakter yang tidak dapat dicetak, karakter lonceng ada di sini (dan dalam TIO), diwakili oleh kombinasi dua karakter ^G. Di program sebenarnya, ini adalah karakter dengan kode ASCII 7 (jadi, saya menghitungnya sebagai 1 karakter).
Bagaimana cara kerjanya?
Semua kasus yang dijelaskan bermuara pada penyusup di samping beberapa permata atau karyawan. Jadi kami menggunakan regexp untuk mendeteksi kasus ini.
perl -pl, 15 byte
s/E *I|I *E/^G/i
Cobalah secara online!
Di sini, "truthy" dianggap "berisi karakter BEL", dan "falsey" sebagai "tidak mengandung karakter BEL". Dan itu menggunakan saran @Dom Hastings untuk digunakan esebagai simbol perhiasan.
perl -F / [EJ] \ s * I | I \ s * [EJ] / -pl, 13 byte
$_=@F>1?"^G":0
Cobalah secara online!
Kita dapat memindahkan sebagian pekerjaan ke saklar baris perintah, dan menguranginya menjadi 13 byte.
Pip , 26 21 byte
3NST(_-BMPaRMs)?o.'!i
Cobalah secara online!
-5 byte setelah masukan Dominic Van Essen berubah.
Mengambil masukan sebagai:
8 → Wall
4 → intruder
7 → Jewel
1 → Employee
Mengambil perbedaan, mengubah menjadi string, memeriksa apakah ada 3 dalam representasi string.
Pyth , 13 byte
*\lf&/TN@GTc
Cobalah secara online!
Legenda
j- permatae- para karyawan"- penyusup- dinding#- kosong
Penjelasan
*\!lf&/TN@GTc
f # filter
c # input split on whitespace chars
# with lambda T:
@GT # some lowercase alphabet in T
&/TN # and '"' in T
*\!l # output '!' repeated length of results of filter times
R , 74 byte
function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)
Cobalah secara online!
C (gcc) , 97 byte
i;j;r;t;f(char*s){for(i=j=r=0;t=*s++;t==87?i=j=0:0)i|=t==73,j|=t==74|t==69,r|=i&j;r&&putchar(7);}
Cobalah secara online (dengan tanda seru alih-alih bel karena TIO tidak dapat menanganinya)
Arang , 18 byte
×!⊙⪪EIIEIJJI²№⁻θ ι
Cobalah secara online! Tautan adalah untuk verbose versi kode. Output !karena BEL tidak ada di halaman kode Charcoal. Penjelasan:
EIIEIJJI Literal string `EIIEIJJI`
⪪ ² Split into 2-character substrings
⊙ Any substring satisfies
№ (non-zero) Count of
ι Current substring in
θ Input string
⁻ With spaces deleted
×! `!` if the above is true
Implicitly print