비가 오는 중이 야? 말할 수 없어


10

이들은 빗방울입니다.

! | . " :

이들은 구름 입자입니다.

( ) _ @ $ &

비가 오는지 아닌지 텍스트 블록이 주어지면 확인하기를 원합니다. 모든 빗방울에 대해 그 위에 어딘가에 구름 입자가 있으면 비가 내립니다. 빗방울마다 구름 입자가 하나 있어야합니다. 당신의 결론을 나타내는 진실하거나 거짓된 가치 를 산출 하십시오.

유효한 예

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

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

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

잘못된 예

!
()

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

이것은 이므로 문자 가 가장 짧은 프로그램이 승리합니다.


2
"모든 빗방울에 대해 하나의 구름 입자가 있어야합니다"
Blue

@feersum 두 번째 잘못된 예는 찾고있는 예입니다.
Seadrus

@feersum I see;)
Seadrus

사각형을 형성하기 위해 행이 공백으로 채워져 있다고 가정 할 수 있습니까?
feersum

3
@Zereges, no : 적어도 하나
msh210

답변:


4

APL (30)

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

문자 행렬을 입력으로 사용하고 부울 출력을 제공하는 함수입니다.

테스트:

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

설명:

  • ⍵∘∊¨'!|.":' '()_@$&': 문자 세트 (비와 구름) 및 ⍵의 각 문자에 대해 문자가 세트의 구성원인지 확인하십시오.
  • +⍀¨: 각 열과 각 세트에 대한 누계를 가져옵니다.
  • ≤/: ⍵의 각 위치에 대해 빗방울의 양이 누계의 구름 입자의 양을 초과하지 않는지 확인하십시오.
  • ∧/∊: 결과에있는 모든 요소의 부울 AND를 리턴합니다.

5

C ++ 11, 186184 바이트

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

언 골프

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

기본 접근 방식, 구름 입자의 위치를 ​​연속으로 저장하고 비 입자가 발생하면 구름 입자가 그 위에 있는지 확인하고 해당 열에서 구름 입자의 카운터를 줄입니다. 프로그램은 유효하면 0을, 그렇지 않으면 1을 반환합니다.


당신은 대체 할 수 없습니다 c-m?0:p[i]++와 함께 p[i]+=c==m? 아니면 C ++ 11에서 더 이상 작동하지 않습니까?
marinus

@marinus 아마 그렇습니다.
Zereges

4

달팽이 , 125

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

프로그램은 비가 오면 그리드의 면적 (또는 면적이 0 인 경우 1)을 출력합니다. 그렇지 않으면 0입니다. 정규식 스타일의 문자 클래스 만 구현 한 경우.

Ungolfed version 이것은 모든 횡설수설을 쓰는 대신 구름이나 빗방울에 대한 가짜 지침을 포함합니다. \whatever( .실제 프로그램으로 대체 됨 )은 빗방울이 있어야하지만 실제로는 빗방울이 아닌 구름과 일치하더라도 중요하지 않기 때문에 무엇이든 될 수 있습니다.

{
    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

흥미로운 댓글 시스템.
Seadrus

2

파이썬 2, 121 바이트

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

입력이 사각형으로 채워질 것으로 예상합니다.


1

자바 스크립트 ES6, 112

화살표 기능, 스프레드 연산자 및 템플릿 문자열을 구현하는 EcmaScript 6 호환 브라우저에서 아래 스 니펫 실행 테스트 (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

펄 5, 80

79 개 + -E대신 1 개-e

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

2
나는 Perl을 읽을 수 없지만 수학에 강하다 : 79 + 1 = 80
edc65

1

줄리아, 90 자

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

원래 솔루션 (아래)과 달리 수학을 사용하여 솔루션을 결정합니다. mapfoldl(collect,hcat,split(s,"\n"))(위에 \n문자를 저장하기 위해 실제 개행 문자로 대체하여 작성 )는 문자열을 2d 문자 배열로 변환합니다.map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)문자가 구름이면 1, 문자가 비이면 -1, 그렇지 않으면 0으로 숫자 배열을 만듭니다.

cumsum(...')행의 누적 합계를 계산합니다 (일반적으로 작성 cumsum(...,2)되지만이 시점부터 방향에 신경 쓰지 않기 때문에 한 문자 만 바꿉니다) all(... .>-1). 음수 를 확인합니다. 음수는 비가 오는 경우에만 발생합니다 구름 문자가 앞에없이 나타납니다.

줄리아, 139 개 (136) 문자

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

이 함수는 먼저 텍스트를 바꿈으로써 행이 열이되고 그 반대가됩니다. 줄 바꿈은 실제 줄 바꿈 형식으로 코드에 표시되어 인스턴스 당 하나의 문자를 저장합니다.

그런 다음이 함수는 구름 / 방울 쌍을 공백으로 반복적으로 대체하며, 일단 그러한 쌍이 모두 제거되면 방울이 남아 있으면 true를, 그렇지 않으면 false를 반환합니다.

r"[()_@$&](.*?)[!|.\":]"-이것은 구름과 방울 사이의 모든 것을 포함하는 그룹 1과 함께 게으른 방식으로 구름 / 방울 쌍과 일치하는 정규식입니다. 그런 다음 s"\g<1>"일치하는 구름과 물방울을 제거하라고 말하지만 (구름이 포함될 수 있으므로) 사이에 물건을 보관하십시오 \g<1>. ∩("!|.\":",t)==[]드롭 릿 문자와 최종 문자열의 교차점을 생성하며, 비어 있으면 드롭 릿 문자가없고 비가 내립니다.


@nimi-실제로 필요하지 않습니다. h사용중인를 실제 익명 함수로 바꿀 수 있습니다 . 이와 같이 : g((s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n")s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n"))("()()()\n......"))-호출하면 호출하기 h가 더 쉽습니다.
Glen O

@nimi- "단일 함수 호출"은 약간 더 합리적인 주장이지만 커뮤니티의 입장이 무엇인지는 확실하지 않습니다.
Glen O

@nimi-바로 메타 게시물을 통해 설명을 얻을 것입니다.
Glen O

단 하나의 기능으로 더 좋은 방법을 찾았으므로 지금이 질문에 대한 답이 아닙니다.
Glen O
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.