Statystyki popularności marchwi

27

W PPCG pokoju z XIX Byte , przy użyciu jest kursor ^(lub marchewki ) to sposób wskazujący, że zgadzasz się z jednym z wcześniej wykonanych komentarzach tuż nad twoim.

Wiadomość karetka składa się wyłącznie z N ^znaków (gdzie N jest dodatnią liczbą całkowitą) i oznacza zgodę na N-tą poprzednią wiadomość. Tak więc pojedynczy ^oznacza zgodę na wiadomość bezpośrednio poprzedzającą, ^^oznacza zgodę na wiadomość dwa wiersze w górę, ^^^oznacza zgodę na wiadomość trzy linie w górę i tak dalej.

Dodatkowo, gdy komunikat karetki X zgadza się (inaczej zwany w kierunku) innego komunikatu karetki Y, wtedy mówi się, że X zgadza się z tym, z czym Y się zgadza. Może być ich wiele warstw, a na koniec wszystkie komunikaty doraźne wskazują na zgodę na jeden komunikat nietradycyjny.

Na przykład, jeśli zapis rozmowy na czacie wygląda następująco: (jedna wiadomość na wiersz)

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]

Następnie wiersze 1, 2 i 6 są wiadomościami bezobsługowymi, a wszystkie pozostałe są wiadomościami bezobsługowymi, które wskazują na wiadomości bezobsługowe:

  • Linia 3 wskazuje bezpośrednio na linię 2.
  • Linia 4 wskazuje bezpośrednio na linię 1.
  • Linia 5 wskazuje na linię 3, która wskazuje na linię 2.
  • Linia 7 wskazuje na linię 6.
  • Linia 8 wskazuje na linię 5, która wskazuje na linię 3, która wskazuje na linię 2.
  • Linia 9 wskazuje na linię 7, która wskazuje na linię 6.

Tak więc, włączając użytkowników, którzy napisali wiadomość bez opieki (i zakładając, że ludzie nie dbają o swoją wiadomość), możemy stwierdzić, że:

  • 2 osoby zgadzają się z I like dogs(linie 1 i 4)
  • 4 osoby zgadzają się z I like cats(Linie 2, 3, 5 i 8)
  • 3 osoby zgadzają się z I like turtles(linie 6, 7 i 9)

Wyzwanie

Napisz program lub funkcję, która pobiera ciąg wielowierszowy podobny do powyższego przykładu, w którym każda linia reprezentuje wiadomość czatu, a starsze wiadomości są pierwsze.

Każda linia będzie miała co najmniej jeden znak i będzie co najmniej jedna linia. Wszystkie wiadomości będą albo wiadomościami typu „daszek” składającymi się wyłącznie z ^„s”, albo wiadomościami typu „daszek” składającymi się z liter i spacji ( [ a-zA-Z]+wyrażenia regularne).

Dla każdej wiadomości bez znaku, w dowolnej kolejności, wypisz liczbę osób, które się z nią zgadzają, w czytelnym formacie, który zawiera tekst wiadomości, np.

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

lub

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

lub

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

Możesz założyć, że:

  • Ludzie zawsze zgadzają się z własnymi przesłaniami i nie dbają o siebie.
  • Nie ma dwóch identycznych komunikatów.
  • Wiadomości z daszkiem nie będą wskazywać na rzeczy przed pierwszą wiadomością.
  • Linie nie będą zawierać spacji wiodących ani końcowych.

Najkrótszy kod w bajtach wygrywa.

Przypadki testowe

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
Hobby Calvina
źródło
Związane .
Addison Crump
4
W przyszłym roku możemy rozwiązać ten problem za pomocą Unicode: blog.unicode.org/2015/05/unicode-90-candidate-emoji.html # 1F955 marchewka
Robert Fraser
R @RobertFraser
DDPWNAGE

Odpowiedzi:

11

CJam, 18 lat

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

2 bajty wyeliminowane dzięki Martinowi :)
Wypróbuj online

Wyjaśnienie:

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
źródło
8

Pyth, 19 18 bajtów

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

Demonstracja

Podobne podejście do aditsu, zwłaszcza części 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
źródło
4

JavaScript (ES6), 110 bajtów

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

Wyjaśnienie

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
)

Test

użytkownik 81655
źródło
2

Mathematica, 83 77 bajtów

Tally@#[[Range@Length@#-#~StringCount~"^"//.x_:>x[[x]]]]&@StringSplit[#,"
"]&
alephalpha
źródło
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

Jest to program, który pobiera dane ze STDIN i drukuje wynik. Śledzi wiadomości, a ich głos liczy się w zmiennej v, która jest a Hash.

Dema online:

Cristian Lupascu
źródło
2

Python 2.7 - 122 114 bajtów

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]

Prawie najprostsze rozwiązanie, jakie istnieje, i nie jest szczególnie golfem.

kwintopia
źródło
1

Python 2.7 96 bajtów

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

wyjaśnienie: nadpisywanie w miejscu l, każde wywołanie l[_] = ...sklepów wskazuje wskazane słowo, a słownik służy do zsumowania wyników poprzez zainicjowanie lub dodanie do bieżącej liczbyb[l[_]]

eqzx
źródło
Prawdopodobnie możesz wygolić kilka bajtów for _,i in enumerate(l):.
Mego,