Statistik Popularitas Wortel

27

Di chatroom PPCG , Byte Kesembilan Belas , menggunakan tanda sisipan ^(atau wortel ) adalah cara untuk menunjukkan bahwa Anda setuju dengan salah satu komentar yang dibuat sebelumnya tepat di atas Anda.

Pesan caret hanya terdiri dari ^karakter N (di mana N adalah bilangan bulat positif) dan itu berarti persetujuan dengan pesan Nth sebelumnya. Jadi satu ^berarti persetujuan dengan pesan sebelumnya, ^^berarti persetujuan dengan pesan dua baris ke atas, ^^^berarti persetujuan dengan pesan tiga baris ke atas, dan seterusnya.

Selain itu, ketika pesan tanda X dalam persetujuan (alias menunjuk ke arah) pesan tanda tanda Y lain, maka X dikatakan sesuai dengan apa yang Y setuju. Mungkin ada beberapa lapisan ini dan, pada akhirnya, semua pesan caret menunjukkan persetujuan dengan satu pesan non-caret.

Misalnya, jika transkrip obrolan terlihat seperti ini: (satu pesan per baris)

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]

Maka baris 1, 2, dan 6 adalah pesan non-caret dan yang lainnya adalah pesan caret yang mengarah ke pesan non-caret:

  • Jalur 3 menunjuk langsung ke jalur 2.
  • Jalur 4 poin langsung ke jalur 1.
  • Baris 5 poin ke baris 3, yang menunjuk ke baris 2.
  • Jalur 7 poin ke baris 6.
  • Baris 8 menunjuk ke baris 5, yang menunjuk ke baris 3, yang menunjuk ke baris 2.
  • Jalur 9 poin ke baris 7, yang menunjuk ke baris 6.

Dengan demikian, termasuk pengguna yang menulis pesan non-caret (dan dengan asumsi orang tidak peduli pesan mereka sendiri) kita dapat menyimpulkan bahwa:

  • 2 orang setuju dengan I like dogs(Baris 1 dan 4.)
  • 4 orang setuju dengan I like cats(Baris 2, 3, 5, dan 8.)
  • 3 orang setuju dengan I like turtles(Baris 6, 7, dan 9.)

Tantangan

Tulis program atau fungsi yang menggunakan string multiline mirip dengan contoh di atas di mana setiap baris mewakili pesan obrolan, dengan pesan yang lebih tua datang terlebih dahulu.

Setiap baris akan memiliki setidaknya satu karakter dan akan ada setidaknya satu baris. Semua pesan akan berupa pesan caret yang hanya terdiri dari pesan-pesan ^itu, atau menjadi pesan-pesan non-caret yang terdiri dari huruf dan spasi ( [ a-zA-Z]+dalam regex).

Untuk setiap pesan non-caret, dalam urutan apa pun, output jumlah orang yang setuju dengannya dalam beberapa format yang jelas yang berisi teks pesan, misalnya

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

atau

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

atau

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

Anda dapat mengasumsikan bahwa:

  • Orang-orang selalu setuju dengan pesan mereka sendiri dan tidak peduli pada diri mereka sendiri.
  • Tidak ada dua pesan non-caret yang identik.
  • Pesan caret tidak akan menunjuk ke hal-hal sebelum pesan pertama.
  • Garis tidak akan berisi ruang depan atau belakang.

Kode terpendek dalam byte menang.

Uji Kasus

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
Hobi Calvin
sumber
Terkait .
Addison Crump
4
Tahun depan, kita dapat menyelesaikan masalah ini dengan unicode: blog.unicode.org/2015/05/unicode-90-candidate-emoji.html # 1F955 wortel
Robert Fraser
👆 @RobertFraser
DDPWNAGE

Jawaban:

11

CJam, 18

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

2 byte dihilangkan berkat Martin :)
Cobalah online

Penjelasan:

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

Pyth, 19 18 byte

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

Demonstrasi

Pendekatan yang mirip dengan aditsu, terutama bagian.

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

Penjelasan

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
)

Uji

pengguna81655
sumber
2

Mathematica, 83 77 byte

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

Ini adalah program yang mendapat input dari STDIN dan mencetak hasilnya. Itu melacak pesan dan suara mereka dihitung dalam variabel v, yaitu a Hash.

Demo online:

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

Cukup banyak solusi paling mudah yang ada, dan tidak terlalu golf.

kuintopia
sumber
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

Penjelasan: ditimpa di tempat l, setiap panggilan l[_] = ...toko kata menunjuk ke, dan kamus digunakan untuk menghitung hasil dengan menginisialisasi atau menambahkan ke hitungan saat ini darib[l[_]]

eqzx
sumber
Anda mungkin dapat mencukur beberapa byte dengan for _,i in enumerate(l):.
Mego