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


17

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

-_-

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

  /\
 /  \
/    \

  -_-

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

  /\
 /  \
/    \

     -_-

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

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

  /\
 /  \
/    \

/\

    /\
   /  \
  /    \
 /      \
/        \

И это не

/   \

\/

  \
 / \
/   \

 0\
/  \

//\\
/  \

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

Разъяснения

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

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

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

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

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

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

Тест IO:

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

  /\
 /  \
/    \

  -_-

Outputs: []

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

   /\
  /  \

     -_-

Outputs: [2, 3]

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

    /\
   -_-

Outputs: [1]

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

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




               -_-

Outputs: [1, 2, 3]

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>


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

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

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 или более, которые будут пробелами).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.