Statistiche sulla popolarità delle carote


27

Nella chatroom di PPCG il diciannovesimo byte , usando i punti di inserimento ^(o le carote ) è un modo per indicare che sei d'accordo con uno dei commenti precedentemente fatti appena sopra il tuo.

Un messaggio di inserimento è composto esclusivamente da N ^caratteri (dove N è un numero intero positivo) e significa accordo con l'ennesimo messaggio precedente. Quindi un singolo ^significa accordo con il messaggio immediatamente precedente, ^^significa accordo con il messaggio due righe, ^^^significa accordo con il messaggio tre righe e così via.

Inoltre, quando un messaggio di caret X è in accordo (noto anche come verso) un altro messaggio di caret Y, allora si dice che X sia in accordo con ciò che Y è in accordo. Potrebbero esserci più livelli di questo e, alla fine, tutti i messaggi con il cursore indicano un accordo con un messaggio senza il cursore.

Ad esempio, se una trascrizione della chat è simile alla seguente: (un messaggio per riga)

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]

Quindi le righe 1, 2 e 6 sono messaggi non trattati e tutti gli altri sono messaggi trattati che puntano a messaggi non trattati:

  • La linea 3 punta direttamente alla linea 2.
  • La linea 4 punta direttamente alla linea 1.
  • La linea 5 punta alla linea 3, che punta alla linea 2.
  • La linea 7 punta alla linea 6.
  • La linea 8 punta alla linea 5, che punta alla linea 3, che punta alla linea 2.
  • La linea 9 punta alla linea 7, che punta alla linea 6.

Pertanto, includendo gli utenti che hanno scritto il messaggio non trascinato (e presumendo che le persone non si prendano cura del proprio messaggio) possiamo concludere che:

  • 2 persone sono d'accordo con I like dogs(Linee 1 e 4.)
  • 4 persone sono d'accordo con I like cats(Linee 2, 3, 5 e 8.)
  • 3 persone sono d'accordo con I like turtles(Linee 6, 7 e 9.)

Sfida

Scrivi un programma o una funzione che includa una stringa multilinea simile all'esempio sopra in cui ogni riga rappresenta un messaggio di chat, con i messaggi più vecchi che arrivano per primi.

Ogni riga avrà almeno un carattere e ci sarà almeno una riga. Tutti i messaggi saranno o messaggi di scorrimento composti esclusivamente da ^"s", oppure messaggi di non inserimento con lettere e spazi ( [ a-zA-Z]+in regex).

Per ogni messaggio non trascinato, in qualsiasi ordine, visualizza il numero di persone che lo concordano in un formato chiaro che contiene il testo del messaggio, ad es.

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}

Puoi presumere che:

  • Le persone sono sempre d'accordo con i propri messaggi e non si curano da sole.
  • Non ci sono due messaggi non trascinati identici.
  • I messaggi con il cursore non indicano le cose prima del primo messaggio.
  • Le linee non conterranno spazi iniziali o finali.

Vince il codice più breve in byte.

Casi 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


4
Il prossimo anno, possiamo risolvere questo problema con unicode: blog.unicode.org/2015/05/unicode-90-candidate-emoji.html # 1F955 carota
Robert Fraser,

👆 @RobertFraser
DDPWNAGE

Risposte:


11

CJam, 18 anni

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

2 byte eliminati grazie a Martin :)
Provalo online

Spiegazione:

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

8

Pyth, 19 18 byte

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

Dimostrazione

Un approccio simile ad aditsu, in particolare la parte reale.

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

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

Spiegazione

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


2

Mathematica, 83 77 byte

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


2

Python 2.7 - 122 114 byte

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]

Praticamente la soluzione più semplice che ci sia, e non particolarmente giocata a golf.


1

Python 2.7 96 byte

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

spiegazione: sovrascrittura sul posto di l, ogni chiamata di l[_] = ...negozi a cui punta la parola e un dizionario viene utilizzato per calcolare i risultati inizializzando o aggiungendo al conteggio corrente dib[l[_]]


Probabilmente potresti radere alcuni byte con for _,i in enumerate(l):.
Mego
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.