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
Odpowiedzi:
CJam, 18 lat
2 bajty wyeliminowane dzięki Martinowi :)
Wypróbuj online
Wyjaśnienie:
źródło
Pyth,
1918 bajtówDemonstracja
Podobne podejście do aditsu, zwłaszcza części rle.
źródło
JavaScript (ES6), 110 bajtów
Wyjaśnienie
Test
Pokaż fragment kodu
źródło
Mathematica,
8377 bajtówźródło
Ruby 89
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 aHash
.Dema online:
źródło
Python 2.7 -
122114 bajtówPrawie najprostsze rozwiązanie, jakie istnieje, i nie jest szczególnie golfem.
źródło
Python 2.7 96 bajtów
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[_]]
źródło
for _,i in enumerate(l):
.