Karottenpopulationsstatistik

27

Im PPCG- Chatroom zeigt das Neunzehnte Byte mithilfe von Karotten ^(oder Karotten ) an, dass Sie mit einem der zuvor über Ihrem Kommentar abgegebenen Kommentare einverstanden sind.

Eine Caret-Nachricht besteht ausschließlich aus N ^Zeichen (wobei N eine positive Ganzzahl ist) und bedeutet Übereinstimmung mit der N-ten vorherigen Nachricht. Ein einzelnes ^bedeutet also Übereinstimmung mit der unmittelbar vorhergehenden Nachricht, ^^Übereinstimmung mit der Nachricht in zwei Zeilen, ^^^Übereinstimmung mit der Nachricht in drei Zeilen und so weiter.

Wenn eine Caret-Nachricht X mit einer anderen Caret-Nachricht Y übereinstimmt (oder auf diese zeigt), dann heißt es, dass X mit dem übereinstimmt, womit Y übereinstimmt. Es kann mehrere Schichten davon geben, und am Ende zeigen alle Caret-Nachrichten eine Übereinstimmung mit einer Nicht-Caret-Nachricht an.

Wenn ein Chat-Protokoll beispielsweise wie folgt aussieht: (eine Nachricht pro Zeile)

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]

Dann sind die Zeilen 1, 2 und 6 Nicht-Caret-Nachrichten und alle anderen Caret-Nachrichten, die auf Nicht-Caret-Nachrichten verweisen:

  • Linie 3 zeigt direkt auf Linie 2.
  • Linie 4 zeigt direkt auf Linie 1.
  • Linie 5 zeigt auf Linie 3, die auf Linie 2 zeigt.
  • Linie 7 zeigt auf Linie 6.
  • Linie 8 zeigt auf Linie 5, die auf Linie 3 zeigt, die auf Linie 2 zeigt.
  • Die Linie 9 zeigt auf die Linie 7, die auf die Linie 6 zeigt.

Daher können wir unter Einbeziehung der Benutzer, die die Nicht-Caret-Nachricht geschrieben haben (und unter der Annahme, dass die Leute ihre eigene Nachricht nicht pflegen), zu folgendem Schluss kommen:

  • 2 Personen stimmen zu I like dogs(Linien 1 und 4)
  • 4 Personen stimmen zu I like cats(Zeilen 2, 3, 5 und 8.)
  • 3 Personen stimmen zu I like turtles(Zeilen 6, 7 und 9.)

Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die eine mehrzeilige Zeichenfolge ähnlich dem obigen Beispiel enthält, wobei jede Zeile eine Chat-Nachricht darstellt, wobei ältere Nachrichten an erster Stelle stehen.

Jede Zeile hat mindestens ein Zeichen und es gibt mindestens eine Zeile. Alle Nachrichten sind entweder Caret-Nachrichten, die nur aus ^'s bestehen, oder Nicht-Caret-Nachrichten, die aus Buchstaben und Leerzeichen bestehen ( [ a-zA-Z]+in Regex).

Geben Sie für jede Nicht-Caret-Nachricht in beliebiger Reihenfolge die Anzahl der Personen, die damit einverstanden sind, in einem eindeutigen Format aus, das den Nachrichtentext enthält, z

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

oder

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

oder

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

Sie können davon ausgehen, dass:

  • Menschen stimmen immer mit ihren eigenen Botschaften überein und kümmern sich nicht um sich selbst.
  • Keine zwei Nicht-Caret-Nachrichten sind identisch.
  • Caret-Nachrichten zeigen nicht auf Dinge vor der ersten Nachricht.
  • Zeilen enthalten keine führenden oder nachfolgenden Leerzeichen.

Der kürzeste Code in Bytes gewinnt.

Testfälle

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
Calvins Hobbys
quelle
Verwandte .
Addison Crump
4
Nächstes Jahr können wir dieses Problem mit Unicode lösen: blog.unicode.org/2015/05/unicode-90-candidate-emoji.html # 1F955 carrot
Robert Fraser
@RobertFraser
DDPWNAGE

Antworten:

11

CJam, 18

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

2 Bytes entfernt dank Martin :)
Probieren Sie es online

Erläuterung:

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

Pyth, 19 18 Bytes

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

Demonstration

Eine ähnliche Herangehensweise an Aditsu, insbesondere den Rle-Teil.

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
quelle
4

JavaScript (ES6), 110 Byte

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

Erläuterung

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
)

Prüfung

user81655
quelle
2

Mathematica, 83.77 Bytes

Tally@#[[Range@Length@#-#~StringCount~"^"//.x_:>x[[x]]]]&@StringSplit[#,"
"]&
Alephalpha
quelle
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

Dieses Programm wird von STDIN eingegeben und gibt das Ergebnis aus. Es verfolgt die Nachrichten und deren Stimmenzahl in der Variablen v, bei der es sich um eine handelt Hash.

Online-Demos:

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

Ziemlich genau die einfachste Lösung, die es gibt, und nicht besonders golfen.

Quintopie
quelle
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

Erklärung: In-Place-Überschreiben von l, jeder Aufruf von l[_] = ...speichert das Wort, auf das verwiesen wird, und ein Wörterbuch wird verwendet, um die Ergebnisse zu zählen, indem die aktuelle Anzahl von initialisiert oder addiert wirdb[l[_]]

eqzx
quelle
Sie könnten wahrscheinlich einige Bytes mit rasieren for _,i in enumerate(l):.
Mego