Steam 사용자의 평판은 어느 정도입니까? [닫은]


20

소개

증기에 익숙하지 않은 사람들 또는 적어도이 특정 측면 :

사람들의 프로필에 따라 사람들은 "+ rep _____"또는 "-rep _____"라는 말을 남깁니다. 여러 가지 이유로 커뮤니티의 누군가가 좋은 평판을 얻는다고 생각하는지 여부를 나타내는 비공식적 인 수단입니다. 이러한 의견은 다음과 같습니다.

좋은 선수를 + 답변

+ 답변 도움

-rep 해커

-rep 사기꾼


태스크

프로그램은 합의 된 방식으로 의견을 수렴해야합니다. 입력은 선택적인 개행 ( \n) 이있는 문자열로 구성됩니다 . 각 줄의 맨 처음에 '+rep '또는 '-rep '있을 수 있습니다. 나머지 줄은 버릴 수 있습니다. 줄이 '+rep '또는로 시작하지 않으면 '-rep '(뒤 공백을 참고) 줄을 무시해야합니다.

그런 다음 프로그램은 총 평판 점수를 유지해야합니다. 에서 시작 0하면이 점수는로 시작하는 모든 줄에서 증가하고로 시작 '+rep '하는 모든 줄에서 감소해야합니다 '-rep '.

이 결과는 합의 된 방식으로 출력되어야합니다.


테스트 사례

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

보너스

가능한지 모르겠지만 Steam 에서이 의견을 얻을 수 있다면 보너스 포인트가 있습니다.


5
보너스 포인트가 가상이라고 가정하면 맞습니까? 실제로 점수에 영향을 미치지 않습니다.
Rɪᴋᴇʀ

2
더하기 및 빼기 기호가 '+ rep'/ '-rep'에 있다고 가정 할 수 있습니까? 담당자가 줄의 시작 부분에만 있습니까, 아니면 중간에있을 수 있습니까?
Rɪᴋᴇʀ

3
줄의 시작 부분에없는 + rep 또는 -rep가있는 테스트 사례를 추가하는 것이 좋습니다.
fəˈnɛtɪk

3
나는 예제 4가 0아닌 출력을 가져야한다고 믿는다 1.
DJMcMayhem

10
야곱 안녕하세요, PPCG에 오신 것을 환영합니다. 첫 번째 도전에 대한 대화가 활발해졌습니다! 아직 아무도 언급하지 않았으므로 Main에 도전 과제를 게시하기 전에 의미있는 피드백을 받고 세부 사항이나 설명 문제를 해결할 수있는 샌드 박스 로 안내합니다. 앞으로는 다운 보트, 클로즈 보트 등을 ​​피하는 데 도움이됩니다. 나는 당신이 머물면서 즐거운 시간을 보내시기 바랍니다!
AdmBorkBork

답변:


9

05AB1E , 18 16 17 바이트

rep 다음에 공백이 와야하는 스펙의 변경으로 인해 Okx
+1 바이트 덕분에 2 바이트 가 절약되었습니다.

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

온라인으로 사용해보십시오!

설명

|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

당신은 대체 할 수 있습니다 ð¡0è. 나는 당신과 동시에 이것에 대한 해결책을 연구하고있었습니다.
Okx

@Emigna 나는 |ðý#D'·Ý©.åÏ®1:O14 또는 15가 될 수 있다고 생각 하지만 그것을 보지 못했습니다. 또한 16시에 붙어 있으면 도움이 될 것입니다. 여기에 두겠습니다. 기본적으로 "rep"라는 단어를 숫자 "1"로 바꾸면 합계를 지정할 수 있습니다.
Magic Octopus Urn

@ carusocomputing : 14시에 예라고 생각합니다. 좀 더 테스트를
해보자

그것이 발생하기 전에 피할 수없는 젤리 넥타이를이기는 것이 좋습니다.).
Magic Octopus Urn

@carusocomputing : 실제로 내 방식 0|vy4£'·Ý1:R.V은 +/- rep로 시작하지 않는 줄에는 작동하지 않습니다. 드로잉 보드로 돌아 가기 :(
Emigna

10

파이썬 3, 73 바이트

나는이 답변이 쓰레기이고 곧 이길 것이라고 확신하지만 아직 다른 파이썬 답변은 없습니다.

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

다음과 같이 사용하십시오.

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


스팀에서 가져 오기

다음은 KennyS의 프로파일에서 처음 100 개의 주석을 가져오고 그의 담당자를 계산하는 샘플 코드입니다.

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]-1
ovs

대괄호가 필요 없습니다
ovs

9

펄 5 , 25 바이트

24 바이트의 코드 + -p플래그.

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

온라인으로 사용해보십시오!

/^\+rep /1줄이 다음으로 시작하면를 반환 합니다 +rep. 행이 시작하면를 /^-rep /리턴 1합니다 -rep(그중 하나만 최대 하나). 우리 $\는 결과가 마지막에 암시 적으로 인쇄되므로 결과를 저장하는 데 사용 합니다 ( -p플래그 및 일치하지 않는 결과 }{).


rep 뒤에 공백이 필요하므로 2 바이트를 추가하십시오.
fəˈnɛtɪk

이것은 사양에서 명확하지 않은 것처럼 보이지만 거의 모든 사람들이 그것을하고 있기 때문에 컴퓨터에 손을 대는 즉시 편집 할 것입니다.
Dada

OP가 주석으로 남겨 두었 기 때문에 스펙에 추가했습니다
fəˈnɛtɪk

6

파이썬 2 , 54 바이트

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

온라인으로 사용해보십시오! 여러 줄 문자열을 입력으로받습니다.

줄 바꿈 기호 다음에 나오는 문자열을 검색하여 줄의 시작 부분 '+rep '과 모양의 '-rep '시작 부분 만 계산합니다 . 첫 번째 줄을 잡기 위해 줄 바꿈이 입력 앞에 붙습니다.


5

망막 , 63 51 50 49 바이트

사양을 준수하지 않았기 때문에 몇 가지 문제를 해결했지만 많은 문제를 겪었습니다 (Kritixi Lithos의 솔루션에서 첫 번째 라인을 빌려서).

Kritixi Lithos 덕분에 다른 바이트를 절약했습니다.

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

+`\+-|-\+

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

온라인으로 사용해보십시오!

설명

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

첫째, 입력에 이르기까지 모든이를 제외하고, 삭제 +하고 -하나에서 +rep또는 -rep라인의 시작.

+`\+-|-\+

그런 다음 더 이상 제거 할 수 없을 때까지 +와의 인접한 쌍이 -제거됩니다. 이 후, 무엇을 왼쪽 것은 하나의 실행 +의의 실행 -의, 또는 아무것도.

(.)+
$1$.&

그런 다음 하나 이상의 문자 ( +또는 또는 -)의 런이 런을 구성하는 문자와 런 길이로 대체됩니다. 이런 식으로 +긍정적 인 결과와 -부정적인 결과를 위해 처음에 보존됩니다 .

T`+

그런 다음 +담당자가 긍정적 인 경우 모든 s가 제거됩니다.

$^
0

마지막으로이 시점에서 문자열이 비어 있으면 rep는 0이므로 0을 씁니다.


첫 번째 줄 이후에 를 삭제하고 (한 줄 모드) 추가 할 수 있습니다sm
Kritixi Lithos

4

자바 스크립트, 55 바이트

12 바이트에서 골프를 해주셔서 감사합니다 @Neil 2 바이트에서 골프를 해주셔서 감사합니다 @Arnauld

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

온라인으로 사용해보십시오!


split대신 사용하여 12 바이트를 절약하십시오 match(항상 원하는 1보다 긴 배열을 반환하지만 두 1은 취소합니다). 또한 중복을 제거하려고 시도했지만 다시 57 바이트로 나왔습니다.
Neil

3

Mathematica, 47 바이트 (ISO 8859-1 인코딩)

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

개행으로 분리 된 문자열을 입력으로 받아서 정수를 리턴하는 순수 함수. 코드에서 세 줄 바꿈은 따옴표로 묶여 있으므로 "\n"문자열에서 각각 동일 합니다 (그러나이 방법은보다 1 바이트 짧습니다 "\n"). StringCount무거운 물건 들기; 적절한 경우 첫 줄이 일치하도록 문자열의 시작 부분에 줄 바꿈을 수동으로 추가합니다. ±반복을 피하는 단조 도움 기능StringCount .

대체 솔루션

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

4 바이트 더 길지만 시퀀스를 좋아합니다 ±"+"-±"-"....


아마도 요구 사항의 일부인 +/- rep 뒤에 공백을 추가해야 할 수도 있습니다.
fəˈnɛtɪk

3

망막 , 59 53 52 50 바이트

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

+`\+-|-\+

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

온라인으로 사용해보십시오!

같은 언어로 Basic Sunset의 짧은 답변 을 확인하십시오 !

설명

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

[+-]reps를 제외한 모든 것을 제거합니다 .

+`\+-|-\+

-매번 1 을 반복적으로 제거합니다 +.

-+
-$.&

s --s -의 수로 바꾸고 s를 앞에 씁니다 (숫자가 음수이므로) -.

\+
$.&

에 대해 동일한 +작업을 수행하지만 앞에 붙지 마십시오 -.

^$
0

마지막으로 아무것도 없다면,로 대체하십시오 0.



좋아, 나는 그것을 실제 질문으로 편집했습니다.
fəˈnɛtɪk

3

PHP, 118 바이트

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=="");}

온라인으로 사용해보십시오!

이런 식으로 사용 :

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

빈 문자열을 공급하면 1이 출력됩니다.
fəˈnɛtɪk

@ fəˈnɛtɪk fixed
steenbergh

링크를 수정하는 것이 좋습니다. +/- rep 줄을 지정하지 않으면 출력 후 오류가 발생합니다. : P
fəˈnɛtɪk


1

자바, 109 바이트

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

사용이 짧게 만들려고 노력 Stream의를


담당자 후 공백이 필요
fəˈnɛtɪk

1

스택 형 , 45 바이트

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

온라인으로 사용해보십시오!

또는 (49 바이트) :

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

설명

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

이것은 기본적으로 모두를 추출 +또는 -라인과의 시작 부분에 부착 rep. 그런 다음 각각 앞에 a를 붙입니다 #. 그런 다음 전체에 a 0가 앞에 붙습니다. #~문자열을 평가하면 다음과 같습니다.

0#+#+#-

#+증가하고 #-감소합니다. 따라서 원하는 결과를 얻습니다.


1

레티 나 , 38 바이트

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

*\M1!`-
[+-]

온라인으로 사용해보십시오!

Retina에 이미 게시 된 솔루션과는 다른 (더 짧은) 솔루션입니다.

설명

M!m`^[+-]rep 

(이 줄에는 후행 공백이 있습니다). 입력의 관련 부분, 즉 라인의 시작 부분 +rep또는 -rep시작 부분 만 유지하십시오 .

Os`.

모든 문자 (줄 바꾸기 포함)를 정렬하십시오. 그러면 + s와 -s가 나란히 놓입니다.

+`\+-

+-두 표지판 중 최대 하나가 남을 때까지 커플을 반복해서 제거 합니다.

*\M1!`-

첫 번째 -(있는 경우)를 일치시키고 문자열을 수정하지 않고 인쇄하십시오.

[+-]

남은 부호 수를 세어 프로그램의 마지막 단계이므로 인쇄하십시오.


0

C #, 87 바이트

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

줄 바꿈 문자를 사용하여 입력 문자열을 분할하고 문자 앞에 접두사 "rep"문자열을 검색하고 찾은 경우 평판을 증가시키는 익명 함수 n 변수)을 1 또는 -1 .

ungolfed 방법 및 테스트 사례가 포함 된 전체 프로그램 :

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
    }
}

의 ASCII 코드 +는 43이며- 45는 45입니다.이 방법은 모든 테스트 사례를 OP에서 전달합니다. 그러나 첫 번째 문자가 다른 것이면 잘못된 답변으로 이어질 것입니다!

이것은 17 바이트의 비용으로 고정 될 수 있습니다 :

C # 고정, 104 바이트

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;}

수정 된 익명 함수는 각 줄의 첫 문자로 +또는 -기호를 확인합니다 .




0

C # , 104 바이트


이미 하나의 솔루션이 있고 더 길어 졌음에도 불구하고 여전히 게시해야한다고 생각합니다 '=rep '.


골프

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;}

언 골프

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;
}

언 골프 가능

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;
}

전체 코드

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();
      }
   }
}

자료

  • V1.0 - 104 bytes- 초기 솔루션입니다.

노트

추가 할 사항이 없습니다


0

루비, 46 바이트

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

입력에서 모든 +/- rep을 가져 와서 단일 문자열로 묶습니다. 그런 다음 rep = 1로 평가하십시오.


0

자바 스크립트 ES6, 85 79 바이트

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

시도 해봐

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`));


언 골프

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;
};

역사

85 바이트

l=>l.split`\n`.map(i=>(r=i.slice(0,5))=="+rep "?1:r=="-rep "?-1:0).reduce((a,b)=>a+b)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.