Czy moje emoji są suche?

17

To jest moje zwierzę domowe emoji, Billy:

-_-

Emoji nie lubią być w deszczu, więc Billy jest smutny ... Narysujmy parasol, aby poczuł się lepiej!

  /\
 /  \
/    \

  -_-

To dobrze, jest całkowicie przykryty parasolem! Oto przykład, w którym objęta jest tylko jego część:

  /\
 /  \
/    \

     -_-

W takim przypadku sekcje 2 i 3 jego ciała są narażone na deszcz.

Parasole są w wielu kształtach i rozmiarach, ale zawsze składają się z serii rosnących cięć, /a następnie serii malejących ukośników \. Na przykład są to wszystkie prawidłowe parasole:

  /\
 /  \
/    \

/\

    /\
   /  \
  /    \
 /      \
/        \

A to nie są:

/   \

\/

  \
 / \
/   \

 0\
/  \

//\\
/  \

Musisz ustalić, które części mojego emoji są narażone na deszcz.

Wyjaśnienia

  • Twój program (lub funkcja) pobierze ciąg 2d jako dane wejściowe. Może być w dowolnym formacie najbardziej dogodnym lub naturalnym dla twojego języka. Tablica ciągów, tablica znaków, ciąg znaków z nowymi liniami itp.

  • Musisz określić, które części emoji są narażone na deszcz. Może to być indeksowane zerowo lub indeksowane jednokrotnie, o ile to wyjaśnisz. Dane wyjściowe mogą być w dowolnym rozsądnym formacie. Jeśli cały emoji jest chroniony przed deszczem, nie wysyłaj nic (lub pustej tablicy).

  • Można założyć, że wszystkie wejścia będą miały poprawną parasol, i ten sam emotikony: -_-. Emoji zawsze będzie w ostatnim wierszu wejścia, jednak może to być kilka pustych linii między parasolem a emoji.

  • Wszystko, co nie jest częścią parasola lub emoji, będzie znakiem spacji lub znakiem nowej linii.

  • Dane wejściowe zostaną wypełnione spacjami, aby długość każdej linii była taka sama.

Obowiązują standardowe luki, a najkrótsza odpowiedź w bajtach wygrywa!

Test IO:

Wszystkie przykładowe przypadki będą korzystały z jednego indeksowania.

  /\
 /  \
/    \

  -_-

Outputs: []

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

   /\
  /  \

     -_-

Outputs: [2, 3]

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

    /\
   -_-

Outputs: [1]

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

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




               -_-

Outputs: [1, 2, 3]
DJMcMayhem
źródło
2
Czy możemy wyprowadzać części emoji, które są w deszczu? tj ["_","-"].
Rɪᴋᴇʀ
Jeśli nasz język obsługuje ciągi, czy nadal możemy akceptować tablicę znaków 2D? Na przykład Array w JavaScript ma do dyspozycji inne funkcje niż String.
Patrick Roberts
@PatrickRoberts Tak, to jest dopuszczalne.
DJMcMayhem
@ EᴀsᴛᴇʀʟʏIʀᴋ Nie, powinieneś wypisać liczby.
DJMcMayhem
1
Myślę, że masz na myśli emotikon. Suche emoji to 🔥 (lub ☂️ przypuszczam)
NH.

Odpowiedzi:

8

05AB1E , 18 17 15 bajtów

Kod:

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

Wyjaśnienie:

|                  # 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.

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! (pamiętaj o wypełnieniu wszystkich linii spacjami do tej samej długości ..

Adnan
źródło
5

JavaScript (ES6), 95 bajtów

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

Dane wejściowe powinny być tablicą ciągów, z każdą linią wypełnioną spacjami, aby utworzyć kwadrat. Dane wyjściowe to tablica liczb 1-indeksowanych.

Wyjaśnienie

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>

użytkownik81655
źródło
4

JavaScript (ES6), 92 bajty

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

Akceptuje nierówną tablicę wierszy i zwraca wynik o indeksie 1. Wyjaśnienie:

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
Neil
źródło
3

Java 8 lambda, 241 218 201 191 185 184 (lub 161) znaków

Ponieważ wiesz, także Java potrzebuje suchych emoji.

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

Zwraca ArrayList a HashSet a Stack zawierający części emoji, które są wystawione na działanie deszczu (indeksowanie zaczyna się od 0). Cała sprawa rozpakowana:

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

Aktualizacje

Zrobiłem podstawowe golfa. Obejmuje to złożenie deklaracji razem, porównanie z wartościami ascii, aby zapisać niektóre znaki i skrócić pętle.

Dzięki @ user902383 za wskazanie mojego błędu zrzutu przy użyciu ArrayLists zamiast list. Zastąpiłem ArrayLists / Lists HashSets / Sets, który zapisuje więcej znaków. Dziękujemy również za jego wskazówkę dotyczącą użycia pętli foreach w wewnętrznej pętli! Dzięki tej zmianie jestem w stanie utworzyć zmienną dla indeksu ostatniego wiersza siatki, co nieco go skraca. Ogółem uratowano 17 znaków!

@KevinCruijssen zasugerował, aby usunąć generyczne podczas inicjalizacji, poszedłem o krok dalej: Usuń wszystkie ogólne To oszczędza kolejne 10 znaków.

Wróciłem z pętli foreach do pętli for. Umożliwia to pominięcie porównania ostatniej linii, co z kolei pozwala mi skrócić porównanie wartości ascii. W tym kontekście tylko „/”, „\” i „_” mają wartość ascii powyżej 46. Jeśli nie sprawdzimy ostatniego wiersza, możemy > 46 checkzamiast tego użyć wartości rzeczywistej.

Jeszcze raz dziękuję @ user902383 za pokazanie mi, że używam lambda i mogę użyć List + Stack zamiast Set + HashSet, aby zgolić inną postać.


Wersja zwracająca ciąg

@ user902383 wskazał, że zamiast tego mogę po prostu utworzyć ciąg z cyframi. Brzmi to bardzo podstępnie, ale inni wydają się to rozwiązywać w ten sposób, więc tutaj jest krótsza wersja wykorzystująca znak powrotu:

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

Nie golfowany:

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
źródło
2
złamałeś zasadę numer 1 always program to an interface, jeśli użyjesz Listzamiast tego ArrayListmożesz zapisać 5 bajtów
user902383
1
Myślę, że wewnętrzna pętla for może zostać zastąpiona przez pętlę foreach, która powinna dać ci dodatkową parę bajtów
user902383
1
Nie do końca pewni, ale =new HashSet<>();najprawdopodobniej można w nią grać =new HashSet();.
Kevin Cruijssen
1
@Frozn Dlaczego nie jest to dozwolone? Wiem, że kompilator generuje ostrzeżenie, które zdarza się często podczas gry w golfa. Nie jestem pewien, czy Twój kod nadal działa tak samo, nie przetestowałem go. Jeśli tak, to po usunięciu <>zapisuje się 2 bajty. :)
Kevin Cruijssen
2
@Frozn miałbyś rację w dobrej starej javie, ale teraz mamy lambda, aw notacji lambda nie podajesz typu. stąd masz Set(3) HashSet(7)przeciwko List(4) i Stack(5).
user902383
3

V , 20 19 bajtów (niekonkurencyjny)

G^R123?/
f\GddHÍó

Alternatywna, konkurencyjna wersja (21 bajtów):

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

Wypróbuj online! (Uwaga: tryitonline.net używa nieco starej wersji V. Aby to zrekompensować, używa tej nieco dłuższej wersji)

Wyjaśnienie:

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

To samo daje poprawny wynik w 17 bajtach. Jednak tworzy również dodatkowe białe znaki. Nie przeszkadza mi to, ale nie chcę dać sobie nieuczciwej przewagi, więc dodaję dwa bajty:

Íó          "Remove all whitespace
DJMcMayhem
źródło
3

JavaScript (ES6), 117 112 bajtów

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)

Akceptuje nierówną tablicę łańcuchów znaków i zwraca wyniki o indeksie 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

Próbny

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>

Patrick Roberts
źródło
Lubię twoje komentarze!
sintax
2

Siatkówka , 56 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

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

Wypróbuj online!

Jest to pojedynczy etap zastępowania, w którym wyrażenie regularne pasuje do jednego ze znaków emoji, pod warunkiem, że gdzieś powyżej w tej samej poziomej pozycji znajduje się znak spacji (tj. A /lub \), a następnie przechwytujemy liczbę znaków emoji do tego poziomu punkt. To dopasowanie zostało zastąpione długością ostatniego przechwytywania, co daje nam indeks tej niezabezpieczonej postaci emoji. Wyrażenie regularne zawiera również |\Dpasujące do wszystkich innych elementów, które są zastępowane niczym, więc usuwamy wszystkie pozostałe znaki.

Martin Ender
źródło
Czy możesz wyjaśnić więcej, jak ten regex wygląda ponad znakami emoji?
sintax
1
@sintax Używa grup równoważących do zliczania poprzedzających je znaków we własnej linii. Mierzy to swoje położenie poziome. Następnie po ja dopasowanych, /albo \, ja popping z tej grupy ponownie, dopasowując rzeczy poprzedzającego że , a następnie upewnij się, że już całkowicie wyczerpany grupę. Zasadniczo zapewnia to dopasowanie poziomej pozycji emoji do znaku dachu.
Martin Ender
1

Pyth, 27 23 bajtów

0-indeksowane.

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

Wypróbuj online!

Wyjaśnienie

-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

Historia

27 bajtów: sM:#"^ *\d"0.T:R"-_-"s`M3.z( Wypróbuj online! )

Leaky Nun
źródło
1

Matlab, 43 bajty

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

Ten kod wyszukuje pozycje kolumn znaków spacji w ostatnim rzędzie danych wejściowych, sumuje liczbę znaków spacji w tych kolumnach i znajduje tam, gdzie jest tylko jeden taki znak (znak emoji, nie osłonięty parasolem!) . Ten kod zwraca tylko prawidłowe wyniki dla prawidłowo uformowanych parasoli (zakłada, że ​​dowolny znak powyżej naszego emoji jest częścią dobrze uformowanego parasola).

Oto trochę kodu narzędzia do pisania przypadków testowych i sprawdzania mojej pracy:

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) '-_-']);

Bieganie x = thrht(7) daje

x =

   /\    
  /  \   
 /    \  

      -_-

Lub x = twht(0) daje

x =

   /\   
  /  \  

 -_-     
sintax
źródło
0

APL, 31 bajtów

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

To pobiera macierz znaków jako dane wejściowe.

Testy:

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

Wyjaśnienie:

  • '-_-'⍷⍵: w macierzy zer zerowej wielkości wejścia zaznacz pozycję początku '-_-'wejścia za pomocą 1.
  • +\+\: Suma bieżąca nad wierszami. Pierwszy 0 0 0 1 0 0 ...przekształca się 0 0 0 1 1 1 ..., drugi przekształca się w 0 0 0 1 2 3 ....
  • ⍵∊'/\': zaznacz wszystkie wystąpienia „/” i „\” na wejściu za pomocą 1s.
  • ∨⌿: orponad kolumnami. Oznacza to 1 wszystkimi pozycjami w ostatnim rzędzie, które są objęte parasolem.
  • ~: not ponieważ potrzebujemy czegoś przeciwnego
  • (... )/...: Wybierz wszystkie niepokryte kolumny z bieżącej macierzy sum wcześniej
  • ,: Uzyskaj listę wszystkich wartości w wynikowej macierzy.
  • (⍳3)∩: Przecięcie tego i 1 2 3(pozbywa się dowolnych wybranych zer lub wyższych wartości, które byłyby spacjami).
marinus
źródło
0

Python 2, 114 111 bajtów

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)

Wykorzystuje indeksowanie 0.

Wypróbuj tutaj .

Chuck Morris
źródło