ニンジン人気統計


27

PPCGのチャットルーム十九バイトキャレット使用して、^(またはニンジンは)あなたがちょうどあなた以上前に作られたコメントの一つと一致していることを示すの方法です。

キャレットメッセージはN ^文字(Nは正の整数)のみで構成され、N 番目の前のメッセージとの一致を意味します。したがって、1つ^は直前のメッセージ^^との合意、2行目まで^^^のメッセージとの合意、3行目までのメッセージとの合意などを意味します。

さらに、キャレットメッセージXが別のキャレットメッセージYに同意する(別名)場合、XはYが同意するものに同意すると言われます。これには複数の層があり、最終的に、すべてのキャレットメッセージは1つの非キャレットメッセージとの一致を示しています。

たとえば、チャットの記録が次のようになっている場合:(1行に1メッセージ)

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は行6を指す行7を指します。

したがって、キャレット以外のメッセージを書いたユーザーを含めて(そして、人々が自分のメッセージを気にしないと仮定して)、次のように結論付けることができます。

  • 2人が同意しますI like dogs(1行目と4行目)
  • 4人が同意しますI like cats(2、3、5、8行目)
  • 3人が同意しますI like turtles(6、7、9行目)

チャレンジ

上記の例のように、すべての行がチャットメッセージを表し、古いメッセージが最初に来る複数行の文字列を受け取るプログラムまたは関数を記述します。

各行には少なくとも1つの文字があり、少なくとも1つの行があります。すべてのメッセージは、^' のみで構成されるキャレットメッセージ、または文字とスペース([ 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}

あなたはそれを仮定することができます:

  • 人々は常に自分のメッセージに同意し、自分自身をキャレットにしない。
  • 同一の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
来年、我々はユニコードでこの問題を解決することができますblog.unicode.org/2015/05/unicode-90-candidate-emoji.html#1F955ニンジン
ロバート・フレイザー

Ro @RobertFraser
DDPWNAGE

回答:


11

CJam、18歳

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

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):
メゴ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.