Yağmur yağıyor mu? Söyleyemem


10

Bunlar yağmur damlaları:

! | . " :

Bunlar bulut parçacıkları:

( ) _ @ $ &

Bir metin bloğu verildiğinde yağmur yağıp yağmadığını doğrulamanızı istiyorum. Her yağmur damlası için üzerinde bir bulut parçacığı varsa yağmur yağıyor. Her yağmur damlası için bir bulut parçacığı olmalıdır. Sonuçlarınızı ifade eden doğruluk ya da yanlış bir değer ortaya koyun.

Geçerli örnekler

(@@@@@@)
 ( $ &  )
Q   (  )
..  .  !
 : .
  |"   !
    .

()()()
......

@_$ &
errrr
h_r-5
.:. .
 "

Geçersiz örnekler

!
()

$$$$$
(   )
:::::
.....

Bu bir bu yüzden karakterlerdeki en kısa program kazanır.


2
"Her yağmur damlası için bir bulut parçacığı olmalı"
Blue

@feersum İkinci geçersiz örnek, aradığınız örnektir.
Seadrus

@feersum I see;)
Seadrus

Satırların dikdörtgen oluşturmak için boşluklarla doldurulduğunu varsayabilir miyiz?
feersum

3
@Zereges, no: en az bir
msh210

Yanıtlar:


4

APL (30)

{∧/∊≤/+⍀¨⍵∘∊¨'!|.":' '()_@$&'}

Bu, karakter matrisini girdi olarak alan ve boole çıktısı veren bir işlevdir.

Ölçek:

      ex1 ex2 ex3 ex4 ex5
┌─────────┬──────┬─────┬──┬─────┐
│(@@@@@@) │()()()│@_$ &│! │$$$$$│
│ ( $ &  )│......│errrr│()│(   )│
│Q   (  ) │      │h_r-5│  │:::::│
│..  .  ! │      │.:. .│  │.....│
│ : .     │      │ "   │  │     │
│  |"   ! │      │     │  │     │
│    .    │      │     │  │     │
└─────────┴──────┴─────┴──┴─────┘
      {∧/∊≤/+⍀¨⍵∘∊¨'!|.":' '()_@$&'}¨ex1 ex2 ex3 ex4 ex5
1 1 1 0 0

Açıklama:

  • ⍵∘∊¨'!|.":' '()_@$&': her iki karakter kümesi için (yağmur ve bulutlar) ve in'daki her karakter için, karakterin kümenin bir üyesi olup olmadığına bakın.
  • +⍀¨: her sütun ve her küme için geçerli bir toplam elde
  • ≤/: in'daki her konum için, yağmur damlaları miktarının çalışma toplamındaki bulut parçacıklarını aşmadığını kontrol edin
  • ∧/∊: sonuçtaki tüm öğelerin boolean AND değerini döndürür

5

C ++ 11, 186 184 byte

#include<map>
int i,c;int main(){std::map<int,int>p;while(~(c=getchar())){for(int m:{40,41,95,64,36,38})p[i]+=c==m;for(int m:{33,124,46,34,58})if(c==m&&!p[i]--)return 1;i=c-10?i+1:0;}}

Ungolfed

#include <map>
int i, c;
int main()
{
    std::map<int, int> p;
    while (~(c = getchar()))
    {
//        for (int m : { '(', ')', '_', '@', '$', '&'})
        for (int m : { 40, 41, 95, 64, 36, 38})
            p[i] += c == m;
//        for (int m : { '!', '|', '.', '"', ':'})
        for (int m : { 33, 124, 46, 34, 58})
            if (c == m && !p[i]--)
                return 1;
        i = c - '\n' ? i + 1 : 0;
    }
    return 0;
}

Temel yaklaşım, bulut parçacıklarının konumlarını arka arkaya depolamak ve yağmur parçacığına rastlanırsa, bulut parçacığının üstünde olup olmadığını kontrol eder ve o sütundaki bulut parçacıklarının sayacını azaltır. Program geçerliyse 0, aksi takdirde 1 döndürür.


Eğer yerini alamaz c-m?0:p[i]++ile p[i]+=c==m? Yoksa bu artık C ++ 11'de çalışmıyor mu?
marinus

@marinus Muhtemelen evet.
Zereges

4

Salyangoz , 125

{t.{t(\(|\)|\_|\@|\$|\&)=(u.,~)d!(.,~)t.!(.,~},!{t(\!|\||\.|\"|\:)ud!(.,~}t(\(|\)|\_|\@|\$|\&)!(d.,~)u.,~},!{t(\!|\||\.|\"|\:

Program yağmur yağıyorsa, ızgara alanını (veya alanı 0 ise 1'i) çıkarır; aksi halde 0. Eğer regex tarzı karakter sınıfları uygulamış olsaydım.

Ungolfed sürümü Tüm anlamsızları yazmak yerine bulutlar veya yağmur damlaları için sahte talimatlar içerir. \whatever( .gerçek programda değiştirilen), yağmur damlası olması gereken bir şey anlamına gelir, ancak aslında herhangi bir şey olabilir, çünkü yağmur damlası olmayan bir bulutu bir bulutla eşleştirmemizin önemi yoktur.

{
    t \whatever   ,, Pick a drop in a new column
    {
        t \cloud ,, Find a cloud with 
        =(u.,~)  ,, nothing above in the same column marked
        !(d.,~)  ,, but not in an empty column
        t \whatever
        !(d.,~)
    },
    !(t \drop ud !(.,~) )  ,,no drops remaining in column
    t \cloud
    !(d.,~)
    u.,~
},             ,, repeated 0 or more times
! (t \drop)   ,, no drops left

ilginç yorum sistemi.
Seadrus

2

Python 2, 121 bayt

def f(i):
 for l in zip(*i.split('\n')):
  s=0
  for p in l:
   s+=p in'()_@$&';s-=p in'!|.":'
   if s<0:return
 return 1

Dolgulu girişin dikdörtgen olmasını bekler.


1

JavaScript ES6, 112

Aşağıdaki snippet'i ok işlevleri, yayma operatörü ve şablon dizeleri uygulayan bir EcmaScript 6 uyumlu tarayıcıda çalıştırmayı test edin (Firefox kullanıyorum)

f=t=>!t.split`
`.some(r=>[...r].some((c,i)=>(c='!|.":()_@$&'.indexOf(c),n[i]=~c?c<5?~-n[i]:-~n[i]:n[i])<0),n=[])

//TEST
console.log=x=>O.innerHTML+=x+'\n';

test_valid = [
 '(@@@@@@)\n ( $ &  )\nQ   (  )\n..  .  !\n : .\n  |"   !\n    .',
 '()()()\n......',
 '@_$ &\nerrrr\nh_r-5\n.:. .\n "'
] 
console.log('Valid');
test_valid.forEach(t=>console.log(t+'\n'+f(t)+'\n'))

test_invalid = ['!\n()','$$$$$\n(   )\n:::::\n.....']
console.log('Invalid');
test_invalid.forEach(t=>console.log(t+'\n'+f(t)+'\n'))
<pre id=O></pre>


1

Perl 5, 80

79, artı bir -Eyerine-e

@a=();while(<>){@_=split'';(0>($a[$_]+=/[()_@&\$]/-/[!|.":]/)?die:1)for@_}say 1

2
Perl'i

1

Julia, 90 karakter

s->all(cumsum(map(i->i∈"!|.\":"?-1:i∈"()_@\$&",mapfoldl(collect,hcat,split(s,"
")))').>-1)

Orijinal çözümün aksine (aşağıda), çözümü belirlemek için matematik kullanılır. mapfoldl(collect,hcat,split(s,"\n"))(yukarıda \nkarakterleri kaydetmek için gerçek bir satırsonu ile yazılmıştır ) dizeyi 2d karakter dizisine dönüştürür. map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)karakter bir bulutsa 1, karakter yağmurda -1 ve aksi takdirde 0 olan bir sayı dizisi oluşturur.

cumsum(...')satırların kümülatif toplamlarını hesaplar (normal olarak yazılır cumsum(...,2), ancak bu noktadan itibaren yönlendirmeyi umursamadığımız için, aktarma yalnızca bir karaktere mal olur) ve daha sonra all(... .>-1)negatif bir sayı olup olmadığını kontrol eder - negatifler yalnızca yağmur karakteri olduğunda gerçekleşir öncesinde bulut karakteri olmadan görünür.

Julia, 139 136 karakter

s->(t=join(mapfoldl(i->split(i,""),.*,split(s,"
")),"
");while t!=(t=replace(t,r"[()_@$&](.*?)[!|.\":]",s"\g<1>"))end;∩("!|.\":",t)==[])

Bu işlev önce metni satırlar sütun haline gelecek şekilde tersine çevirir. Yeni satırların kodda, örnek başına bir karakter kaydetmek için gerçek satır satırları biçiminde bulunduğunu unutmayın.

İşlev daha sonra bulut / damlacık çiftlerini boşluklarla yinelemeli olarak değiştirir ve tüm bu çiftler kaldırıldığında, kalan damlacıklar varsa true değerini, aksi halde false değerini döndürür.

r"[()_@$&](.*?)[!|.\":]"- bu, bulut / damlacık çiftlerini tembel bir şekilde eşleştirecek ve grup 1, bulut ve damlacık arasındaki her şeyi içeren bir normal ifade. Ardından s"\g<1>", eşleşen bulutu ve damlacıkları kaldırmasını söyler, ancak aradaki öğeleri (bulut içerebileceğinden gerekli) arasında tutun - \g<1>normal ifadenin 1. grubunda eşleşen şey budur. ∩("!|.\":",t)==[]damlacık karakterlerinin son dizeyle kesişimini oluşturur ve boşsa damlacık karakterlerinden hiçbiri yoktur ve yağmur yağıyor.


@nimi - aslında buna ihtiyacınız yok. Sen yerini alabilecek hfiili anonim fonksiyonu ile kullanımda. Bunun gibi: g((s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n")s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n"))("()()()\n......"))- çağırmak hsadece çağırmayı kolaylaştırır.
Glen O

@nimi - "aramak için tek işlev" gelince, bu biraz daha makul bir iddia, ama bunun üzerinde duran topluluğun ne olduğu belli değil - bunu soran bir meta yazı yapacağım.
Glen O

@nimi - şu anda bir meta yayınla açıklığa kavuşacağım.
Glen O

Bunu yapmanın daha iyi bir yolunu bulduğum için, şimdi tek bir işlevle bu soru için tartışmalı.
Glen O
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.