นี่คือการปล้น?
Backstory
คุณเป็นเจ้าของร้านอัญมณีเล็ก ๆ ในเขตชานเมืองของเมือง ย่านชานเมืองมีประชากรมากเกินไปดังนั้นร้านของคุณจึงมีความหนาเพียงตัวเดียวเพื่อให้พอดีกับถนนที่พลุกพล่าน
เมื่อเร็ว ๆ นี้มีคดีปล้นมากมายในละแวกใกล้เคียงและคุณกลัวว่าโจรจะมารับเงินรางวัลจากคุณ
ดังนั้นคุณจึงติดตั้งกล้องวงจรปิดเพื่อดูแลร้าน แต่มีหนึ่งใหญ่ปัญหา: กล้องไม่เตือนหรือสัญญาณเตือน
คุณตัดสินใจที่จะตั้งโปรแกรมการเตือนความปลอดภัยด้วยตัวเอง สิ่งนี้จะทำให้การคุมกำเนิดสมบูรณ์และ (หวังว่า) จะทำให้ร้านเล็ก ๆ ของคุณปลอดภัย
งาน
กล้องวงจรปิดของคุณจะทำแผนที่ร้านของคุณดังนี้:
WI J E Wนี่คืออินพุตของคุณซึ่งคุณสามารถรับจาก STDIN หรือจากอาร์กิวเมนต์บรรทัดคำสั่ง ตัวอักษรแต่ละตัวมีความหมายที่แตกต่างกัน
- Wหมายถึงผนัง โจรและผู้บุกรุกไม่สามารถผ่านพวกเขาไปได้
- Eหมายถึงพนักงาน สิ่งเหล่านี้คือสิ่งมีชีวิตที่กล้องรับรู้ หากพวกเขาเห็นผู้บุกรุกพวกเขาจะปิดการเตือนทันทีก่อนที่พวกโจรจะทำอะไรได้ (พวกเขาสามารถมองเห็นผู้บุกรุกถ้าไม่มีผนัง , อัญมณี , ผู้บุกรุกหรืออื่น ๆ ที่พนักงานในระหว่าง) พวกเขายังมีแนวโน้มที่จะยังคงยืน
- Jหมายถึงอัญมณี นี่คือสิ่งที่พวกโจรและผู้บุกรุกกำลังมองหา
- ฉันหมายความว่าผู้บุกรุก พวกเขามักจะเป็นโจร เป้าหมายของพวกเขาคือขโมย (อย่างน้อยหนึ่งใน) อัญมณีของร้าน
- แน่นอนคุณสามารถสร้างตำนานแผนที่ของคุณเองเพื่อประโยชน์ในการบันทึกไบต์ของรหัส
จากข้อมูลที่ป้อนคุณต้องเขียนโปรแกรม (หรือฟังก์ชัน) ที่ทำสิ่งต่อไปนี้:
- หากผู้บุกรุกสามารถวางมือบนอัญมณีได้อย่างอิสระหรือพนักงานสามารถมองเห็นผู้บุกรุกได้ :
- พิมพ์ค่าที่แท้จริง ("1", "จริง", "การแจ้งเตือน")
- พิมพ์อักขระกระดิ่ง ASCII เพื่อแจ้งเตือนอย่างสมบูรณ์ (มันมีรหัส ASCII ของ 7. เมื่อพิมพ์ก็เล่นการใช้งานเสียงในจำนวนของคอมพิวเตอร์และการใช้งาน)
- ในการใช้งานส่วนใหญ่มีไม่สามารถเป็นการใช้งานเสียงจึงควรระวัง!
- ในบางกรณีที่ไม่สามารถพิมพ์กระดิ่งได้อย่างสมบูรณ์ให้พิมพ์เครื่องหมายอัศเจรีย์ ('!') แทน (การพิมพ์เครื่องหมายอัศเจรีย์อาจทำได้ยากกว่าในบางภาษา)
- อื่น:
- พิมพ์ค่าเท็จ ("0", "เท็จ", "เงียบ")
- หากผู้บุกรุกสามารถวางมือบนอัญมณีได้อย่างอิสระหรือพนักงานสามารถมองเห็นผู้บุกรุกได้ :
ร้านค้าที่ไม่ได้ห่อรอบ
Welp คอมพิวเตอร์ของคุณทำงานช้าเมื่อคุณใช้งานไบต์มากเกินไป พยายามตั้งโปรแกรมโค้ดของคุณให้สั้นที่สุด (
code-golf)
ตัวอย่างการทดสอบ
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
หมายเหตุ: "(BEL)" หมายถึงอักขระกระดิ่งไม่ใช่สตริง
โชคดี!
คำตอบ
เจลลี่ , 10 8 ไบต์
ḟ⁶OIA7fỌ
โปรแกรมเต็มรูปแบบที่พิมพ์สตริงว่าง (เท็จ) หากทุกอย่างเรียบร้อยดีหรืออักขระเบลล์ถ้าไม่ใช่ (อักขระเบลล์ก็จริงเช่นกัน)
อินพุต:
Wall W
Employee X
Jewel J
Intruder Q
ลองออนไลน์!
หรือดูชุดทดสอบ (ส่วนท้ายจะแปลอักขระจากตัวอย่างก่อนแล้วเรียกลิงก์สำหรับแต่ละบรรทัด)
อย่างไร?
ḟ⁶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 ไบต์
-5 ไบต์โดยไม่แยกความแตกต่างระหว่างพนักงานและอัญมณี
-2 ไบต์โดยใช้การบวกไม่ใช่การคูณดังนั้นฉันจึงได้รับ 7 สำหรับ \ a ฟรี
กระเบื้องที่ว่างเปล่าคือ-ผู้บุกรุกก็ยังเป็นhมนุษย์อัญมณียังคงเป็นJปลาไหลพนักงานในร้านอยู่eและกำแพง>กำลังจะปิดลงใน Brachylog คำที่ประสบความสำเร็จคือค่าที่แท้จริง ดังนั้นจึงเป็นทั้งมูลค่าการส่งออก ( BEL) false.หรือการรวมกันล้มเหลวแสดงเป็น
ạ%₉ᵐs+7g~ạ
ลองออนไลน์!
นี้จะทำทั้งหมดเพื่อไบต์แบบโมดูโล 9 แผนที่ạ%₉ᵐ (empty) => 0, I => 5, J => 2, E => 2, W => 8ด้วยวิธีนี้เราสามารถรวมองค์ประกอบย่อยที่ต่อเนื่องกันทั้งหมดs+และตรวจสอบว่าหนึ่งในนั้นคือ7( I Jเช่น5+0+0+2หรือE Iกล่าวคือ2+0+0+5) เนื่องจากไทล์ว่างจับคู่กับ0จึงไม่เปลี่ยนค่าและไม่เรียงลำดับด้วย นอกจากนี้ 7 องค์ประกอบอื่นไม่สามารถสร้างได้ หากหนึ่งในการแข่งขันเซตกลับแปลง 7 ไบต์ซึ่งเป็น~gạ\a
05AB1E , 7 ไบต์
áÇ¥Ä7Ãç
พอร์ตคำตอบของ Jellyของ@JonathanAllanดังนั้นอย่าลืมโหวตให้เขาด้วย!
เช่นเดียวกับคำตอบของเขาฉันใช้W= wall; J= อัญมณี; X= พนักงาน; Q= ผู้บุกรุก
แสดงอักขระ BEL หนึ่งตัวหรือหลายตัวในรายการเป็นค่าจริงหรือรายการว่างเป็นค่าเท็จ
ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด
คำอธิบาย:
á # 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 ไบต์
ใช้#แทน พื้นที่ว่างและ ใช้แทนWผนัง เอาต์พุตคือสตริงว่างเป็นค่าเท็จและอักขระเบลล์สำหรับอินพุตที่แท้จริง
lambda s:any({*'I#'}<{*g,'#'}for g in s.split())*''
ลองออนไลน์!
JavaScript (ES6), 33 28 ไบต์
บันทึก 5 ไบต์ขอบคุณ @DomHastings!
คาดหวังeสำหรับอัญมณีและตัวละครที่กำหนดไว้ในการท้าทายสำหรับไอเท็มอื่น ๆ
สิ่งที่พิมพ์ไม่ได้BELจะถูกหลบหนีด้านล่าง
s=>/E *I|I *E/i.test(s)&&'\7'
ลองออนไลน์!
AWK , 47 \$\cdots\$ 27 26 ไบต์
บันทึก2 3 7 8 ไบต์ขอบคุณDominic van Essen !!!
มีอักขระกระดิ่งที่ไม่สามารถพิมพ์ได้ในเครื่องหมายคำพูด
$0=/[EJ] *I|I *[EJ]/?"":0
ลองออนไลน์! (พร้อมพิมพ์กริ่ง)
หากมีอันตรายที่มืออาจส่งออกอักขระระฆัง (จริง) หรือเอาต์พุต 0 (เท็จ) เป็นอย่างอื่น
perl -pl 26 ไบต์
$_=/I *[EJ]|[EJ] *I/?"^G":0
ลองออนไลน์!
เพราะมันยากที่จะป้อนตัวอักษรไม่สามารถพิมพ์ตัวอักษรระฆังอยู่ที่นี่ (และใน TIO) ^Gแสดงโดยคำสั่งผสมสองตัวละคร ในโปรแกรมจริงนี่คืออักขระที่มีรหัส ASCII 7 (ดังนั้นฉันนับเป็น 1 อักขระ)
มันทำงานอย่างไร?
ทุกกรณีที่อธิบายถึงผู้บุกรุกที่อยู่ถัดจากอัญมณีหรือพนักงาน ดังนั้นเราจึงใช้ regexp เพื่อตรวจจับกรณีนี้
perl -pl, 15 ไบต์
s/E *I|I *E/^G/i
ลองออนไลน์!
ในที่นี้ "truthy" จะถูกนำไปที่ "มีอักขระ BEL" และ "falsey" เป็น "ไม่มีอักขระ BEL" และใช้คำแนะนำของ @Dom Hastings ในการใช้eเป็นสัญลักษณ์สำหรับอัญมณี
perl -F / [EJ] \ s * I | I \ s * [EJ] / -pl, 13 ไบต์
$_=@F>1?"^G":0
ลองออนไลน์!
เราสามารถถ่ายโอนงานบางส่วนไปยังสวิตช์บรรทัดคำสั่งและลดลงเหลือ 13 ไบต์
Pip , 26 21 ไบต์
3NST(_-BMPaRMs)?o.'!i
ลองออนไลน์!
-5 ไบต์หลังจากการเปลี่ยนแปลงอินพุตของ Dominic Van Essen
รับอินพุตเป็น:
8 → Wall
4 → intruder
7 → Jewel
1 → Employee
นำความแตกต่างแปลงเป็นสตริงตรวจสอบว่ามี 3 ในการแสดงสตริงหรือไม่
Pyth , 13 ไบต์
*\lf&/TN@GTc
ลองออนไลน์!
ตำนาน
j- อัญมณีe- พนักงาน"- ผู้บุกรุก- ผนัง#- ว่างเปล่า
คำอธิบาย
*\!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 ไบต์
function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)
ลองออนไลน์!
C (gcc) 97 ไบต์
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);}
ลองใช้งานออนไลน์ (โดยใช้เครื่องหมายอัศเจรีย์แทนกระดิ่งเนื่องจาก TIO ไม่สามารถจัดการได้)
ถ่าน 18 ไบต์
×!⊙⪪EIIEIJJI²№⁻θ ι
ลองออนไลน์! ลิงก์คือรหัสเวอร์ชันที่ละเอียด แสดงผล!เนื่องจาก BEL ไม่ได้อยู่ในหน้ารหัสของ Charcoal คำอธิบาย:
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