Zrób równiarkę matematyczną

17

Lubię uczestniczyć w konkursach matematycznych prowadzonych przez Mu Alpha Theta, honorowe stowarzyszenie matematyczne w Stanach Zjednoczonych. Podczas zawodów przystępuję do testu wielokrotnego wyboru składającego się z 30 pytań. Istnieje pięć opcji na pytanie, oznaczonych od A do E.

Mój wynik testu wynosi cztery punkty za każdą poprawną odpowiedź, zero punktów za pytanie pozostawione puste i jeden punkt ujemny za każdą błędną odpowiedź.

Napisz program oceniający test zgodnie z powyższym systemem punktacji. Dane wejściowe powinny zawierać dwa elementy: klucz odpowiedzi i odpowiedzi. Pytania pozostawione puste należy wpisać jako puste miejsca. Pierwsze wejście musi zawierać tylko litery AE (lub ae, twój wybór) i można założyć, że na wejściu nie ma białych znaków. Drugie wejście musi zawierać tylko puste spacje i litery AE (lub ae). Dane wejściowe, które nie realizują testów na 30 pytań, muszą zostać wydrukowane Invalid testjako dane wyjściowe.

Wyjście powinno być oceną lub Invalid test.

Premia

Jeśli twój program wydrukuje cyfrę po prawej, cyfrę po lewej stronie jest pusta, a cyfra jest niepoprawna po końcowym wyniku jako (aR bB cW), usuń 20 bajtów.

Przykładowe dane wejściowe

CABBDCABECDBACDBEAACADDBBBEDDA    //answer key
CABEDDABDC BACDBBAADE  CBBEDDA    //responses

Próbka wyjściowa

Bez premii

73

Premia

73 (20R 3B 7W)

Obowiązują standardowe zasady. Najkrótszy kod w bajtach wygrywa.

Arktur
źródło
Co powinniśmy zrobić ze spacjami w pierwszym wierszu?
lirtosiast
@ThomasKwa W pierwszym wierszu nie powinno być spacji. Invalid test.
Arcturus,
2
Wygląda na to, że zmieniłeś zasady po opublikowaniu odpowiedzi, co unieważniło co najmniej 2 z nich. Nie wprowadzaj zmian, które mogłyby unieważnić odpowiedzi po opublikowaniu wyzwania. Dobrym pomysłem jest skorzystanie z piaskownicy, aby uzyskać informację zwrotną przed opublikowaniem.
Alex A.,
Myślę, że byłoby to bardziej interesujące, jak podstępne
kot
co z rozróżnianiem wielkości liter? a co jeśli mój język jest ... niezadowolony z białych znaków? czy mogę określić białe znaki w danych wejściowych zamiast tego powinny być podkreślenia?
kot

Odpowiedzi:

7

Pyth, 53 51

?&!-sJ.z+d<G5&FqR30lMJ+sm?qFd4_1CJ/eJd"Invalid test

Wypróbuj online

Sprawdzanie odbywa się poprzez sprawdzenie, czy całe wejście zawiera jakieś znaki, gdy wszystkie spacje i a-esą usunięte, oraz poprzez sprawdzenie, czy oba ciągi mają długość 30.

Wynik obliczenia dokonuje skompresowanie dwie linie razem, a następnie przez odwzorowanie każdej pary do: (letters are equal) ? 4 : -1. Następnie po prostu sumując wartości i dodając liczbę spacji w drugiej linii z powrotem do wyniku.

FryAmTheEggman
źródło
1
Bez błędów. (Obecnie mniej bajtów niż odpowiedź Dennisa ...)
Arcturus,
7

Poważnie , 86 bajtów

,`;l5╙¬=);' UΣS" ABCDE"=(**;l`Mi@)=YWé"Invalid test"0WX@Z```i@;(=5*(' =D+`(;l@)5╙¬=IMΣ

Pobiera dane jak "CABBDCABECDBACDBEAACADDBBBEDDA", "CABEDDABDC BACDBBAADE CBBEDDA"

Wypróbuj online (będziesz musiał ręcznie wprowadzić dane, ponieważ permalinki nie lubią cytatów)

Pracuję teraz nad premią. Nie, dodanie premii kosztowałoby ponad 20 bajtów.

Wiedziałem, że coś zapomniałem ... Invalid Testnie było drukowane w przypadku błędu. Mam nadzieję, że Dennis przestanie grać w golfa.

Mego
źródło
Czy to? Poważnie? Potem muszę to zagłosować
edc65
4

JavaScript (ES6), 134 bajty

Edycja: Wymagania dotyczące pytań uległy zmianie. Ta odpowiedź pochodzi z sytuacji, gdy program musiał upewnić się, że każdy znak odpowiedzi to AE, każdy znak odpowiedzi to AE lub spacja i oba mają długość 30, w przeciwnym razie zwracają Invalid test.

(a,r)=>[...a].map((q,i)=>q>"E"|q<"A"?x=1:(c=r[l=i])==" "?0:c>"E"|c<"A"?x=1:c==q?s+=4:s--,s=x=0)&&x|l!=29|r.length!=30?"Invalid test":s

Wyjaśnienie

(a,r)=>                   // a = answer string, r = responses string
  [...a].map((q,i)=>      // iterate over answers, q = answer, i = question number
    q>"E"|q<"A"?x=1:      // x = 1 if answer is invalid
    (c=r[l=i])==" "?0:    // c = question response, l = answer length, add 0 for space
    c>"E"|c<"A"?x=1:      // x = 1 if response is invalid
    c==q?s+=4:s--,        // add 4 if correct, subtract 1 if incorrect
    s=x=0                 // s = total score, x = is invalid
  )&&
    x|l!=29|r.length!=30? // check input lengths for validity
      "Invalid test":
      s                   // return the score

Test

<input type="text" id="answers" value="CABBDCABECDBACDBEAACADDBBBEDDA" /><br />
<input type="text" id="responses" value="CABEDDABDC BACDBBAADE  CBBEDDA" /><br />
<button onclick='result.innerHTML=(

(a,r)=>[...a].map((q,i)=>q>"E"|q<"A"?x=1:(c=r[l=i])==" "?0:c>"E"|c<"A"?x=1:c==q?s+=4:s--,s=x=0)&&x|l!=29|r.length!=30?"Invalid test":s

)(answers.value,responses.value)'>Go</button><pre id="result"></pre>

użytkownik 81655
źródło
3

CJam, 60 bajtów

2{l_,30=\N?}*_2$|S'F,65>+-!@2$.{=4W?}@' f=+:+"Invalid test"?

Wypróbuj online w interpretatorze CJam .

Dennis
źródło
3

JavaScript (Firefox 31+), 86 bajtów

(x,y)=>(r=i=0,[for(l of y)x[i++]==l?r+=4:r-=l!=' '],i!=30|i-x.length?'Invalid test':r)

Korzysta ze zrozumienia tablic zaproponowanego dla ES7. Dlatego wsparcie jest obecnie ograniczone do przeglądarki Firefox.

Z bonusem 106 bajtów (126-20)

(x,y)=>[r=w=i=0,[for(l of y)x[i++]==l?r++:w+=l!=' '],`${r*4-w} (${r}R ${i-r-w}B ${w}W)`,'Invalid test'][i!=30||i-x.length?3:2]

Edycja: Wcześniej moje rozwiązanie sprawdzało tylko odpowiedź lub długość pytania, teraz sprawdza oba.

George Reith
źródło
Możesz pominąć f=na początku i powiedzieć, że generuje to funkcję lambda.
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Dzięki, zawsze zapominam, że to ich testowanie -_-
George Reith
Byłoby to znacznie krótsze bez premii. 86 bajtów:(x,y)=>(r=i=0,[for(l of y)x[i++]==l?r+=4:r-=l!=' '],i!=30|i-x.length?'Invalid test':r)
user81655,
@ user81655 To prawda, dziękuję ... trochę się w to wplątałem ... sam ciąg szablonu ma 34 bajty
George Reith,
Mam bardzo podobną odpowiedź, ale nie skopiowałem tej (moja pierwsza próba jest precedensowa, ale usunąłem ją, ponieważ nie sprawdzałem długości). To powiedziawszy: nie jest to ważne pomimo 3 głosów pozytywnych, ponieważ nie sprawdza zakresu A ... E
edc65
2

Japt , 71 bajtów

Japt to skrócona wersja Ja vaScri pt . Interpretator

Ul ¥30©Vl ¥30«(U+V k"[A-E ]+" ?U¬r@VgZ ¥Y?X+4:VgZ ¥S?X:X-1,0 :`InvÃ. È.

Dwa .s przy końcu powinny być niezadrukowane unicode U + 0017 + 0099 i U, odpowiednio.

Jak to działa

Ul ==30&&Vl ==30&&!(U+V k"[A-E ]+" ?Uq r@VgZ ==Y?X+4:VgZ ==S?X:X-1,0 :"Invalid test
                    // Implicit: U = first input, V = second input
Ul ==30&&Vl ==30&&  // If both input lengths are 30, and
!(U+V k"[A-E ]+"?   // removing all ABCDE and spaces from (U+V) results in an empty string:
Uq r@            ,0 //  Reduce U with this function, starting with a value of 0:
VgZ ==Y?            //   If the matching char in V is equal to this char, 
X+4                 //    return previous value + 4.
:VgZ ==S?X          //   Else if the matching char in V is a space, return previous value.
:X-1                //   Else (if it's wrong), return previous value - 1.
:"Invalid test      // Else, return "Invalid test".
                    // Implicit: output last expression

Mam nadzieję, że istnieje krótszy sposób, aby upewnić się, że obie długości są równe 30. Sugestie mile widziane!

ETHprodukcje
źródło
2

Haskell, 144 138 bajtów

a%b|map length[a,b]==[30,30]&&"ABCDE"!a&&"ABCDE "!b=show$sum$zipWith(?)a b|0<1="Invalid test"
l!s=all(`elem`l)
_?' '=0
x?y|x==y=4|0<1=0-1

Byłoby około 50 bez walidacji. sniff .

Stosowanie: "ABCDEABCDEABCDEABCDEABCDEABCDE" % "AAAAABBBBBCCCCCDDDDDEEEEEAAAAA"

Leif Willerts
źródło
1
!można zdefiniować jako all(`elem`l)soszczędzając 6 bajtów.
Zgarb
1
... lub przejdź pointfree: g=all.flip elem.
nimi
2

C #, 162 154 148 134 bajtów

string g(string k,string a)=>k.Length!=30||a.Length!=30?"Invalid Test!":Enumerable.Range(0,30).Sum(e=>a[e]==' '?0:k[e]==a[e]?4:-1)+"";

Stosowanie

g("CABBDCABECDBACDBEAACADDBBBEDDA", "CABEDDABDC BACDBBAADE  CBBEDDA")

Test

http://csharppad.com/gist/15f7c9c3c8cfce471ff2

noisyass2
źródło
Możesz to zmienić, int s=0,i=0;for(;...aby zapisać 3 bajty.
LegionMammal978,
To nie zadziała, jeśli wprowadzę 29 znaków dla pierwszego wejścia i 31 dla drugiego. Powinien wydrukować „niepoprawny test”, ale faktycznie spróbuje ocenić.
Johan
@ noisyass2: string x (string k, string a) => k.Length! = 30 || a.Length! = 30? „Invalid Test!”: Enumerable.Range (0,30) .Sum (e => a [e] == ''? 0: k [e] == a [e]? 4: -1) + ""; (134 znaków) i rozważa wkład Johansa.
Stephan Schinkel
+1 za rozwiązanie, ale czy to się kwalifikuje? OP powiedział pełny program.
Yytsi,
Johan niezły chwyt! @StephanSchinkel dzięki za pomysł na użycie delegata i bitu Enum.range. Byłem w stanie ogolić 3 kolejne znaki zmieniając warunek na 30 == (k.Length & a.Length)
noisyass2
2

Ruby, 81 znaków

->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}

Przykładowy przebieg:

2.1.5 :001 > ->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}['CABBDCABECDBACDBEAACADDBBBEDDA','CABEDDABDC BACDBBAADE  CBBEDDA']
 => 73 

2.1.5 :002 > ->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}['CCCATCH','CABEDDABDC BACDBBAADE  CBBEDDA']
 => "Invalid test" 
człowiek w pracy
źródło
2

Jawa, 183 169 bajtów

To była niezła praktyka Java 8:

String f(String a,String r){return a.length()==30&r.length()==30?""+IntStream.range(0,30).map(i->a.charAt(i)==r.charAt(i)?4:r.charAt(i)!=' '?-1:0).sum():"Invalid test";}
RCB
źródło
Nie jestem golfistą Java, ale myślę, że możesz to zapisać, String.valueOfdodając int do pustego ciągu ( ""+IntStream....) - Wierzę też, że Java pozwala na brak zwarć, więc możesz usunąć jeden z nich &i zapisać bajt .
VisualMelon,
@VisualMelon Świetne wskazówki, dzięki. Denerwowało mnie, ile bajtów zajęła String.valueOf!
RCB
2

pieprzenie mózgu, 354 bajty

+[--[>]<<+>-],----------[[<<<]>>->[>>>],----------]<<<[<<<]>>+[<-[-------<+>]<.+[---<+>]<.++++++++.[-<+++>]<-.+++++++++++.---.-----.-[---<+>]<-.---[-<++++>]<.+++[-<+++>]<.[---<+>]<----.+.>]>[[>,----------->+++++++[<---<<+++>>>-]<[<<+[>>+<<-]]>[>]<<<[>[>+>+<<-]>>[<<+>>-]>[>>>]>----<<<<[<<<]>>[-]]>[>-<-]>[>>[>>>]>-----<<<<[<<<]>[-]]>>]----[>+++<--]>--.<]

Wymaga interpretera, który pozwala przejść w lewo od komórki 0. Wyjście jest bajtem ze znakiem. Na przykład bajt 0x49jest drukowany dla przykładowego wejścia i 0xFFjest drukowany dla wejścia z tym samym pierwszym wierszem, ale drugi wiersz zastąpiono „C” i 29 spacjami.

Wynik zaczyna się od 0, a gdy czytany jest drugi wiersz danych wejściowych, wprowadza się do niego następujące zmiany:

  • Dane wejściowe są prawidłowe: nic nie rób
  • Błędne dane wejściowe: odejmij 5
  • Dane wejściowe to spacja: odejmij 4

Na koniec dodaje się 120. Jest to funkcjonalnie to samo, co zakładanie idealnego wyniku i stosowanie kar, zamiast rozpoczynania od 0.

Z komentarzami:

+[--[>]<<+>-]                          Get 29

,----------[[<<<]>>->[>>>],----------] Get first line of input; for each char sub one
                                       from the 29

<<<[<<<]>>+                            Add one to the cell that originally held 29

[                                      If the cell that originally held 29 is nonzero:

  Write "Invalid test"
  <-[-------<+>]<.+[---<+>]<.++++++++.[-<+++>]<-.+++++++++++.---.-----.-[---<+>]<-.---[-<++++>]<.+++[-<+++>]<.[---<+>]<----.+.

>]

>[                                     If the cell to the right is nonzero:

  This block is only ever entered if "Invalid test" isn't written!

  [                                      For all 30 characters of the first input:

    >,                                     Get char from second input to the right

    ----------                             Subtract 10 for consistency

    -                                      Subtract one more

    >+++++++[<---<<+++>>>-]                Subtract 21 (plus above lines = 32)

    <[                                     If it's nonzero:

      <<+[>>+<<-]                            Add 22 to the character

    ]

    >[>]<<<[                                 If the above block wasn't entered:

      >[>+>+<<-]>>[<<+>>-]                   Make a copy of the character from input 1

      >[>>>]>----                            Subtract 4 from the score

      <<<<[<<<]>>[-]                         Go to the cell just before first character

    ]

    >[>-<-]                                Subtract input 1 char from input 2 char

    >[                                     If the result is nonzero:

      >>[>>>]>-----                          Subtract 5 from the score

      <<<<[<<<]>[-]                          Go back to the result and set it to 0

    ]

    >>                                     Move on to next character

  ]

  ----[>+++<--]>--                       Add 120 to score (perfect score)

  .                                      Print score

  <                                      Go to an empty cell to kill loop

]
podziemny monorail
źródło
1

Python 3, 187 179 175 165 155 151

lambda a,b:(['Invalid test',sum([-1,4][i==j]for i,j in zip(a,b))+b.count(' ')][len(a)==len(b)==30and set(a)^set('ABCDE')==set(b)^set('ABCDE ')==set()])
Trang Oul
źródło
1

JavaScript ES7, 102

Jak zwykle bonus nie jest wart wysiłku.

(k,h,t=i=0)=>[for(x of h)t+=k[i++]==x?4:1-x?0:-1]|/[^ A-E]/.test(k+h)|i-30|k.length-i?"Invalid test":t

Sprawdzanie nieprawidłowych spacji na pierwszym wejściu (jak dla mnie ma to sens) 112

(k,h,t=i=0)=>[for(x of h)(y=k[i++])>' '?t+=y==x?4:1-x?0:-1:k=h+h]|/[^ A-E]/.test(k+h)|i-30|k[i]?"Invalid test":t
edc65
źródło
Ugh, walidacja zajęła połowę mojego kodu, kiedy próbowałem: (k,r,s=0)=>/^[A-E]{30}$/.test(k)&&/^[ A-E]{30}$/.test(r)?Object.keys(k).map(i=>k[i]==r[i]?s+=4:s-=r[i]!=' ').pop():'Invalid Test'ma 129 bajtów.
Neil,
1

Python 2.7, 131, 116, 109 , 139

Próbowałem zrobić „krótkie” rozwiązanie Pythona ... Cóż, oto sugestie są mile widziane

lambda c,d:d.count(' ')+sum([-1,4][a==b]for a,b in zip(c,d)if b!=' ')if not set('ABCDE ')^set(c+d)and len(c)==len(d)==30 else'Test Invalid'

Dodanie kilku dodatkowych znaków sprawia, że ​​jest on znacznie bardziej czytelny ...

def m(c, d):
    if len(c)==len(d)==30:return d.count(' ')+sum((a==b)*4+(a!=b)*-1 for a,b in zip(c,d)if b!=' ')
    return'Test Invalid'
N3buchadnezzar
źródło
1

Prolog, 165 bajtów

Ponad połowa bajtów służy do sprawdzenia nieprawidłowych testów.

Kod:

p(X,X,4).
p(_,32,0).
p(_,_,-1).
A*B:-length(A,30),length(B,30),subset(A,`ABCDE`),subset(B,`ABCDE `),maplist(p,A,B,L),sum_list(L,S),write(S);write('Invalid Test').

Wyjaśniono:

p(X,X,4).                                       % If corresponding elements are equal, 4p
p(_,32,0).                                      % If answer is 'space', 0p
p(_,_,-1).                                      % Else, -1p
A*B:-length(A,30),length(B,30),                 % Check that input is of correct length
     subset(A,`ABCDE`),subset(B,`ABCDE `),      % Check that input has correct characters
     maplist(p,A,B,L),sum_list(L,S),write(S);   % Create a list of scores (L) and print sum
     write('Invalid Test').                     % If anything failed, write Invalid Test

Przykład:

`CABBDCABECDBACDBEAACADDBBBEDDA`*`CABEDDABDC BACDBBAADE  CBBEDDA`.
73

Wypróbuj online tutaj

Emigna
źródło
1

MATLAB, 92 90 bajtów

Dzięki Tomowi Carpenterowi za pomoc w zmniejszeniu mojej odpowiedzi o 2 bajty!

function c(q,a),if nnz(q)~=30,t='Invalid test';else s=q-a;t=5*nnz(~s)-sum(s<9);end,disp(t)

Funkcję można wywołać, przypisując arkusz odpowiedzi do q, a przesłane odpowiedzi do a . na przykład:

c('CABBDCABECDBACDBEAACADDBBBEDDA','CABEDDABDC BACDBBAADE  CBBEDDA')

Odpowiedź jest po prostu drukowana na ekranie. 8 bajtów można zapisać, jeśli można wydrukować ans = 73

slvrbld
źródło
Możesz zapisać 2 bajty, zastępując numel(q)je nnz(q).
Tom Carpenter
1

C # 6.0 -> (270-20 = 250) 246-20 = 226 bajtów

void m(string b,string c){if((b+c).Length==60){var a=new int[3];int s=0;for(int i=0;i<30;i++){if(b[i]==c[i]){a[0]++;s+=4;}else if(c[i]==' ')a[2]++;else{a[1]++;s--;}}Console.Write(s+$" ({a[0]} {a[2]} {a[1]})");}else Console.Write("Invalid test");}

Wersja do odczytu i bez golfa:

    void m(string b, string c)
    {
        if ((b+c).Length==60)
        {
            var a = new int[3];
            int s = 0;
            for (int i = 0; i < 30; i++)
            {
                if (b[i]==c[i])
                {
                    a[0]++;
                    s+=4;
                }
                else if (c[i] == ' ')a[2]++;
                else
                {
                    a[1]++;
                    s--;
                }
            }
            Console.Write(s+$" ({a[0]} {a[2]} {a[1]})");
        }
        else Console.Write("Invalid test");
    }

Naprawdę chciałem otrzymać bonus: D

Yytsi
źródło
Dobra robota! Kilka ogólnych sztuczek, które mają tutaj zastosowanie, możesz zadeklarować iwraz z spoza pętlą for. Możesz użyć vardo deklaracji a, oszczędzając 1 bajt (hurra!). Nie potrzebujesz wielu nawiasów klamrowych {}w kodzie, co zawsze jest dobrym sposobem na przycinanie bajtów, i zawsze warto spojrzeć na tabelę ASCII podczas porównywania znaków (możesz odrzucić bajt c[i]==' 'nieco używając nierówności). Powinieneś także rozważyć liczenie ciągów wstecz - w tym przypadku możesz zaoszczędzić co najmniej 1 bajt, nieco przechodząc do pętli for.
VisualMelon,
Unfortunately, your submission is currently not complicit with the criteria, as it is unable to recognise invalid inputs.
VisualMelon
@VisualMelon Ahh, I feel so dumb. I wrote this submission at school so I forgot to add the 'invalid test' things etc. I'll add them :)
Yytsi
@VisualMelon Yeah, this was submitted and written in school at the end of the class, I'll edit it. Thanks for the tricks :)
Yytsi
0

Groovy 2.4.5, 107 bytes

Just a simple translation of the earlier Java answer.

f={a,b->a.length()==30&b.length()==30?(0..29).collect{a[it]==b[it]?4:b[it]!=' '?-1:0}.sum():'Invalid test'}
J Atkin
źródło
0

C, 273 - 20 = 253 bytes

#include<stdio.h>
#include<string.h>
int main(int c,char**v){char*p=v[1],*q=v[2],*s=" ABCDE",r[]={0,0,0};if(strspn(p,s+1)!=30||p[30]||strspn(q,s)!=30||q[30])puts("Invalid test");else{for(;*p;++q)++r[(*p++!=*q)+(*q==' ')];printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]);}}

I've taken the bonus, even though it cost me 23 bytes just to print it. :-(

Explanation

#include <stdio.h>
#include <string.h>
int main(int c,char**v)
{
    char *p=v[1], *q=v[2],      /* arguments */
        *s=" ABCDE",            /* valid chars */
        r[]={0,0,0};            /* results - right, wrong, blank */

    if (strspn(p,s+1) != 30     /* validity check - answer key begins with [A-E]{30} */
        || p[30]                /* and ends there */
        || strspn(q,s) != 30    /* same for answers, but allow space, too */
        || q[30])
    {
        puts("Invalid test");
    } else {
        for ( ;  *p;  ++q)      /* for each answer */
            ++r[(*p++!=*q)+(*q==' ')]; /* increment the appropriate counter */
        printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]); /* print result */
    }
}

Jest dwa razy więcej kodu do sprawdzenia pod kątem nieprawidłowych danych wejściowych niż do policzenia odpowiedzi - prawdziwe wyzwanie jest w for loop near the end. In fact here's a version that assumes the input is always valid, in 163-20 = 143 bytes:

#include<stdio.h>
int main(int c,char**v){char*p=v[1],*q=v[2],r[]={0,0,0};for(;*p;++q)++r[(*p++!=*q)+(*q==' ')];printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]);}

I taki, który przyjmuje to samo założenie i drukuje tylko wynik, w 133 bajtach:

#include<stdio.h>
int main(int c,char**v){char*p=v[1],*q=v[2],r[]={4,-1,0};for(c=0;*p;++q)c+=r[(*p++!=*q)+(*q==' ')];printf("%d",c);}
Toby Speight
źródło
0

SAS 9.4, 291-20 = 271 bytes(with bonus), or 231 bytes(without bonus)

Z premią:

data a;k='CABBDCABECDBACDBEAACADDBBBEDDA';r='CABEDDABDC BACDBBAADE  CBBEDDA';c=0;b=0;w=0;if length(k) ne 30 then put "Invalid test";do i=1 to 30;if substr(k,i,1)=substr(r,i,1) then c=c+1;else if substr(r,i,1) =' ' then b=b+1;else w=w+1;end;a=cat(c*4-w,' (',c,'R ',b,'B ',w,'W)');put a;run;

Bez premii:

data a;k='CABBDCABECDBACDBEAACADDBBBEDDA';r='CABEDDABDC BACDBBAADE  CBBEDDA';c=0;if length(k) ne 30 then put "Invalid test";do i=1 to 30;if substr(k,i,1)=substr(r,i,1) then c=c+4;else if substr(r,i,1)ne' ' then c=c-1;end;put c;run;

Sas tak naprawdę nie ma wejścia / wyjścia, więc trzeba zastąpić k = „..” kluczem, a r = „..” odpowiedzią. Dane wyjściowe są drukowane w dzienniku.

TMP4
źródło