Мой эмодзи сухой?

17

Это мой любимый эмодзи, Билли:

-_-

Эмодзи не нравится находиться под дождем, поэтому Билли грустит ... Давайте нарисуем ему зонт, чтобы он почувствовал себя лучше!

  /\
 /  \
/    \

  -_-

Это хорошо, он полностью накрыт своим зонтиком! Вот пример, где покрыта только его часть:

  /\
 /  \
/    \

     -_-

В этом случае участки 2 и 3 его тела подвергаются воздействию дождя.

Зонты бывают разных форм и размеров, но они всегда состоят из серии восходящих косых /черт, за которыми следует серия нисходящих обратных косых черт \. Например, это все действительные зонтики:

  /\
 /  \
/    \

/\

    /\
   /  \
  /    \
 /      \
/        \

И это не

/   \

\/

  \
 / \
/   \

 0\
/  \

//\\
/  \

Вы должны определить, какие части моих смайликов подвержены воздействию дождя.

Разъяснения

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

  • Вы должны указать, какие разделы смайликов подвержены воздействию дождя. Это может быть с нулевой или одной индексацией, если вы это ясно дадите. Вывод может быть в любом разумном формате. Если все смайлики защищены от дождя, ничего не выводите (или пустой массив).

  • Можно предположить , что все входы будут иметь действительный зонтик, и тот же смайлик: -_-. Смайлики всегда будут в последней строке ввода, однако их может быть несколько пустых строк между зонтиком и смайликами.

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

  • Ввод будет дополнен пробелами, чтобы длина каждой строки была одинаковой.

Применяются стандартные лазейки, и выигрывает самый короткий ответ в байтах!

Тест IO:

Все примеры случаев будут использовать одноиндексирование.

  /\
 /  \
/    \

  -_-

Outputs: []

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

   /\
  /  \

     -_-

Outputs: [2, 3]

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

    /\
   -_-

Outputs: [1]

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

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




               -_-

Outputs: [1, 2, 3]
DJMcMayhem
источник
2
Можем ли мы вывести части смайликов, которые находятся под дождем? то есть ["_","-"].
Rɪᴋᴇʀ
Если наш язык поддерживает строки, можем ли мы по-прежнему принимать двумерный массив символов? Например, 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>

user81655
источник
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

Java 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, содержащий части смайликов, подверженные воздействию дождя (индексация начинается с 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 вместо просто Lists. Я заменил ArrayLists / Lists на HashSets / Sets, который сохраняет еще несколько символов. Также спасибо за совет по использованию цикла foreach во внутреннем цикле! Благодаря этому изменению я могу создать переменную для индекса последней строки сетки, которая укорачивает его немного больше. Всего 17 символов были сохранены!

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

Я переключился обратно с цикла foreach на цикл for. Это позволяет пропустить сравнение последней строки, что, в свою очередь, позволяет сократить сравнение значений ascii. В этом контексте только '/', '\' и '_' имеют значение ascii более 46. Если мы не проверяем последнюю строку, мы можем использовать > 46 checkвместо этого для проверки фактического значения.

Еще раз спасибо @ user902383 за показ, что я использую лямбду и могу использовать List + Stack вместо Set + HashSet, чтобы сбрить другой символ.


Строка, возвращающая версию

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

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

Ungolfed:

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;
    }
}
Frozn
источник
2
вы нарушили правило № 1 always program to an interface, если вы используете Listвместо этого, ArrayListвы можете сохранить 5 байтов
user902383
1
Я думаю, что внутренний цикл for мог бы быть заменен циклом 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
DJMcMayhem
источник
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чтобы соответствовать всему остальному, которое вообще заменяется ничем, поэтому мы удаляем все остальные символы.

Мартин Эндер
источник
Можете ли вы объяснить подробнее, как это регулярное выражение выглядит над персонажами эмодзи?
синтаксис
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

Matlab, 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 ....
  • ⍵∊'/\': пометить все вхождения '/' и '\' на входе 1с.
  • ∨⌿: or над столбцами. Это отмечает 1 все позиции в последнем ряду, которые покрыты зонтиком.
  • ~: not, Потому что нам нужно наоборот
  • (... )/...: Выбрать все открытые столбцы из матрицы промежуточных сумм из предыдущих
  • ,: Получить список всех значений в результирующей матрице.
  • (⍳3)∩: Пересечение между этим и 1 2 3(это избавляет от любых выбранных значений 0 или более, которые будут пробелами).
Мэринус
источник
0

Python 2, 114 111 байт

def f(a):c=a.find("\n")+1;r=a.rfind;g=lambda i:([i],[])[r("\\")%c>=r("-")%c-2+i>=r("/")%c];print g(0)+g(1)+g(2)

Использует индексирование на основе 0.

Попробуй это здесь .

Чак Моррис
источник