Thống kê phổ biến cà rốt


27

Trong phòng chat PPCG , Byte thứ mười chín , sử dụng dấu mũ ^(hoặc cà rốt ) là một cách chỉ ra rằng bạn đồng ý với một trong những nhận xét được đưa ra trước đó ngay trên bạn.

Một tin nhắn caret chỉ bao gồm N ^ký tự (trong đó N là số nguyên dương) và nó có nghĩa là thỏa thuận với tin nhắn thứ N trước đó. Vì vậy, một ^thỏa thuận có nghĩa là thỏa thuận với tin nhắn ngay trước đó, ^^có nghĩa là thỏa thuận với tin nhắn hai dòng lên, ^^^có nghĩa là thỏa thuận với tin nhắn ba dòng, v.v.

Ngoài ra, khi một tin nhắn dấu mũ X được thỏa thuận (còn gọi là hướng tới) một tin nhắn dấu mũ khác Y, thì X được cho là đồng ý với những gì Y đồng ý. Có thể có nhiều lớp của điều này và cuối cùng, tất cả các tin nhắn caret đều thể hiện sự đồng ý với một tin nhắn không quan tâm.

Ví dụ: nếu bản ghi trò chuyện trông như thế này: (một tin nhắn trên mỗi dòng)

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]

Sau đó, các dòng 1, 2 và 6 là các tin nhắn không có dấu mũ và tất cả các tin nhắn khác là các tin nhắn được chăm sóc chỉ đến các tin nhắn không quan tâm:

  • Dòng 3 điểm trực tiếp đến dòng 2.
  • Dòng 4 điểm trực tiếp đến dòng 1.
  • Dòng 5 điểm đến dòng 3, điểm này đến dòng 2.
  • Dòng 7 điểm đến dòng 6.
  • Dòng 8 điểm đến dòng 5, điểm này đến dòng 3, điểm này chỉ đến dòng 2.
  • Dòng 9 điểm đến dòng 7, điểm này đến dòng 6.

Do đó, bao gồm cả những người dùng đã viết tin nhắn không quan tâm (và giả sử mọi người không quan tâm đến tin nhắn của họ), chúng tôi có thể kết luận rằng:

  • 2 người đồng ý với I like dogs(Dòng 1 và 4.)
  • 4 người đồng ý với I like cats(Dòng 2, 3, 5 và 8.)
  • 3 người đồng ý với I like turtles(Dòng 6, 7 và 9.)

Thử thách

Viết chương trình hoặc hàm lấy một chuỗi nhiều dòng tương tự như ví dụ ở trên, nơi mỗi dòng đại diện cho một tin nhắn trò chuyện, với các tin nhắn cũ hơn xuất hiện trước.

Mỗi dòng sẽ có ít nhất một ký tự và sẽ có ít nhất một dòng. Tất cả các tin nhắn sẽ là các tin nhắn được chăm sóc chỉ bao gồm các tin nhắn ^hoặc là các tin nhắn không được chăm sóc bao gồm các chữ cái và dấu cách ( [ a-zA-Z]+trong biểu thức chính quy).

Đối với mọi tin nhắn không quan tâm, theo bất kỳ thứ tự nào, hãy xuất số lượng người đồng ý với nó ở một số định dạng rõ ràng có chứa văn bản tin nhắn, ví dụ:

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

hoặc là

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

hoặc là

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

Bạn có thể cho rằng:

  • Mọi người luôn đồng ý với các thông điệp của riêng họ và không tự chăm sóc bản thân.
  • Không có hai tin nhắn không quan tâm là giống hệt nhau.
  • Tin nhắn quan tâm sẽ không chỉ đến những điều trước tin nhắn đầu tiên.
  • Các dòng sẽ không chứa khoảng trắng hàng đầu hoặc dấu.

Mã ngắn nhất tính bằng byte thắng.

Các trường hợp thử nghiệm

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
Năm tới, chúng ta có thể giải quyết vấn đề này bằng unicode: blog.unicode.org/2015/05/unicode-90-candidate-emoji.html # 1F955 cà rốt
Robert Fraser

@RobertFraser
DDPWNAGE

Câu trả lời:


11

CJam, 18

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

2 byte đã bị loại bỏ nhờ Martin :)
Hãy thử trực tuyến

Giải trình:

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

Trình diễn

Một cách tiếp cận tương tự với aditsu, đặc biệt là phần 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 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))

Giải trình

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
)

Kiểm tra


2

Toán học, 83 77 byte

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

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

Đây là một chương trình nhận đầu vào từ STDIN và in ra kết quả. Nó theo dõi các thông điệp và số phiếu bầu của họ trong biến v, đó là a Hash.

Bản demo trực tuyến:


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]

Khá nhiều giải pháp đơn giản nhất hiện có, và không đặc biệt là chơi gôn.


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

giải thích: ghi đè tại chỗ của l, mỗi lệnh gọi l[_] = ...lưu trữ từ được trỏ đến và từ điển được sử dụng để kiểm đếm kết quả bằng cách khởi tạo hoặc thêm vào số lượng hiện tại củab[l[_]]


Bạn có thể có thể cạo một số byte với for _,i in enumerate(l):.
Mego
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.