สถิติความนิยมแครอท


27

ในห้องสนทนาPPCG ไบต์ที่สิบเก้าการใช้คาเร็ต^(หรือแครอท ) เป็นวิธีการแสดงว่าคุณเห็นด้วยกับหนึ่งในความคิดเห็นที่ทำไว้ก่อนหน้านี้เหนือของคุณ

ข้อความคาเร็ตประกอบด้วยเพียง^อักขระN ตัว (โดยที่ N เป็นจำนวนเต็มบวก) และหมายถึงข้อตกลงกับข้อความก่อนหน้าของ Nth ดังนั้น^หมายถึงข้อตกลงเดียวกับข้อความก่อนหน้าทันที^^หมายถึงข้อตกลงกับข้อความสองบรรทัดขึ้น^^^หมายถึงข้อตกลงกับข้อความสามบรรทัดขึ้นไปและอื่น ๆ

นอกจากนี้เมื่อ caret message X อยู่ในข้อตกลง (หรือที่ชี้ไปที่) caret message อื่น 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. )

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในสตริงหลายบรรทัดคล้ายกับตัวอย่างข้างต้นโดยที่ทุกบรรทัดแสดงข้อความแชทโดยข้อความเก่าจะมาก่อน

ทุกบรรทัดจะมีอักขระอย่างน้อยหนึ่งตัวและจะมีอย่างน้อยหนึ่งบรรทัด ข้อความทั้งหมดจะเป็นข้อความคาเร็ตที่ประกอบด้วย แต่เพียงผู้เดียว^หรือเป็นข้อความที่ไม่ใช่คาเร็ตที่ประกอบด้วยตัวอักษรและช่องว่าง ( [ a-zA-Z]+ใน regex)

สำหรับทุกข้อความที่ไม่เป็นคาเร็ตในลำดับใด ๆ ให้ส่งออกจำนวนคนที่เห็นด้วยกับข้อความนั้นในบางรูปแบบที่ชัดเจนที่มีข้อความเช่น

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}

คุณสามารถสันนิษฐานได้ว่า:

  • คนมักจะเห็นด้วยกับข้อความของตัวเองและไม่ได้ดูแลตัวเอง
  • ไม่มีข้อความที่ไม่ใช่คาเร็ตสองข้อความที่เหมือนกัน
  • ข้อความ Caret จะไม่ชี้ไปที่สิ่งต่าง ๆ ก่อนที่จะมีข้อความแรก
  • เส้นจะไม่มีช่องว่างนำหน้าหรือต่อท้าย

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

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

ที่เกี่ยวข้อง
Addison Crump

4
ปีหน้าเราสามารถแก้ปัญหานี้ได้ด้วย unicode: blog.unicode.org/2015/05/unicode-90-candidate-emoji.html # 1F955 แครอท
Robert Fraser

👆 @RobertFraser
DDPWNAGE

คำตอบ:


11

CJam, 18

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

กำจัด 2 ไบต์ด้วย Martin :)
ลองออนไลน์

คำอธิบาย:

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 โดยเฉพาะอย่างยิ่งในส่วน

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 และพิมพ์ผลลัพธ์ มันจะติดตามข้อความและนับคะแนนเสียงของพวกเขาในตัวแปรซึ่งเป็นvHash

การสาธิตออนไลน์:


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):คุณอาจจะโกนไบต์บางคนที่มี
Mego
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.