Statistiques de popularité de Carrot

27

Dans le salon de discussion PPCG le dix - neuvième octet , l'utilisation de carets ^(ou de carottes ) est un moyen d'indiquer que vous êtes d'accord avec l'un des commentaires précédents juste au-dessus du vôtre.

Un caret message se compose uniquement de N ^caractères (où N est un entier positif) et cela signifie un accord avec le Nième message précédent. Donc, un seul ^signifie accord avec le message immédiatement précédent, ^^signifie accord avec le message deux lignes, ^^^signifie accord avec le message trois lignes, et ainsi de suite.

De plus, lorsqu'un message de caret X est en accord (aka pointant vers) un autre message de caret Y, alors X est en accord avec ce avec quoi Y est d'accord. Il peut y avoir plusieurs couches de cela et, en fin de compte, tous les messages de caret indiquent un accord avec un message sans caret.

Par exemple, si une transcription de discussion ressemble à ceci: (un message par ligne)

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]

Ensuite, les lignes 1, 2 et 6 sont des messages non caret et toutes les autres sont des messages caret qui pointent vers des messages non caret:

  • La ligne 3 pointe directement vers la ligne 2.
  • La ligne 4 pointe directement vers la ligne 1.
  • La ligne 5 pointe vers la ligne 3, qui pointe vers la ligne 2.
  • La ligne 7 pointe vers la ligne 6.
  • La ligne 8 pointe vers la ligne 5, qui pointe vers la ligne 3, qui pointe vers la ligne 2.
  • La ligne 9 pointe vers la ligne 7, qui pointe vers la ligne 6.

Ainsi, en incluant les utilisateurs qui ont écrit le message non caret (et en supposant que les gens ne tiennent pas leur propre message), nous pouvons conclure que:

  • 2 personnes d'accord avec I like dogs (lignes 1 et 4.)
  • 4 personnes d'accord avec I like cats (lignes 2, 3, 5 et 8.)
  • 3 personnes d'accord I like turtles(lignes 6, 7 et 9.)

Défi

Écrivez un programme ou une fonction qui accepte une chaîne multiligne similaire à l'exemple ci-dessus où chaque ligne représente un message de discussion, les anciens messages venant en premier.

Chaque ligne aura au moins un caractère et il y aura au moins une ligne. Tous les messages seront soit des messages d'insertion constitués uniquement de ^', soit des messages non accompagnés de lettres et d'espaces ([ a-zA-Z]+ en regex).

Pour chaque message non caret, dans n'importe quel ordre, affichez le nombre de personnes qui sont d'accord avec lui dans un format clair contenant le texte du message, par exemple

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}

Vous pouvez supposer que:

  • Les gens sont toujours d'accord avec leurs propres messages et ne se soucient pas d'eux-mêmes.
  • Il n'y a pas deux messages non-caret identiques.
  • Les messages circonflexes n'indiqueront rien avant le premier message.
  • Les lignes ne contiendront pas d'espaces de début ou de fin.

Le code le plus court en octets gagne.

Cas de test

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
Loisirs de Calvin
la source
Connexes .
Addison Crump
4
L'année prochaine, nous pouvons résoudre ce problème avec unicode: blog.unicode.org/2015/05/unicode-90-candidate-emoji.html # 1F955 carotte
Robert Fraser
👆 @RobertFraser
DDPWNAGE

Réponses:

11

CJam, 18 ans

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

2 octets éliminés grâce à Martin :)
Essayez-le en ligne

Explication:

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
la source
8

Pyth, 19 18 octets

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

Manifestation

Une approche similaire à l'aditsu, en particulier la partie 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
la source
4

JavaScript (ES6), 110 octets

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

Explication

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
)

Tester

user81655
la source
2

Mathematica, 83 77 octets

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

Rubis 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

Il s'agit d'un programme qui obtient l'entrée de STDIN et imprime le résultat. Il garde une trace des messages et de leur nombre de votes dans la variable v, qui est unHash .

Démos en ligne:

Cristian Lupascu
la source
2

Python 2,7 - 122 114 octets

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]

À peu près la solution la plus simple qui existe, et pas particulièrement au golf.

quintopie
la source
1

Python 2.7 96 octets

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

explication: écrasement sur place de l, chaque appel de l[_] = ...stocke le mot pointé et un dictionnaire est utilisé pour comptabiliser les résultats en initialisant ou en ajoutant au nombre actuel deb[l[_]]

eqzx
la source
Vous pourriez probablement raser quelques octets avec for _,i in enumerate(l):.
Mego