胡萝卜人气统计


27

PPCG聊天室的第十九个字节中,使用脱字号^(或红萝卜)是一种表示您同意之前发表的评论的一种方式。

脱字符号消息仅由N个^字符组成(其中N为正整数),表示与第N个先前的消息一致。因此,单个^表示与之前的消息^^一致,表示与消息两个^^^一致,表示与消息三个一致,依此类推。

另外,当插入符号消息X同意(又指向)另一个插入符号消息Y时,则称X与Y同意的消息相同。可能有多个层次,最后,所有插入符号消息都表示与一个非插入符号消息一致。

例如,如果聊天记录如下:(每行一条消息)

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]

然后,第1、2和6行是非插入符号消息,所有其他都是指向非插入符号消息的插入符号消息:

  • 第3行直接指向第2行。
  • 第4行直接指向第1行。
  • 第5行指向第3行,第3行指向第2行。
  • 第7行指向第6行。
  • 第8行指向第5行,第5行指向第3行,第3行指向第2行。
  • 第9行指向第7行,而第7行指向第6行。

因此,包括编写非插入符号消息的用户(并假设人们不插入自己的消息),我们可以得出以下结论:

  • 2个人同意I like dogs(第1行和第4行)。
  • 4个人同意I like cats(第2、3、5和8行)
  • 3个人同意I like turtles(第6、7和9行)。

挑战

编写一个包含多行字符串的程序或函数,类似于上面的示例,其中每行代表一个聊天消息,旧消息优先。

每行至少要有一个字符,并且至少要有一行。所有消息要么是仅由组成的插入号消息^,要么是由字母和空格组成的非插入号消息([ a-zA-Z]+在正则表达式中)。

对于每条非脱字符消息,以任何顺序,以包含消息文本的清晰格式输出同意该消息的人数。

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

要么

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

要么

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

您可以假设:

  • 人们总是同意他们自己的信息,而不是在意自己。
  • 没有两个非脱字符消息是相同的。
  • 插入符号消息不会指向第一个消息之前的内容。
  • 行将不包含前导或尾随空格。

以字节为单位的最短代码获胜。

测试用例

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
明年,我们可以解决这个问题可能有unicode:blog.unicode.org/2015/05/unicode-90-candidate-emoji.html#1F955胡萝卜
罗伯特·弗雷泽

👆@RobertFraser
DDPWNAGE 2015年

Answers:


11

18岁的CJam

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

感谢Martin消除了2个字节:)
在线尝试

说明:

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字节

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

示范

与aditsu类似的方法,尤其是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

4

JavaScript(ES6),110个字节

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

说明

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
)

测试


2

Mathematica,83 77字节

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


2

蟒2.7 - 122个 114字节

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]

几乎是最简单的解决方案,并不是特别适合打高尔夫球。


1

Python 2.7 96字节

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

说明:对l进行就地覆盖,每次调用都l[_] = ...存储指向的单词,并使用字典通过初始化或添加到的当前计数来计算结果b[l[_]]


您可能可以使用删除一些字节for _,i in enumerate(l):
Mego 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.