Buat Grader Kompetisi Matematika

17

Saya menikmati berpartisipasi dalam kompetisi matematika yang dijalankan oleh Mu Alpha Theta, sebuah masyarakat kehormatan matematika di Amerika Serikat. Di kompetisi, saya mengikuti tes pilihan ganda 30 pertanyaan. Ada lima pilihan per pertanyaan, berlabel A hingga E.

Skor saya pada tes adalah empat poin untuk setiap jawaban yang benar, nol poin untuk pertanyaan yang dibiarkan kosong, dan negatif satu poin untuk setiap jawaban yang salah.

Tulis program yang menilai ujian berdasarkan sistem penilaian di atas. Seharusnya ada dua komponen input: kunci jawaban diikuti oleh tanggapan. Pertanyaan yang dibiarkan kosong harus dimasukkan sebagai ruang kosong. Input pertama harus hanya berisi huruf AE (atau ae, pilihan Anda), dan dapat diasumsikan bahwa tidak ada spasi kosong dalam input. Input kedua hanya boleh berisi spasi kosong dan huruf AE (atau ae). Input yang tidak menerapkan tes 30-pertanyaan harus dicetak Invalid testsebagai output.

Outputnya harus grade atau Invalid test.

Bonus

Jika program Anda mencetak angka dengan benar, angka dibiarkan kosong, dan angka salah setelah skor akhir sebagai (aR bB cW) , lepas 20 byte.

Masukan sampel

CABBDCABECDBACDBEAACADDBBBEDDA    //answer key
CABEDDABDC BACDBBAADE  CBBEDDA    //responses

Output sampel

Tidak ada bonus

73

Bonus

73 (20R 3B 7W)

Aturan standar berlaku. Kode terpendek dalam byte menang.

Arcturus
sumber
Apa yang harus kita lakukan dengan spasi di baris pertama?
lirtosiast
@ThomasKwa Seharusnya tidak ada spasi di baris pertama. Invalid test.
Arcturus
2
Tampaknya Anda mengubah aturan setelah jawaban diposting, yang membatalkan paling tidak 2 di antaranya. Tolong jangan lakukan perubahan yang dapat membatalkan jawaban setelah sebuah tantangan dikirimkan. Sebaiknya gunakan Sandbox untuk mendapatkan umpan balik sebelum memposting.
Alex A.
Saya pikir ini akan menjadi lebih menarik sebagai curang
kucing
bagaimana dengan sensitivitas kasus? juga, bagaimana jika bahasa saya ... tidak disukai oleh spasi putih? dapatkah saya menentukan spasi di input harus garis bawah?
kucing

Jawaban:

7

Pyth, 53 51

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

Cobalah online

Pemeriksaan dilakukan dengan melihat apakah seluruh input berisi karakter apa pun ketika semua spasi dan a-edihapus, dan dengan memeriksa apakah kedua string memiliki panjang 30.

Perhitungan skor dilakukan dengan zipping dua baris bersama-sama, maka dengan memetakan setiap pasangan untuk: (letters are equal) ? 4 : -1. Kemudian cukup menjumlahkan nilai-nilai, dan menambahkan jumlah spasi di baris kedua kembali ke skor.

FryAmTheEggman
sumber
1
Tidak ada kesalahan (Saat ini lebih sedikit byte daripada jawaban Dennis ...)
Arcturus
7

Serius , 86 byte

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

Mengambil input seperti "CABBDCABECDBACDBEAACADDBBBEDDA", "CABEDDABDC BACDBBAADE CBBEDDA"

Cobalah online (Anda harus memasukkan input secara manual karena permalink tidak suka kutipan)

Bekerja pada bonus sekarang.Tidak, menambahkan bonus akan membutuhkan biaya lebih dari 20 byte.

Saya tahu saya lupa sesuatu ... Invalid Testtidak dicetak jika terjadi kesalahan. Ada harapan saya untuk bermain golf Dennis.

Mego
sumber
Melakukannya? Serius? Maka saya harus
membatalkannya
4

JavaScript (ES6), 134 byte

Sunting: Persyaratan pertanyaan berubah. Jawaban ini berasal dari saat program diperlukan untuk memastikan setiap karakter jawaban adalah AE, setiap karakter respons adalah AE atau spasi dan keduanya memiliki panjang 30, jika tidak kembali 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

Penjelasan

(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

Uji

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

pengguna81655
sumber
3

CJam, 60 byte

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

Cobalah online di juru bahasa CJam .

Dennis
sumber
3

JavaScript (Firefox 31+), 86 byte

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

Menggunakan pemahaman array yang diusulkan untuk ES7. Dengan demikian dukungan terbatas untuk Firefox untuk saat ini.

Dengan bonus, 106 byte (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]

Sunting: Sebelumnya solusi saya hanya memeriksa panjang jawaban atau pertanyaan, sekarang periksa keduanya.

George Reith
sumber
Anda dapat menghilangkan f=di awal dan mengatakan bahwa ini menghasilkan fungsi lambda.
Conor O'Brien
1
@CᴏɴᴏʀO'Bʀɪᴇɴ Terima kasih, saya selalu lupa bahwa ini dari pengujian -_-
George Reith
Ini akan jauh lebih singkat tanpa bonus. 86 byte:(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 Benar, terima kasih ... Saya sedikit terjebak di dalamnya ... string template saja 34 byte
George Reith
Saya memiliki jawaban yang sangat mirip, tetapi saya tidak menyalin yang ini (upaya pertama saya adalah preseden, tetapi saya menghapusnya karena saya tidak memeriksa panjangnya). Yang mengatakan: ini tidak valid terlepas dari 3 upvotes, karena tidak memeriksa kisaran ... E
edc65
2

Japt , 71 byte

Japt adalah versi singkat dari Ja vaScri pt . Penerjemah

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

Keduanya .di akhir haruslah Unicode chars U + 0017 dan U + 0099 yang tidak dapat dicetak, masing-masing.

Bagaimana itu bekerja

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

Saya harap ada cara yang lebih pendek untuk memastikan kedua panjangnya sama dengan 30. Saran diterima!

Produksi ETH
sumber
2

Haskell, 144 138 byte

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

Akan menjadi sekitar 50 tanpa validasi. mengendus .

Pemakaian: "ABCDEABCDEABCDEABCDEABCDEABCDE" % "AAAAABBBBBCCCCCDDDDDEEEEEAAAAA"

Leif Willerts
sumber
1
!dapat didefinisikan sebagai all(`elem`l)s, menghemat 6 byte.
Zgarb
1
... atau pointfree go: g=all.flip elem.
nimi
2

C #, 162 154 148 134 byte

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

Pemakaian

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

Uji

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

noisyass2
sumber
Anda dapat mengubahnya int s=0,i=0;for(;...untuk menyimpan 3 byte.
LegionMammal978
Ini tidak akan berfungsi jika saya memasukkan 29 karakter untuk input pertama dan 31 untuk detik .. itu harus mencetak "tes tidak valid" tetapi benar-benar akan mencoba untuk menilai.
Johan
@ noisyass2: string x (string k, string a) => k.Length! = 30 || a.Length! = 30? "Uji Tidak Valid!": Enumerable.Range (0,30) .Sum (e => a [e] == ''? 0: k [e] == a [e]? 4: -1) + ""; (134 karakter) dan pertimbangkan masukan Johans.
Stephan Schinkel
+1 untuk solusi, tetapi apakah ini memenuhi syarat? OP mengatakan program penuh.
Yytsi
Johan tangkapan bagus! @StephanSchinkel terima kasih atas ide penggunaan delegasi dan bit Enum.range. Saya dapat mencukur 3 karakter lagi mengubah kondisi menjadi 30 == (k.Length & a.Length)
noisyass2
2

Ruby, 81 karakter

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

Contoh dijalankan:

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" 
manatwork
sumber
2

Jawa, 183 169 byte

Ini sedikit latihan 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
sumber
Saya bukan Java Golfer, tapi saya pikir Anda dapat menyimpan String.valueOfdengan hanya menambahkan int ke string kosong ( ""+IntStream....) - Saya juga percaya Java memungkinkan non-korsleting dan, sehingga Anda dapat menghapus salah satu &dan menyimpan byte .
VisualMelon
@VisualMelon Tip yang bagus, terima kasih. Itu mengganggu saya berapa byte String.value diambil!
RCB
2

brainfuck, 354 byte

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

Membutuhkan penerjemah yang memungkinkan Anda untuk belok kiri dari sel 0. Output adalah byte yang ditandatangani. Misalnya, byte 0x49dicetak untuk input contoh, dan 0xFFdicetak untuk input dengan baris pertama yang sama tetapi baris kedua diganti dengan "C" dan 29 spasi.

Skor dimulai pada 0, dan saat baris kedua input dibaca, perubahan ini dibuat untuk itu:

  • Input benar: Tidak melakukan apa pun
  • Input salah: Kurangi 5
  • Input adalah spasi: Kurangi 4

Akhirnya, 120 ditambahkan. Ini secara fungsional sama dengan mengasumsikan skor sempurna dan menerapkan penalti, daripada mulai dari 0.

Dengan komentar:

+[--[>]<<+>-]                          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

]
monmon bawah tanah
sumber
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
sumber
1

JavaScript ES7, 102

Seperti biasa, bonus tidak sepadan dengan usaha.

(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

Memeriksa spasi yang tidak valid pada input pertama (karena ini masuk akal bagi saya) 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
sumber
Ugh, validasi mengambil setengah dari kode saya ketika saya mencoba: (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'adalah 129 byte.
Neil
1

Python 2.7, 131, 116, 109 , 139

Saya mencoba melakukan solusi python "pendek" ... Nah ini dia, saran lebih dari diterima

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'

Menambahkan beberapa karakter membuatnya jauh lebih mudah dibaca ...

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
sumber
1

Prolog, 165 byte

Lebih dari setengah byte untuk pemeriksaan tes tidak valid.

Kode:

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').

Dijelaskan:

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

Contoh:

`CABBDCABECDBACDBEAACADDBBBEDDA`*`CABEDDABDC BACDBBAADE  CBBEDDA`.
73

Cobalah online di sini

Emigna
sumber
1

MATLAB, 92 90 byte

Terima kasih kepada Tom Carpenter karena membantu saya mengurangi jawaban saya sebanyak 2 byte!

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)

Fungsi dapat dipanggil dengan menugaskan lembar jawaban ke q dan jawaban yang diajukan ke a . misalnya:

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

Jawabannya hanya dicetak ke layar. 8 byte dapat disimpan jika diizinkan untuk mencetak ans = 73

slvrbld
sumber
Anda bisa menghemat 2 byte dengan menggantinya numel(q)dengan nnz(q).
Tom Carpenter
1

C # 6.0 -> (270 - 20 = 250) 246 - 20 = 226 byte

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

Versi yang dapat dibaca & tidak dikoleksi:

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

Sangat ingin mendapat bonus: D

Yytsi
sumber
Kerja bagus! Beberapa trik umum yang berlaku di sini, Anda dapat mendeklarasikan ibersama dengan di sluar for loop. Anda dapat menggunakan varuntuk mendeklarasikan a, menghemat 1 byte (hore!). Anda tidak perlu banyak kurung kurawal {}dalam kode Anda, yang selalu merupakan cara yang bagus untuk memangkas byte, dan selalu layak untuk melihat tabel ASCII saat membandingkan karakter (Anda dapat c[i]==' 'sedikit mengurangi byte dengan menggunakan ketidaksetaraan). Anda juga harus mempertimbangkan menghitung melalui string ke belakang - dalam hal ini Anda dapat menyimpan setidaknya 1 byte dengan menghubungkan kembali loop for.
VisualMelon
Sayangnya, kiriman Anda saat ini tidak terlibat dengan kriteria, karena tidak dapat mengenali input yang tidak valid.
VisualMelon
@VisualMelon Ahh, saya merasa sangat bodoh. Saya menulis kiriman ini di sekolah jadi saya lupa menambahkan hal-hal 'tes tidak valid' dll. Saya akan menambahkannya :)
Yytsi
@VisualMelon Ya, ini dikirim dan ditulis di sekolah di akhir kelas, saya akan mengeditnya. Terima kasih untuk triknya :)
Yytsi
0

Groovy 2.4.5, 107 byte

Hanya terjemahan sederhana dari jawaban Java sebelumnya .

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
sumber
0

C, 273 - 20 = 253 byte

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

Saya telah mengambil bonus, meskipun saya harus membayar 23 byte hanya untuk mencetaknya. :-(

Penjelasan

#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 */
    }
}

Ada dua kali lebih banyak kode untuk memeriksa input yang tidak valid karena ada untuk menghitung jawaban - daging sebenarnya dari tantangan ada di forloop dekat akhir. Sebenarnya inilah versi yang mengasumsikan input selalu valid, dalam 163-20 = 143 byte:

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

Dan satu yang membuat asumsi yang sama dan hanya mencetak skor, dalam 133 byte:

#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
sumber
0

SAS 9.4, 291-20 = 271 byte (dengan bonus), atau 231 byte (tanpa bonus)

Dengan bonus:

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;

Tanpa bonus:

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 tidak benar-benar memiliki input / output, jadi Anda perlu mengganti k = '..' dengan kunci, dan r = '..' dengan respons. Outputnya dicetak ke log.

TMP4
sumber