นี่คือการปล้น?

Sep 15 2020

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)" หมายถึงอักขระกระดิ่งไม่ใช่สตริง

โชคดี!

คำตอบ

9 JonathanAllan Sep 15 2020 at 21:03

เจลลี่ ,  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
9 xash Sep 15 2020 at 21:26

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

6 KevinCruijssen Sep 16 2020 at 08:01

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)
5 ovs Sep 15 2020 at 20:03

Python 3 , 52 ไบต์

ใช้#แทน พื้นที่ว่างและ ใช้แทนWผนัง เอาต์พุตคือสตริงว่างเป็นค่าเท็จและอักขระเบลล์สำหรับอินพุตที่แท้จริง

lambda s:any({*'I#'}<{*g,'#'}for g in s.split())*''

ลองออนไลน์!

4 Arnauld Sep 15 2020 at 18:32

JavaScript (ES6),  33  28 ไบต์

บันทึก 5 ไบต์ขอบคุณ @DomHastings!

คาดหวังeสำหรับอัญมณีและตัวละครที่กำหนดไว้ในการท้าทายสำหรับไอเท็มอื่น ๆ

สิ่งที่พิมพ์ไม่ได้BELจะถูกหลบหนีด้านล่าง

s=>/E *I|I *E/i.test(s)&&'\7'

ลองออนไลน์!

4 Noodle9 Sep 15 2020 at 19:38

AWK , 47 \$\cdots\$ 27 26 ไบต์

บันทึก2 3 7 8 ไบต์ขอบคุณDominic van Essen !!!
มีอักขระกระดิ่งที่ไม่สามารถพิมพ์ได้ในเครื่องหมายคำพูด

$0=/[EJ] *I|I *[EJ]/?"":0

ลองออนไลน์! (พร้อมพิมพ์กริ่ง)

หากมีอันตรายที่มืออาจส่งออกอักขระระฆัง (จริง) หรือเอาต์พุต 0 (เท็จ) เป็นอย่างอื่น

3 Abigail Sep 15 2020 at 20:12

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 ไบต์

3 Razetime Sep 16 2020 at 10:05

Pip , 26 21 ไบต์

3NST(_-BMPaRMs)?o.'!i

ลองออนไลน์!

-5 ไบต์หลังจากการเปลี่ยนแปลงอินพุตของ Dominic Van Essen

รับอินพุตเป็น:

8 → Wall
4 → intruder
7 → Jewel
1 → Employee

นำความแตกต่างแปลงเป็นสตริงตรวจสอบว่ามี 3 ในการแสดงสตริงหรือไม่

2 Mukundan314 Sep 15 2020 at 19:24

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  
2 CongChen Sep 16 2020 at 07:59

R , 74 ไบต์

function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)

ลองออนไลน์!

2 rtpax Sep 16 2020 at 13:07

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 ไม่สามารถจัดการได้)

1 Neil Sep 15 2020 at 23:32

ถ่าน 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