Quanta reputação um usuário do Steam tem? [fechadas]

20

Introdução

Para quem não conhece o vapor - ou pelo menos esse aspecto em particular:

Frequentemente, nos perfis das pessoas, as pessoas deixam comentários dizendo "+ rep _____" ou "-rep _____". Esse é um meio não oficial de mostrar se você acha que alguém da comunidade tem uma reputação boa ou má, por várias razões. Esses comentários são parecidos com:

+ rep um bom jogador

+ rep útil

-rep hacker

-rep scammer


Tarefa

O programa deve receber informações de qualquer maneira consensual. A entrada consiste em uma sequência com novas linhas opcionais ( \n). No início de cada linha, '+rep 'ou '-rep 'pode estar presente. O restante da linha pode ser descartado. Se a linha não começar com '+rep 'ou'-rep ' (observe o espaço à direita), a linha deve ser ignorada.

O programa deve manter uma pontuação total de reputação. Começando em 0, essa pontuação deve ser incrementada em todas as linhas que começam com '+rep 'e diminuída em todas as linhas que começam com '-rep '.

Esse resultado deve ser produzido de qualquer maneira acordada.


Casos de teste

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

Bônus

Eu nem sei se é possível, mas pontos de bônus, se você puder obter esses comentários do Steam.

Jacob Garby
fonte
5
Supondo que os pontos de bônus sejam imaginários, correto? Na verdade, eles não afetam sua pontuação.
Rɪᴋᴇʀ
2
Podemos supor que os únicos sinais de mais e menos estão no '+ rep' / '- rep'? O representante estará apenas no início da linha ou também no meio?
Rɪᴋᴇʀ
3
Eu recomendaria adicionar um caso de teste onde há um + rep ou -rep que não é no início da linha
fənɛtɪk
3
Eu acredito que o exemplo 4 deveria ter saída 0, não 1.
DJMcMayhem
10
Olá Jacob, e bem-vindo ao PPCG. Você conseguiu uma conversa bastante ativa para o seu primeiro desafio aqui! Como ninguém mais o mencionou, encaminharei você para a Sandbox, onde você pode obter um feedback significativo e esclarecer quaisquer detalhes ou questões de esclarecimento antes de postar o desafio no Main. No futuro, isso ajudará a evitar votos negativos, votos fechados e similares. Espero que você fique por perto e aproveite a sua estadia!
AdmBorkBork

Respostas:

9

05AB1E , 18 16 17 bytes

Economizou 2 bytes graças ao Okx
+1 byte devido a alterações nas especificações, onde agora o representante precisa ser seguido por um espaço.

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

Experimente online!

Explicaçã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
Emigna
fonte
Você pode substituir ð¡0èpor . Eu estava trabalhando em uma solução para isso ao mesmo tempo que você estava.
Okx
@ Emigna Sinto que minha ideia |ðý#D'·Ý©.åÏ®1:Opode ter 14 ou 15 anos, mas não estou vendo. Também preso aos 16 anos, talvez isso o ajude. Vou deixar aqui. Substituindo basicamente a palavra "rep" pelo número "1" para que você possa direcionar a soma.
Magic Octopus Urn
@carusocomputing: Acho que tenho 14, sim. Apenas tenho que mais alguns testes :)
Emigna
Melhor vencer o inevitável empate em Jelly antes que isso aconteça;).
Magic Octopus Urn
@carusocomputing: na verdade, o meu caminho 0|vy4£'·Ý1:R.Vnão funciona para linhas que não começam com +/- rep. De volta à área de desenho :(
Emigna 10/04
10

Python 3, 73 bytes

Tenho certeza de que essa resposta é lixo e será vencida em breve, mas ainda não há outras respostas em python

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

Use assim:

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


Buscando do vapor

Aqui está um exemplo de código que busca os 100 primeiros comentários do perfil de KennyS e calcula seu representante.

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)))
Keatinge
fonte
if"rep"==i[1:4]para -1
ovs 11/04/19
Você não precisa de colchetes
ovs 11/11/19
9

Perl 5 , 25 bytes

24 bytes de código + -psinalizador.

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

Experimente online!

/^\+rep /retorna 1se a linha começa com +rep; /^-rep /retorna 1se a linha começa com -rep(portanto, apenas um deles será um no máximo). Usamos $\para armazenar o resultado, pois ele é impresso implicitamente no final (graças ao -psinalizador e aos inigualáveis }{).

dada
fonte
Adicionar dois bytes, porque é preciso haver um espaço após rep
fənɛtɪk
Isso não parece muito claro com as especificações, mas como quase todo mundo está fazendo isso, editarei isso assim que colocar as mãos no computador.
Dada
Eu adicionei-lo para as especificações porque o OP tinha deixado como um comentário
fənɛtɪk
6

Python 2 , 54 bytes

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

Experimente online! Pega uma sequência multilinha como entrada.

Conta as aparências '+rep 'e '-rep 'somente no início das linhas, procurando a sequência seguindo um símbolo de nova linha. Para capturar a primeira linha, uma nova linha é anexada à entrada.

xnor
fonte
5

Retina , 63 51 50 49 bytes

Como não cumpri bem as especificações, resolvi alguns problemas, mas também joguei bastante (emprestando a primeira linha da solução da Kritixi Lithos).

Guardou outro byte graças a Kritixi Lithos.

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

+`\+-|-\+

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

Experimente online!

Explicação

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

Primeiro, tudo da entrada é excluído, exceto o +e -de qualquer um +repou -repno início de uma linha.

+`\+-|-\+

Em seguida, pares adjacentes de +e -são removidos até que não mais possam ser removidos. Depois disso, o que resta é uma sequência de +s, uma sequência de -s ou nada.

(.)+
$1$.&

Em seguida, uma corrida de um ou mais caracteres ( +ou -) é substituída pelo caractere que compõe a corrida seguido pelo comprimento da corrida. Dessa forma, +é preservada no início para resultados positivos e -negativos.

T`+

Todos os +s são removidos, caso o representante seja positivo.

$^
0

Finalmente, se a string estiver vazia neste momento, o representante será 0, então escrevemos 0.

Gato de negócios
fonte
Você pode fazer cair o e adicione uma s(modo de linha única) após o mna primeira linha
Kritixi Lithos
4

JavaScript, 55 bytes

Obrigado @ Neil por jogar fora 12 bytes Obrigado @Arnauld por jogar fora 2 bytes

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

Experimente online!

fəˈnɛtɪk
fonte
Salve 12 bytes usando em splitvez de match(ele sempre retorna uma matriz 1 mais longa que você normalmente deseja, mas os dois 1s são cancelados). Eu também tentei eliminar a duplicação, mas ela saiu com 57 bytes novamente.
1111 Neil
3

Mathematica, 47 bytes (codificação ISO 8859-1)

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

Função pura, tendo como entrada uma string separada por nova linha e retornando um número inteiro. Observe que as três novas linhas no código são flanqueadas por aspas e, portanto, são equivalentes a "\n"uma sequência de caracteres (mas dessa maneira é um byte menor que "\n"). StringCountfaz o trabalho pesado; adicionamos manualmente uma nova linha ao início da string para que a primeira linha corresponda quando apropriado. ±é uma função de ajuda unária para evitar a repetição de StringCount.

A solução alternativa

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

é 4 bytes mais, mas eu gosto da sequência ±"+"-±"-"....

Greg Martin
fonte
Eu acho que você pode precisar adicionar um espaço atrás do +/- representante como que era aparentemente parte dos requisitos
fənɛtɪk
3

Retina , 59 53 52 50 bytes

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

+`\+-|-\+

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

Experimente online!

Confira a resposta mais curta do Basic Sunset no mesmo idioma!

Explicação

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

Remove tudo, exceto [+-]reps.

+`\+-|-\+

Remove repetidamente 1 -para cada +e vice-versa.

-+
-$.&

Anexe um a -(porque o número é negativo) a -s e substitua os -s pelo número de -s.

\+
$.&

Faça o mesmo para +s, mas não inclua a -.

^$
0

Finalmente, se não houver nada, substitua-o por a 0.

Kritixi Lithos
fonte
@ fəˈnɛtɪk> +/- rep sempre terá um espaço à direita
Kritixi Lithos
OK, então eu editei isso na pergunta real.
fənɛtɪk
3

PHP, 118 bytes

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

Experimente online!

Usado assim:

echo s("-rep bad
+rep good
+rep very good
+rep exceeds expectation");
steenbergh
fonte
Este saídas 1 se você alimentá-lo a cadeia vazia
fənɛtɪk
@ fəˈnɛtɪk fixed
steenbergh
Recomendaria corrigir o seu link. Ele também erros após a saída se você dar-lhe uma linha não +/- rep: P
fənɛtɪk
3

Röda , 53 bytes

{{|l|[1]if[l=~`\+rep .*`];[-1]if[l=~`-rep .*`]}_|sum}

Experimente online!

fergusq
fonte
1

Java, 109 bytes

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

Tentando diminuir isso usando Stream's

Roman Gräf
fonte
Precisa de um espaço após o representante
fəˈnɛtɪk
1

Empilhados , 45 bytes

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

Experimente online!

Como alternativa (49 bytes):

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

Explicação

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

Basicamente, isso extrai tudo +ou é -anexado ao início da linha e rep. Então, para cada um, ele precede a #. Então, para a coisa toda, a 0é anexado. #~avalia a string, que agora se parece com:

0#+#+#-

#+é incremento e #-é decremento. Assim, obtemos o resultado desejado.

Conor O'Brien
fonte
1

Retina , 38 bytes

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

*\M1!`-
[+-]

Experimente online!

Uma solução diferente (e mais curta) do que as que já foram publicadas na Retina.

Explicação

M!m`^[+-]rep 

(Esta linha tem um espaço à direita). Mantenha apenas as partes relevantes da entrada, ou seja, o +repou -repno início de uma linha.

Os`.

Classifique todos os caracteres (incluindo novas linhas). isso colocará + se -s próximos um do outro.

+`\+-

Remova os +-casais repetidamente até que no máximo um dos dois sinais permaneça.

*\M1!`-

Combine o primeiro -(se houver) e imprima-o sem modificar a sequência.

[+-]

Conte o número de placas restantes e imprima-o, pois esta é a etapa final do programa.

Leo
fonte
0

C #, 87 bytes

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

A função anônima que divide a string de entrada usando o caractere de nova linha, procura a string "rep" prefixada por um caractere e, se a encontrar, aumenta a reputação (a propriedade n variável) em 1 ou -1.

Programa completo com método não destruído e casos de teste:

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

Observe que o código ASCII para +é 43 e para- é 45. Esse método passa todos os casos de teste do OP. No entanto, se o primeiro caractere for outra coisa, isso levará a respostas erradas!

Isso pode ser corrigido ao custo de 17 bytes:

C # fixo, 104 bytes

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

A função anônima modificada procurará um sinal +ou -como o primeiro caractere em cada linha.

adrianmp
fonte
0

C ++, 144 bytes

#import<iostream>
int f(){int r=0;for(std::string s;std::getline(std::cin,s);)if((s[0]==43|s[0]==45)&s.substr(1,4)=="rep ")r-=s[0]-44;return r;}

Experimente online!

Steadybox
fonte
0

C # , 104 bytes


Apesar de já existir uma solução - e a minha ser mais longa - ainda acho que devo publicá-la, pois o que já está aqui pode falhar se algo assim '=rep 'atrapalhar.


Golfe

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 legible

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

Código completo

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

Lançamentos

  • v1.0 - 104 bytes- Solução inicial.

Notas

Nada para adicionar

auhmaan
fonte
0

Ruby, 46 bytes

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

Obtenha todo o representante +/- da entrada e monte em uma única sequência. Em seguida, avalie isso para rep = 1.

GB
fonte
0

JavaScript ES6, 85 79 bytes

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

Tente

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

História

85 bytes

l=>l.split`\n`.map(i=>(r=i.slice(0,5))=="+rep "?1:r=="-rep "?-1:0).reduce((a,b)=>a+b)
Shaggy
fonte