Скільки репутації має користувач пари? [зачинено]


20

Вступ

Для тих, хто не знайомий з парою - або, принаймні, з цього особливості:

Часто у профілях людей люди залишають коментарі, які говорять або "+ 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, що не знаходиться на початку рядка
fəˈnɛtɪk

3
Я вважаю, що приклад 4 повинен мати вихід 0, а не 1.
DJMcMayhem

10
Привіт Якобе, і ласкаво просимо до PPCG. Тут вам вдалося завести досить активну розмову для вашого першого виклику! Оскільки ніхто ще не згадав про це, я направляю вас до пісочниці, де ви зможете отримати змістовні відгуки та розібрати будь-які деталі чи роз'яснення, перш ніж надсилати виклик Main. Надалі це допоможе вам уникнути злодійства, закритих подій тощо. Я сподіваюся, що ви тримаєтесь і насолоджуєтесь своїм перебуванням!
AdmBorkBork

Відповіді:


9

05AB1E , 18 16 17 байт

Збережено 2 байти завдяки байту Okx
+1 через зміну специфікації, де тепер потрібно повторити реп.

|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:Oможе бути 14 чи 15, я просто не бачу її. Також застряг у 16, можливо, це вам і допоможе. Я залишу його тут. В основному замінивши слово "rep" цифрою "1", щоб ви могли направити суму.
Magic Octopus Urn

@carusocomputing: Я думаю, у мене це вже в 14, так. Просто треба ще кілька тестів :)
Emigna

Краще обіграти неминучу краватку желе, перш ніж це станеться;).
Чарівний восьминога Урна

@carusocomputing: насправді мій шлях 0|vy4£'·Ý1:R.Vне працює для рядків, які не починаються з +/- повтору. Назад до дошки для малювання :(
Емінья

10

Python 3, 73 байти

Я впевнений, що ця відповідь є сміттям і незабаром буде побитий, але інших відповідей пітона поки немає

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


Отримання пари

Ось приклад коду, який отримує перші 100 коментарів з профілю KennyS і обчислює його представник.

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
ов

Квадратні дужки вам не потрібні
всь

9

Perl 5 , 25 байт

24 байти коду + -pпрапор.

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

Спробуйте в Інтернеті!

/^\+rep /повертається, 1якщо рядок починається з +rep; /^-rep /повертається, 1якщо рядок починається з -rep(тому лише один з них буде максимум одним). Ми використовуємо $\для зберігання результату, оскільки він неявно друкується в кінці (завдяки -pпрапору та тим, що не мають відповідності }{).


Додайте два байти, оскільки після
повтору

Це не здається дуже зрозумілим із специфікації, але оскільки майже всі це роблять, я відредагую це, як тільки стану руками на комп'ютер.
Дада

Я додав його до специфікацій, тому що ОП залишила це як коментар
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.

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

+`\+-|-\+

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

Спробуйте в Інтернеті!

Пояснення

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

По-перше, все з введення видаляється, за винятком +і -з будь-якого +repабо -repна початку рядка.

+`\+-|-\+

Потім сусідні пари +і -видаляються до тих пір, поки їх більше не можна буде видалити. Після цього те, що залишилося, - або пробіг +s, пробіг -s, або нічого.

(.)+
$1$.&

Потім запуск одного або декількох символів (або +або -) замінюється символом, що складає пробіг, а потім довжиною пробігу. Цей спосіб +зберігається на початку для позитивних результатів і -для негативів.

T`+

Потім всі +s видаляються у випадку, якщо представник позитивний.

$^
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

Спробуйте в Інтернеті!


Збережіть 12 байт, використовуючи splitзамість match(він завжди повертає масив, який на 1 більше довший, ніж ви хочете, але два 1s скасовують). Я також намагався усунути дублювання, але воно знову вийшло в 57 байт.
Ніл

3

Mathematica, 47 байт (кодування ISO 8859-1)

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

Чиста функція, що приймає введений рядок, що містить новий рядок, і повертає ціле число. Зауважте, що три нові рядки в коді є посиланням на лапки і, таким чином, кожен еквівалент "\n"рядку (але цей спосіб на один байт коротший "\n"). StringCountробить важкий підйом; ми вручну додаємо новий рядок до початку рядка, щоб перший рядок відповідав відповідним чином. ±є одинарною функцією допомоги, щоб уникнути повторення StringCount.

Альтернативне рішення

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

на 4 байти довше, але мені подобається послідовність ±"+"-±"-"....


Я думаю, вам може знадобитися додати пробіл за +/- представником, оскільки це, мабуть, було частиною вимог
fəˈnɛtɪk

3

Сітківка , 59 53 52 50 байт

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

+`\+-|-\+

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

Спробуйте в Інтернеті!

Перевірте коротку відповідь Basic Sunset на тій самій мові!

Пояснення

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

Видаляє все, крім [+-]reps.

+`\+-|-\+

Неодноразово видаляє 1 -для кожного +і навпаки.

-+
-$.&

Заздалегідь додайте a -(оскільки число від’ємне) до -s, а також замініть -s на число -s.

\+
$.&

Зробіть те ж саме для +s, але не додайте a -.

^$
0

Нарешті, якщо нічого немає, замініть його на a 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

Рекомендуємо виправити своє посилання. Він також помиляється після виведення, якщо ви надаєте йому рядок +/- повторень: 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's


Потрібен пробіл після реп.
пт.

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 поруч.

+`\+-

Неодноразово видаляйте +-пари, поки не залишиться не більше одного з двох знаків.

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

Анонімна функція, яка розбиває рядок введення, використовуючи символ нового рядка, шукає рядок "повтор" з префіксом символу і, якщо він знайде його, збільшує репутацію ( n змінну) на 1 або -1.

Повна програма з методом unolfolf та тестовими кейсами:

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. Цей метод передає всі тестові випадки з ОП. Однак якщо перший персонаж - це щось інше, це призведе до неправильних відповідей!

Це можна виправити ціною 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 байти


Незважаючи на існуюче вже одне рішення - і моє довше - я все-таки думаю, що я мушу його опублікувати, оскільки вже тут може вийти з ладу, якщо щось на кшталт '=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 /]}*''}

Отримайте всі вхідні дані +/- і складіть в один рядок. Потім оцініть, що для повтору = 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.