数学のコンペティショングレーダーを作る


17

アメリカの数学名誉協会であるMu Alpha Thetaが運営する数学大会に参加するのは楽しいです。競技会では、30問の多肢選択テストを受けます。質問ごとに5つの選択肢があり、A〜Eとラベル付けされています。

テストでの私のスコアは、正解ごとに4ポイント、空白のままの質問ではゼロポイント、間違った回答ごとにマイナス1ポイントです。

上記のスコアリングシステムに従ってテストを採点するプログラムを作成します。入力には、応答キーと応答が続く2つのコンポーネントが必要です。空白のままの質問は、空白として入力します。最初の入力には文字AE(または選択したae)のみを含める必要があり、入力に空白がないと想定できます。2番目の入力には、空白と文字AE(またはae)のみを含める必要があります。30問のテストを実装していない入力はInvalid test、出力として印刷する必要があります。

出力はグレードまたはでなければなりませんInvalid test

ボーナス

プログラムが最終スコアの後に数値を右、数値を空白、数値を間違って印刷する場合、(aR bB cW)20バイトを削除します。

サンプル入力

CABBDCABECDBACDBEAACADDBBBEDDA    //answer key
CABEDDABDC BACDBBAADE  CBBEDDA    //responses

サンプル出力

ボーナスなし

73

ボーナス

73 (20R 3B 7W)

標準ルールが適用されます。バイト単位の最短コードが優先されます。


最初の行のスペースで何をすべきですか?
リトシアスト

@ThomasKwa最初の行にスペースがあってはいけません。Invalid test
アークトゥルス

2
回答が投稿された後にルールを変更したため、少なくとも2つのルールが無効になったようです。チャレンジが投稿された後、回答を無効にする可能性のある変更を加えないでください。投稿する前にSandboxを使用してフィードバックを取得することをお勧めします。
アレックスA.

私は、これは、より興味深いものだっただろうと思う人手不足

大文字と小文字の区別はどうですか?また、私の言語が...空白に不快な場合はどうなりますか?入力で空白を代わりにアンダースコアにする必要がありますか?

回答:


7

ピス、53 51

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

オンラインで試す

チェックは、すべてのスペースa-eが削除されたときに入力全体に文字が含まれているかどうかを確認し、両方の文字列にlengthがあるかどうかを確認し30ます。

スコアの計算は、2行を一緒に圧縮してから、各ペアをにマッピングすることで行われます(letters are equal) ? 4 : -1。次に、単純に値を合計し、2行目のスペースの数をスコアに追加します。


1
エラーなし。(現在、デニスの答えよりも少ないバイト...)
Arcturus

7

真剣に、86バイト

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

のような入力を取る "CABBDCABECDBACDBEAACADDBBBEDDA", "CABEDDABDC BACDBBAADE CBBEDDA"

オンラインで試してください(パーマリンクは引用符が気に入らないため、入力を手動で入力する必要があります)

今ボーナスに取り組んでいます。いいえ、ボーナスを追加すると20バイト以上かかります。

私は何かを忘れていたことを知っていました... Invalid Testエラーが発生しても印刷されていませんでした。デニスにゴルフをするという私の希望があります。


しますか?マジ?そして、私はそれをupvoteする必要がある
edc65

4

JavaScript(ES6)、134バイト

編集:質問の要件が変更されました。この回答は、プログラムが各回答文字がAEであり、各応答文字がAEまたはスペースであり、両方とも30の長さを持っていることを確認する必要がある場合からのものです。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

説明

(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

テスト

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



3

JavaScript(Firefox 31 +)、86バイト

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

ES7向けに提案されている配列内包表記を使用します。したがって、現時点ではサポートはFirefoxに限定されています。

ボーナスあり、106バイト(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]

編集:以前、私のソリューションは回答または質問の長さのみをチェックしていましたが、今では両方をチェックします。


f=先頭のを省略して、ラムダ関数を生成すると言うことができます。
コナーオブライエン

1
@CᴏɴᴏʀO'Bʀɪᴇɴありがとう、私はいつもそれが彼らのテストからであることを忘れている-_-
ジョージ・リース

これは、ボーナスなしでは大幅に短くなります。86バイト:(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 Trueが、おかげで...私は少しはそれに巻き込まれた...だけではテンプレート文字列は34バイトである
ジョージReithの

私は非常に似た答えを持っていますが、私はこれをコピーしませんでした(私の最初の試みは先例ですが、長さをチェックしていないので削除しました)。つまり、これは3回のアップ投票にもかかわらず有効ではありません。範囲A ... E
edc65

2

Japt、71バイト

JaptJa vaScri ptの短縮バージョンです。通訳

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

.末尾の2つのsは、それぞれ印刷できないUnicode文字U + 0017とU + 0099である必要があります。

使い方

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

両方の長さが30に等しいことを確認するより短い方法があることを願っています。提案を歓迎します!


2

Haskell、144 138バイト

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

検証なしでは約50になります。におい

使用法: "ABCDEABCDEABCDEABCDEABCDEABCDE" % "AAAAABBBBBCCCCCDDDDDEEEEEAAAAA"


1
!として定義できall(`elem`l)s、6バイトを節約します。
ズガルブ

1
...またはpointfree:に進みますg=all.flip elem
nimi

2

C位、162の 154 148 134バイト

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

使用法

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

テスト

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


int s=0,i=0;for(;...3バイトを節約するように変更できます。
LegionMammal978

これは、最初の入力に29文字、2番目に31文字を入力すると機能しません。「無効なテスト」を出力するはずですが、実際に評価を試みます。
ヨハン

@ 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文字)とJohans入力を考慮します。
ステファンシンケル

ソリューションの+1ですが、これは資格がありますか?OPは完全なプログラムを述べました。
Yytsi

ヨハンナイスキャッチ!@StephanSchinkelは、デリゲートとEnum.rangeビットの使用に関するアイデアに感謝します。条件を30 ==(k.Length&a.Length)に変更してさらに3文字を削ることができました
-noisyass2

2

ルビー、81文字

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

サンプル実行:

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" 

2

Java、 183 169バイト

これは、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";}

私はJavaのゴルファーないんだけど、私はあなたが救うことができると思うString.valueOfだけで、空の文字列(にint型を追加することによって、""+IntStream....あなたはのいずれかを削除することができますので、私はまた、Javaが非短絡ができます信じて- )&とバイトを保存します。
VisualMelon

@VisualMelonすばらしいヒント、ありがとう。String.valueOfが何バイトを使用したかは、私を悩ませました。
RCB

2

brainfuck、354バイト

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

セル0から左に移動できるインタープリターが必要です。出力は符号付きバイトです。たとえば、0x49入力例の場合はバイトが出力され、入力の場合0xFFは同じ最初の行で出力されますが、2番目の行は「C」および29個のスペースに置き換えられます。

スコアは0から始まり、入力の2行目が読み取られると、これらの変更が加えられます。

  • 入力が正しい:何もしない
  • 入力が間違っています:減算5
  • 入力はスペースです:減算4

最後に、120が追加されます。これは、機能的には0からではなく、完全なスコアを仮定してペナルティを適用することと同じです。

コメント付き:

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

]

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()])

1

JavaScript ES7、102

いつものように、ボーナスは努力する価値はありません。

(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

最初の入力で無効なスペースをチェックする(これは私にとって理にかなっている)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

うーん、私が試みたとき、検証は私のコードの半分を占めました:(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'129バイトです。
ニール

1

パイソン2.7、131、116、109、139

私は「短い」Pythonソリューションを実行しようとしました...さて、ここにあります、提案は大歓迎です

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'

さらに文字を追加すると、読みやすくなります...

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'

1

プロローグ、165バイト

半数以上のバイトが無効なテストチェック用です。

コード:

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

説明:

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

例:

`CABBDCABECDBACDBEAACADDBBBEDDA`*`CABEDDABDC BACDBBAADE  CBBEDDA`.
73

こちらからオンラインでお試しください


1

MATLAB、92 90バイト

回答を2バイト減らすのを手伝ってくれたTom Carpenterに感謝します!

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)

解答用紙をqに、提出された解答をaに割り当てることにより、関数を呼び出すことができます。例えば:

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

答えは単に画面に出力されます。ans = 73を出力できる場合、8バイトを節約できます


に置き換えるnumel(q)と2バイト節約できますnnz(q)
トムカーペンター

1

C#6.0-> (270-20 = 250) 246-20 = 226バイト

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

読み取り可能および未使用バージョン:

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

本当にボーナスを取得したかった:D


よくやった!ここに適用される一般的なトリックのいくつか、あなたが宣言することができるiとともにsforループの外。を使用varして宣言することができa、1バイトを節約します(hurrah!)。{}コードに中括弧の多くは必要ありませんが、これは常にバイトをトリミングするのに適した方法です。また、charsを比較するときは常にASCIIテーブルを見る価値があります(c[i]==' '不等式を使用することでバイトをいくらかノックできます)。また、文字列を逆方向にカウントすることも検討する必要があります。この場合、forループを多少修正することで、少なくとも1バイトを節約できます。
VisualMelon

残念ながら、無効な入力を認識することができないため、提出物は現在、基準に準拠していません。
VisualMelon

@VisualMelonああ、私はとても馬鹿だ。私は学校でこの提出物を書いたので、「無効なテスト」などを追加するのを忘れました。それらを追加します:)
Yytsi

@VisualMelonええ、これはクラスの最後に学校で提出され、書かれたものです。編集します。トリックをありがとう:)
Yytsi

0

Groovy 2.4.5、107バイト

以前のJava回答の単なる簡単な翻訳です。

f={a,b->a.length()==30&b.length()==30?(0..29).collect{a[it]==b[it]?4:b[it]!=' '?-1:0}.sum():'Invalid test'}

0

C、273-20 = 253バイト

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

印刷するだけで23バイトかかりましたが、ボーナスを受け取りました。:-(

説明

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

答えを数えるのに比べて、無効な入力をチェックするコードは2倍あります-チャレンジの本当の意味は、forループの終わり近くにあります。実際、ここでは、入力が常に有効であると想定するバージョン(163-20 = 143バイト)があります。

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

そして、同じ仮定を行い、スコアのみを133バイトで出力するもの:

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

0

SAS 9.4、291-20 = 271バイト(ボーナスあり)、または231バイト(ボーナスなし)

ボーナスあり:

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;

ボーナスなし:

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には実際には入力/出力がないため、k = '..'をキーに、r = '..'を応答に置き換える必要があります。出力はログに出力されます。

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