Це дощ? Я не можу сказати


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

Безумовно

#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 Напевно, так.
Зереги

4

Равлики , 125

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

Програма виводить область сітки (або 1, якщо її площа дорівнює 0), якщо йде дощ; інакше 0. Якби тільки я реалізував класи символів у стилі регулярного виразів.

Версія без заготівлі Це містить підроблені вказівки щодо хмар або крапель дощу замість того, щоб виписати все безглуздя. \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

цікава система коментарів.
Сеадрус

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

Перл 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)перевіряє наявність від'ємного числа - негативи виникатимуть лише у випадку, якщо характер дощу З'являється, не передуючи символу хмари.

Юлія, 139 136 персонажів

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

Ця функція спочатку переміщує текст так, що рядки стають стовпцями і навпаки. Зауважте, що нові рядки містяться в коді у вигляді фактичних нових рядків, щоб зберегти один символ на примірник.

Потім функція ітеративно замінює пари хмари / крапель пробілами, і як тільки всі такі пари будуть видалені, вона повертає справжнє значення, якщо є краплі, а інше - помилкове.

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просто полегшує виклик.
Глен О

@nimi - що стосується "єдиної функції для дзвінка", це трохи більш розумне твердження, але не зрозуміло, на чому стоїть громада - я збираюся зробити мета-пост із запитанням про це.
Глен О

@nimi - ось що я хочу отримати роз'яснення прямо зараз з мета-дописом.
Глен О

Зараз це питання суперечить, тому що я знайшов кращий спосіб зробити це лише однією функцією.
Глен О
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.