Bu bir soygun mu?
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 WBu, 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")
- Bir davetsiz misafir ellerini bir mücevhere özgürce koyabilirse VEYA bir çalışan davetsiz misafirleri görebilirse :
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
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
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.
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)
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!
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!
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.
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.
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.
Pyth , 13 bayt
*\lf&/TN@GTc
Çevrimiçi deneyin!
Efsane
j- mücevhere- ç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
R , 74 bayt
function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)
Çevrimiçi deneyin!
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)
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