Bir buhar kullanıcısının ne kadar şöhreti var? [kapalı]


20

Giriş

Buharı bilmeyenler için - veya en azından bu özel yön için:

Genellikle insanların profillerinde, insanlar "+ rep _____" veya "-rep _____" diyerek yorumlar bırakır. Bunlar, bir takım nedenlerden dolayı, topluluktaki birisinin iyi veya kötü bir şöhrete sahip olup olmadığını göstermenin resmi olmayan bir yoludur. Bu yorumlar şöyle görünür:

+ iyi bir oyuncuyu tekrarla

+ temsilci yardımcı olur

-rep hacker

-prep scammer


Görev

Program herhangi bir rıza ile giriş yapmalıdır. Giriş, isteğe bağlı yeni satırlara ( \n) sahip bir dizeden oluşur . Her satırın en başında '+rep 'ya '-rep 'da mevcut olabilir. Hattın geri kalanı atılabilir. Satır '+rep 'veya ile başlamazsa '-rep '(sondaki boşluğu not edin), satır yoksayılmalıdır.

Program daha sonra toplam itibar puanını korumalıdır. 0Bu puandan başlayarak, başlayan her satırda artırılmalı ve başlayan '+rep 'her satırda azaltılmalıdır '-rep '.

Bu sonuç üzerinde anlaşmaya varılmış bir şekilde çıkmalıdır.


Test senaryoları

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

Mümkün olup olmadığını bilmiyorum, ancak bu yorumları bir şekilde Steam'den alabiliyorsanız bonus puan.


5
Bonus puanlarının hayali olduğu varsayılarak, doğru mu? Aslında puanınızı etkilemezler.
Rɪᴋᴇʀ

2
Tek artı ve eksi işaretlerinin '+ rep' / '- rep' içinde olduğunu varsayabilir miyiz? Temsilci sadece çizginin başında mı olacak, yoksa ortada da olabilir mi?
Rɪᴋᴇʀ

3
Satırın başında olmayan bir + rep veya -rep olduğu bir test örneği eklemenizi öneririm
fəˈnɛtɪk

3
Ben örnek 4 çıkışa sahip olacaktır inanıyoruz 0değil 1.
DJMcMayhem

10
Merhaba Jacob ve PPCG'ye hoş geldiniz. Burada ilk göreviniz için oldukça aktif bir konuşma yapmayı başardınız! Daha önce hiç kimse bundan bahsetmediği için sizi Sandbox'a yönlendireceğim ve burada Main'e göndermeden önce anlamlı geri bildirim alabileceğiniz ve ayrıntıları veya açıklama sorunlarını çözebileceğiniz. Gelecekte, bu, downvotes, closevotes ve benzerlerinden kaçınmanıza yardımcı olacaktır. Umarım etrafta dolaşır ve konaklamanızın tadını çıkarırsınız!
AdmBorkBork

Yanıtlar:


9

05AB1E , 18 16 17 bayt

Temsilcinin artık bir boşluk izlemesi gereken özellikteki
değişiklik nedeniyle Okx +1 bayt sayesinde 2 bayt kaydedildi .

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

Çevrimiçi deneyin!

açıklama

|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

Sen yerini alabilir ð¡0èile . Ben de bu konuda bir çözüm üzerinde çalışıyordum.
Okx

@Emigna Benim fikrim |ðý#D'·Ý©.åÏ®1:O14 veya 15 olabilir gibi hissediyorum , sadece görmüyorum. Ayrıca 16'da sıkışmış, belki de size yardımcı olacaktır. Onu burada bırakacağım. Temel olarak "rep" kelimesini "1" rakamıyla değiştirerek toplamı yönlendirebilirsiniz.
Sihirli Ahtapot Urn

@carusocomputing: Sanırım 14 yaşında evet. Biraz daha test yapmalıyım :)
Emigna

Daha önce kaçınılmaz Jelly kravat yenmek için daha iyi;).
Sihirli Ahtapot Urn

@ carusocomputing: aslında benim yolum 0|vy4£'·Ý1:R.V+/- rep ile başlamayan satırlar için çalışmıyor. Çizim tahtasına geri dön :(
Emigna

10

Python 3, 73 bayt

Eminim bu cevap çöptür ve yakında dövülecektir, ancak henüz başka python cevapları yok

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

Bunun gibi kullanın:

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


Buhardan getiriliyor

İşte KennyS'in profilinden ilk 100 yorumu alan ve temsilcisini hesaplayan bazı örnek kod.

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

Köşeli parantez gerekmez
ovs

9

Perl 5 , 25 bayt

24 bayt kod + -pbayrak.

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

Çevrimiçi deneyin!

/^\+rep /1çizgi ile başlarsa döner +rep; çizgi ile başlarsa /^-rep /döner (bu yüzden bunlardan sadece biri en fazla bir olacaktır). Sonunda örtük olarak yazdırıldığı için sonucu saklamak için kullanıyoruz ( bayrak ve eşleşmeyenler sayesinde ).1-rep$\-p}{


İki bayt ekleyin çünkü
rep'den

Bu spesifikasyondan çok net görünmüyor, ancak hemen hemen herkes yaptığı için, bir bilgisayara ellerimi alır almaz bunu düzenleyeceğim.
Dada

OP bir yorum olarak bırakmıştı çünkü özellikleri ekledim
fəˈnɛtɪk

6

Python 2 , 54 bayt

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

Çevrimiçi deneyin! Çok satırlı bir dizeyi girdi olarak alır.

Yeni satır sembolü izleyen dizeyi arayarak satırların '+rep 've '-rep 'yalnızca satır başlarındaki görünümlerini sayar . İlk satırı yakalamak için girişe bir yeni satır eklenir.


5

Retina , 63 51 50 49 bayt

Bu yüzden bazı sorunları sabit ama aynı zamanda çok golf (Kritixi Lithos çözümden ilk satır ödünç alarak) oldukça uygun değildi.

Kritixi Lithos sayesinde bir bayt daha kurtardı.

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

+`\+-|-\+

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

Çevrimiçi deneyin!

açıklama

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

İlk olarak, girişten herşey hariç silinir +ve -herhangi birinden +repveya -repbir satırın başında.

+`\+-|-\+

Daha sonra bitişik çiftler +ve -daha fazla çıkarılana kadar çıkarılır. Bundan sonra geriye kalan, ya bir +s koşusu, bir -s koşusu ya da hiçbir şeydir .

(.)+
$1$.&

Daha sonra, bir veya daha fazla karakterden oluşan bir ( +veya -) karakter koşusu, koşuyu oluşturan karakter ve ardından koşunun uzunluğu ile değiştirilir. Bu şekilde, +başlangıçta olumlu sonuçlar ve -negatifler için korunur .

T`+

Daha sonra +temsilci olumlu olursa tüm s kaldırılır.

$^
0

Son olarak, bu noktada dize boşsa, rep 0 olur, bu yüzden 0 yazarız.


İlk satırdan sonra bırakabilir ve s(tek satır modu) ekleyebilirsinizm
Kritixi Lithos

4

JavaScript, 55 bayt

12 bayt golf için teşekkürler @Neil 2 bayt golf için teşekkürler @Arnauld

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

Çevrimiçi deneyin!


Kullanarak 12 bayt kaydet splityerine match(her zaman uzun normalde istediğiniz 1 olan bir dizi döndürür ancak iki 1s iptal). Ben de yineleme ortadan kaldırmak için çalıştı ama yine 57 bayt çıktı.
Neil

3

Mathematica, 47 bayt (ISO 8859-1 kodlaması)

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

Yeni satırla ayrılmış bir dizeyi girdi olarak alan ve bir tamsayı döndüren saf işlev. Koddaki üç yeni satırın tırnaklarla çevrildiğini ve bu nedenle her birinin "\n"bir dizede eşdeğer olduğunu unutmayın (ancak bu yol bir bayttan daha kısadır "\n"). StringCountağır kaldırma yapar; dizenin başına manuel olarak yeni bir satır ekleriz, böylece ilk satır uygun olduğunda eşleşir. ±tekrarını önlemek için alışılmadık bir yardım işlevidir StringCount.

Alternatif çözüm

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

4 bayt daha uzun, ama ben sıra gibi ±"+"-±"-"....


Sanırım görünüşe göre gereksinimlerin bir parçası olarak +/- temsilcisi arkasında bir boşluk eklemeniz gerekebilir
fəˈnɛtɪk

3

Retina , 59 53 52 50 bayt

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

+`\+-|-\+

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

Çevrimiçi deneyin!

Aynı dilde Basic Sunset'in daha kısa cevabına göz atın !

açıklama

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

[+-]repS hariç her şeyi kaldırır .

+`\+-|-\+

-Her biri için 1'i tekrar tekrar kaldırır +veya tam tersi.

-+
-$.&

A'yı -(sayı negatif olduğu için) -s'ye getirin ve -s'yi s sayısı ile değiştirin -.

\+
$.&

Aynısını +s için yapın, ama a'nın başına başlamayın -.

^$
0

Son olarak, hiçbir şey yoksa, yerine a 0.



Tamam, asıl soruya bunu düzenledim.
fəˈnɛtɪk

3

PHP, 118 bayt

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

Çevrimiçi deneyin!

Bunun gibi kullanılır:

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

Boş dize ile
beslerseniz

@ fəˈnɛtɪk fixed
steenbergh

Bağlantınızı düzeltmenizi tavsiye ederim. Ayrıca +/- olmayan bir satır
verirseniz çıkıştan


1

Java, 109 bayt

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

Kullanarak bu kısa yapmaya çalışıyorum Stream's


Temsilciden sonra bir yere ihtiyacı var
fəˈnɛtɪk

1

Yığılmış , 45 bayt

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

Çevrimiçi deneyin!

Alternatif olarak (49 bayt):

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

açıklama

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

Bu temelde tüm ayıklar +veya -hat ve başlangıcına bağlı rep. Sonra, her birine a #. Sonra, her şey için, a 0eklenir. #~şimdi şuna benzeyen dizeyi değerlendirir:

0#+#+#-

#+artıştır ve #-azalır. Böylece istediğimiz sonucu elde ederiz.


1

Retina , 38 bayt

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

*\M1!`-
[+-]

Çevrimiçi deneyin!

Retina'da yayınlananlardan farklı (ve daha kısa) bir çözüm.

açıklama

M!m`^[+-]rep 

(Bu çizginin sonunda bir boşluk vardır). Girişin yalnızca ilgili kısımlarını, yani bir satırın başında +repveya -repbaşında tutun .

Os`.

Tüm karakterleri sıralayın (yeni satırlar dahil). bu + s ve -s'yi yan yana koyacaktır.

+`\+-

+-İki işaretten en fazla biri kalana kadar çiftleri tekrar tekrar çıkarın .

*\M1!`-

İlkini -(varsa) eşleştirin ve dizgiyi değiştirmeden yazdırın.

[+-]

Kalan işaret sayısını sayın ve programın son aşaması olduğu için yazdırın.


0

C #, 87 bayt

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

Yeni satır karakterini kullanarak giriş dizesini ayıran anonim işlev, bir karakterin ön ekine sahip "rep" dizesini arar ve bulursa saygınlığı ( ndeğişken) 1 veya -1 artırır .

Golfsiz yöntem ve test senaryoları ile tam program:

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 kodunun +43 ve for -45 olduğunu unutmayın. Bu yöntem tüm test senaryolarını OP'den geçirir. Ancak, ilk karakter başka bir şeyse, bu yanlış cevaplara yol açacaktır!

Bu, 17 bayt maliyetiyle düzeltilebilir:

C # sabit, 104 bayt

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

Değiştirilen anonim işlev, her satırdaki ilk karakter olarak bir işareti +veya -işareti kontrol eder.



0

C ++, 144 bayt

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

Çevrimiçi deneyin!


0

C # , 104 bayt


Mevcut tek bir çözüme rağmen - ve benimki daha uzun olmasına rağmen - hala göndermem gerektiğini düşünüyorum, çünkü böyle bir şey '=rep 'yoluna girerse zaten burada başarısız olabilir .


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

Okunmamış okunabilir

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

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

Bültenleri

  • v1.0 - 104 bytes- İlk çözüm.

notlar

Eklenecek bir şey yok


0

Yakut, 46 bayt

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

Girişten tüm +/- temsilcisini alın ve tek bir dizede bir araya getirin. Sonra bunu rep = 1 için değerlendirin.


0

JavaScript ES6, 85 79 bayt

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

Dene

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

Tarihçe

85 bayt

l=>l.split`\n`.map(i=>(r=i.slice(0,5))=="+rep "?1:r=="-rep "?-1:0).reduce((a,b)=>a+b)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.