Người dùng hơi nước có bao nhiêu danh tiếng? [đóng cửa]


20

Giới thiệu

Đối với những người không quen thuộc với hơi nước - hoặc ít nhất là khía cạnh cụ thể này:

Thông thường trên hồ sơ của mọi người, mọi người để lại bình luận nói "+ rep _____" hoặc "-rep _____". Đây là một phương tiện không chính thức để cho thấy bạn nghĩ ai đó trong cộng đồng có tiếng tốt hay tiếng xấu, vì một số lý do. Nhận xét như vậy trông giống như:

+ rep một người chơi tốt

+ đại diện hữu ích

-rep hacker

-rep kẻ lừa đảo


Bài tập

Chương trình phải nhận đầu vào thông qua bất kỳ cách đồng thuận. Đầu vào bao gồm một chuỗi với các dòng mới tùy chọn ( \n). Vào đầu mỗi dòng, '+rep 'hoặc '-rep 'có thể có mặt. Phần còn lại của dòng có thể được loại bỏ. Nếu dòng không bắt đầu bằng '+rep 'hoặc'-rep ' (lưu ý dấu cách), dòng sẽ bị bỏ qua.

Chương trình sau đó phải giữ tổng điểm danh tiếng. Bắt đầu từ 0, điểm số này nên được tăng lên trên mỗi dòng bắt đầu '+rep 'và giảm dần trên mỗi dòng bắt đầu bằng '-rep '.

Kết quả này phải là đầu ra theo bất kỳ cách nào đã được thỏa thuận.


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

Input:
+rep fast trade
+rep nice person
-rep too good

Output: 1

Input:
-rep hacker
-rep scammer
-rep was mean

Output: -3

Input:
first
i don't like him
+rep good at cs go

Output: 1

Input (note the lack of a trailing space on the third line):    
+rep +rep
hi +rep
-rep

Output: 1

Input:
+ rep

Output: 0

Input:
+rep like
-thing

Output: 1

Tiền thưởng

Tôi thậm chí không biết nếu có thể, nhưng điểm thưởng nếu bạn bằng cách nào đó có thể nhận được những nhận xét này từ Steam.


5
Giả sử điểm thưởng là tưởng tượng, đúng không? Họ không thực sự ảnh hưởng đến điểm số của bạn.
Rɪᴋᴇʀ

2
Chúng ta có thể giả sử các dấu cộng và dấu trừ duy nhất nằm trong '+ rep' / '- rep' không? Đại diện sẽ chỉ ở đầu dòng, hoặc nó cũng có thể ở giữa?
Rɪᴋᴇʀ

3
Tôi sẽ khuyên bạn nên thêm một trường hợp thử nghiệm trong đó có + rep hoặc -rep không ở đầu dòng
fəˈnɛtɪk

3
Tôi tin rằng ví dụ 4 nên có đầu ra 0, không 1.
DJMcMayhem

10
Xin chào Jacob, và chào mừng bạn đến với PPCG. Bạn đã xoay sở để có được một cuộc trò chuyện khá tích cực cho thử thách đầu tiên của bạn ở đây! Vì chưa có ai khác đề cập đến nó, tôi sẽ hướng dẫn bạn đến Sandbox nơi bạn có thể nhận được phản hồi có ý nghĩa và giải quyết mọi chi tiết hoặc các vấn đề làm rõ trước khi đăng thử thách lên Main. Trong tương lai, điều đó sẽ giúp bạn tránh được downvote, closevote và tương tự. Tôi hy vọng bạn gắn bó và tận hưởng kỳ nghỉ của bạn!
admBorkBork

Câu trả lời:


9

05AB1E , 18 16 17 byte

Đã lưu 2 byte nhờ byte Okx
+1 do thay đổi thông số trong đó đại diện bây giờ cần được theo sau bởi khoảng trắng .

|vy5£„+-S„·Ý «QÆO

Hãy thử trực tuyến!

Giải trình

|v                   # for each line of input
  y5£                # get the first 4 chars of input
     „+-S„·Ý «       # push the list ['+rep ','-rep ']
              Q      # check each for equality
                     # results in either [1,0] for +rep, [0,1] for -rep or [0,0] for others
               Æ     # reduce by subtraction, gives either 1, -1 or 0
                O    # sum

Bạn có thể thay thế ð¡0èbằng . Tôi đã làm việc trên một giải pháp cho điều này cùng lúc với bạn.
Okx

@Emigna Tôi cảm thấy ý tưởng của mình |ðý#D'·Ý©.åÏ®1:Ocó thể là 14 hoặc 15, tôi chỉ không thấy nó. Cũng bị mắc kẹt ở tuổi 16, có thể nó sẽ giúp bạn mặc dù. Tôi sẽ để nó ở đây. Về cơ bản thay thế từ "rep" bằng số "1" để bạn có thể tính tổng.
Bạch tuộc ma thuật Urn

@carusocomputing: Tôi nghĩ rằng tôi có nó ở tuổi 14 có. Chỉ cần thực hiện thêm một số bài kiểm tra :)
Emigna

Tốt hơn là đánh bại cà vạt Jelly không thể tránh khỏi trước khi nó xảy ra;).
Bạch tuộc ma thuật Urn

@carusocomputing: thực sự cách của tôi 0|vy4£'·Ý1:R.Vkhông hoạt động đối với các dòng không bắt đầu bằng +/- rep. Quay lại bảng vẽ :(
Emigna

10

Python 3, 73 byte

Tôi chắc chắn câu trả lời này là rác và sẽ sớm bị đánh bại, nhưng vẫn chưa có câu trả lời nào về con trăn

lambda x:sum(["- +".index(i[0])-1for i in x.split('\n')if i[1:4]=="rep"])

Sử dụng như thế này:

f = lambda x:sum(["- +".index(i[0])-1for i in x.split('\n')if i[1:4]=="rep"])
print(f("PUT INPUT HERE"))


Lấy từ hơi nước

Đây là một số mã mẫu lấy 100 bình luận đầu tiên từ hồ sơ của KennyS và tính đại diện của anh ấy.

import requests
from bs4 import BeautifulSoup

# Kenny's profile as Steam ID 64
# You can adjust this to whatever numbers you want
STEAM_PROFILE_URL = "76561198024905796"
payload =  {"start" : 0, "count" : 100}
r = requests.post("http://steamcommunity.com/comment/Profile/render/{}/-1/".format(STEAM_PROFILE_URL), payload)

# Comments are html inside a json object
soup = BeautifulSoup(r.json()["comments_html"], "html.parser")

# Get raw text for every comment.
# The " ".join() strips out the newlines and tabs which are part of html
comments = [" ".join(s.text.split()) for s in soup.find_all("div", {"class" : "commentthread_comment_text"})]

calculateRep = lambda x:sum(["- +".index(i[0])-1for i in x.split('\n')if i[1:4]=="rep"])

print(calculateRep("\n".join(comments)))

if"rep"==i[1:4]cho -1
ovs

Bạn không cần dấu ngoặc vuông
ovs

9

Perl 5 , 25 byte

24 byte mã + -pcờ.

$\+=/^\+rep /-/^-rep /}{

Hãy thử trực tuyến!

/^\+rep /trả về 1nếu dòng bắt đầu bằng +rep; /^-rep /trả về 1nếu dòng bắt đầu bằng -rep(vì vậy chỉ một trong số chúng sẽ là một trong số đó). Chúng tôi sử dụng $\để lưu trữ kết quả, vì nó được in ngầm ở cuối (nhờ -pcờ và những thứ chưa từng có }{).


Thêm hai byte vì cần phải có khoảng
trắng

Điều này dường như không rõ ràng từ thông số kỹ thuật nhưng vì khá nhiều người đang thực hiện nó, tôi sẽ chỉnh sửa nó ngay khi tôi chạm tay vào máy tính.
Dada

Tôi đã thêm nó vào thông số kỹ thuật vì OP đã để lại bình luận
fəˈnɛtɪk

6

Python 2 , 54 byte

q=('\n'+input()).count;print q('\n+rep ')-q('\n-rep ')

Hãy thử trực tuyến! Lấy một chuỗi nhiều dòng làm đầu vào.

Đếm số lần xuất hiện '+rep ''-rep 'chỉ khi bắt đầu các dòng bằng cách tìm kiếm chuỗi theo ký hiệu dòng mới. Để bắt dòng đầu tiên, một dòng mới được thêm vào đầu vào.


5

Võng mạc , 63 51 50 49 byte

Không hoàn toàn tuân thủ thông số kỹ thuật nên tôi đã khắc phục một số vấn đề nhưng cũng đã khắc phục nó rất nhiều (bằng cách mượn dòng đầu tiên từ giải pháp của Kritixi Lithos).

Lưu một byte khác nhờ Kritixi Lithos.

ms`(?!^[+-]rep ).

+`\+-|-\+

(.)+
$1$.&
T`+
$^
0

Hãy thử trực tuyến!

Giải trình

ms`(?!^[+-]rep ).

Đầu tiên, mọi thứ từ đầu vào sẽ bị xóa, ngoại trừ +-từ bất kỳ +rephoặc -repkhi bắt đầu một dòng.

+`\+-|-\+

Sau đó, các cặp liền kề +-được loại bỏ cho đến khi không còn có thể được gỡ bỏ. Sau này, những gì còn lại là một chuỗi +s, một chuỗi -s hoặc không gì cả.

(.)+
$1$.&

Sau đó, một lần chạy của một hoặc nhiều ký tự (hoặc +hoặc -) được thay thế bằng ký tự tạo thành lần chạy tiếp theo là độ dài của lần chạy. Bằng cách này, +được bảo tồn vào lúc bắt đầu cho kết quả dương tính và -âm bản.

T`+

Sau đó tất cả +s được loại bỏ, trong trường hợp đại diện là dương.

$^
0

Cuối cùng, nếu chuỗi trống vào thời điểm này, đại diện là 0, vì vậy chúng tôi viết 0.


Bạn có thể thả và thêm s(chế độ một dòng) sau mdòng đầu tiên
Kritixi Lithos

4

JavaScript, 55 byte

Cảm ơn @Neil vì đã chơi golf 12 byte Cảm ơn @Arnauld vì đã chơi golf 2 byte

x=>x.split(/^\+rep /m).length-x.split(/^-rep /m).length

Hãy thử trực tuyến!


Lưu 12 byte bằng cách sử dụng splitthay vì match(nó luôn trả về một mảng dài hơn 1 mà bạn thường muốn nhưng hai giây hủy bỏ). Tôi cũng đã cố gắng loại bỏ sự trùng lặp nhưng nó lại xuất hiện ở mức 57 byte.
Neil

3

Mathicala, 47 byte (mã hóa ISO 8859-1)

c_:=StringCount["
"<>#,c];±"
+rep""
-rep")&

Hàm thuần túy lấy một chuỗi phân tách dòng mới làm đầu vào và trả về một số nguyên. Lưu ý rằng ba dòng mới trong mã được đặt cạnh các dấu ngoặc kép và do đó mỗi dòng tương đương với "\n"trong một chuỗi (nhưng cách này ngắn hơn một byte so với "\n"). StringCountkhông nâng vật nặng; chúng tôi tự thêm một dòng mới vào đầu chuỗi để dòng đầu tiên khớp khi thích hợp. ±là một chức năng giúp đỡ đơn phương để tránh lặp lại StringCount.

Giải pháp thay thế

(±c_:=StringCount["
"<>#,"
"<>c<>"rep"];±"+"-±"-")&

dài hơn 4 byte, nhưng tôi thích chuỗi ±"+"-±"-"....


Tôi nghĩ rằng bạn có thể cần thêm một khoảng
trắng

3

Võng mạc , 59 53 52 50 byte

ms`(?!^[+-]rep ).

+`\+-|-\+

-+
-$.&
\++
$.&
^$
0

Hãy thử trực tuyến!

Kiểm tra câu trả lời ngắn hơn của Basic Sunset trong cùng một ngôn ngữ!

Giải trình

ms`(?!^[+-]rep ).

Loại bỏ mọi thứ trừ [+-]reps.

+`\+-|-\+

Liên tục loại bỏ 1 -cho mỗi +và ngược lại.

-+
-$.&

Chuẩn bị một - (vì số âm) cho -s cũng như thay thế -s bằng số -s.

\+
$.&

Làm tương tự cho +s, nhưng không trả trước a -.

^$
0

Cuối cùng, nếu không có gì, thay thế nó bằng một 0 .



OK để tôi chỉnh sửa nó thành câu hỏi thực tế.
fnɛtɪk

3

PHP, 118 byte

function s($a,$c=0){foreach(explode("
",$a)as$b){$b=substr($b,0,1).'1';if(is_numeric($b){$c+=$b});}return$c-($a=="");}

Hãy thử trực tuyến!

Được sử dụng như thế này:

echo s("-rep bad
+rep good
+rep very good
+rep exceeds expectation");

Điều này xuất ra 1 nếu bạn cung cấp cho nó chuỗi trống
fnɛtɪk

@ fəˈnɛtɪk đã sửa
steenbergh

Muốn giới thiệu sửa chữa liên kết của bạn. Nó cũng bị lỗi sau khi xuất nếu bạn cung cấp cho nó một dòng không +/- rep: P
fəˈnɛtɪk


1

Java, 109 byte

l->{int i=0;for(String s:l.split("\n")){if(s.startsWith("+rep "))i++;if(s.startsWith("-rep "))i--;}return i;}

Đang cố gắng để làm cho điều này ngắn hơn sử dụng Stream's


Cần một không gian sau khi đại diện
fnɛtɪk

1

Xếp chồng , 45 byte

'^([+-])rep |.'{.a:''['#'a+]a if}mrepl'0'\+#~

Hãy thử trực tuyến!

Cách khác (49 byte):

lines'^[-+]rep 'match$#'YES[0#0# '#'\+]"!''#`0\#~

Giải trình

'^([+-])rep |.'{.a:''['#'a+]a if}mrepl'0'\+#~

Điều này về cơ bản trích xuất tất cả +hoặc -gắn vào đầu dòng và rep. Sau đó, đến từng, nó chuẩn bị a #. Sau đó, với toàn bộ, một 0được chuẩn bị trước. #~đánh giá chuỗi, mà bây giờ trông giống như:

0#+#+#-

#+là tăng và #-là giảm. Vì vậy, chúng tôi có được kết quả mong muốn của chúng tôi.


1

Võng mạc , 38 byte

M!m`^[+-]rep 
Os`.
+`\+-

*\M1!`-
[+-]

Hãy thử trực tuyến!

Một giải pháp khác (và ngắn hơn) so với các giải pháp đã được đăng trên Retina.

Giải trình

M!m`^[+-]rep 

(Dòng này có một không gian dấu). Chỉ giữ lại các phần có liên quan của đầu vào, tức là +rephoặc -repở đầu dòng.

Os`.

Sắp xếp tất cả các ký tự (bao gồm cả dòng mới). cái này sẽ đặt + s và -s cạnh nhau.

+`\+-

Liên tục loại bỏ +-các cặp vợ chồng cho đến khi nhiều nhất một trong hai dấu hiệu vẫn còn.

*\M1!`-

Khớp đầu tiên -(nếu có) và in nó mà không sửa đổi chuỗi.

[+-]

Đếm số lượng dấu hiệu còn lại và in nó vì đây là giai đoạn cuối cùng của chương trình.


0

C #, 87 byte

s=>{int n=0;foreach(var t in s.Split('\n'))n+=t.IndexOf("rep ")==1?44-t[0]:0;return n;}

Hàm ẩn danh phân tách chuỗi đầu vào bằng cách sử dụng ký tự dòng mới, tìm kiếm chuỗi "rep" có tiền tố bởi một ký tự và nếu tìm thấy nó, sẽ tăng danh tiếng ( n biến) lên 1 hoặc -1.

Chương trình đầy đủ với phương pháp vô căn cứ và các trường hợp thử nghiệm:

using System;

class P
{
    static void Main()
    {
        Func<string, int> f =
        s=>
        {
            int n = 0;
            foreach (var t in s.Split('\n'))
                n += t.IndexOf("rep ") == 1 ?
                    44 - t[0]
                    :
                    0;

            return n;
        };

        // test cases:
        Console.WriteLine(f(@"+rep fast trade
+rep nice person
-rep too good"));       // 1

        Console.WriteLine(f(@"-rep hacker
-rep scammer
-rep was mean"));       // -3

        Console.WriteLine(f(@"first
i don't like him
+rep good at cs go"));  // 1

        Console.WriteLine(f(@"+rep +rep
hi +rep
-rep"));            // 1

        Console.WriteLine(f(@"+ rep"));     // 0

        Console.WriteLine(f(@"+rep like
-thing"));          // 1
    }
}

Lưu ý rằng mã ASCII cho +là 43 và cho -là 45. Phương thức này vượt qua tất cả các trường hợp thử nghiệm từ OP. Tuy nhiên, nếu nhân vật đầu tiên là một cái gì đó khác, điều này sẽ dẫn đến câu trả lời sai!

Điều này có thể được sửa chữa với chi phí 17 byte:

C # cố định, 104 byte

s=>{int n=0;foreach(var t in s.Split('\n'))n+=t.IndexOf("rep ")==1?t[0]==43?1:t[0]==45?-1:0:0;return n;}

Hàm ẩn danh được sửa đổi sẽ kiểm tra một +hoặc -ký là ký tự đầu tiên trong mỗi dòng.




0

C # , 104 byte


Mặc dù đã có sẵn một giải pháp - và của tôi còn dài hơn - tôi vẫn nghĩ rằng tôi nên đăng nó, vì việc này đã xảy ra ở đây có thể thất bại nếu có gì đó giống như '=rep 'vậy.


Chơi gôn

i=>{var c=0;foreach(var o in i.Split('\n'))c+=o.IndexOf("rep ")!=1?0:o[0]==43?1:o[0]==45?-1:0;return c;}

Ung dung

i => {
   var c = 0;

   foreach( var o in i.Split( '\n' ) )
      c += o.IndexOf( "rep " ) != 1
         ? 0
         : o[ 0 ] == 43
            ? 1
            : o[ 0 ] == 45
               ? -1
               : 0;

   return c;
}

Ungolfed có thể đọc được

i => {
   // Counter for the 'reputation'
   var c = 0;

   // Cycle through every line
   foreach( var o in i.Split( '\n' ) )
      // Check if the "rep " string has index 1
      //   ( Index 0 should be the sign )
      c += o.IndexOf( "rep " ) != 1
         // Add 0 if the rep isn't on the right position
         ? 0
         // Check for the '+' sign
         : o[ 0 ] == 43
            // Add 1 if the sign is found
            ? 1
            // Check for the '-' sign
            : o[ 0 ] == 45
               // Add -1 if the sign is found
               ? -1
               // Add 0 if another char is found
               : 0;

   // Return the 'reputation'
   return c;
}

Mã đầy đủ

using System;
using System.Collections.Generic;

namespace Namespace {
   class Program {
      static void Main( String[] args ) {
         Func<String, Int32> f = i => {
            var c = 0;

            foreach( var o in i.Split( '\n' ) )
               c += o.IndexOf( "rep " ) != 1
               ? 0
                  : o[ 0 ] == 43
                  ? 1
                  : o[ 0 ] == 45
                     ? -1
                     : 0;

            return c;
         };

         List<String>
            testCases = new List<String>() {
               @"+rep fast trade
+rep nice person
-rep too good",
               @"-rep hacker
-rep scammer
-rep was mean",
               @"first
i don't like him
+rep good at cs go",
               @"+rep +rep
hi +rep
-rep",
               @"+ rep",
               @"+rep like
-thing",
         };

         foreach( String testCase in testCases ) {
            Console.WriteLine( $"{testCase}\n{f( testCase )}\n" );
         }

         Console.ReadLine();
      }
   }
}

Phát hành

  • v1.0 - 104 bytes- Giải pháp ban đầu.

Ghi chú

Không có gì để bổ sung


0

Ruby, 46 byte

->x{rep=1;eval ?0+x.map{|a|a[/^[+-]rep /]}*''}

Nhận tất cả +/- rep từ đầu vào và ghép lại thành một chuỗi. Sau đó đánh giá rằng cho rep = 1.


0

JavaScript ES6, 85 79 byte

l=>eval(l.split`
`.map(i=>(r=i.slice(0,5))==`+rep `?1:r==`-rep `?-1:0).join`+`)

Thử nó

f=l=>eval(l.split`
`.map(i=>(r=i.slice(0,5))==`+rep `?1:r==`-rep `?-1:0).join`+`);

console.log(f(`+rep fast trade
+rep nice person
-rep too good`));

console.log(f(`-rep hacker
-rep scammer
-rep was mean`));

console.log(f(`first
i don't like him
+rep good at cs go`));

console.log(f(`+rep +rep
hi +rep
-rep`));

console.log(f(`+ rep`));

console.log(f(`+rep like
-thing`));


Ung dung

const repcount=list=>{
    let array=list.split("\n");
    let values=array.map(item=>{
        let rep=item.slice(0,5);
        return rep==="+rep "?1:rep==="-rep "?-1:0;
    });
    let result=values.reduce((a,b)=>a+b);
    return result;
};

Lịch sử

85 byte

l=>l.split`\n`.map(i=>(r=i.slice(0,5))=="+rep "?1:r=="-rep "?-1:0).reduce((a,b)=>a+b)
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.