Ile reputacji ma użytkownik Steam? [Zamknięte]


20

Wprowadzenie

Dla tych, którzy nie znają pary - a przynajmniej tego konkretnego aspektu:

Często na profilach ludzi ludzie zostawiają komentarze z napisem „+ rep _____” lub „-rep _____”. Są to nieoficjalne sposoby wykazania, czy uważasz, że ktoś w społeczności ma dobrą lub złą reputację, z wielu powodów. Takie komentarze wyglądają następująco:

+ rep dobry gracz

+ pomocny przedstawiciel

-rep haker

-rep oszustwo


Zadanie

Program musi przyjmować dane w dowolny zgodny sposób. Dane wejściowe składają się z ciągu z opcjonalnymi znakami nowej linii ( \n). Na samym początku każdej linii '+rep 'lub '-rep 'może być obecny. Resztę linii można odrzucić. Jeśli linia nie zaczyna się od '+rep 'lub '-rep '(zwróć uwagę na spację końcową), linię należy zignorować.

Program musi następnie zachować łączny wynik reputacji. Począwszy od 0, ten wynik powinien być zwiększany na każdej linii, która zaczyna się '+rep 'i zmniejszany na każdej linii, która zaczyna się '-rep '.

Wynik ten powinien być generowany w dowolny uzgodniony sposób.


Przypadki testowe

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

Premia

Nie wiem nawet, czy to możliwe, ale punkty bonusowe, jeśli możesz w jakiś sposób uzyskać te komentarze ze Steam.


5
Zakładając, że punkty bonusowe są wymyślone, prawda? W rzeczywistości nie wpływają na twój wynik.
Rɪᴋᴇʀ

2
Czy możemy założyć, że jedyne znaki plus i minus znajdują się w „+ rep” / „- rep”? Czy przedstawiciel będzie tylko na początku linii, czy może też będzie na środku?
Rɪᴋᴇʀ

3
Poleciłbym dodanie przypadku testowego, w którym istnieje powtórzenie + lub -rep, które nie jest na początku linii
fəˈnɛtɪk

3
Uważam, że przykładem 4 powinien mieć wyjście 0, nie 1.
DJMcMayhem

10
Cześć Jacob i witamy w PPCG. Udało ci się nawiązać dość aktywną rozmowę na swoje pierwsze wyzwanie tutaj! Ponieważ nikt jeszcze o tym nie wspominał, skieruję cię do piaskownicy, gdzie możesz uzyskać znaczące informacje zwrotne i wyjaśnić wszelkie szczegóły lub wyjaśnienia problemów przed wysłaniem wyzwania do Main. W przyszłości pomoże Ci to uniknąć głosów negatywnych, głosowań zamkniętych i tym podobnych. Mam nadzieję, że zostaniesz i będziesz się dobrze bawić!
AdmBorkBork

Odpowiedzi:


9

05AB1E , 18 16 17 bajtów

Oszczędność 2 bajtów dzięki bajtowi Okx
+1 ze względu na zmianę specyfikacji, gdzie po rep musi następować spacja.

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

Wypróbuj online!

Wyjaśnienie

|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

Można wymienić ð¡0èz . Pracowałem nad rozwiązaniem tego w tym samym czasie, w którym byłeś.
Okx,

@Emigna Wydaje mi się, że mój pomysł |ðý#D'·Ý©.åÏ®1:Omoże mieć 14 lub 15 lat, po prostu tego nie widzę. Utknąłem również w wieku 16 lat, może ci to pomoże. Zostawię to tutaj. Zasadniczo zastępując słowo „rep” liczbą „1”, abyś mógł bezpośrednio sumować.
Magic Octopus Urn

@carusocomputing: Myślę, że mam 14 lat tak. Jeszcze kilka testów :)
Emigna

Lepiej pokonać nieuchronny remis Jelly zanim to nastąpi;).
Magic Octopus Urn

@carusocomputing: właściwie moja droga 0|vy4£'·Ý1:R.Vnie działa dla linii, które nie zaczynają się od +/- rep. Powrót do deski kreślarskiej :(
Emigna,

10

Python 3, 73 bajty

Jestem pewien, że ta odpowiedź jest śmieciowa i wkrótce zostanie pobita, ale nie ma jeszcze innych odpowiedzi w języku Python

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

Użyj w ten sposób:

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


Pobieranie z pary

Oto przykładowy kod, który pobiera pierwsze 100 komentarzy z profilu KennySa i oblicza jego powtórzenie.

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

Nie potrzebujesz nawiasów kwadratowych
2017

9

Perl 5 , 25 bajtów

24 bajty kodu + -pflaga.

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

Wypróbuj online!

/^\+rep /zwraca, 1jeśli linia zaczyna się od +rep; /^-rep /zwraca, 1jeśli linia zaczyna się od -rep(więc tylko jeden z nich będzie najwyżej jeden). Używamy $\do przechowywania wyniku, ponieważ jest on domyślnie drukowany na końcu (dzięki -pflagom i tym niedopasowanym }{).


Dodaj dwa bajty, ponieważ po powtórzeniu musi być spacja
fəˈnɛtɪk 10.04.17

Nie wydaje się to zbyt jasne w specyfikacji, ale ponieważ prawie wszyscy to robią, zedytuję to, gdy tylko dostanę komputer.
Dada,

Dodałem go do specyfikacji, ponieważ OP zostawił go jako komentarz
fəˈnɛtɪk

6

Python 2 , 54 bajty

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

Wypróbuj online! Pobiera wejściowy ciąg multilinii.

Liczy pojawienie się '+rep 'i '-rep 'tylko na początku linii, szukając ciągu następującego po symbolu nowej linii. Aby złapać pierwszy wiersz, do wejścia jest dodawany nowy wiersz.


5

Siatkówka , 63 51 50 49 bajtów

Nie do końca byłem zgodny ze specyfikacją, więc naprawiłem kilka problemów, ale także dużo grałem w golfa (pożyczając pierwszą linię z rozwiązania Kritixi Lithos).

Zaoszczędził kolejny bajt dzięki Kritixi Lithos.

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

+`\+-|-\+

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

Wypróbuj online!

Wyjaśnienie

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

Po pierwsze, wszystko z danych wejściowych jest usuwane, z wyjątkiem +i -od dowolnego +replub -repna początku linii.

+`\+-|-\+

Następnie sąsiednie pary +i -są usuwane, dopóki nie będzie można ich usunąć. Po tym, co zostało, albo ciąg +s, bieg -s, albo nic.

(.)+
$1$.&

Następnie ciąg jednego lub więcej znaków (albo +albo -) jest zastępowany znakiem tworzącym bieg, po którym następuje długość przebiegu. W ten sposób +zostaje zachowany na początku dla pozytywnych wyników i -negatywów.

T`+

Następnie wszystkie +s są usuwane, jeśli powtórzenie jest pozytywne.

$^
0

Wreszcie, jeśli łańcuch jest pusty w tym momencie, powtórzenie wynosi 0, więc zapisujemy 0.


Możesz porzucić i dodać s(tryb pojedynczej linii) po mpierwszej linii
Kritixi Lithos

4

JavaScript, 55 bajtów

Dzięki @Neil za grę w golfa z 12 bajtów Dzięki @ Arnauld za grę w golfa z 2 bajtów

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

Wypróbuj online!


Zaoszczędź 12 bajtów, używając splitzamiast match(zawsze zwraca tablicę, która jest o 1 dłuższa niż zwykle, ale dwie 1s anulują). Próbowałem również wyeliminować duplikację, ale pojawiła się ponownie przy 57 bajtach.
Neil

3

Mathematica, 47 bajtów (kodowanie ISO 8859-1)

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

Czysta funkcja przyjmująca ciąg oddzielony znakiem nowej linii jako dane wejściowe i zwracająca liczbę całkowitą. Zauważ, że trzy nowe znaki w kodzie są flankowane cudzysłowami, a zatem każdy z nich jest równoważny "\n"ciągowi (ale w ten sposób jest o jeden bajt krótszy niż "\n"). StringCountrobi ciężkie podnoszenie; ręcznie dodajemy nowy wiersz na początku łańcucha, aby pierwsza linia pasowała, gdy jest to właściwe. ±to niezwykle pomocna funkcja pozwalająca uniknąć powtórzeńStringCount .

Alternatywne rozwiązanie

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

ma 4 bajty dłużej, ale podoba mi się sekwencja ±"+"-±"-"....


Myślę, że możesz potrzebować dodać spację za przedstawicielem +/-, ponieważ najwyraźniej była to część wymagań
f 10nɛtɪk 10.04.17

3

Retina , 59 53 52 50 bajtów

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

+`\+-|-\+

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

Wypróbuj online!

Sprawdź krótszą odpowiedź Basic Sunset w tym samym języku!

Wyjaśnienie

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

Usuwa wszystko oprócz [+-]reps.

+`\+-|-\+

Wielokrotnie usuwa 1 -na każdy +i odwrotnie.

-+
-$.&

Dodaj a -(ponieważ liczba jest ujemna) do -s, a także zastępując -s liczbą -s.

\+
$.&

Zrób to samo dla +s, ale nie dodawaj -.

^$
0

Na koniec, jeśli nic nie ma, zamień na 0.



OK, więc zredagowałem to w rzeczywistym pytaniu.
fəˈnɛtɪk 10.04.17

3

PHP, 118 bajtów

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

Wypróbuj online!

Używany w ten sposób:

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

Daje to 1, jeśli podasz mu pusty łańcuch
fəˈnɛtɪk 10.04.17

@ fəˈnɛtɪk naprawiono
steenbergh 10.04.17

Poleciłbym naprawić twój link. Występuje również błąd po wypisaniu, jeśli podasz mu linię bez powtórzeń +/-: P
fəˈnɛtɪk


1

Java, 109 bajtów

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

Próbuje zrobić to krótsze używając Stream„s


Potrzebuje spacji po powtórzeniu
fəˈnɛtɪk 10.04.17

1

Ułożone , 45 bajtów

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

Wypróbuj online!

Alternatywnie (49 bajtów):

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

Wyjaśnienie

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

Zasadniczo wyodrębnia wszystkie +lub -dołączone na początku wiersza i rep. Następnie do każdego z nich przygotowuje #. Następnie do całości 0jest dodawane a. #~ocenia ciąg, który teraz wygląda mniej więcej tak:

0#+#+#-

#+jest przyrostem i #-spadkiem. W ten sposób uzyskujemy pożądany rezultat.


1

Siatkówka , 38 bajtów

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

*\M1!`-
[+-]

Wypróbuj online!

Inne (i krótsze) rozwiązanie niż już opublikowane w Retina.

Wyjaśnienie

M!m`^[+-]rep 

(Ta linia ma spację końcową). Zachowaj tylko odpowiednie części danych wejściowych, tj. +repLub -repna początku linii.

Os`.

Sortuj wszystkie znaki (w tym znaki nowej linii). spowoduje to umieszczenie + s i -s obok siebie.

+`\+-

Kilkakrotnie usuwaj +-pary, aż pozostanie co najwyżej jeden z dwóch znaków.

*\M1!`-

Dopasuj pierwszy -(jeśli jest obecny) i wydrukuj go bez modyfikowania łańcucha.

[+-]

Policz pozostałą liczbę znaków i wydrukuj ją, ponieważ jest to ostatni etap programu.


0

C #, 87 bajtów

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

Anonimowa funkcja, która dzieli ciąg wejściowy za pomocą znaku nowej linii, wyszukuje ciąg „rep” poprzedzony znakiem i, jeśli go znajdzie, zwiększa reputację ( n zmienną) o 1 lub -1.

Pełny program z nieprzylepioną metodą i testami:

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

Zauważ, że kod ASCII dla +to 43, a dla -to 45. Ta metoda przekazuje wszystkie przypadki testowe z PO. Jeśli jednak pierwsza postać jest czymś innym, doprowadzi to do błędnych odpowiedzi!

Można to naprawić kosztem 17 bajtów:

Naprawiono C #, 104 bajty

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

Zmodyfikowana anonimowa funkcja sprawdzi, +czy -znak lub jest pierwszym znakiem w każdej linii.



0

C ++, 144 bajty

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

Wypróbuj online!


0

C # , 104 bajty


Mimo że istnieje już jedno rozwiązanie - a moje jest dłuższe - nadal myślę, że powinienem je opublikować, ponieważ już tutaj może się nie powieść, jeśli coś takiego '=rep 'stanie na przeszkodzie.


Grał w golfa

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

Nie golfił

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

Nieczytelny czytelny

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

Pełny kod

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

Prasowe

  • v1.0 - 104 bytes- Wstępne rozwiązanie.

Uwagi

Nic do dodania


0

Rubinowy, 46 bajtów

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

Zbierz wszystkie powtórzenia +/- z wejścia i ułóż je w jednym ciągu. Następnie oceń to dla rep = 1.


0

JavaScript ES6, 85 79 bajtów

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

Spróbuj

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


Nie golfił

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

Historia

85 bajtów

l=>l.split`\n`.map(i=>(r=i.slice(0,5))=="+rep "?1:r=="-rep "?-1:0).reduce((a,b)=>a+b)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.