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
Respostas:
CJam, 18
2 bytes eliminados graças a Martin :)
Experimente online
Explicação:
fonte
Pitão,
1918 bytesDemonstração
Uma abordagem semelhante ao aditsu, especialmente a parte principal.
fonte
JavaScript (ES6), 110 bytes
Explicação
Teste
Mostrar snippet de código
fonte
Mathematica,
8377 bytesfonte
Ruby 89
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:
fonte
Python 2.7 -
122114 bytesPraticamente a solução mais direta que existe, e não particularmente jogada no golfe.
fonte
Python 2.7 96 bytes
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[_]]
fonte
for _,i in enumerate(l):
.