在下雨吗?我不知道


10

这些是雨滴:

! | . " :

这些是云粒子:

( ) _ @ $ &

我想让您验证一下,是否有文本在下雨。如果在每个雨滴上方都存在一个云团,则在下雨。每个雨滴都必须有一个云粒子。输出表示您的结论的真实或虚假值

有效的例子

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

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

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

无效的例子

!
()

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

这是一个因此最短的字符程序胜出。


2
“每个雨滴都必须有一个云粒子”
蓝色

@feersum第二个无效示例是您要查找的示例。
Seadrus

@feersum我看到了;)
Seadrus

我们是否可以假设行用空格填充以形成矩形?
feersum

3
@Zereges,否:至少一个
msh210

Answers:


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,186 184个字节

#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 2015年

@marinus可能是的。
Zereges 2015年

4

蜗牛 125

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

如果正在下雨,程序将输出网格的面积(如果面积为0,则输出1;否则,则输出1)。否则为0。如果仅实现了正则表达式样式的字符类。

Ungolfed版本, 其中包含针对云或雨滴的伪指令,而不是写出所有乱码。\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

Python 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

JavaScript 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

Perl 5,80

79,另加一个-E代替-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)检查负数-仅当下雨字符时才出现负数出现之前没有云字符。

朱莉娅139136字符

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>就是正则表达式第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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.