У мене емоджи сухі?


17

Це мій емоційний улюбленець, Біллі:

-_-

Емоджи не любить бути під дощем, тому Біллі сумно ... Давайте намалюємо йому парасольку, щоб йому стало краще!

  /\
 /  \
/    \

  -_-

Це добре, він цілком прикритий його парасолькою! Ось приклад, коли охоплюється лише його частина:

  /\
 /  \
/    \

     -_-

При цьому ділянки 2 та 3 його тіла піддаються впливу дощу.

Парасольки бувають різних форм і розмірів, але вони завжди складаються з ряду висхідних /косої риски з наступною низкою низхідних косих \. Наприклад, це всі дійсні парасольки:

  /\
 /  \
/    \

/\

    /\
   /  \
  /    \
 /      \
/        \

І це не такі:

/   \

\/

  \
 / \
/   \

 0\
/  \

//\\
/  \

Вам потрібно визначити, які частини моїх емоджи піддаються дощу.

Роз'яснення

  • Ваша програма (або функція) буде приймати 2d рядок як вхід. Це може бути в будь-якому форматі, який є найбільш зручним або природним для вашої мови. Масив рядків, масив масивів символів, рядок з новими рядками в ньому і т.д.

  • Ви повинні вивести, які розділи смайлів піддаються впливу дощу. Це може бути нульовим чи одноіндексованим, якщо ви це ясно зробите. Вихід може бути в будь-якому розумному форматі. Якщо вся смайлик захищений від дощу, нічого не видайте (або порожній масив).

  • Можна припустити , що всі входи будуть мати дійсний парасольку, і той же смайлик: -_-. Емоджи завжди буде в останньому рядку вводу, проте їх може бути кілька порожніх рядків між парасолькою та смайликами.

  • Все, що не входить до парасольки чи смайликів, буде пробілом або новим рядком.

  • Вхід буде прокладений пробілами, щоб довжина кожного рядка була однаковою.

Застосовуються стандартні лазівки, і найкоротша відповідь у байтах виграє!

IO тесту:

Усі вибіркові випадки використовуватимуть одноіндексацію.

  /\
 /  \
/    \

  -_-

Outputs: []

----------------

   /\
  /  \

     -_-

Outputs: [2, 3]

----------------

    /\
   -_-

Outputs: [1]

----------------

     /\
    /  \
   /    \
  /      \
 /        \
/          \




               -_-

Outputs: [1, 2, 3]

2
Чи можемо ми вивести частини емоджи, які перебувають під дощем? тобто ["_","-"].
Rɪᴋᴇʀ

Якщо наша мова підтримує рядки, чи можемо ми прийняти 2D-масив символів? Наприклад, Array в JavaScript має інші функції, доступні для нього, ніж String.
Патрік Робертс

@PatrickRoberts Так, це прийнятно.
DJMcMayhem

@ EᴀsᴛᴇʀʟʏIʀᴋ Ні, слід вивести цифри.
DJMcMayhem

1
Я думаю, ти маєш на увазі смайлик. Сухі емоджи будуть 🔥 (або ☂️ я думаю)
NH.

Відповіді:


8

05AB1E , 18 17 15 байт

Код:

|…-_-123:)ø€J€ï

Пояснення:

|                  # Take all input as a list of strings.
 …-_-              # 3-char string, which results into "-_-".
     123:)         # Replace "-_-" with 123.
          ø        # Zip, resulting into the columns of the 2D array.
           €J      # Join each of them.
             ە    # For each, convert to integer. If this is not possible, it will ignore
                     the result.
                   # Implicitly output the array.

Використовує кодування CP-1252 . Спробуйте в Інтернеті! (обов’язково прокладіть усі рядки з пробілами однакової довжини.


5

JavaScript (ES6), 95 байт

a=>[...a[n=0]].map((_,i)=>a.map(s=>(c=s[i])>"-"&c<"_"?p=1:n+=!++c,p=0)|p<!c&&o.push(n),o=[])&&o

Вхідним рядком повинен бути масив рядків, кожен рядок з пробілами, щоб утворити квадрат. Вихід - це масив 1-індексованих чисел.

Пояснення

var solution =

a=>
  [...a[n=0]].map((_,i)=>  // n = current index of emoji, for each column i of input
    a.map(s=>              // for each line s
      (c=s[i])             // c = character in column
      >"-"&c<"_"?p=1       // p = 1 if column is protected from rain
      :n+=!++c,            // increment n if emoji character found, c = 1 if last line
                           // contained a space in the current column
      p=0
    )
    |p<!c&&o.push(n),      // if the emoji is not protected in the current column
    o=[]
  )
  &&o
<textarea id="input" rows="6" cols="40">   /\   
  /  \  
        
     -_-</textarea><br />
<button onclick="result.textContent=solution(input.value.split('\n'))">Go</button>
<pre id="result"></pre>


4

JavaScript (ES6), 92 байти

a=>a.map(s=>s.replace(/\S/g,(c,i)=>c>'-'&c<'_'?u[i]=3:++n&u[i]||r.push(n)),n=0,u=[],r=[])&&r

Приймає нерівний масив рядків і повертає 1-індексований результат. Пояснення:

a=>a.map(               Loop through all lines
 s=>s.replace(/\S/g,    Loop through all non-whitepsace
  (c,i)=>c>'-'&c<'_'    If it's part of the umbrella
   ?u[i]=3              Mark that column as dry
   :++n&                Add 1 to the emoji index
     u[i]||             If the column is not dry
      r.push(n)         Add the emoji index to the result
  ),n=0,u=[],r=[]       Initialise variables
 )&&r                   Return result

3

Ява 8 лямбда, 241 218 201 191 185 184 (або 161) символів

Оскільки ви знаєте, Java також потребує сухих емоджи.

import java.util.*;f->{int e,i=e=-1,c,l=f.length-1;while(++e<f[l].length&&f[l][e]!=45);List p=new Stack();l:for(;++i<3;){for(char[]r:f)if((c=r[e+i])==47|c==92)continue l;p.add(i);}return p;}

Він повертає ArrayList HashSet Stack, що містить частини смайлів, які піддаються впливу дощу (індексація починається з 0). Вся справа розкручена:

import java.util.*;

public class Q82668 {
    static List isEmojiDryRevE(char[][] fieldToCheck) {
        int emojiStart, i = emojiStart = -1, j, rows = fieldToCheck.length - 1;

        while (++emojiStart < fieldToCheck[rows].length && fieldToCheck[rows][emojiStart] != 45)
            ;

        List parts = new Stack();
        emojiLoop: for (; ++i < 3;) {
            for (j = -1; ++j < rows;) {
                if (fieldToCheck[j][emojiStart + i] > 46) {
                    // umbrella part found
                    continue emojiLoop;
                }
            }
            // no umbrella part found
            parts.add(i);
        }
        return parts;
    }
}

Оновлення

Я займався базовим гольфом. Сюди входить складання декларацій, порівняння зі значеннями ascii для збереження деяких символів та скорочення циклів.

Завдяки @ user902383 за вказівку моєї помилки демпінгу за допомогою ArrayLists замість просто списків. Я замінив ArrayLists / Lists на HashSets / Sets, що зберігає ще кілька символів. Також дякую за його пораду використовувати петлю передбачення у внутрішній петлі! Завдяки цій зміні я можу створити змінну для індексу останнього ряду сітки, яка скорочує її трохи більше. Загалом збережено 17 символів!

@KevinCruijssen запропонував видалити дженерики при ініціалізації, я пішов ще на крок далі: Видаліть усі дженерики. Це економить ще 10 символів.

Я переключився з петлі foreach у цикл for. Це дає можливість пропустити порівняння останнього рядка, що, в свою чергу, дозволяє скоротити порівняння значень ascii. У цьому контексті лише '/', '\' і '_' мають значення ascii понад 46. Якщо ми не перевіримо останній рядок, ми можемо використовувати> 46 check замість цього перевірити фактичне значення.

Ще раз дякую @ user902383, що показав мені, що я використовую лямбда і можу використовувати List + Stack замість Set + HashSet, щоб відголити інший символ.


Версія для рядків, що повертаються

@ user902383 вказав, що я можу замість цього просто створити рядок з цифрами. Це звучить дуже хитро, але інші, здається, вирішують це таким чином, ось ось коротка версія, що використовує String return:

f->{int e,i=e=-1,c,r=f.length-1;while(++e<f[r].length&&f[r][e]!=45);String p="";l:for(;++i<3;){for(char[]o:f)if((c=o[e+i])==47|c ==92)continue l;p+=i;}return p;}

Безумовно:

public class Q82668 {
    public static String isEmojiDryRevD(char[][] fieldToCheck) {
        int emojiStart, i = emojiStart = -1, c, rows = fieldToCheck.length - 1;

        while (++emojiStart < fieldToCheck[rows].length && fieldToCheck[rows][emojiStart] != 45)
            ;

        String parts = "";
        emojiLoop: for (; ++i < 3;) {
            for (char[] row : fieldToCheck) {
                if ((c = row[emojiStart + i]) == 47 | c == 92) {
                    // umbrella part found
                    continue emojiLoop;
                }
            }
            // no umbrella part found
            parts += i;
        }
        return parts;
    }
}

2
ви порушили правило №1 always program to an interface, якщо Listзамість цього ArrayListви можете зберегти 5 байт
user902383

1
Я думаю, що внутрішній цикл для циклу може бути замінений циклом foreach, який повинен дати вам додаткову пару байтів
user902383

1
Не зовсім впевнений, але, =new HashSet<>();швидше за все, можна пограти в гольф =new HashSet();.
Кевін Кройсейсен

1
@Frozn Чому б це не було дозволено? Я знаю, що компілятор створює попередження, яке трапляється багато під час гольф-коду. У чому я не впевнений, якщо ваш код все ще працює так само, не перевіряли його. Якщо це так, то вилучення <>економить 2 байти. :)
Кевін Круїссен

2
@Frozn ви б мали рацію в старому доброму Java, але тепер у нас є лямбда, і в лямбда-нотації ви не вказуєте тип. отже, ви маєте Set(3) HashSet(7)проти List(4) і Stack(5).
user902383

3

V , 20 19 байт (неконкурентоспроможний)

G^R123?/
f\GddHÍó

Альтернативна, конкуруюча версія (21 байт):

G^R123?/
f\òjòddHÍó

Спробуйте в Інтернеті!(Зауважте, tryitonline.net використовує трохи стару версію V. Щоб компенсувати це, він використовує цю трохи довшу версію)

Пояснення:

G^          "Move to the first non-whitespace character on the last column
  R123<esc> "Replace the emojii with '123'

?/          "Move backwards to the last '/' character
  <C-v>     "Start a blockwise selection
       f\G  "Move the selection to the next '\', and then to the last line
d           "Delete the block selection
 dH         "Delete the umbrella

Це одне дає правильний результат у 17 байт. Однак це також створює додатковий пробіл. Я не проти цього, але не хочу віддавати собі несправедливу перевагу, тому я додаю два байти:

Íó          "Remove all whitespace

3

JavaScript (ES6), 117 112 байт

s=>s.map(r=>r.map((c,i)=>~'-_'[o='indexOf'](c)&&!s.some(a=>~'/\\'[o](a[i]))?i-r[o]('-'):-1)).pop().filter(n=>~n)

Приймає нерівний масив рядків масивів символів та повертає 0-індексовані результати.

s=>s.map(     // for each row
  r=>         // row
    r.map(    // for each character
      (c,i)=> // character, index
        ~'-_'[o='indexOf'](c) // if character is part of emoji
        &&                    // and
        !s.some(              // none of the rows have umbrella in this column
          a=>~'/\\'[o](a[i])
        )
        ? // then return 0-index of emoji
          i-r[o]('-')
        : // else return -1
          -1
  )
)
.pop()         // get last element of string array
.filter(n=>~n) // filter out -1s

Демо

f=s=>s.map(r=>r.map((c,i)=>~'-_'[x='indexOf'](c)&&!s.some(a=>~'/\\'[x](a[i]))?i-r[x]('-'):-1)).pop().filter(n=>~n)
i.oninput=()=>o.value=f(i.value.split`\n`.map(r=>r.split``))
i.oninput()
<textarea rows=6 cols=20 id=i>
   /\
  /  \

     -_-</textarea>
<br/>
<input readonly id=o>


Мені подобаються ваші коментарі!
синтакс

2

Сітківка , 56 байт

Кількість байтів передбачає кодування ISO 8859-1.

m`(?<!(?(2)!)^(?<-2>.)*\S(.*¶)+(.)*).(?<=([-_]+))|\D
$.3

Спробуйте в Інтернеті!

Це єдина стадія підстановки, де регулярний вирівнювання відповідає одному з символів смайлів, за умови, що десь вище в цьому ж горизонтальному положенні знаходиться непробільний символ (тобто a /або \), і тоді ми фіксуємо кількість символів смайлів до цього бал. Цей збіг замінюється довжиною останнього захоплення, що дає нам індекс цього непорушеного символу емоджи. У регулярному вираженні також міститься |\Dвідповідність усім іншим, що замінюється взагалі нічим, тому ми видаляємо всі інші символи.


Чи можете ви пояснити, як виглядає цей регекс над символами смайлів?
sintax

1
@sintax Він використовує врівноважуючі групи для підрахунку символів, що передують йому, у своєму власному рядку. Це вимірює його горизонтальне положення. Потім після того, як я зрівняюсь з /або \, я знову вискакую з цієї групи під час узгодження матеріалів, що передували цьому , а потім переконайтесь, що я повністю виснажив групу. Це в основному забезпечує узгодження горизонтального положення емодзі та символу даху.
Мартін Ендер

1

Pyth, 27 23 байт

0-індексований.

-m.xsd;.T:R"-_-"s`M3.zd

Спробуйте в Інтернеті!

Пояснення

-m.xsd;.T:R"-_-"s`M3.zd

                    .z   all lines of input, as a list
         :R"-_-"s`M3     replace "-_-" by "012" 
                         "012" is generated by s`M3
       .T                transpose, return all columns
                         The sample input becomes:
                           0
                           1
                          /2
                         / 
                         \ 
                         \
 m   d                   for each line:
  .xs                        attempt to convert to integer.
      ;                      if errors, replace to space
-                     d  remove all spaces

Історія

27 байт: sM:#"^ *\d"0.T:R"-_-"s`M3.z( Спробуйте в Інтернеті! )


1

Матлаб, 43 байти

@(x)find(sum((x(:,x(end,:)~=' '))~=' ')==1)

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

Ось трохи корисного коду для написання тестових випадків та перевірки моєї роботи:

ws = @(x) repmat(' ',1,x);  %  for making strings of spaces
% for writing three-storey umbrellas over an emoji located left-edge at position x
thrht = @(x) strvcat([ws(3) '/\' ws(3); ws(2) '/  \' ws(2); ws(1) '/' ws(4) '\' ws(1); ws(8)], [ws(x-1) '-_-']);
twht = @(x) strvcat([ws(3) '/\' ws(3); ws(2) '/  \' ws(2); ws(8)], [ws(x-1) '-_-']);

Біг x = thrht(7)дає

x =

   /\    
  /  \   
 /    \  

      -_-

Або x = twht(0) дає

x =

   /\   
  /  \  

 -_-     

0

APL, 31 байт

{(⍳3)∩,(~∨⌿⍵∊'/\')/+\+\'-_-'⍷⍵}

Для цього використовується матриця символів як вхід.

Тести:

      t1 t2 t3 t4
┌──────┬────────┬──────┬─────────────────┐
│  /\  │   /\   │    /\│     /\          │
│ /  \ │  /  \  │   -_-│    /  \         │
│/    \│        │      │   /    \        │
│      │     -_-│      │  /      \       │
│  -_- │        │      │ /        \      │
│      │        │      │/          \     │
│      │        │      │                 │
│      │        │      │                 │
│      │        │      │                 │
│      │        │      │                 │
│      │        │      │              -_-│
└──────┴────────┴──────┴─────────────────┘
      {(⍳3)∩,(~∨⌿⍵∊'/\')/+\+\'-_-'⍷⍵} ¨ t1 t2 t3 t4
┌┬───┬─┬─────┐
││2 3│1│1 2 3│
└┴───┴─┴─────┘

Пояснення:

  • '-_-'⍷⍵: у матриці з нулями розмір входу позначте позицію початку '-_-'входу на 1.
  • +\+\: Сума за рядками. Перший робить 0 0 0 1 0 0 ...в 0 0 0 1 1 1 ..., другий потім робить його в 0 0 0 1 2 3 ....
  • ⍵∊'/\': позначте всі входження "/" та "\" на вході 1s.
  • ∨⌿: orнад стовпцями. Це позначає 1 на всіх позиціях в останньому ряду, які охоплені парасолькою.
  • ~: not, тому що нам потрібно навпаки
  • (... )/...: Виберіть усі непокриті стовпці з матриці поточної суми з попередньої
  • ,: Отримайте список усіх значень в отриманій матриці.
  • (⍳3)∩: Перетин між цим і 1 2 3(це позбавляється від будь-яких вибраних значень 0 або вище, які були б пробілами).

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