당근 인기도 통계 세 줄의 메시지와의

캐럿 (또는 당근 )을 사용 하는 PPCG 대화방에서 19 번째 바이트 는 이전에 작성한 의견 중 하나에 동의한다는 것을 나타내는 방법입니다.^

캐럿 메시지는 N ^문자 (여기서 N은 양의 정수) 로만 구성되며 이전 N 번째 메시지와의 동의를 의미합니다. 따라서 단일 ^은 바로 이전 메시지와의 계약을 ^^의미하고, 두 줄 ^^^의 메시지와의 계약을 의미 하고, 세 줄의 메시지와의 계약을 의미합니다.

또한, 캐럿 메시지 X가 다른 캐럿 메시지 Y와 일치 할 때 (일명, 캐럿 메시지), X는 Y가 동의 한 것과 일치한다고 말한다. 이것의 여러 계층이있을 수 있으며 결국 모든 캐럿 메시지는 하나의 캐럿이 아닌 메시지와의 동의를 나타냅니다.

예를 들어, 대화 내용이 다음과 같은 경우 (한 줄에 하나의 메시지)

I like dogs           [line 1]
I like cats           [line 2]
^                     [line 3]
^^^                   [line 4]
^^                    [line 5]
I like turtles        [line 6]
^                     [line 7]
^^^                   [line 8]
^^                    [line 9]

그런 다음 줄 1, 2 및 6은 캐럿이 아닌 메시지이고 나머지는 캐럿이 아닌 메시지를 가리키는 캐럿 메시지입니다.

  • 3 호선은 2 호선을 직접 가리 킵니다.
  • 라인 4는 라인 1을 직접 가리 킵니다.
  • 5 행은 2 행을 가리키는 3 행을 가리 킵니다.
  • 7 행은 6 행을 가리 킵니다.
  • 8 행은 5 행, 3 행, 2 행을 가리 킵니다.
  • 9 행은 7 행, 6 행을 가리 킵니다.

따라서 캐럿이 아닌 메시지를 작성한 사용자 (및 사람들이 자신의 메시지를 캐럿하지 않는다고 가정)를 포함하여 다음과 같은 결론을 내릴 수 있습니다.

  • 2 명이 동의합니다 I like dogs(1, 4 행).
  • 4 명이 동의합니다 I like cats(2, 3, 5 및 8 행).
  • 3 명이 동의합니다 I like turtles(6, 7, 9 행).

도전

위의 예와 비슷한 여러 줄 문자열을 사용하는 프로그램이나 함수를 작성하십시오. 여기서 모든 줄은 채팅 메시지를 나타내며 이전 메시지가 먼저 나타납니다.

모든 줄에는 문자가 하나 이상 있고 줄이 하나 이상 있습니다. 모든 메시지는로만 구성된 캐럿 메시지 ^이거나 문자와 공백으로 구성된 캐럿이 아닌 메시지 ( [ a-zA-Z]+정규식)입니다.

캐럿이 아닌 모든 메시지에 대해 순서에 상관없이 메시지 텍스트를 포함하는 명확한 형식으로 메시지에 동의하는 사람 수를 출력하십시오.

2 - I like dogs
4 - I like cats
3 - I like turtles

또는

I like cats (4)
I like dogs (2)
I like turtles (3)

또는

{"I like cats" : 4, "I like turtles" : 3, "I like dogs" : 2}

다음과 같이 가정 할 수 있습니다.

  • 사람들은 항상 자신의 메시지에 동의하고 자신을 걱정하지 않습니다.
  • 캐럿이 아닌 두 메시지는 동일하지 않습니다.
  • 캐럿 메시지는 첫 번째 메시지 이전의 내용을 가리 키지 않습니다.
  • 행은 앞뒤 공백을 포함하지 않습니다.

바이트 단위의 가장 짧은 코드가 이깁니다.

테스트 사례

bread is bread

1 - bread is bread

---

animals are fuzzy
^
^
^
^^^
^^
^^^^^^

7 - animals are fuzzy

---

pie
^
^^
pi
^
^^
^^^^
^
^^^^^
^^^^^
^^^
^^^^
^^
^
^^^^^^^^^

9 - pie
6 - pi

---

a
b
c
^
^
^

1 - a
1 - b
4 - c

---

a
b
c
^
^^
^^^

1 - a
1 - b
4 - c

---

a
b
c
^^^
^^^^
^^^^^

4 - a
1 - b
1 - c

---

W
^
^^
X
^^^
^^^^
Y
^^^^^
^^^^^^
Z
^^^^^^^
^^^^^^^^

1 - Y
3 - X
1 - Z
7 - W

---

ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqretuvwxyz
^
ABCDEFGHIJKLMNOPQRSTUVWXYZ  abcdefghijklmnopqretuvwxyz

2 - ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqretuvwxyz
1 - ABCDEFGHIJKLMNOPQRSTUVWXYZ  abcdefghijklmnopqretuvwxyz

---

I like dogs
I like cats
^
^^^
^^
I like turtles
^
^^^
^^

2 - I like dogs
4 - I like cats
3 - I like turtles


답변

CJam, 18

qN/{_'^e=$\;}%$e`p

마틴 덕분에 제거 2 바이트 🙂
온라인 체험

설명:

q         read the input
N/        split into lines
{…}%      transform each line as follows:
  _       make a copy
  '^e=    count '^' characters in the string
  $       copy the corresponding earlier line from the stack
           if 0, it copies the current line again
  \;      discard the current line (from before the copied line)
          * after the loop, all caret lines have been replaced
          * with the original messages they agree with
$         sort the messages
e`        RLE encode
p         pretty print

답변

Pyth, 19 18 바이트

rSu+G@+HG_/H\^.zY8

데모

aditsu, 특히 rle 부분에 대한 비슷한 접근 방식.

rSu+G@+HG_/H\^.zY8
  u           .zY      Reduce over the list input lines, starting with [].
                       G is the working value, H is the next input line.
   +G                  Append to the current value
      +HG              H prependeded to G
     @   _/H\^         Indexed at -(H.count('^')). This is H if no carets are in H,
                       or the appropiate distance from the end of G otherwise.
 S                     Sort
r                 8    Run length encode

답변

자바 스크립트 (ES6), 110 바이트

x=>(r={},l=x.split`
`,l.map((_,i)=>(a=n=>(m=l[n])[0]=="^"?a(n-m.length):r[m]=r[m]+1||1)(i)),JSON.stringify(r))

설명

x=>(
  r={},                   // r = results
  l=x.split`
`,                        // l = array of messages
  l.map((_,i)=>           // check each message
    (a=n=>                // n = index of the message to agree with
      (m=l[n])            // m = message
        [0]=="^"          // if this is a caret message
          ?a(n-m.length)  // agree with the message it points to
          :r[m]=r[m]+1||1 // else add one to this message's agreements
    )(i)
  ),
  JSON.stringify(r)       // return the results as a string
)

테스트

<textarea id="input" rows="7">I like dogs
I like cats
^
^^^
^^
I like turtles
^
^^^
^^</textarea>
<br />
<button onclick='result.textContent=(

x=>(r={},l=x.split`
`,l.map((_,i)=>(a=n=>(m=l[n])[0]=="^"?a(n-m.length):r[m]=r[m]+1||1)(i)),JSON.stringify(r))

)(input.value)'>Go</button>
<pre id="result"></pre>

답변

매스 매 티카, 83 77 바이트

Tally@#[[Range@Length@#-#~StringCount~"^"//.x_:>x[[x]]]]&@StringSplit[#,"
"]&

답변

루비 89

m={}
v={}
i=0
$<.map{|l|(t=l.chop![/\^+/])?v[m[i]=o=m[i-t.size]]+=1:v[m[i]=l]=1;i+=1}
p v

STDIN에서 입력을 받아 결과를 출력하는 프로그램입니다. 변수 v및 변수에있는 메시지 수와 투표 수를 추적 합니다 Hash.

온라인 데모 :


답변

파이썬 2.7 – (122) 114 바이트

def c(s):
 l=s.split('\n');c=len(l);d=[1]*c
 while c:
  c-=1
  if'^'in l[c]:d[c-len(l[c])]+=d[c]
  else:print l[c],d[c]

가장 간단한 솔루션이 있으며 특히 골프는 아닙니다.


답변

파이썬 2.7 96 바이트

l=s.split();b={}
for i in l:_=l.index(i);l[_]=l[_-i.count('^')];b[l[_]]=b.get(l[_],0)+1
print b

설명 : l의 내부 덮어 쓰기, 각 호출은 l[_] = ...가리키는 단어 를 저장하며 사전은 현재 카운트를 초기화하거나 추가하여 결과를 집계하는 데 사용됩니다.b[l[_]]