이모티콘이 건조합니까?


17

이것은 내 애완 동물 이모티콘, 빌리 :

-_-

비가 오는 것을 좋아하지 않는 이모티콘. 그래서 Billy는 슬프다 ... 우산을 그려서 기분이 나아지도록하자!

  /\
 /  \
/    \

  -_-

이것은 좋습니다, 그는 그의 우산으로 완전히 덮여 있습니다! 다음은 그중 일부만 다루는 예입니다.

  /\
 /  \
/    \

     -_-

이 경우 신체의 섹션 2와 3이 비에 노출됩니다.

우산은 다양한 모양과 크기로 제공되지만 항상 일련의 오름차순 슬래시 /와 일련의 내림차순 백 슬래시로 구성 \됩니다. 예를 들어 다음은 모두 유효한 우산입니다.

  /\
 /  \
/    \

/\

    /\
   /  \
  /    \
 /      \
/        \

그리고 이것들은 아닙니다 :

/   \

\/

  \
 / \
/   \

 0\
/  \

//\\
/  \

내 이모티콘의 어느 부분이 비에 노출되는지 확인해야합니다.

설명

  • 프로그램 (또는 함수)은 2d 문자열을 입력으로받습니다. 이것은 귀하의 언어에 가장 편리하거나 자연스러운 형식 일 수 있습니다. 문자열 배열, 문자 배열, 줄 바꿈이 포함 된 문자열 등

  • 비가 오는 이모티콘 섹션을 출력해야합니다. 이를 명확하게하는 한, 인덱스가 0이거나 인덱스가 1 일 수 있습니다. 출력은 임의의 합리적인 형식 일 수 있습니다. 전체 이모티콘이 빗물로부터 보호되면 아무 것도 출력하지 않습니다 (또는 빈 배열).

  • 모든 입력에 유효한 우산과 동일한 그림 이모티콘이 있다고 가정 할 수 있습니다 -_-. 그림 이모티콘은 항상 입력의 마지막 줄에 있지만 우산과 그림 이모티콘 사이에 빈 줄이 몇 개있을 수 있습니다.

  • 우산이나 그림 이모티콘에 포함되지 않은 모든 것은 공백 문자 또는 줄 바꿈입니다.

  • 입력은 공백으로 채워져 각 줄의 길이가 동일합니다.

표준 허점이 적용되며 바이트 단위의 최단 답변이 승리합니다!

IO 테스트 :

모든 샘플 사례는 1 인덱싱을 사용합니다.

  /\
 /  \
/    \

  -_-

Outputs: []

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

   /\
  /  \

     -_-

Outputs: [2, 3]

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

    /\
   -_-

Outputs: [1]

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

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




               -_-

Outputs: [1, 2, 3]

2
비가 오는 이모티콘 부분을 출력 할 수 있습니까? 즉 ["_","-"].
Rɪᴋᴇʀ

우리의 언어가 문자열을 지원하는 경우에도 2D 문자 배열을 사용할 수 있습니까? 예를 들어 JavaScript의 Array는 String과 다른 기능을 사용할 수 있습니다.
Patrick Roberts

@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

자바 스크립트 (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

자바 스크립트 (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;}

비에 노출되는 이모티콘 부분을 포함하는 스택을 HashSet a StackList로 반환 합니다 (인덱싱은 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 값과 비교하여 일부 문자를 저장하고 루프를 단축시키는 것이 포함됩니다.

List 대신 ArrayLists를 사용하여 덤프 실수를 지적한 @ user902383에게 감사합니다. ArrayLists / Lists를 HashSets / Sets로 바꾸어 더 많은 문자를 저장했습니다. 또한 내부 루프에서 foreach 루프를 사용하는 팁에 감사드립니다! 이 변경을 통해 마지막 그리드 행의 인덱스에 대한 변수를 만들어 조금 더 단축시킬 수 있습니다. 총 17 개의 문자가 저장되었습니다!

@KevinCruijssen은 초기화에서 제네릭을 제거 할 것을 제안했지만 한 단계 더 나아갔습니다. 모든 제네릭을 제거하십시오. 이것은 또 다른 10자를 저장합니다.

foreach 루프에서 for 루프로 다시 전환했습니다. 이것은 마지막 줄 비교를 건너 뛸 수있게하여 ASCII 값의 비교를 단축시킬 수 있습니다. 이 문맥에서는 '/', '\'및 '_'만 46보다 큰 ASCII 값을 갖습니다. 마지막 행을 확인하지 않으면 > 46 check대신 실제 값을 확인 하는 대신 사용할 수 있습니다 .

람다를 사용하고 다른 문자를 제거하기 위해 Set + HashSet 대신 List + Stack을 사용할 수 있음을 보여 준 @ user902383에게 다시 감사드립니다.


문자열 반환 버전

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

언 골프 드 :

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사용 하면 5 바이트를 절약 할 수 있습니다.ListArrayList
user902383

1
inner for 루프가 foreach 루프로 대체되어 추가 바이트를 제공해야한다고 생각합니다.
user902383

1
완전히 확실하지는 않지만 =new HashSet<>();골프를 치기 쉽습니다 =new HashSet();.
Kevin Cruijssen

1
@Frozn 왜 허용되지 않습니까? 컴파일러가 경고를 생성한다는 것을 알고 있습니다. 이는 코드 골프 중 많은 일이 발생합니다. 확실하지 않은 것은 코드가 여전히 똑같이 작동하고 테스트하지 않은 것입니다. 그렇다면 제거하는 것보다 <>2 바이트 가 절약됩니다. :)
Kevin Cruijssen 2016 년

2
@ Frozn 당신은 좋은 오래된 자바에 맞을 것이지만 지금은 람다가 있고 람다 표기법에서는 유형을 지정하지 않습니다. 그러므로 당신은 (4)와 (5) Set(3) HashSet(7)에 반대 합니다. ListStack
user902383 2016 년

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 바이트의 정확한 결과를 얻을 수 있습니다. 그러나 추가 공백이 생깁니다. 나는 그것을 신경 쓰지 않지만 불공평 한 이점을주고 싶지 않기 때문에 2 바이트를 추가하고있다.

Íó          "Remove all whitespace

3

자바 스크립트 (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>


나는 당신의 의견을 좋아합니다!
sintax

2

레티 나 , 56 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

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

온라인으로 사용해보십시오!

동일한 수평 위치 위에 공백이 아닌 문자 (예 : a /또는 \)가 있는 경우 정규식이 이모티콘 문자 중 하나와 일치하는 단일 대체 단계 입니다. 포인트. 이 일치는 마지막 캡처 길이로 대체되어이 보호되지 않은 이모티콘 문자의 인덱스를 제공합니다. 정규식에는 또한 |\D아무것도 대체하지 않는 다른 모든 항목과 일치하는가 포함되어 있으므로 다른 모든 문자를 제거합니다.


이 정규식이 이모티콘 문자 위에 어떻게 보이는지 더 자세히 설명해 주시겠습니까?
sintax

1
@sintax 밸런싱 그룹 을 사용 하여 앞에 오는 문자를 자체 줄에서 계산합니다. 가로 위치를 측정합니다. 그런 다음/ 또는 \이전의 물건 일치하는 동안, 나는 다시 해당 그룹에서 터지는거야 것을 확인 후, 나는 완전히 그룹을 고갈했습니다. 기본적으로 이모 지의 가로 위치와 지붕 문자가 일치합니다.
Martin Ender 2016 년

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│
└┴───┴─┴─────┘

설명:

  • '-_-'⍷⍵: 입력의 크기가 0 인 행렬에서 입력의 시작 위치를 '-_-'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 이상의 값을 제거함)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.