Steamユーザーの評判はどのくらいですか?[閉まっている]


20

前書き

蒸気に精通していない人-または少なくともこの特定の側面:

多くの場合、人々のプロフィールには、「+ rep _____」または「-rep _____」のいずれかのコメントが残されています。これらは、いくつかの理由で、コミュニティの誰かが良い評判か悪い評判かを示す非公式の手段です。このようなコメントは次のようになります。

+良い選手を代表する

+担当者役立つ

-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」にあると想定できますか?担当者は行の先頭にのみいるのでしょうか、それとも中央にいるのでしょうか?
Rɪᴋᴇʀ

3
行の先頭にない+ repまたは-repがあるテストケースを追加することをお勧めします
-fəˈnɛtɪk

3
例4 0ではなく、出力が必要だと思います1
DJMcMayhem

10
こんにちはジェイコブ、PPCGへようこそ。ここで最初の挑戦のためにかなり活発な会話を得ることができました!誰もまだそれについて言及していないので、メインにチャレンジを投稿する前に、意味のあるフィードバックを取得し、詳細や明確化の問題を確認できるサンドボックスに案内します。将来的には、それはあなたが下票、閉票などを避けるのを助けるでしょう。滞在して楽しんでください!
AdmBorkBork

回答:


9

05AB1E18 16 17バイト

担当者の後にスペースが必要な仕様の変更により、Oxx
+1 バイトのおかげで2バイト節約されました。

|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:O14または15になりそうだと思っています。また、16で立ち往生しているかもしれませんが、おそらくそれはあなたを助けるでしょう。ここに置いておきます。基本的に、単語「rep」を数字「1」に置き換えて、合計を指示できるようにします。
魔法のタコUr

@carusocomputing:私は14時にイエスがあると思います。さらにいくつかのテストを
取得

それが起こる前に避けられないゼリーのネクタイを打つ方が良い;)。
魔法のタコUr

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


蒸気からの取り出し

KennySのプロファイルから最初の100件のコメントを取得して、担当者を計算するサンプルコードを次に示します。

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

角かっこは必要ありません
-ovs

9

Perl 5、25バイト

24バイトのコード+ -pフラグ。

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

オンラインでお試しください!

/^\+rep /1行が+rep;で始まる場合に戻ります。行がで始まる場合に/^-rep /戻ります(したがって、最大で1つだけになります)。結果は暗黙的に最後に出力されるため、結果を保存するために使用します(flagとunmatchedに感謝します)。1-rep$\-p}{


担当者の後にスペースが必要であるため、2バイトを追加します
fəˈnɛtɪk

これは仕様からはあまり明確ではないようですが、ほとんどの人がそれをやっているので、コンピューターを手に入れたらすぐに編集します。
ダダ

OPがコメントとして残していたため、仕様に追加しました
-fəˈnɛtɪk

6

Python 2、54バイト

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

オンラインでお試しください!入力として複数行の文字列を受け取ります。

改行記号に続く文字列を検索することにより、行の先頭'+rep ''-rep 'のみ出現をカウントします。最初の行をキャッチするために、入力に改行が追加されます。


5

網膜63 51 50 49バイト

仕様に完全に準拠していなかったため、いくつかの問題を修正しましたが、多くの問題を解決しました(Kritixi Lithosのソリューションから最初の行を借りることにより)。

Kritixi Lithosのおかげでもう1バイト節約できました。

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

+`\+-|-\+

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

オンラインでお試しください!

説明

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

最初に、入力からのすべて、+および-任意の行+repまたは-rep行の先頭を除くすべてが削除されます。

+`\+-|-\+

次に、との隣接するペアは+-削除できなくなるまで削除されます。この後、残っているのは、+sの実行、-sの実行、または何もないことです。

(.)+
$1$.&

次に、1つ以上の文字(+または-)の実行は、実行を構成する文字とそれに続く実行の長さに置き換えられます。このようにして、+肯定的な結果と-否定的な結果を得るために、開始時に保持されます。

T`+

その後+、担当者が正の場合、すべてのが削除されます。

$^
0

最後に、この時点で文字列が空の場合、担当者は0なので、0を書き込みます。


あなたはドロップ行うことができますし、追加しsた後(シングルラインモード)をm最初の行に
KritixiのLithos

4

JavaScript、55バイト

@ Neil、12バイトのゴルフをありがとう。@ Arnauld、2バイトのゴルフをありがとう。

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

オンラインでお試しください!


split代わりに使用して、12バイトを節約しますmatch(通常は1より長い配列を返しますが、2つの1はキャンセルされます)。また、重複を排除しようとしましたが、再び57バイトになりました。
ニール

3

Mathematica、47バイト(ISO 8859-1エンコード)

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

改行で区切られた文字列を入力として受け取り、整数を返す純粋な関数。コード内の3つの改行は引用符で囲まれているため、それぞれ"\n"が文字列内と同等であることに注意してください(ただし、この方法ではが1バイト短くなります"\n")。StringCount重い物を持ち上げる; 必要に応じて最初の行が一致するように、文字列の先頭に手動で改行を追加します。±はの繰り返しを避ける単項補助関数ですStringCount

代替ソリューション

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

は4バイト長くなりますが、シーケンスは好き±"+"-±"-"です....


明らかに要件の一部だったので、+ /
-repの

3

網膜59 53 52 50バイト

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

+`\+-|-\+

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

オンラインでお試しください!

同じ言語でBasic Sunsetの短い答えをチェックしてください!

説明

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

[+-]reps を除くすべてを削除します。

+`\+-|-\+

-毎回1 を繰り返し削除し+、その逆も同様です。

-+
-$.&

sをsの数で置き換えるだけでなく、aの前に-(数が負であるため)を追加します。---

\+
$.&

+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

@ 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。次に、それぞれにを付加し#ます。次に、全体にa 0が付加されます。#~次のような文字列を評価します。

0#+#+#-

#+増分および#-減分です。したがって、望ましい結果が得られます。


1

網膜、38バイト

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

*\M1!`-
[+-]

オンラインでお試しください!

Retinaに既に投稿されているものとは異なる(そしてより短い)ソリューション。

説明

M!m`^[+-]rep 

(この行には末尾スペースがあります)。すなわち、入力の関連部分のみを保つ+repか、-rep行の先頭に。

Os`.

すべての文字(改行を含む)をソートします。これにより、+ sと-sが隣り合って配置されます。

+`\+-

+-2つの兆候のうち多くても1つが残るまで、カップルを繰り返し削除します。

*\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で、for -は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バイト


既に1つのソリューションが存在しますが(私の場合はそれより長くなりますが)、まだ何かを投稿する必要があると思います'=rep '


ゴルフ

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

非ゴルフ

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

読みやすい

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つの文字列にまとめます。次に、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`));


非ゴルフ

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.