Oblicz swoją reputację wymiany stosów

13

Tło:

Często zdarza mi się, że przeglądając stronę Stackexchange, zaczynam się zastanawiać, jak ludzie zdobywają reputację. Wiem, że zawsze mogę liczyć na codegolf SE w rozwiązaniu moich problemów, więc oto:

Utwórz program, który zaakceptuje dodatnią liczbę całkowitą reprezentującą reputację osoby. Zignorujemy nagrody i stwierdzimy, że są to jedyne sposoby na zdobycie / utratę przedstawiciela w SE (pełna tabela tutaj ):

  • Każde konto zaczyna się od 1 powtórzenia i nie może zejść poniżej tego
  • Twoje pytanie jest ocenione = +5
  • Twoja odpowiedź jest pozytywna = +10
  • Twoje pytanie jest odrzucone = -2
  • Twoja odpowiedź jest przegłosowana = -2
  • Głosujesz za odpowiedzią = -1
  • Twoja odpowiedź została zaakceptowana = +15
  • Akceptujesz odpowiedź = +2

Twój program musi dowiedzieć się, ile z tych działań miało miejsce na koncie tego użytkownika, aby uzyskać dostęp do jego przedstawiciela. Musi ustalić najkrótszą liczbę akcji, aby dostać się do tego poziomu powtórzeń. Przykłady:

Wejście: 11 Wyjście: 1 odpowiedź pozytywna

Dane wejściowe: 93 Dane wyjściowe: zaakceptowano 6 odpowiedzi, zaakceptowano 1 odpowiedź

W tych przykładach, kiedy mówię „pytanie głosujące”, oznacza to, że queston tej osoby został pozytywnie oceniony. Kiedy mówię „odpowiedź negatywnie oceniona”, oznacza to, że ocenili cudzą odpowiedź.

Zasady:

, więc wygrywa najkrótszy kod, który może to zrobić.

Doktor
źródło
8
Istnieje nieskończona liczba sposobów na uzyskanie dowolnej reputacji. Wystarczy zaimplementować „odpowiedź pozytywna” i „odpowiedź negatywna”, aby zawsze znaleźć sposób, więc nie ma bodźca do korzystania z szerszego podzbioru zmian wyniku. Czy to jest to, co zamierzałeś?
algorytm
Edytowano @al algorytmshark. Musisz znaleźć najmniejszą liczbę działań, które Cię tam doprowadzą
TheDoctor
„” „Często widzę, że przeglądając stronę Stackexchange, zaczynam się zastanawiać, jak ludzie zdobywają taką reputację, jaką mają.” „„ Vs ”„ „Musisz znaleźć najmniejszą liczbę działań, które cię tam doprowadzą” „”. Drugi cytat niekoniecznie jest poprawną odpowiedzią na pierwszy cytat.
1
@ algorytmshark Ogólnie zgadzam się z twoimi komentarzami. Jednak 6 odpowiedzi przyjmuje + 1 odpowiedź jest równa 6 * 15 + 2 = 92, a nie 93! Nie widzę sposobu, aby to zrobić w 7 działaniach, ale mogę to zrobić w odpowiedzi 8: 6, jedno pytanie pozytywne, jedno pytanie negatywne: 6 * 15 + 5-2 = 93. Doktorze, jeśli istnieje więcej niż jedna możliwość „najmniejszej liczby działań”, czy musimy je wszystkie znaleźć, czy tylko jedną?
Level River St
1
@steveverrill zaczynasz od 1 powtórzenia
TheDoctor

Odpowiedzi:

3

Golfscript, 162 144 bajty

{{}if}:?;~.)15/:^15*-:~3>1~8>' answer ':A' question 'if'upvote'++?^^A'accept'+:C+^1>{'s'+}??~5%:,4<,1>&1C'ed'++?,2%!1A'downvote'++,4<{'d'+}??]n*

Jak to działa

Ogólna idea jest dokładnie taka sama jak w mojej odpowiedzi na Bash .

{{}if}:?;         # Create an `if' statement with an empty `else' block.
                  #
~.)15/:^          # Interpret the input string, subtract 1 from its only element (the
                  # reputation score), divide by 15 and save the result in `^'. This gives
                  # the number of accepted answers.
                  #
15*-:~            # Multiply the number of accepted answer by 15 and subtract the product
                  # from the reputation score. Save the result in `~'.
                  #
3>                # If the result is greater than 3:
                  #
  1               # Push 1 on the stack.
                  #
  ~8>             # If the result is greater than 8:
                  #
    ' answer ':A  # Push `answer' on the stack. Either way, save the string in `A'.
                  #
    ' question '  # Otherwise, push `question' on the stack.
                  #
  if              #
                  #
  'upvote'++      # Push `upvote' on the stack and concatenate the three strings.
                  #
?                 #
                  #
^                 # If the number of accepted answers is positive:
                  #
  ^A'accept'+:C+  # Push the number, concatenated with the string ` answer accept', on the
                  # stack. Either way, the string in `C'.
                  #
  ^1>             # If the number of accepted answers is greater than 1:
                  #
    {'s'+}        # Cocatenate the previous string with `s', for proper pluralization.
                  #
  ?               #
                  #
?                 #
                  #
~5%:,             # Calculate the reputation score modulus 5. Save the result in `,'.
                  #
4<,1>&            # If the result is less than 4 and greater than 1:
                  #
  1C'ed'++        # Push the string `1 answer accepted' on the stack.
                  #
?                 #
                  #
,2%!              # If the result is odd:
                  #
  1A'downvote'++  # Push the string `1 answer downvote' on the stack.
                  #
  ,4<             # If the result is less than 4:
                  #
    {'d'+}        # Concatente the previous string with `d'.
                  #
  ?               #
                  #
?                 #
                  #
]n*               # Join the array formed by all strings on the stack, separating the
                  # strings by newlines. This is the output.
Dennis
źródło
9

Bash, 247 202 192 bajtów

n=$1 bash <(sed 's/E/)echo /;s/C/ Aaccept/;s/A/answer /
s/.*)/((&)\&\&/'<<<'a=(n+1)/15,a-1)s=s;q=question
aE$aC$s
r=n%5,r-4)d=d&&
r>1E1Ced
1-r%2E1 Adownvote$d
n-=15*a,n>8)q=A
n>3E1 $q upvote')

Jak to działa

Po wykonaniu polecenia przez sed zostanie wykonany następujący skrypt bash:

((a=(n+1)/15,a-1))&&s=s;q=question
((a))&&echo $a answer accept$s
((r=n%5,r-4))&&d=d&&
((r>1))&&echo 1 answer accepted
((1-r%2))&&echo 1 answer downvote$d
((n-=15*a,n>8))&&q=answer 
((n>3))&&echo 1 $q upvote

Aby uzyskać optymalne rozwiązanie (minimalna liczba zdarzeń w celu uzyskania nreputacji), wystarczy obliczyć liczbę zaakceptowanych odpowiedzi ( a) niezbędnych do uzyskania reputacji poniżej 16 (1 odpowiedź zaakceptować) i postępować z resztą w następujący sposób:

1  (no rep change)
2  answer accepted, answer downvoted
3  answer accepted
4  question upvote, answer downvote
5  question upvote, answer downvoted
6  question upvote
7  question upvote, answer accepted, answer downvoted
8  question upvote, answer accepted
9  answer upvote, answer downvote
10 answer upvote, answer downvoted
11 answer upvote
12 answer upvote, answer accepted, answer downvoted
13 answer upvote, answer accepted  
14 answer accept, answer downvote
15 answer accept, answer downvoted
Dennis
źródło
2
Dzięki za wyjaśnienie, nie jest łatwo poradzić sobie -2i -1przegłosować.
AL
6

Perl, 500 263 256 208 bajtów

Scenariusz rep.pl :

$_=1+pop;sub P($){print$=,@_,$/}$;=" answer ";$:="$;downvote";($==$_/15)&&P"$;accept"."s"x($=>1);$_%=15;$==1;P"$;upvote",$_-=10if$_>9;P" question upvote",$_-=5if$_>4;P"$;accepted"if$_>2;P$:."d"if$_%2;P$:if!$_

Stosowanie

Dane wejściowe są oczekiwane jako dodatnia liczba całkowita podana jako argument skryptu. Różne akcje są wyprowadzane jako linie.

Testy

perl rep.pl 11
1 answer upvote

perl rep.pl 93
6 answer accepts
1 answer accepted

perl rep.pl 1

perl rep.pl 4
1 question upvote
1 answer downvote

perl rep.pl 12
1 answer upvote
1 answer accepted
1 answer downvoted

perl rep.pl 19
1 answer accept
1 question upvote
1 answer downvote

perl rep.pl 34
2 answer accepts
1 question upvote
1 answer downvote

perl rep.pl 127
8 answer accepts
1 question upvote
1 answer accepted
1 answer downvoted

perl rep.pl 661266
44084 answer accepts
1 question upvote

Nie golfił

$_ = pop() + 1; # read the reputation as argument,
                # remove the actionless start reputation
                # and add a bias of two to calculate
                # the answer accepts in one division.

# Actions
# -------
# answer accepts:      Your answer is accepted    = +15
# answer upvotes:       Your answer is upvoted     = +10
# question upvotes:     Your question is upvoted   = +5
# answers accepted:     You accept an answer       = +2
# answers downvoted:    You downvote an answer     = -1
# answer downvotes:     Your answer is downvoted   = -2
# (questions downvoted: Your question is downvoted = -2) not used

# Function P prints the number of actions in $= and
# the action type, given in the argument.
# The function is prototyped "($)" to omit the
# parentheses in the usage.
sub P ($) {
    print $=, @_, $/ # $/ is the line end "\n"
}
# abbreviations,
# special variable names to save a space if a letter follows
$; = " answer ";
$: = "$;downvote";

# Calculation and printing the result
# -----------------------------------
($= = $_ / 15) && # integer division because of the special variable $=
P "$;accept" .
  "s" x ($= > 1); # short for: ($= == 1 ? "" : "s")
$_ %= 15;
$= = 1;           # now the action count is always 1 if the action is used
P "$;upvote",         $_ -= 10 if $_ > 9;
P " question upvote", $_ -=  5 if $_ > 4;
P "$;accepted"                 if $_ > 2;
P $: . "d"                     if $_ % 2;
P $:                           if ! $_

Starsza wersja

$_ = pop() + 1; # read the reputation as argument
                # subtract start reputation (1)
                # add bias (2)

# Actions
# -------
# $= answer accepts:      Your answer is accepted    = +15
# $b answer upvotes:      Your answer is upvoted     = +10
# $c question upvotes:    Your question is upvoted   = +5
# $d answers accepted:    You accept an answer       = +2
# $e answers downvoted:   You downvote an answer     = -1
# $f answer downvotes:    Your answer is downvoted   = -2
# -- questions downvoted: Your question is downvoted = -2

# Calculaton of answer accepts by a simple division that is
# possible because of the bias.
$= = $_ / 15; # integer division because of the special variable $=
$_ %= 15;

# The older version of the calculation can be simplified further, see below.
# Also the older version did not use the bias.
#
# function E optimizes the construct "$_ == <num>" to "E <num>"
# sub E {
#     $_ == pop
# }
#
# $d = $e = 1 if E 1;       #  1 =     +2 -1
# $d++ if E 2;              #  2 =     +2
#
# $c = $f = 1 if E 3;       #  3 =  +5 -2
# $c = $e = 1 if E 4;       #  4 =  +5 -1
# $c++ if E 5;              #  5 =  +5
# $c = $d = $e = 1 if E 6;  #  6 =  +5 +2 -1
# $c = $d = 1 if E 7;       #  7 =  +5 +2
#
# $b = $f = 1 if E 8;       #  8 = +10 -2
# $b = $e = 1 if E 9;       #  9 = +10 -1
# $b++ if E 10;             # 10 = +10
# $b = $d = $e = 1 if E 11; # 11 = +10 +2 -1
# $b = $d = 1 if E 12;      # 12 = +10 +2
#
# $=++, $f++ if E 13;       # 13 = +15 -2
# $=++, $e++ if E 14;       # 14 = +15 -1

$b++, $_ -= 10 if $_ > 9;
$c++, $_ -=  5 if $_ > 4;

# Now $_ is either 0 (-2), 1 (-1), 2 (0), 3 (1), or 4 (2).
# The number in parentheses is the remaining reputation change.

# The following four lines can be further optimized. 
# $f++        if ! $_;    # "! $_" is short for "$_ == 0"
# $e++        if $_ == 1;
# $d = $e = 1 if $_ == 3;
# $d++        if $_ == 4;

# Optimized version of the previous four lines:

$f++ if ! $_;
$e++ if $_ % 2;
$d++ if $_ > 2;

# function P optimizes the printing and takes the arguments for "print";
# the first argument is the action count and the printing is suppressed,
# if this action type is not needed.
sub P {
    print @_, $/ if $_[0]
    # $/ is "\n"
}

# some abbreviations to save some bytes
$; = " answer ";
$D = "$;downvote";

# output the actions

P $=, "$;accept", ($= == 1 ? "" : "s");
P $b, "$;upvote";
P $c, " question upvote";
P $d, "$;accepted";
P $e, $D, "d";
P $f, $D

Edycje

  • Przypadek 4 został naprawiony.
  • Upraszcza to również obliczenia, które są teraz wykonywane bez pętli.
  • Usunięto nieosiągalną liczbę mnogą „s”, funkcja S nie jest już potrzebna.
  • Zoptymalizowane obliczenia, funkcja E nie jest już potrzebna.
  • Dodano odchylenie 2 w celu zoptymalizowania obliczeń.
  • Większe przepisanie, aby usunąć większość zmiennych, inne sztuczki, aby zaoszczędzić niektóre bajty.
Heiko Oberdiek
źródło
zgodnie z tym, Jon Skeet ma 44084 odpowiedzi przyjmuje i 1 odpowiedź głosuje
TheDoctor
6
@TheDoctor: Zgodnie z pytaniem jest to minimalna liczba działań, aby uzyskać reputację 661266.
Heiko Oberdiek
4

R, 454 421

r=as.integer(commandArgs(T)[1])-1;p=function(...){paste(...,sep='')};a='answer ';b='accept';e='ed';f='d';v='vote';d=p('down',v);u=p('up',v);q='question ';z=c();t=r%/%15;if(t>0){z=c(p(t,' ',a,b));r=r%%15;};if(r%in%(8:12))z=c(z,p(a,u));if(r%in%(3:7))z=c(z,p(q,u));if(r%in%c(1,2,6,7,11,12))z=c(z,p(a,b,e));if(r%in%(13:14))z=c(z,p(a,b));if(r%in%c(3,8,13))z=c(z,p(a,d));if(r%in%c(1,4,6,9,11,14))z=c(z,p(a,d,f));cat(z,sep=', ')

Dzięki Dennisowi za odpowiedź, która bardzo mi pomogła.

Wersja bez golfa

# read input
r = as.integer(commandArgs(T)[1]) - 1

# shortcut to join strings (... will pass the parameter to paste() *as is*)
p = function(...) {paste(..., sep = '')}

# strings
a = 'answer '; b = 'accept'; e = 'ed'; f = 'd'
v = 'vote'; d = p('down',v); u = p('up',v)
q = 'question '

z = c()

# +15
t = r %/% 15;
if (t > 0) {
    z = c(p(t,' ',a,b))
    r = r %% 15
}

if (r %in% (8:12))              z = c(z,p(a,u));    # answer upvote
if (r %in% (3:7))               z = c(z,p(q,u));    # question upvote
if (r %in% c(1,2,6,7,11,12))    z = c(z,p(a,b,e));  # answer accepted
if (r %in% (13:14))             z = c(z,p(a,b));    # answer accept
if (r %in% c(3,8,13))           z = c(z,p(a,d));    # answer downvote
if (r %in% c(1,4,6,9,11,14))    z = c(z,p(a,d,f));  # answer downvoted

# print operations
cat(z,sep = ', ')
glin
źródło
4

JavaScript - 270 237 227 206 192 znaków

p=prompt,r=p()-1,a="1answer ",v="vote,";s=(r/15|0)+"answer accept,",r%=15;if(r>9)s+=a+"+"+v,r-=10;if(r>2)s+="1question +"+v,r-=5;r>0?s+=a+"accepted,":0;r<-1?s+=a+"-"+v:0;p(r&1?s+=a+"-voted":s)

Dokładnie tyle znaków, ile Bash (tak!) I pokonuje Pythona i Perla :) To obniża reputację do 14 po którym zajmuje kolejne niezbędne akcje, całkowicie w stylu pętli.

EDYCJA 1: Przekształcono \ns na ,s i przekonwertowałem jedenif blok na trójskładnikowy, i lepszą podłogę o krótkich nazwach.

EDYCJA 2: Wielkie podziękowania dla Alconji, która pomogła mi zmniejszyć 11 znaków. Następnie wprowadziłem kilka poprawek, aby zmniejszyć o 2 znaki więcej.


Starsza wersja:

r=prompt()-1,a="1answer ",q="1question ",v="vote,";s=(c=r/15|0)+"answer accept,",r-=c*15;if(r>9)s+=a+"+"+v,r-=10;if(r>2)s+=q+"+"+v,r-=5;r>0?s+=a+"accepted,":0;if(r<-1)s+=a+"-"+v;r&1?s+=a+"-voted":0;alert(s)

Test:

WEJŚCIE: 42
WYJŚCIE:

2answer accept,1answer +vote,1answer accepted,1answer -voted

/*I sincerely hope the output is clear and easy to make out*/

WEJŚCIE: 1337
WYJŚCIE:

89answer accept,1answer accepted,1answer -voted

Nieskluczony kod:

// different version from the golfed code
rep = prompt() - 1
string = ""

function $(z, c, k){
  while(rep > 0 && rep >= z - 2) c += 1 , rep -= z;

  if(c) string += c + k + "\n"
}

a=" answer ", q=" question "

$(15, 0, a + "accept")
$(10, 0, a + "upvote")
$(5, 0, q + "upvote")
$(2, 0, a + "accepted")

function _(z, c, str){
  while(rep <= z) c += 1, rep -= z

  if(c) string += c + str + "\n";
}

_(-2, 0, a + "downvote");
_(-1, 0, a + "downvoted");

alert(string);
Gaurang Tandon
źródło
Dlaczego pierwszy jest tylko Firefox?
TheDoctor
1
@TheDoctor Wykorzystuje funkcję JS dostępną obecnie tylko w Firefoksie - function name(args){}staje się, name=(args)=>{}a tym samym oszczędza wiele bajtów.
Gaurang Tandon
@TheDoctor Zaktualizowałem swój program, aby działał w różnych przeglądarkach i jest teraz znacznie krótszy niż wcześniej!
Gaurang Tandon
Twoja aktualna wersja używa tylko qraz, więc możesz ją wstawić. Możesz także upuścić czmienną i zrobić r%=15zamiast r-=c*15. Powinieneś sprowadzić cię do 195 znaków ( r=prompt()-1,a="1answer ",v="vote,";s=(r/15|0)+"answer accept,",r%=15;if(r>9)s+=a+"+"+v,r-=10;if(r>2)s+="1question +"+v,r-=5;r>0?s+=a+"accepted,":0;if(r<-1)s+=a+"-"+v;r&1?s+=a+"-voted":0;alert(s)).
Alconja,
@Alconja Wow! Wielkie dzięki! Nareszcie jestem bardzo blisko Basha! Jeszcze raz wielkie dzięki!
Gaurang Tandon
1

Game Maker Language, 276

p=real(keyboard_string())-1j="#"s=""z=" answer"w=" accept"x=" upvoted"+j;y=w+"ed"v=" question"u=" downvoted"if m=floor(p/15)s+=(m+z+y)+j;r=p-m*15if m=floor(r/10)s+=(m+z+x)r-=m*10if m=floor(r/5)s+=(m+v+x)r-=m*5n=floor(r/2)r-=n*2if m=r{n++;s+=(m+u+z)+j}s+=(n+y+z)show_message(s)
Timtech
źródło
1

C # - 391

Trochę długo i nie przetestowałem tego dokładnie (dużo). :)

class R{void Main(string[] a){var r=int.Parse(a[0])-1;var a=new[]{15,10,5,2};var o=new List<string>();Func<int,string>y=z=>{var w="";if(z==15)w=" answer accepted";if(z==10)w=" answer upvotes";if(z==5)w=" question upvotes";if(z==2)w=" answer accepts";return w;};foreach(var x in a)if(r/x>0){o.Add(r/x+y(x));r-=(r/x)*x;}if(r==1)o.Add("1 question downvotes");Console.Write(string.Join(", ",o));

Bez golfa - NOWOŚĆ

class R
{
    void Main(string[] a)
    {
        var r = int.Parse("122")-1; // subtracts 1 from total rep
        var a = new[] {15,10,5,2};
        var o = new List<string>();

        Func<int,string> y = 
            z => 
                {
                    var w="";
                    if(z==15) w=" answer accepted";
                    if(z==10) w=" answer upvotes";
                    if(z==5) w=" question upvotes";
                    if(z==2) w=" answer accepts";
                    return w;
                };

        foreach(var x in a) {
            if (r/x>0) {
                o.Add(r/x+y(x));
                r-=(r/x)*x;
            }
        }

        if(r==1)
            o.Add("1 question downvotes");

        Console.Write(string.Join(", ",o));
    }
}

Bez gry w golfa - STARY (409)

class R
{
    void Main(string[] a)
    {
        var r = int.Parse(a[0])-1; // subtracts 1 from total rep
        var v = new[] {" question"," answer"," downvotes"," upvotes"," accepts"," accepted"};
        var o = new List<string>();

        // Starts from 15, then checks all the lower values.
        if (r/15>0) {
            o.Add(r/15+v[1]+v[5]);
            r-=(r/15)*15; // automatic rounding down due to int
        }
        if(r/10>0) {
            o.Add(r/10+v[1]+v[3]);
            r-=(r/10)*10;
        }
        if(r/5>0) {
            o.Add(r/5+v[0]+v[3]);
            r-=(r/5)*5;
        }
        if(r/2>0) {
            o.Add(r/2+v[1]+v[4]);
            r-=(r/2)*2;
        }
        if(r==1) {
            o.Add("1"+v[0]+v[2]);
        }
        Console.Write(string.Join(", ",o));
    }
}

Test:

> prog.exe 120

7 answer accepted, 1 answer upvotes, 2 answer accepts 
jzm
źródło
1

Python - 213 207

p,k=__import__('itertools').combinations_with_replacement,int(input())
t,m,u=[5,10,-2,-1,15,2],[],iter(range(0,k))
while not m:m=list(filter(lambda v:k-1==sum(v),p(t,next(u))))
print(''.join(map(chr,m[0])))

Przeklinajcie długie nazwy funkcji!

Przykład: (zignoruj ​​końcowy znak nowej linii)

$ echo "93" | python per.py | hexdump -C
00000000  0f 0f 0f 0f 0f 0f 02 0a                           |........|

$ echo "11" | python per.py | hexdump -C
00000000  0a 0a                                             |..|
LemonBoy
źródło
Jak wyświetlasz liczbę pytań i odpowiedzi, głosów itp.? Twój kod nie zawiera tych ciągów (zobacz inne odpowiedzi), więc obawiam się, że dane wyjściowe nie są zgodne z regułami.
AL
Produkcja jest również golfa, ponieważ nie było żadnych wymagań. Nie traktuje osobno zanotowanych pytań / odpowiedzi osobno, ponieważ oba dają -2 punkty, wydrukowana lista wynikowa jest najkrótszą sekwencją do osiągnięcia wyniku.
LemonBoy
Tak, zasady nie zawierają szczegółów na temat tego punktu. Ale możesz zauważyć, że w innych odpowiedziach dane wyjściowe są standardowe i wyświetlają się odpowiedzi X , komentarze odpowiedzi Y , itd. Ale to nie jest problem, ponieważ nie masz najkrótszego kodu.
AL
@LemonBoy Próbowałem tego na trzech tłumaczach i to nie działa. Wszyscy mówią EOF. Czy możesz wskazać mi kompilator, który działa (i który powinienem zachować na przyszłość)?
Gaurang Tandon
1
@GaurangTandon westchnienie, próbujesz uruchomić kod Pythona za pomocą interpretera
coffeescript
1

C ++, 276 (316 w / obejmuje)

#include <stdio.h>
#include <stdlib.h>
p(int&q,int*d){int r;char*s[]={"downvoted","accepted","question","answer","upvoted"};
if(r=(q&&q>=*d)){q-=(*d?*d:2);printf("%s %s\n",s[*(++d)],s[*(++d)]);}return r;}main(
int n,char**v){int q=atoi(v[1]);int d[]={-1,3,0,0,3,1,5,4,2,10,4,3,15,1,3};n=15;while
(p(q,d+n-3)||(n-=3));}

Kompiluje z GCC, z ostrzeżeniami. Przykład:

$ ./a.out 0
$ ./a.out 1
accepted answer
downvoted answer
$ ./a.out 2
accepted answer
$ ./a.out 5
question upvoted
$ ./a.out 10
answer upvoted
$ ./a.out 15
answer accepted
$ ./a.out 16
answer accepted
accepted answer
downvoted answer
$ ./a.out 17
answer accepted
accepted answer

Możesz go przenieść na język, który nie wymaga deklaracji typu i opublikować go jako swój własny.

Jason C.
źródło
1

JavaScript - 273 256 235

p=prompt(s=j="\n")-1;z=" answer",w=" accept",x=" upvoted"+j,y=w+"ed",v=" question",u=" downvoted";if(m=p/15|0)s+=m+z+y+j;r=p-m*15;if(m=r/10|0)s+=m+z+x;r-=m*10;if(m=r/5|0)s+=m+v+x;r-=m*5;n=r/2|0;if(m=r-=n*2)n++,s+=m+u+z+j;alert(s+n+y+z)

Połączone obliczenia i produkcja, i grał w golfa w sumie do 287.

Edycja: wyjęto niektóre zmienne na kilka krótszych.

Usunięto podejście Math.Floor dla | 0.

Przeniesiono trochę inicjalizacji do parametru prompt (), usunięto kilka nawiasów, ostrzeżono o dołączeniu końcowego łańcucha.

Matt
źródło
Witamy w codegolf.SE! Instrukcje mówią: „Utwórz program, który zaakceptuje dodatnią liczbę całkowitą” ->, więc będziesz musiał użyć prompttej wartości i nie możesz na stałe zakodować tej wartości.
Gaurang Tandon
Bez obaw, dodano podpowiedź (), która podnosi go do 161.
Mat.
Po mądrzejszym znaku @ (GaurangTandon) (1) i podejściu do wyjścia alarmowego, aby przejść dalej. Zmniejszono także część zapisywanego ciągu znaków.
Matt
1

Python3, 188B

n=input()+1
a=n//15
n%=15
A='answer '
print("%d %saccepted\n%d %supvoted\n%d question upvoted\n%d accept %s\n%d downvote %s\n%d %sdownvoted"%(a,A,n//10,A,n%10//5,n%5>2,A,n%5%2,A,n%5==0,A))

Zastosowanie: python3 score.py <ret> 11 <ret>gdzie ten skrypt jest zapisywany jako score.py.

Przykładowe dane wyjściowe:

$ python score.py
5543
369 answer accepted
0 answer upvoted
1 question upvoted
1 accept answer 
0 downvote answer 
0 answer downvoted
Alexander-Brett
źródło
zaakceptowano = zaakceptuj + d, przegłosowano = przegłosowano + d, przegłosowano powtórzono.
Bill Woodger,
Tak, ale te zamiany nie zapisują ogólnie żadnych postaci - spróbuj i zobacz
Alexander-Brett