Сколько репутации у пользователя Steam? [закрыто]


20

Вступление

Для тех, кто не знаком с паром - или, по крайней мере, этот конкретный аспект:

Часто в профилях людей люди оставляют комментарии со словами "+ 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'? Будет ли повтор только в начале строки, или он также может быть в середине?
17

3
Я бы порекомендовал добавить тестовый пример, в котором есть + rep или -rep, которых нет в начале строки
fəˈnɛtɪk

3
Я считаю, что пример 4 должен иметь результат 0, а не 1.
DJMcMayhem

10
Привет Джейкоб, и добро пожаловать в PPCG. Вам удалось получить достаточно активный разговор для вашего первого испытания здесь! Поскольку никто еще не упомянул об этом, я направлю вас в Песочницу, где вы сможете получить содержательную обратную связь и проработать любые детали или разъяснения по вопросам, прежде чем отправлять вызов в Main. В будущем это поможет вам избежать отрицательных, закрытых голосов и тому подобного. Я надеюсь, что вы остаетесь и наслаждаетесь вашим пребыванием!
AdmBorkBork

Ответы:


9

05AB1E , 18 16 17 байт

Сохранено 2 байта благодаря байту Okx
+1 из-за изменения спецификации, где после rep теперь должен следовать пробел.

|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:Oможет быть 14 или 15, я просто не вижу этого. Также застрял на 16, может быть, это поможет вам, хотя. Я оставлю это здесь. В основном, заменяя слово «rep» числом «1», вы можете направить сумму.
Волшебная Урна Осьминога

@carusocomputing: я думаю, что у меня это в 14 да. Просто нужно
провести

Лучше побить неизбежный галстук Желе, прежде чем это произойдет;).
Волшебная урна осьминога

@carusocomputing: на самом деле мой путь 0|vy4£'·Ý1:R.Vне работает для строк, не начинающихся с +/- rep. Вернуться к чертежной доске :(
Emigna

10

Python 3, 73 байта

Я уверен, что этот ответ - мусор и скоро будет побежден, но других ответов на Python пока нет

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"))


Извлечение из пара

Вот пример кода, который выбирает первые 100 комментариев из профиля KennyS и вычисляет его репутацию.

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
овс

Вам не нужны квадратные скобки
овс

9

Perl 5 , 25 байт

24 байта кода + -pфлаг.

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

Попробуйте онлайн!

/^\+rep /возвращает, 1если строка начинается с +rep; /^-rep /возвращается, 1если строка начинается с -rep(поэтому только один из них будет один максимум). Мы используем $\для хранения результата, так как он неявно печатается в конце (благодаря -pфлагу и непревзойденному результату }{).


Добавьте два байта, потому что после rep должен быть пробел
fəˈnɛtɪk

Это не очень понятно из спецификации, но так как почти все это делают, я отредактирую это, как только получу в руки компьютер.
Дада

Я добавил его в спецификации, потому что ОП оставил его в качестве комментария
fəˈnɛtɪk

6

Python 2 , 54 байта

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

Попробуйте онлайн! Принимает многострочную строку в качестве ввода.

Считает появления '+rep 'и '-rep 'только в начале строк путем поиска строки, следующей за символом новой строки. Чтобы поймать первую строку, перед вводом добавляется новая строка.


5

Retina , 63 51 50 49 байт

Не совсем соответствовал спецификации, поэтому я исправил некоторые проблемы, но также много играл в гольф (позаимствовав первую строку из решения Kritixi Lithos).

Сохраненный еще один байт благодаря Kritixi Lithos.

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

+`\+-|-\+

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

Попробуйте онлайн!

объяснение

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

Во-первых, все входные данные удаляются, кроме +и -из любого +repили -repв начале строки.

+`\+-|-\+

Затем соседние пары +и -удаляются, пока больше не могут быть удалены. После этого остается либо +s, либо -s, либо ничего.

(.)+
$1$.&

Затем последовательность из одного или нескольких символов (либо, +либо -) заменяется символом, составляющим цикл, за которым следует длина цикла. Таким образом, +сохраняется в начале для положительных результатов и -для отрицательных.

T`+

Затем все +s удаляются, если репутация положительная.

$^
0

Наконец, если строка в этой точке пуста, значение rep равно 0, поэтому мы пишем 0.


Вы можете оставить и добавить s(однострочный режим) после mпервой строки
Kritixi Lithos

4

JavaScript, 55 байт

Спасибо @Neil за игру в гольф от 12 байтов Спасибо @Arnauld за игру от 2 байтов

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

Попробуйте онлайн!


Сохраните 12 байтов, используя splitвместо match(он всегда возвращает массив, который на 1 больше, чем обычно требуется, но две единицы отменяются). Я также попытался устранить дублирование, но оно снова оказалось на 57 байтах.
Нил

3

Mathematica, 47 байт (кодировка ISO 8859-1)

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

Чистая функция, принимающая строку, разделенную символом новой строки, и возвращающая целое число. Обратите внимание, что три символа новой строки в коде заключены в кавычки и, таким образом, каждая эквивалентна "\n"строке (но этот путь на один байт короче "\n"). StringCountвыполняет тяжелую работу; мы вручную добавляем новую строку в начало строки, чтобы первая строка соответствовала при необходимости. ±это одинарная функция помощи, чтобы избежать повторения StringCount.

Альтернативное решение

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

на 4 байта длиннее, но мне нравится последовательность ±"+"-±"-"....


Я думаю, что вам может понадобиться добавить пробел после +/- повторения, поскольку это, очевидно, является частью требований
fəˈnɛtɪk

3

Сетчатка , 59 53 52 50 байт

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

+`\+-|-\+

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

Попробуйте онлайн!

Ознакомьтесь с кратким ответом Basic Sunset на том же языке!

объяснение

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

Удаляет все, кроме [+-]reps.

+`\+-|-\+

Неоднократно удаляет 1 -для каждого +и наоборот.

-+
-$.&

Добавьте a -(поскольку число отрицательное) к -s, а также заменив -s на число -s.

\+
$.&

Сделайте то же самое для +s, но не добавляйте a -.

^$
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 исправлено
steenbergh

Рекомендую исправить вашу ссылку. Это также приводит к ошибкам после вывода, если вы даете ему строку +/- rep: P
fəˈnɛtɪk


1

Java, 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. Затем каждому из них предшествует #. Затем ко всему этому 0добавляется a . #~оценивает строку, которая теперь выглядит примерно так:

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. Этот метод проходит все тестовые случаи из 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 'будет мешать.


Golfed

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

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 читаемый

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 = 1.


0

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


Ungolfed

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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.