Bu bir soygun mu?

Sep 15 2020

Arka plan

Şehrin banliyölerinde küçük bir kuyumcu dükkanınız var. Banliyöler çok fazla kalabalık , bu nedenle dükkanınız kalabalık caddelere sığmak için yalnızca bir karakter kalınlığına sahip .

Son zamanlarda, mahallede birçok soygun vakası oldu ve hırsızların da ödülünüzü almaya gelmesinden korkuyorsunuz.

Bu nedenle, mağazayla ilgilenmek için güvenlik kameraları kurdunuz. Ancak büyük bir sorun var: Kameralar bip sesi çıkarmıyor veya alarm vermiyor .


Güvenlik alarmını kendiniz programlamaya karar verirsiniz. Bu, mekanizmaları tamamlayacak ve (umarım) küçük dükkanınızı güvenli ve emniyetli hale getirecektir.

Görev

  • Güvenlik kameralarınız mağazanızın haritasını şu şekilde çıkaracaktır:

    WI  J E W
    

    Bu, STDIN'den veya komut satırı argümanlarından alabileceğiniz girdinizdir. Harflerin her birinin farklı anlamları vardır.

    • W bir duvarı temsil eder . Hırsızlar ve davetsiz misafirlerin içinden geçemezler.
    • E , çalışanlar demektir . Bunlar, kameraların tanıdığı varlıklardır. Bir davetsiz misafir görürlerse, hırsızlar herhangi bir şey yapmadan hemen alarmı çalıştırırlar. (Arada duvar , mücevher , davetsiz misafir veya başka bir çalışan yoksa davetsiz misafirleri görebilirler ) Ayrıca hareketsiz durma eğilimindedirler.
    • J , mücevher anlamına gelir . Bunlar soyguncuların ve davetsiz misafirlerin aradığı şeyler.
    • Davetsiz misafir demek istiyorum . Büyük ihtimalle soygunculardır. Amaçları, dükkanın mücevherlerini (en az birini) çalmaktır.
    • Elbette, kod baytlarını kaydetmek adına kendi harita efsanenizi oluşturabilirsiniz.
  • Girişe bağlı olarak, aşağıdakileri yapan bir program (veya işlev) yazmanız gerekir:

    • Bir davetsiz misafir ellerini bir mücevhere özgürce koyabilirse VEYA bir çalışan davetsiz misafirleri görebilirse :
      • Doğru bir değer yazdırın. ("1", "Doğru", "Uyarı")
      • Tamamen uyanık olmak için ASCII çan karakterini yazdırın. (7 ASCII koduna sahiptir. Yazdırıldığında, birçok bilgisayar ve uygulamada tınlama sesi çalar )
        • Çoğu uygulamada bir çınlama sesi olamaz , bu yüzden dikkatli olun!
        • Zilin kesinlikle basılamadığı bazı durumlarda , bunun yerine bir ünlem işareti ('!') Yazdırın. (Bazı dillerde ünlem işareti basmak daha zor olabilir)
    • Başka:
      • Yanlış bir değer yazdırın. ("0", "Yanlış", "Sessiz")
  • Dükkan etrafına dolanmaz .

  • Pekala, çok fazla bayt çalıştırdığınızda bilgisayarınız yavaş çalışıyor. Kodunuzu olabildiğince kısa programlamaya çalışın. ( code-golf)

Örnek testler

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

Not: "(BEL)" dizeyi değil çan karakterini ifade eder.

İyi şanslar!

Yanıtlar

9 JonathanAllan Sep 15 2020 at 21:03

Jöle ,  10  8 bayt

ḟ⁶OIA7fỌ

Her şey yolunda ise boş bir dizge (falsey) veya değilse bir çan karakteri (bir çan karakteri de doğrudur) yazdıran tam bir program.

Giriş:

    Wall W
Employee X
   Jewel J
Intruder Q

Çevrimiçi deneyin!

Veya test paketine bakın (Altbilgi önce örnek olanlardan karakterleri çevirir ve her satır için Bağlantıyı çağırır).

Nasıl?

ḟ⁶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 bayt

Çalışanlar ve Jewels arasında ayrım yapmayarak -5 bayt

Çarpma yerine toplama kullanarak -2 bayt, bu yüzden ücretsiz \ a için 7 alırım

Boş fayanslar -, davetsiz misafirler hde Jumandır , mücevherler hala yılan balığı, dükkan çalışanları eve duvarlar >yaklaşıyor. Brachylog'da başarılı olan bir dayanak gerçek değerdir. Yani ya çıktı olarak bir değer ( BEL) ya da birleştirme başarısız, olarak temsil edilir false..

ạ%₉ᵐs+7g~ạ

Çevrimiçi deneyin!

Bu, tüm bayt modulo 9 ạ%₉ᵐharitası için yapılır (empty) => 0, I => 5, J => 2, E => 2, W => 8. Bununla, ardışık elemanların her alt kümesini toplayabilir s+ve bunlardan birinin 7( I Jyani 5+0+0+2veya E I, yani 2+0+0+5) olup olmadığını kontrol edebiliriz . Boş karolar eşlendiği için 0değeri değiştirmezler ve sıra da değişmez. Ayrıca 7 diğer elemanlarla yapılamaz. Bir alt küme eşleşirse, 7'yi bayta dönüştür ~gạ, yani \a.

6 KevinCruijssen Sep 16 2020 at 08:01

05AB1E , 7 bayt

áÇ¥Ä7Ãç

Port of @JonathanAllan'ın Jelly cevabı , bu yüzden ona da oy verdiğinizden emin olun!

Cevabı gibi ben de W= wall; J= mücevher; X= çalışan; Q= davetsiz misafir.
Bir listedeki bir veya birden çok BEL karakterini doğru değer olarak veya boş bir listeyi yanlış değer olarak verir.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

á        # 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 bayt

Kullanımları #yerine ve boş alanlar için yerine Wduvarlar için. Çıktı, sahte değer olarak boş bir dizedir ve doğru girdiler için çan karakteridir.

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

Çevrimiçi deneyin!

4 Arnauld Sep 15 2020 at 18:32

JavaScript (ES6),  33  28 bayt

@DomHastings sayesinde 5 bayt tasarruf edildi!

eBir mücevheri ve diğer öğeler için meydan okumada tanımlanan karakterleri bekler .

Yazdırılamaz BELaşağıda kaçtı.

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

Çevrimiçi deneyin!

4 Noodle9 Sep 15 2020 at 19:38

AWK , 47 \$\cdots\$ 27 26 bayt

Dominic van Essen sayesinde 2 3 7 8 bayt tasarruf etti !!! Tırnak içinde yazdırılamayan çan karakteri vardır.

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

Çevrimiçi deneyin! (Yazdırılabilir zil ile)

Eldeki bir tehlike varsa, aksi takdirde çan karakterini (doğru) veya 0 (yanlış) verir.

3 Abigail Sep 15 2020 at 20:12

perl -pl, 26 bayt

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

Çevrimiçi deneyin!

Yazdırılamayan karakterleri girmek zor olduğundan, çan karakteri buradadır (ve TIO'da) ve iki karakter birleşimiyle temsil edilir ^G. Gerçek programda, bu ASCII kodu 7 olan karakterdir (yani onu 1 karakter olarak sayıyorum).

O nasıl çalışır?

Açıklanan tüm vakalar, ya mücevherlerin ya da bir çalışanın yanındaki davetsiz misafirlere dönüşüyor. Bu nedenle, bu durumu tespit etmek için bir normal ifade kullanırız.

perl -pl, 15 bayt

s/E *I|I *E/^G/i

Çevrimiçi deneyin!

Burada, "doğru", "BEL karakteri içerir" ve "sahte", "BEL karakteri içermediğinden" alınır. Ve @Dom Hastings'in emücevherler için sembol olarak kullanma önerisini kullanıyor .

perl -F / [EJ] \ s * I | I \ s * [EJ] / -pl, 13 bayt

$_=@F>1?"^G":0

Çevrimiçi deneyin!

İşin bir kısmını bir komut satırı anahtarına aktarabilir ve 13 bayta indirebiliriz.

3 Razetime Sep 16 2020 at 10:05

Pip , 26 21 bayt

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

Çevrimiçi deneyin!

Dominic Van Essen'in girişi değiştikten sonra -5 bayt.

Girişleri şu şekilde alır:

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

Farkları alır, dizgeye dönüştürür, dizge gösteriminde 3 olup olmadığını kontrol eder.

2 Mukundan314 Sep 15 2020 at 19:24

Pyth , 13 bayt

*\lf&/TN@GTc

Çevrimiçi deneyin!

Efsane

  • j - mücevher
  • e - çalışanlar
  • " - davetsiz misafir
  • - duvar
  • # - boş

Açıklama

*\!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 bayt

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

Çevrimiçi deneyin!

2 rtpax Sep 16 2020 at 13:07

C (gcc) , 97 bayt

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);}

Çevrimiçi deneyin (TIO bunu kaldıramadığından zil yerine ünlem işaretiyle)

1 Neil Sep 15 2020 at 23:32

Kömür , 18 bayt

×!⊙⪪EIIEIJJI²№⁻θ ι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı sürümüne yöneliktir. !BEL Charcoal'ın kod sayfasında olmadığı için çıktılar . Açıklama:

    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