Estatísticas de popularidade de cenoura

27

Na sala de bate-papo do PPCG, o décimo nono byte , usar circunflexos ^(ou cenouras ) é uma maneira de indicar que você concorda com um dos comentários feitos anteriormente, logo acima dos seus.

Uma mensagem de ^sinal de intercalação consiste apenas em N caracteres (onde N é um número inteiro positivo) e significa concordância com a enésima mensagem anterior. Portanto, um único ^significa acordo com a mensagem imediatamente anterior, ^^significa acordo com a mensagem duas linhas acima, ^^^significa acordo com a mensagem três linhas acima e assim por diante.

Além disso, quando uma mensagem de interpolação X está de acordo (também apontando para) outra mensagem de interpolação Y, então diz-se que X está de acordo com o que Y está de acordo. Pode haver várias camadas disso e, no final, todas as mensagens de sinal de intercalação indicam concordância com uma mensagem que não é de intercalação.

Por exemplo, se uma transcrição de bate-papo estiver assim: (uma mensagem por linha)

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]

Em seguida, as linhas 1, 2 e 6 são mensagens que não são de sinal de intercalação e todas as outras são mensagens de sinal de intercalação que apontam para mensagens de não intercalação:

  • A linha 3 aponta diretamente para a linha 2.
  • A linha 4 aponta diretamente para a linha 1.
  • A linha 5 aponta para a linha 3, que aponta para a linha 2.
  • Linha 7 pontos para a linha 6.
  • A linha 8 aponta para a linha 5, que aponta para a linha 3, que aponta para a linha 2.
  • A linha 9 aponta para a linha 7, que aponta para a linha 6.

Assim, incluindo os usuários que escreveram a mensagem que não seja de sinal de intercalação (e assumindo que as pessoas não se importam com sua própria mensagem), podemos concluir que:

  • 2 pessoas concordam com I like dogs(Linhas 1 e 4.)
  • 4 pessoas concordam com I like cats(Linhas 2, 3, 5 e 8.)
  • 3 pessoas concordam com I like turtles(Linhas 6, 7 e 9.)

Desafio

Escreva um programa ou função que utilize uma sequência de linhas múltiplas semelhante ao exemplo acima, onde cada linha representa uma mensagem de bate-papo, com as mensagens mais antigas em primeiro lugar.

Cada linha terá pelo menos um caractere e haverá pelo menos uma linha. Todas as mensagens serão mensagens de interpolação consistindo apenas de ^'s ou mensagens de interpolação consistindo de letras e espaços ( [ a-zA-Z]+em regex).

Para cada mensagem que não seja sinal de intercalação, em qualquer ordem, imprima o número de pessoas que concordam com ela em algum formato claro que contenha o texto da mensagem, por exemplo

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

ou

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

ou

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

Você pode assumir que:

  • As pessoas sempre concordam com suas próprias mensagens e não se importam.
  • Não há duas mensagens que não sejam de sinal de intercalação são idênticas.
  • As mensagens de sinal de intercalação não apontam para coisas antes da primeira mensagem.
  • As linhas não conterão espaços à esquerda ou à direita.

O código mais curto em bytes vence.

Casos de teste

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
Passatempos de Calvin
fonte
Relacionado .
Addison Crump
4
No próximo ano, podemos resolver este problema com unicode: blog.unicode.org/2015/05/unicode-90-candidate-emoji.html # 1F955 cenoura
Robert Fraser
@RobertFraser
DDPWNAGE

Respostas:

11

CJam, 18

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

2 bytes eliminados graças a Martin :)
Experimente online

Explicação:

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
aditsu
fonte
8

Pitão, 19 18 bytes

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

Demonstração

Uma abordagem semelhante ao aditsu, especialmente a parte principal.

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
isaacg
fonte
4

JavaScript (ES6), 110 bytes

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))

Explicação

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
)

Teste

user81655
fonte
2

Mathematica, 83 77 bytes

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

Ruby 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

Este é um programa que obtém informações do STDIN e imprime o resultado. Ele controla as mensagens e sua contagem de votos na variável v, que é umHash .

Demos online:

Cristian Lupascu
fonte
2

Python 2.7 - 122 114 bytes

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]

Praticamente a solução mais direta que existe, e não particularmente jogada no golfe.

quintopia
fonte
1

Python 2.7 96 bytes

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

explicação: substituição no local de l, cada chamada de l[_] = ...armazena a palavra apontada e um dicionário é usado para contabilizar os resultados inicializando ou adicionando à contagem atual deb[l[_]]

eqzx
fonte
Você provavelmente poderia cortar alguns bytes com for _,i in enumerate(l):.
Mego