Berapa reputasi yang dimiliki pengguna uap? [Tutup]


20

pengantar

Bagi mereka yang tidak terbiasa dengan uap - atau setidaknya aspek khusus ini:

Seringkali pada profil orang, orang meninggalkan komentar yang mengatakan "+ rep _____" atau "-rep _____". Ini adalah cara tidak resmi untuk menunjukkan apakah Anda berpikir seseorang di komunitas memiliki reputasi baik atau buruk, karena sejumlah alasan. Komentar seperti ini terlihat seperti:

+ rep pemain yang bagus

+ perwakilan membantu

-rep hacker

scammer -rep


Tugas

Program harus menerima input melalui cara konsensual apa pun. Input terdiri dari string dengan baris baru opsional ( \n). Di awal setiap baris, '+rep 'atau '-rep 'mungkin ada. Sisa garis dapat dibuang. Jika garis tidak dimulai dengan '+rep 'atau '-rep '(perhatikan spasi tambahan), garis tersebut harus diabaikan.

Program kemudian harus menyimpan skor reputasi total. Mulai dari 0, skor ini harus bertambah pada setiap baris yang dimulai dengan '+rep 'dan dikurangi pada setiap baris yang dimulai dengan '-rep '.

Hasil ini harus berupa keluaran dengan cara apa pun yang disepakati.


Uji kasus

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

Bonus

Saya bahkan tidak tahu apakah itu mungkin, tetapi poin bonus jika Anda entah bagaimana bisa mendapatkan komentar ini dari Steam.


5
Anggap poin bonusnya imajiner, betul? Mereka sebenarnya tidak mempengaruhi skor Anda.
Rɪᴋᴇʀ

2
Bisakah kita mengasumsikan satu-satunya tanda plus dan minus ada di '+ rep' / '- rep'? Akankah perwakilan hanya di awal garis, atau mungkinkah di tengah juga?
Rɪᴋᴇʀ

3
Saya akan merekomendasikan menambahkan test case di mana ada + rep atau -rep yang tidak di awal baris
fəˈnɛtɪk

3
Saya percaya bahwa contoh 4 harus memiliki keluaran 0, bukan 1.
DJMcMayhem

10
Hai Jacob, dan selamat datang di PPCG. Anda telah berhasil mendapatkan percakapan yang cukup aktif untuk tantangan pertama Anda di sini! Karena belum ada orang lain yang menyebutkannya, saya akan mengarahkan Anda ke Sandbox di mana Anda bisa mendapatkan umpan balik yang berarti dan menuntaskan detail atau masalah klarifikasi sebelum memposting tantangan ke Main. Di masa depan, itu akan membantu Anda menghindari downvotes, closevotes, dan sejenisnya. Saya harap Anda tetap tinggal dan menikmati masa tinggal Anda!
AdmBorkBork

Jawaban:


9

05AB1E , 18 16 17 byte

Disimpan 2 byte berkat Okx
+1 byte karena perubahan spesifikasi di mana rep sekarang perlu diikuti oleh spasi.

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

Cobalah online!

Penjelasan

|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

Anda bisa menggantinya ð¡0èdengan . Saya sedang mengerjakan solusi untuk ini pada saat yang sama Anda.
Okx

@ Emigna Saya merasa ide saya |ðý#D'·Ý©.åÏ®1:Obisa 14 atau 15, saya hanya tidak melihatnya. Juga terjebak di 16, mungkin itu akan membantu Anda. Saya akan meninggalkannya di sini. Pada dasarnya mengganti kata "rep" dengan angka "1" sehingga Anda dapat mengarahkan jumlah.
Magic Gurita Guci

@carusocomputing: Saya pikir saya memilikinya di 14 ya. Hanya perlu beberapa tes lagi :)
Emigna

Lebih baik untuk mengalahkan dasi Jelly yang tak terhindarkan sebelum itu terjadi;).
Guci Gurita Ajaib

@carusocomputing: sebenarnya cara saya 0|vy4£'·Ý1:R.Vtidak berfungsi untuk baris yang tidak dimulai dengan +/- rep. Kembali ke papan gambar :(
Emigna

10

Python 3, 73 byte

Saya yakin jawaban ini adalah sampah dan akan segera dikalahkan, tetapi belum ada jawaban python lainnya

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

Gunakan seperti ini:

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


Mengambil dari uap

Berikut ini beberapa contoh kode yang mengambil 100 komentar pertama dari profil KennyS dan menghitung perwakilannya.

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

Anda tidak membutuhkan tanda kurung siku
ovs

9

Perl 5 , 25 byte

24 byte kode + -pbendera.

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

Cobalah online!

/^\+rep /kembali 1jika garis dimulai dengan +rep; /^-rep /kembali 1jika garis dimulai dengan -rep(jadi hanya satu dari mereka yang paling banyak). Kami menggunakan $\untuk menyimpan hasilnya, karena dicetak secara implisit di akhir (terima kasih kepada -pbendera dan yang tidak cocok }{).


Tambahkan dua byte karena harus ada spasi setelah rep
fəˈnɛtɪk

Ini tampaknya tidak terlalu jelas dari spek tetapi karena hampir semua orang melakukannya, saya akan mengeditnya begitu saya mendapatkan komputer.
Dada

Saya menambahkannya ke spesifikasi karena OP telah meninggalkannya sebagai komentar
fəˈnɛtɪk

6

Python 2 , 54 byte

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

Cobalah online! Mengambil string multiline sebagai input.

Menghitung penampilan '+rep 'dan '-rep 'hanya pada awal baris dengan mencari string mengikuti simbol baris baru. Untuk menangkap baris pertama, baris baru ditambahkan ke input.


5

Retina , 63 51 50 49 byte

Tidak cukup sesuai dengan spesifikasi jadi saya memperbaiki beberapa masalah tetapi juga banyak golf (dengan meminjam baris pertama dari solusi Kritixi Lithos).

Disimpan byte lain berkat Kritixi Lithos.

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

+`\+-|-\+

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

Cobalah online!

Penjelasan

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

Pertama, segala sesuatu dari input dihapus, kecuali untuk +dan -dari setiap +repatau -repdi awal baris.

+`\+-|-\+

Kemudian pasangan yang berdekatan +dan -dihapus sampai tidak ada lagi yang bisa dihapus. Setelah ini, yang tersisa adalah menjalankan +s, lari -s, atau tidak sama sekali.

(.)+
$1$.&

Kemudian jalankan satu atau lebih karakter (salah satu +atau -) diganti dengan karakter yang membentuk run diikuti oleh panjang run. Dengan cara ini, +diawetkan di awal untuk hasil positif dan -negatif.

T`+

Kemudian semua +s dihapus, jika perwakilannya positif.

$^
0

Akhirnya, jika string kosong pada titik ini, rep adalah 0, jadi kita tulis 0.


Anda dapat melakukan drop dan menambahkan s(mode single-line) setelah mpada baris pertama
Kritixi Lithos

4

JavaScript, 55 byte

Terima kasih @Neil untuk bermain golf 12 byte Terima kasih @Arnauld untuk bermain golf 2 byte

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

Cobalah online!


Simpan 12 byte dengan menggunakan splitsebagai gantinya match(itu selalu mengembalikan array yang lebih lama dari yang Anda inginkan tetapi dua 1s membatalkan). Saya juga mencoba menghilangkan duplikasi tetapi keluar pada 57 byte lagi.
Neil

3

Mathematica, 47 byte (penyandian ISO 8859-1)

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

Fungsi murni mengambil string yang dipisahkan baris baru sebagai input dan mengembalikan integer. Perhatikan bahwa tiga baris baru dalam kode diapit oleh tanda kutip dan dengan demikian masing-masing setara "\n"dalam string (tetapi cara ini satu byte lebih pendek dari "\n"). StringCountmelakukan angkat berat; kami secara manual menambahkan baris baru ke awal string sehingga baris pertama cocok bila sesuai. ±adalah fungsi bantuan unary untuk menghindari pengulangan StringCount.

Solusi alternatif

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

4 byte lebih lama, tapi saya suka urutannya ±"+"-±"-"....


Saya pikir Anda mungkin perlu menambahkan spasi di belakang +/- perwakilan karena itu tampaknya merupakan bagian dari persyaratan
fəˈnɛtɪk

3

Retina , 59 53 52 50 byte

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

+`\+-|-\+

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

Cobalah online!

Lihat jawaban Basic Sunset yang lebih singkat dalam bahasa yang sama!

Penjelasan

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

Menghapus semuanya kecuali untuk [+-]rep s.

+`\+-|-\+

Secara berulang menghapus 1 -untuk setiap+ dan sebaliknya.

-+
-$.&

Sebutkan a -(karena jumlahnya negatif) ke -s serta mengganti -s dengan jumlah- s.

\+
$.&

Lakukan hal yang sama untuk +s, tetapi jangan tambahkan a- .

^$
0

Akhirnya, jika tidak ada, gantilah dengan a 0.



OK jadi saya mengeditnya menjadi pertanyaan sebenarnya.
fəˈnɛ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=="");}

Cobalah online!

Digunakan seperti ini:

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

Ini menghasilkan 1 jika Anda memberinya string kosong
fəˈnɛtɪk

@ fəˈnɛtɪk diperbaiki
steenbergh

Akan merekomendasikan memperbaiki tautan Anda. Ini juga kesalahan setelah menghasilkan jika Anda memberikannya baris non +/- 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;}

Mencoba untuk membuat ini lebih pendek menggunakan Stream's


Membutuhkan ruang setelah rep
fəˈnɛtɪk

1

Ditumpuk , 45 byte

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

Cobalah online!

Atau (49 byte):

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

Penjelasan

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

Ini pada dasarnya mengekstrak semua +atau -melekat pada awal baris dan rep. Kemudian, untuk masing-masing, ia menambahkan a #. Kemudian, untuk keseluruhannya, a 0adalah prepended. #~mengevaluasi string, yang sekarang terlihat seperti:

0#+#+#-

#+adalah kenaikan dan #-penurunan. Dengan demikian, kami memperoleh hasil yang diinginkan.


1

Retina , 38 byte

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

*\M1!`-
[+-]

Cobalah online!

Solusi yang berbeda (dan lebih pendek) dari yang sudah diposting di Retina.

Penjelasan

M!m`^[+-]rep 

(Baris ini memiliki spasi tambahan). Simpan hanya bagian input yang relevan, yaitu pada +repatau -repdi awal baris.

Os`.

Sortir semua karakter (termasuk baris baru). ini akan menempatkan + s dan -s di samping satu sama lain.

+`\+-

Secara berulang-ulang singkirkan +-pasangan sampai paling tidak satu dari dua tanda tetap.

*\M1!`-

Cocokkan yang pertama -(jika ada) dan cetak tanpa mengubah string.

[+-]

Hitung jumlah tanda yang tersisa, dan cetaklah karena ini adalah tahap akhir dari program.


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

Fungsi anonim yang memisahkan string input dengan menggunakan karakter baris baru, mencari string "rep" yang diawali oleh karakter dan, jika menemukannya, menambah reputasi (the n variabel) dengan 1 atau -1.

Program lengkap dengan metode ungolfed dan uji kasus:

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

Perhatikan bahwa kode ASCII untuk +43 dan untuk -adalah 45. Metode ini melewati semua kasus uji dari OP. Namun, jika karakter pertama adalah sesuatu yang lain, ini akan mengarah pada jawaban yang salah!

Ini dapat diperbaiki dengan biaya 17 byte:

C # diperbaiki, 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;}

Fungsi anonim yang dimodifikasi akan memeriksa +atau -menandatangani sebagai karakter pertama di setiap baris.



0

C ++, 144 byte

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

Cobalah online!


0

C # , 104 byte


Meskipun sudah ada satu solusi - dan milik saya lebih lama - saya masih berpikir saya harus mempostingnya, karena yang sudah ada di sini mungkin gagal jika sesuatu seperti '=rep 'menghalangi jalannya.


Golf

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

Tidak disatukan

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

Tidak terbaca dibaca

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

Kode lengkap

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

Rilis

  • v1.0 - 104 bytes- Solusi awal.

Catatan

Tidak ada yang perlu ditambahkan


0

Ruby, 46 byte

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

Dapatkan semua +/- perwakilan dari input, dan kumpulkan dalam satu string. Kemudian evaluasi itu untuk 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`+`)

Cobalah

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


Tidak disatukan

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

Sejarah

85 byte

l=>l.split`\n`.map(i=>(r=i.slice(0,5))=="+rep "?1:r=="-rep "?-1:0).reduce((a,b)=>a+b)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.