Biểu tượng cảm xúc của tôi có khô không?


17

Đây là biểu tượng cảm xúc thú cưng của tôi, Billy:

-_-

Biểu tượng cảm xúc không thích ở trong mưa, vì vậy Billy rất buồn ... Hãy vẽ cho anh ấy một chiếc ô để anh ấy cảm thấy tốt hơn!

  /\
 /  \
/    \

  -_-

Điều này là tốt, anh ấy hoàn toàn được bao phủ bởi chiếc ô của mình! Đây là một ví dụ mà chỉ một phần của anh ta được bảo hiểm:

  /\
 /  \
/    \

     -_-

Trong trường hợp này, phần 2 và 3 của cơ thể anh ta tiếp xúc với mưa.

Ô dù có nhiều hình dạng và kích cỡ, nhưng chúng luôn được tạo thành từ một loạt các dấu gạch chéo tăng dần /theo sau là một loạt các dấu gạch chéo giảm dần \. Ví dụ: đây là tất cả các ô hợp lệ:

  /\
 /  \
/    \

/\

    /\
   /  \
  /    \
 /      \
/        \

Và đây không phải là:

/   \

\/

  \
 / \
/   \

 0\
/  \

//\\
/  \

Bạn cần xác định phần nào trong biểu tượng cảm xúc của tôi tiếp xúc với mưa.

Làm rõ

  • Chương trình (hoặc chức năng) của bạn sẽ lấy chuỗi 2d làm đầu vào. Điều này có thể ở bất kỳ định dạng nào là thuận tiện nhất hoặc tự nhiên với ngôn ngữ của bạn. Một mảng các chuỗi, một mảng các ký tự, một chuỗi có dòng mới trong đó, v.v.

  • Bạn phải xuất ra phần nào của biểu tượng cảm xúc tiếp xúc với mưa. Điều này có thể là không có chỉ mục hoặc một chỉ mục, miễn là bạn làm rõ điều này. Đầu ra có thể ở bất kỳ định dạng hợp lý. Nếu toàn bộ biểu tượng cảm xúc được bảo vệ khỏi mưa, không xuất ra gì (hoặc một mảng trống).

  • Bạn có thể giả định rằng tất cả các đầu vào sẽ có một ô hợp lệ và cùng một biểu tượng cảm xúc : -_-. Biểu tượng cảm xúc sẽ luôn ở dòng cuối cùng của đầu vào, tuy nhiên chúng có thể là một vài dòng trống giữa ô và biểu tượng cảm xúc.

  • Tất cả mọi thứ không phải là một phần của chiếc ô hoặc biểu tượng cảm xúc sẽ là một nhân vật không gian hoặc dòng mới.

  • Đầu vào sẽ được đệm bằng khoảng trắng sao cho độ dài của mỗi dòng là như nhau.

Áp dụng sơ hở tiêu chuẩn và câu trả lời ngắn nhất tính bằng byte!

Kiểm tra IO:

Tất cả các trường hợp mẫu sẽ sử dụng một chỉ mục.

  /\
 /  \
/    \

  -_-

Outputs: []

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

   /\
  /  \

     -_-

Outputs: [2, 3]

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

    /\
   -_-

Outputs: [1]

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

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




               -_-

Outputs: [1, 2, 3]

2
Chúng ta có thể xuất các phần của biểu tượng cảm xúc đang mưa không? tức ["_","-"].
Rɪᴋᴇʀ

Nếu ngôn ngữ của chúng tôi hỗ trợ các chuỗi, chúng tôi vẫn có thể chấp nhận một mảng các ký tự 2D không? Ví dụ, Array trong JavaScript có các hàm khác nhau có sẵn cho nó so với String.
Patrick Roberts

@PatrickRoberts Vâng, điều đó được chấp nhận.
DJMcMayhem

@ EᴀsᴛᴇʀʟʏIʀᴋ Không, bạn nên xuất số.
DJMcMayhem

1
Tôi nghĩ bạn có nghĩa là biểu tượng cảm xúc. Biểu tượng cảm xúc khô sẽ là 🔥 (hoặc tôi cho rằng)
NH.

Câu trả lời:


8

05AB1E , 18 17 15 byte

Mã số:

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

Giải trình:

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! (đảm bảo đệm tất cả các dòng có khoảng trắng đến cùng độ dài ..


5

JavaScript (ES6), 95 byte

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

Đầu vào phải là một chuỗi các chuỗi, với mỗi dòng được đệm bằng khoảng trắng để tạo thành một hình vuông. Đầu ra là một mảng các số có 1 chỉ mục.

Giải trình

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 byte

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

Chấp nhận một mảng các dòng rách rưới và trả về kết quả 1 chỉ mục. Giải trình:

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 lambda, ký tự 241 218 201 191 185 184 (hoặc 161)

Bởi vì bạn biết, Java cũng cần biểu tượng cảm xúc khô.

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

Nó trả về một ArrayList một Hashset một Stack chứa các phần của biểu tượng cảm xúc tiếp xúc với mưa (lập chỉ mục bắt đầu từ 0). Toàn bộ điều chưa được khám phá:

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

Cập nhật

Tôi đã làm một số golf cơ bản. Điều này bao gồm đặt các khai báo cùng nhau, so sánh với các giá trị ascii để lưu một số ký tự và rút ngắn các vòng lặp.

Cảm ơn @ user902383 vì đã chỉ ra lỗi kết xuất của tôi khi sử dụng ArrayLists thay vì chỉ Danh sách. Tôi đã thay thế ArrayLists / Lists bằng HashSets / Sets để lưu thêm một số ký tự. Cũng cảm ơn vì mẹo của anh ấy để sử dụng vòng lặp foreach trong vòng lặp bên trong! Thông qua thay đổi đó, tôi có thể tạo một biến cho chỉ mục của hàng lưới cuối cùng để rút ngắn nó thêm một chút. Tổng cộng 17 ký tự đã được lưu!

@KevinCruijssen đề nghị loại bỏ thuốc generic trong quá trình khởi tạo, tôi đã tiến thêm một bước: Loại bỏ tất cả các thuốc generic. Điều này tiết kiệm thêm 10 ký tự.

Tôi chuyển trở lại từ vòng lặp foreach sang vòng lặp for. Điều này cho phép bỏ qua việc so sánh dòng cuối cùng, điều này cho phép tôi rút ngắn việc so sánh các giá trị ascii. Trong ngữ cảnh này, chỉ '/', '\' và '_' có giá trị ascii trên 46. Nếu chúng ta không kiểm tra dòng cuối cùng, chúng ta có thể sử dụng > 46 checkthay thế để kiểm tra giá trị thực.

Một lần nữa xin cảm ơn @ user902383 vì đã cho tôi thấy rằng tôi sử dụng lambda và có thể sử dụng List + Stack thay vì Set + Hashset để cạo một ký tự khác.


Phiên bản trả về chuỗi

@ user902383 chỉ ra thay vào đó tôi chỉ có thể tạo Chuỗi bằng các chữ số. Điều này nghe có vẻ rất gian lận nhưng những người khác dường như giải quyết nó theo cách này vì vậy đây là phiên bản ngắn hơn bằng cách sử dụng trả về Chuỗi:

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

Ung dung:

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
bạn đã phá vỡ quy tắc số 1 always program to an interface, nếu bạn sử dụng Listthay vào đó, ArrayListbạn có thể tiết kiệm 5 byte
user902383

1
Tôi nghĩ rằng vòng lặp for bên trong có thể được thay thế bằng vòng lặp foreach sẽ cung cấp cho bạn thêm vài byte
user902383

1
Không hoàn toàn chắc chắn, nhưng rất =new HashSet<>();có thể có thể được chơi golf =new HashSet();.
Kevin Cruijssen

1
@Frozn Tại sao nó không được phép? Tôi biết trình biên dịch tạo ra một cảnh báo, điều này xảy ra rất nhiều trong quá trình chơi mã. Điều tôi không chắc chắn là nếu mã của bạn vẫn hoạt động như cũ, chưa kiểm tra nó. Nếu có, hơn là loại bỏ <>giúp bạn tiết kiệm 2 byte. :)
Kevin Cruijssen

2
@Frozn bạn sẽ đúng trong java cũ, nhưng bây giờ chúng tôi có lambda, và trong ký hiệu lambda bạn không chỉ định loại. do đó bạn có Set(3) HashSet(7)chống lại List(4) và Stack(5).
dùng902383

3

V , 20 19 byte (không cạnh tranh)

G^R123?/
f\GddHÍó

Phiên bản thay thế, cạnh tranh (21 byte):

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

Hãy thử trực tuyến!(Lưu ý, tryitonline.net sử dụng phiên bản V. hơi cũ để bù lại, nó sử dụng phiên bản dài hơn một chút)

Giải trình:

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

Điều này một mình tạo ra kết quả chính xác trong 17 byte. Tuy nhiên, nó cũng tạo ra một số khoảng trắng thêm. Tôi không bận tâm về điều đó, nhưng tôi không muốn tạo cho mình một lợi thế không công bằng, vì vậy tôi đang thêm hai byte:

Íó          "Remove all whitespace

3

JavaScript (ES6), 117 112 byte

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)

Chấp nhận một mảng các chuỗi ký tự rách rưới và trả về các kết quả được lập chỉ mục 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

Bản giới thiệu

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>


Tôi thích ý kiến ​​của bạn!
sintax

2

Võng mạc , 56 byte

Số lượng byte giả định mã hóa ISO 8859-1.

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

Hãy thử trực tuyến!

Đây là một giai đoạn thay thế duy nhất, trong đó regex khớp với một trong các ký tự biểu tượng cảm xúc, với điều kiện là có một ký tự không phải không gian (tức là một /hoặc \) ở trên cùng ở vị trí nằm ngang, và sau đó chúng tôi nắm bắt số lượng ký tự biểu tượng cảm xúc theo đó điểm. Trận đấu này được thay thế bằng độ dài của lần chụp cuối cùng, điều này cho chúng ta chỉ số của nhân vật biểu tượng cảm xúc không được che chở này. Regex cũng chứa một |\Dđể khớp với mọi thứ khác được thay thế bằng không có gì cả, vì vậy chúng tôi loại bỏ tất cả các ký tự khác.


Bạn có thể giải thích thêm làm thế nào regex này trông bên trên các nhân vật biểu tượng cảm xúc?
sintax

1
@sintax Nó sử dụng các nhóm cân bằng để đếm các ký tự đứng trước nó trên dòng riêng của nó. Điều này đo vị trí ngang của nó. Sau đó, sau khi tôi khớp với /hoặc \, tôi lại xuất hiện trong nhóm đó trong khi khớp với những thứ trước đó , và sau đó đảm bảo rằng tôi đã hoàn toàn làm cạn kiệt nhóm. Điều này về cơ bản đảm bảo rằng vị trí ngang của biểu tượng cảm xúc và nhân vật mái nhà phù hợp.
Martin Ender

1

Bình thường, 27 23 byte

Chỉ số 0.

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

Hãy thử trực tuyến!

Giải trình

-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

Lịch sử

27 byte: sM:#"^ *\d"0.T:R"-_-"s`M3.z( Hãy thử trực tuyến! )


1

Matlab, 43 byte

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

Mã này tìm vị trí cột của các ký tự không phải khoảng trắng ở hàng cuối cùng của đầu vào, tính tổng số ký tự không phải khoảng trắng trong các cột đó và tìm thấy nơi chỉ có một ký tự như vậy (ký tự của biểu tượng cảm xúc, không được che chắn bởi ô!) . Mã này chỉ trả về kết quả thích hợp cho các ô được tạo hình tốt (nó giả sử bất kỳ ký tự nào phía trên biểu tượng cảm xúc của chúng tôi là một phần của ô được tạo tốt).

Đây là một chút mã tiện ích để viết các trường hợp thử nghiệm và kiểm tra công việc của tôi:

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

Đang chạy x = thrht(7) cho

x =

   /\    
  /  \   
 /    \  

      -_-

Hoặc x = twht(0) cho

x =

   /\   
  /  \  

 -_-     

0

APL, 31 byte

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

Điều này có một ma trận ký tự làm đầu vào.

Các xét nghiệm:

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

Giải trình:

  • '-_-'⍷⍵: trong một ma trận số 0 kích thước của đầu vào, đánh dấu vị trí bắt đầu của '-_-'đầu vào bằng 1.
  • +\+\: Chạy tổng trên các hàng. Cái thứ nhất tạo 0 0 0 1 0 0 ...thành 0 0 0 1 1 1 ..., cái thứ hai sau đó biến nó thành 0 0 0 1 2 3 ....
  • ⍵∊'/\': đánh dấu tất cả các lần xuất hiện của '/' và '\' trong đầu vào bằng 1s.
  • ∨⌿: ortrên cột. Dấu này với 1 tất cả các vị trí trên hàng cuối cùng được che bởi ô.
  • ~: not, bởi vì chúng ta cần điều ngược lại
  • (... )/...: Chọn tất cả các cột chưa được phát hiện từ ma trận tổng chạy từ trước đó
  • ,: Lấy danh sách tất cả các giá trị trong ma trận kết quả.
  • (⍳3)∩: Giao lộ giữa đó và 1 2 3(điều này loại bỏ mọi giá trị 0 được chọn hoặc cao hơn, sẽ là khoảng trắng).

0

Python 2, 114 111 byte

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)

Sử dụng 0 chỉ mục dựa trên.

Hãy thử nó ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.