Trời đang mưa? Tôi không thể nói


10

Đây là những hạt mưa:

! | . " :

Đây là những hạt mây:

( ) _ @ $ &

Tôi muốn bạn xác minh, khi được cung cấp một khối văn bản, cho dù trời có mưa hay không. Trời mưa nếu, cứ mỗi hạt mưa, có một hạt mây ở đâu đó phía trên nó. Phải có một hạt mây cho mỗi hạt mưa. Đưa ra một giá trị trung thực hoặc giả mạo biểu thị kết luận của bạn.

Ví dụ hợp lệ

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

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

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

Ví dụ không hợp lệ

!
()

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

Đây là một vì vậy chương trình ngắn nhất trong các nhân vật sẽ thắng.


2
"Phải có một hạt mây cho mỗi hạt mưa"
Blue

@feersum Ví dụ không hợp lệ thứ hai là ví dụ bạn đang tìm kiếm.
Seadrus 7/11/2015

@feersum tôi thấy;)
Seadrus 7/11/2015

Chúng ta có thể giả sử các hàng được đệm bằng khoảng trắng để tạo thành một hình chữ nhật không?
frageum

3
@Zereges, không: ít nhất một
msh210

Câu trả lời:


4

APL (30)

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

Đây là một hàm lấy ma trận ký tự làm đầu vào và đưa ra đầu ra boolean.

Kiểm tra:

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

Giải trình:

  • ⍵∘∊¨'!|.":' '()_@$&': cho cả hai bộ ký tự (mưa và mây) và mỗi ký tự trong, xem nhân vật đó có phải là thành viên của bộ không.
  • +⍀¨: lấy tổng tiền chạy cho mỗi cột và từng bộ
  • ≤/: cho mỗi vị trí trong, kiểm tra xem lượng hạt mưa không vượt quá lượng hạt mây trong tổng số chạy
  • ∧/∊: trả về giá trị boolean AND của tất cả các phần tử trong kết quả

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

Ung dung

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

Cách tiếp cận cơ bản, lưu trữ vị trí của các hạt mây liên tiếp và nếu gặp hạt mưa, nó sẽ kiểm tra xem hạt mây có ở trên nó hay không và giảm bộ đếm của các hạt mây trong cột đó. Chương trình trả về 0 nếu nó hợp lệ và 1 nếu không.


Bạn không thể thay thế c-m?0:p[i]++bằng p[i]+=c==m? Hay nó không còn hoạt động trong C ++ 11?
bến tàu

@marinus Có lẽ là có.
Zereges

4

Ốc , 125

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

Chương trình xuất diện tích của lưới (hoặc 1 nếu diện tích của nó là 0) nếu trời mưa; mặt khác 0. Nếu tôi đã thực hiện các lớp nhân vật kiểu regex.

Phiên bản Ungolfed Điều này chứa các hướng dẫn giả mạo cho các đám mây hoặc hạt mưa thay vì viết ra tất cả những điều vô nghĩa. \whatever(được thay thế bằng .trong chương trình thực) có nghĩa là một thứ phải là một hạt mưa, nhưng thực sự có thể là bất cứ thứ gì vì nó không quan trọng nếu chúng ta ghép một hạt mưa với một đám mây.

{
    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

hệ thống bình luận thú vị.
Seadrus

2

Python 2, 121 byte

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

Dự kiến ​​đầu vào sẽ được đệm thành hình chữ nhật.


1

JavaScript ES6, 112

Kiểm tra chạy đoạn mã dưới đây trong trình duyệt tuân thủ EcmaScript 6 thực hiện các chức năng mũi tên, toán tử trải rộng và chuỗi mẫu (Tôi sử dụng Firefox)

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, cộng với một cho -Ethay vì-e

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

2
Tôi không thể đọc Perl, nhưng tôi rất
giỏi

1

Julia, 90 ký tự

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

Không giống như giải pháp ban đầu (bên dưới), điều này sử dụng toán học để xác định giải pháp. mapfoldl(collect,hcat,split(s,"\n"))(được viết ở trên với \nthay thế bằng một dòng mới thực tế để lưu các ký tự) chuyển đổi chuỗi thành một mảng các ký tự 2d. map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)tạo một mảng các số, với 1 nếu ký tự là một đám mây, -1 nếu ký tự đó là mưa và 0 nếu không.

cumsum(...')tính tổng các khoản tích lũy của các hàng (thông thường sẽ được viết cumsum(...,2), nhưng vì chúng tôi không quan tâm đến định hướng từ thời điểm này, nên việc chuyển đổi chỉ tốn một ký tự), và sau đó all(... .>-1)kiểm tra số âm - sẽ chỉ xảy ra nếu một ký tự mưa xuất hiện mà không có trước một nhân vật đám mây.

Julia, 139 136 ký tự

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

Hàm này trước tiên chuyển văn bản để các hàng trở thành cột và ngược lại. Lưu ý rằng các dòng mới có mặt trong mã dưới dạng các dòng mới thực tế, để lưu một ký tự cho mỗi phiên bản.

Hàm sau đó lặp lại thay thế các cặp đám mây / giọt bằng khoảng trắng và một khi tất cả các cặp như vậy được loại bỏ, nó sẽ trả về true nếu có bất kỳ giọt nào còn lại và sai.

r"[()_@$&](.*?)[!|.\":]"- đây là một regex sẽ khớp với các cặp đám mây / giọt một cách lười biếng, với nhóm 1 chứa mọi thứ giữa đám mây và giọt nước. Sau đó s"\g<1>"bảo nó xóa đám mây và các giọt phù hợp, nhưng giữ các thứ ở giữa (cần thiết vì nó có thể chứa các đám mây) - đó \g<1>là bất cứ thứ gì được khớp trong nhóm 1 của biểu thức chính quy. ∩("!|.\":",t)==[]sẽ tạo ra giao điểm của các ký tự giọt với chuỗi cuối cùng và nếu nó trống, thì không có ký tự giọt nào xuất hiện và trời đang mưa.


@nimi - bạn không thực sự cần nó. Bạn có thể thay thế việc hsử dụng bằng chức năng ẩn danh thực tế. Như thế này: g((s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n")s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n"))("()()()\n......"))- gọi nó hchỉ làm cho nó dễ dàng hơn để gọi.
Glen O

@nimi - đối với "chức năng duy nhất để gọi", đó là một khẳng định hợp lý hơn một chút, nhưng không rõ cộng đồng đang đứng trên đó là gì - Tôi sẽ tạo một bài đăng meta hỏi về nó.
Glen O

@nimi - đó là những gì tôi sẽ làm rõ ngay bây giờ, với một bài đăng meta.
Glen O

Bây giờ là câu hỏi cho câu hỏi này, vì tôi tìm thấy một cách tốt hơn để làm điều đó, chỉ với một chức năng.
Glen O
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.