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


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, який вказує на рядок 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

Піт, 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

Рубін 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, яка є a 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.