雨が降っていますか?わからない


10

これらは雨滴です:

! | . " :

これらは雲の粒子です:

( ) _ @ $ &

テキストのブロックが与えられたときに、雨が降っているかどうかを確認してほしい。すべての雨滴について、その上のどこかに雲の粒子がある場合、雨が降っています。雨粒ごとに1つの雲の粒子がなければなりません。あなたの結論を示す真実または偽の値を出力します。

有効な例

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

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

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

無効な例

!
()

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

これはので、キャラクターの中で最も短いプログラムが勝ちます。


2
「すべての雨滴に1つの雲の粒子がなければならない」
ブルー

@feersum 2番目の無効な例は、探している例です。
Seadrus、2015年

@feersumなるほど;)
Seadrus

行がスペースで埋め込まれて長方形を形成していると想定できますか?
feersum 2015年

3
@ゼレゲス、いいえ:少なくとも1つ
msh210 2015年

回答:


4

APL(30)

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

これは、入力として文字行列を取り、ブール出力を提供する関数です。

テスト:

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

説明:

  • ⍵∘∊¨'!|.":' '()_@$&':両方の文字セット(雨と雲)、および⍵の各文字について、その文字がセットのメンバーであるかどうかを確認します。
  • +⍀¨:各列と各セットの実行中の合計を取得します
  • ≤/:inの各位置について、雨滴の量が現在の合計の雲の粒子の量を超えていないことを確認します
  • ∧/∊:結果のすべての要素のブール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では機能しなくなりますか?
マリナス2015年

@marinusおそらくはい。
Zereges 2015年

4

カタツムリ、125

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

雨が降っている場合、プログラムはグリッドの面積(または面積が0の場合は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代わりに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)、この時点以降は方向を気にしないため、転置は1文字しかかかりません)。次にall(... .>-1)負の数をチェックします-負の値は雨の文字の場合にのみ発生します雲の文字が先行せずに表示されます。

ジュリア、139 136 文字

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

この関数はまずテキストを転置して、行が列になり、行が列になるようにします。改行は、実際の改行の形式でコードに存在し、インスタンスごとに1文字を節約することに注意してください。

次に、この関数はクラウド/ドロップレットのペアを繰り返しスペースで置き換え、そのようなペアがすべて削除されると、ドロップレットが残っている場合は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

関数を1つだけ使用して、より良い方法を見つけたので、今はこの質問には当てはまりません。
Glen O
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.