ฝนตกหรือไม่ ฉันไม่สามารถบอกได้


10

นี่คือเม็ดฝน:

! | . " :

นี่คืออนุภาคเมฆ:

( ) _ @ $ &

ฉันต้องการให้คุณยืนยันเมื่อได้รับบล็อกข้อความไม่ว่าฝนจะตกหรือไม่ ฝนกำลังตกถ้าทุกหยดฝนมีอนุภาคเมฆบางแห่งอยู่เหนือมัน จะต้องมีเมฆหนึ่งอนุภาคสำหรับน้ำฝนทุกครั้ง ส่งออกค่าจริงหรือเท็จแสดงถึงข้อสรุปของคุณ

ตัวอย่างที่ถูกต้อง

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

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

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

ตัวอย่างไม่ถูกต้อง

!
()

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

นี่คือเพื่อให้โปรแกรมสั้นที่สุดในตัวละครชนะ


2
"จะต้องมีเมฆหนึ่งอนุภาคสำหรับน้ำฝนทุกหยด"
บลู

@feersum ตัวอย่างที่ไม่ถูกต้องที่สองคือตัวอย่างที่คุณกำลังมองหา
Seadrus

@feersum ฉันเห็น;)
Seadrus

เราสามารถสมมติว่าแถวนั้นถูกเติมด้วยช่องว่างเพื่อสร้างสี่เหลี่ยมผืนผ้าได้หรือไม่?
feersum

3
@Zereges ไม่: อย่างน้อยหนึ่ง
msh210

คำตอบ:


4

APL (30)

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

นี่คือฟังก์ชั่นที่รับเมทริกซ์อักขระเป็นอินพุตและให้เอาต์พุตบูลีน

ทดสอบ:

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

คำอธิบาย:

  • ⍵∘∊¨'!|.":' '()_@$&': สำหรับทั้งชุดอักขระ (ฝนและเมฆ) และอักขระแต่ละตัวใน⍵ดูว่าตัวละครนั้นเป็นสมาชิกของชุดหรือไม่
  • +⍀¨: รับผลรวมสะสมสำหรับแต่ละคอลัมน์และแต่ละชุด
  • ≤/: สำหรับแต่ละตำแหน่งใน⍵ให้ตรวจสอบว่าปริมาณของเม็ดฝนไม่เกินปริมาณของอนุภาคเมฆในผลรวมสะสม
  • ∧/∊: คืนค่าบูลีนและองค์ประกอบทั้งหมดในผลลัพธ์

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

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

วิธีการขั้นพื้นฐานการจัดเก็บตำแหน่งของอนุภาคเมฆในแถวและหากพบอนุภาคฝนมันจะตรวจสอบว่าอนุภาคเมฆอยู่เหนือมันและลดจำนวนอนุภาคของเมฆในคอลัมน์นั้นหรือไม่ โปรแกรมส่งคืน 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(\!|\||\.|\"|\:

โปรแกรมจะแสดงพื้นที่ของกริด (หรือ 1 ถ้าพื้นที่ของมันคือ 0) หากฝนตก มิฉะนั้น 0 ถ้าฉันเพิ่งใช้คลาสอักขระสไตล์ regex

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

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)ตรวจสอบหาจำนวนลบ - เชิงลบจะเกิดขึ้นหากอักขระฝน ปรากฏขึ้นโดยไม่ถูกนำหน้าด้วยอักขระเมฆ

Julia, 139 136 ตัวอักษร

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

ฟังก์ชันนี้แปลงข้อความก่อนเพื่อให้แถวกลายเป็นคอลัมน์และกลับกัน โปรดทราบว่ามีการขึ้นบรรทัดใหม่ในรหัสในรูปแบบของการขึ้นบรรทัดใหม่เพื่อบันทึกหนึ่งอักขระต่อหนึ่งอินสแตนซ์

จากนั้นฟังก์ชั่นจะทำการแทนที่คู่ของ cloud / droplet ด้วยช่องว่างและเมื่อลบคู่ดังกล่าวทั้งหมดแล้วมันจะคืนค่าจริงถ้ามีหยดใด ๆ ที่เหลืออยู่และเป็นเท็จ

r"[()_@$&](.*?)[!|.\":]"- นี่คือ regex ที่จะจับคู่คลาวด์ / หยดในลักษณะขี้เกียจกับกลุ่มที่ 1 ที่มีทุกสิ่งระหว่างคลาวด์และหยด จากนั้นs"\g<1>"บอกให้ลบคลาวด์ที่จับคู่และหยด แต่เก็บสิ่งของไว้ในระหว่าง (จำเป็นเนื่องจากมันอาจมีเมฆ) - \g<1>สิ่งใดก็ตามที่ถูกจับคู่ในกลุ่มที่ 1 ของ regex ∩("!|.\":",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เพียงทำให้ง่ายต่อการเรียกใช้
เกลน O

@nimi - สำหรับ "ฟังก์ชั่นเดียวในการโทร" นั่นเป็นการยืนยันที่สมเหตุสมผลมากกว่า แต่ก็ไม่ชัดเจนว่าชุมชนยืนอยู่บนจุดนั้น - ฉันจะทำเมตาโพสต์ถามเกี่ยวกับมัน
เกลน O

@nimi - นั่นคือสิ่งที่ฉันจะได้รับการชี้แจงในขณะนี้ด้วยการโพสต์เมตา
เกลน O

มันเป็นสิ่งที่สงสัยสำหรับคำถามนี้ในขณะที่ฉันพบวิธีที่ดีกว่าที่จะทำมันด้วยฟังก์ชั่นเดียวเท่านั้น
เกลน O
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.