Статистика популярности моркови


27

В PPCG Chatroom в Девятнадцатых байтах , используя CARETS ^(или морковь ) является способом указания , что вы согласны с одним из ранее сделанных замечаний чуть выше ваших.

Символ каретки состоит только из 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, которая указывает на строку 2.
  • Линия 7 указывает на строку 6.
  • Строка 8 указывает на строку 5, которая указывает на строку 3, которая указывает на строку 2.
  • Строка 9 указывает на строку 7, которая указывает на строку 6.

Таким образом, включая пользователей, которые написали не каретное сообщение (и предполагая, что люди не заботятся о своем собственном сообщении), мы можем сделать вывод, что:

  • 2 человека согласны с I like dogs(Строки 1 и 4.)
  • 4 человека согласны I like cats(строки 2, 3, 5 и 8.)
  • С этим согласны 3 человека I like turtles(строки 6, 7 и 9).

Вызов

Напишите программу или функцию, которая принимает многострочную строку, подобную примеру выше, где каждая строка представляет сообщение чата, причем более старые сообщения идут первыми.

Каждая строка будет иметь как минимум один символ, и будет как минимум одна строка. Все сообщения будут либо символами каретки, состоящими исключительно из ^'s', либо сообщениями не каретного типа, состоящими из букв и пробелов ( [ 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

Ответы:


11

CJam, 18

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

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

демонстрация

Похожий подход к адитсу, особенно в ролевой части.

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

Рубин 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

Это программа, которая получает данные из STDIN и распечатывает результат. Он отслеживает сообщения и их количество голосов в переменной v, которая является Hash.

Демоверсии онлайн:


2

Python 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):.
Мего
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.