Estadísticas de popularidad de zanahoria

27

En la sala de chat de PPCG, el decimonoveno byte , el uso de puntos de atención ^(o zanahorias ) es una forma de indicar que está de acuerdo con uno de los comentarios realizados anteriormente, justo encima del suyo.

Un mensaje de intercalación consta únicamente de N ^caracteres (donde N es un entero positivo) y significa estar de acuerdo con el enésimo mensaje anterior. Entonces, un solo ^significa acuerdo con el mensaje inmediatamente anterior, ^^significa acuerdo con el mensaje dos líneas arriba, ^^^significa acuerdo con el mensaje tres líneas arriba, y así sucesivamente.

Además, cuando un mensaje de intercalación X está de acuerdo (es decir, apuntando hacia) otro mensaje de intercalación Y, entonces se dice que X está de acuerdo con lo que Y está de acuerdo. Puede haber varias capas de esto y, al final, todos los mensajes de caret indican acuerdo con un mensaje de no caret.

Por ejemplo, si una transcripción de chat tiene este aspecto: (un mensaje por línea)

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]

Luego, las líneas 1, 2 y 6 son mensajes sin caret y todos los demás son mensajes con caret que apuntan a mensajes sin caret:

  • La línea 3 apunta directamente a la línea 2.
  • La línea 4 apunta directamente a la línea 1.
  • La línea 5 apunta a la línea 3, que apunta a la línea 2.
  • La línea 7 apunta a la línea 6.
  • La línea 8 apunta a la línea 5, que apunta a la línea 3, que apunta a la línea 2.
  • La línea 9 apunta a la línea 7, que apunta a la línea 6.

Por lo tanto, incluyendo a los usuarios que escribieron el mensaje de no preocupación (y suponiendo que las personas no cuiden su propio mensaje) podemos concluir que:

  • 2 personas están de acuerdo con I like dogs(Líneas 1 y 4.)
  • 4 personas están de acuerdo con I like cats(Líneas 2, 3, 5 y 8.)
  • 3 personas están de acuerdo con I like turtles(Líneas 6, 7 y 9.)

Reto

Escriba un programa o función que tome una cadena multilínea similar al ejemplo anterior donde cada línea representa un mensaje de chat, con los mensajes más antiguos primero.

Cada línea tendrá al menos un carácter y habrá al menos una línea. Todos los mensajes serán mensajes intercalados que consisten únicamente en ^'s, o serán mensajes no intercalados que consisten en letras y espacios ( [ a-zA-Z]+en expresiones regulares).

Para cada mensaje que no sea de intercalación, en cualquier orden, envíe el número de personas que están de acuerdo con él en un formato claro que contenga el texto del mensaje, p. Ej.

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

o

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

o

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

Puedes asumir que:

  • Las personas siempre están de acuerdo con sus propios mensajes y no se preocupan por sí mismas.
  • No hay dos mensajes que no sean de cuidado son idénticos.
  • Los mensajes Caret no señalarán cosas antes del primer mensaje.
  • Las líneas no contendrán espacios iniciales o finales.

El código más corto en bytes gana.

Casos de prueba

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
Pasatiempos de Calvin
fuente
Relacionados .
Addison Crump
44
El año que viene, podemos resolver este problema con Unicode: blog.unicode.org/2015/05/unicode-90-candidate-emoji.html # 1F955 zanahoria
Robert Fraser
👆 @RobertFraser
DDPWNAGE

Respuestas:

11

CJam, 18

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

2 bytes eliminados gracias a Martin :)
Pruébelo en línea

Explicación:

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
fuente
8

Pyth, 19 18 bytes

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

Demostración

Un enfoque similar al aditsu, especialmente la parte 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
isaacg
fuente
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))

Explicación

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
)

Prueba

usuario81655
fuente
2

Mathematica, 83 77 bytes

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

Rubí 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 es un programa que recibe información de STDIN e imprime el resultado. Realiza un seguimiento de los mensajes y sus recuentos de votos en la variable v, que es a Hash.

Demos en línea:

Cristian Lupascu
fuente
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]

Prácticamente la solución más sencilla que existe, y no particularmente golf.

quintapia
fuente
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

explicación: sobrescribir in situ de l, cada llamada de l[_] = ...almacena la palabra apuntada, y se usa un diccionario para contar los resultados al inicializar o agregar al conteo actual deb[l[_]]

eqzx
fuente
Probablemente podría eliminar algunos bytes con for _,i in enumerate(l):.
Mego