UKMT IMCペーパーにマークを付ける


22

今年はIMCをやりました。ここの他の誰かがそれをしましたか?

UKMT Intermediate Maths Challengeの論文には、25の質問があります。最初の15の質問では、正解すれば5つの点が付けられます。他の10個の質問については、それらを正しく評価するために6つのマークを取得します。最後の10問では、間違った場合はマークを失います!16から20の質問では、1つのマークを失います。最後の5つの質問では、2つのマークを失います。質問を空白のままにすると、マークは授与または控除されません。最初の15の質問のいずれかを間違えたとしても採点は差し引かれません。論文は複数の選択肢があります。各質問に対して、A、B、C、D、およびEから回答を選択できます。各質問には常に1つの正解があります。

2つの文字列を取り、スコアを出力するプログラム/関数を作成します。最初の文字列は、論文への回答になります。質問をスキップする場合は、スペース、ヌルバイト、またはアンダースコアを使用してください。それ以外の場合は、回答に文字A、B、C、D、またはEを使用します。入力は大文字でも小文字でもかまいません。2番目の文字列は、論文の各質問に対する正解になります。プログラム/関数はスコアを出力します。コードを短くしてください。

テストケース:

DDDDDDDDDDDDDDDDDDDDDDDDD
ABCDEABCDEABCDEABCDEABCDE
15

BDBEACCECEDDBDABBCBDAEBCD
BDBEACCECEDDBDABBCBDAEBCD
135

DBACBDCDBAEDABCDBEECACDC_
DBADBDCDBAEDABCDBEEDACDCA
117

_________________________
DABDABDABDABDABDABDABDABD
0

DBADBDCDBAEDABCD_E__A__C_
DBADBDCDBAEDABCDBEEDACDCA
99

_______________BBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAA
-15

「15から20の質問の場合」は「16から20の質問の場合」である必要がありますか?
グレッグマーティン

1
スキップされた質問を表すためにヌルバイトを使用できますか?
betseg

2
そして、最初のスコアは27-12 = 15であってはいけませんか?
グレッグマーティン

1
UKMTの論文を見た人や行った人はいますか?彼らは本当に楽しいです。ukmt.org.ukでパズルをチェックしてください。私は、数学の質問からチャレンジに関する私のアイデアのほとんどを得ています。
0WJYxW9FMN

1
テストケースには、おそらくマイナスのスコアの提出物を含める必要があります。
デニス

回答:



6

ゼリー26 23 22バイト

=s5ị"“HHHQP‘D¤_2Fæ.n⁶¥

オンラインでお試しください!

使い方

=s5ị"“HHHQP‘D¤_2Fæ.n⁶¥  Main link. Argument: t (answer to test), s (answer sheet)

=                       Test the characters of t and s for equality.
 s5                     Split into chunks of length 5.
             ¤          Combine the two preceding links into a niladic chain.
     “HHHQP‘              Yield the code points, i.e., [72, 72, 72, 81, 80].
            D             Decimal; yield [[7, 2], [7, 2], [7, 2], [8, 1], [8, 0]].
   ị"                   Index zipwith; use the Booleans in each chunk to index into
                        the corresponding pair. Indexing is 1-based and modular, so
                        1 gives the first element and 0 the last.
              _2        Subtract 2 from each result.
                F       Flatten the resulting 5x5 matrix.
                     ¥  Combine the two preceding links into a dyadic chain.
                   n⁶     Test the characters of t for inequality with space.
                 æ.     Take the dot product of the integers to the left and the
                        Booleans to the right.

5

JavaScript(ES6)、70 68 66バイト

Neilの
おかげで2バイトを節約ETHproductionsのおかげで2バイトを節約

構文をカリー化する際にa、申請者の回答と正解cを受け取ります(a)(c)。スキップされた質問にはスペースが付いていると予想されます。

a=>c=>a.replace(/\S/g,(a,i)=>s+=a==c[j=i>14,i]?5+j:-j^i>19,s=0)&&s

テストケース


スキップされた質問を単語以外の文字(スペースなど)に変更すると、を使用/\w/gして2バイト節約できます。
ニール

私が考える -j-(i>19)と同じである-j^i>19私は確実ではないですけれども、。
ETHproductions

@ETHproductions確かに。この(-j)^(i>19)ように解析されます、はい、これは動作します。
アーナルド

4

パイソン286 85 83 77バイト

f=lambda t,s,i=24:~i and(i/10*-(14<i<t[i]<'_'),5+i/15)[t[i]==s[i]]+f(t,s,i-1)

オンラインでお試しください!

使い方

これは、2つの最適ではない引数を取る再帰関数fを定義します:t(テストへの答え)とs(解答用紙)。これらの2つの引数のみで呼び出された場合、fはitsの両方の最後のインデックスである24に初期化します。

たびfが呼ばれ、その最初のかどうかをチェックするには〜い(NOTのビット単位I)truthy /非ゼロです。以来〜(-1)= 0と、これが起こるiが値に達する-1i = -1の場合、〜i = 0が返されますが、i24から0tおよびsのすべてのインデックス)の値を取るため、次のコードandが実行され、fが結果を返します。

一方で、私は非負で、次のことが起こります。最初、

(i/10*-(14<i<t[i]<'_'),5+i/15)

長さ2のタプルを作成します。

  • 商でi/10ある0であれば0≤I <101であれば10≤I <20、および2であれば20≤I <25。チェーン比較14<i<t[i]<'_'リターン真の場合、すべての個々の比較は返す場合にのみ、すなわち、場合に限り、私≥15(ペナルティとの質問の範囲が)、私はより小さくなる[i]のトンのすべての数値がより小さいので、(常にtrue Pythonのすべてのイテラブル2)、t [i]はアンダースコアではありません。

    比較がFalseを返す場合、単項-0を返し、式全体が0に評価されます。しかし、比較戻る場合Trueを、単項-戻り-1ので、全体の発現評価さに0であれば、I <10≤0 -1であれば10≤I <20、及び-2なら20≤I <25。これらは、すべてのインデックスiの誤った回答または欠落した回答の最終結果です。

  • 5+i/15戻り5 + 0 = 5であれば0≤I <15および5 + 1 = 6であれば15≤I <25。これらは、すべてのインデックスiの正解の最終結果です。

最後に、t [i]s [i]が異なる場合(間違った回答または欠落している場合)[t[i]==s[i]]、構築されたタプルの最初の要素を選択し、等しい場合(正解)、2番目の要素を選択し、減少したfの戻り値を追加しますその結果には。いったんiが到達-1を、最終的なスコアが算出され、返されるF


3

Mathematica、114バイト

Tr@(m=MapThread)[#/.True->#2/.False->-#3&,{Tr/@Partition[m[Equal,#/."_"->u]/.u==_->0,5],{5,5,5,6,6},{0,0,0,1,2}}]&

文字のリストの順序付きペアを取り、整数を返す純粋な関数。回答が等しい場所m[Equal,#/."_"->u]のフォームの未評価エントリを除き、ブール値のリストを返します。その後、これらの未評価のエントリをsに変換します。これらのエントリを一度に5つ追加し、最初のテストケースまたは最後のテストケースのリストを作成します。各座標、及び適切なスコアにマッピングされ、その結果が加算されます。u=="B""_"u==_->00Tr/@Partition[...,5]{4False+True, 4False+True, 4False+True, 4False+True, 4False+True}{5True, 5True, 5True, 2True, 2True}TrueFalse


3

ゼリー22 21バイト

Zm0ṁ135µ;t€⁶E€’;E€ṫ⁹S

オンラインでお試しください!

私は思った、@デニスの答えは、おそらくbeatableました。そして、非常に多くの異なる可能性を試し、驚くべき偶然の恩恵を受けた後、私はついにそれを管理しました!

このプログラムは、[学生の解答、正解]のペアを入力として受け取り、スペースを使用して回答の欠落を示します。

説明

このプログラムは、奇妙な内部入力形式を使用して、何が起こっているかを追跡します。そのため、これを一歩ずつ進めていきます。

  1. Z

    これは入力を転置するので、各質問に1つずつ、25個の要素のリストができあがります。各要素の形式は[生徒の解答、正解]です。このフォームの要素は大文字で示します。A質問1、B質問2など。そのため、回答は現在次のように保存されています

    ABCDEFGHIJKLMNOPQRSTUVWXY
    
  2. m0

    これは「大回旋」手術です。現在の値の逆を値自体に追加して、これを生成します。

    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    
  3. ṁ135

    (モールド)演算子は、多くのことを行うが、この文脈では、それが効果的に繰り返し自体に電流値を付加することによって生成無限リストの最初の135個の要素をとります。これにより、次のようになります(便宜上、50個の要素のグループに分けています。これは、内部的には135ペアのリストです)。

    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    
  4. µ;

    µ現在の値を、欠落しているオペランドの新しいデフォルトとして設定します。その後、オペランドが欠落しているビルトインがすぐに表示されます。;追加しますが、何を追加するかを指定していません。その結果、現在の値が最後の値µ(現在の値でもある)に追加され、次の270要素の現在値が得られます。

    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPABCDEFGHIJKLMNO
    PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
    PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
    PQRSTUVWXYYXWVUTSRQP
    
  5. t€⁶

    上記の大文字はすべて[生徒の答え、正解]のペアを表していることに注意してください。t€⁶動作はそれぞれ(上で動作)ペア、および削除(t)スペース(ペア(対に現れる、すなわち、任意の空間)のいずれかの側から)。そのため、270の質問の同じ複雑なリストが何度も繰り返されていますが、それらは[正解](生徒が答えなかった)または[生徒の答え、正解](生徒が答えた)という形式です。

  6. E€’

    このE€’操作は各()要素にも適用され、の使用によりE、すべての要素が等しい場合(つまり、学生が答えなかったか、質問に正解した場合)に要素を1に置き換えます。要素が等しい(つまり、学生は答えたが、質問を間違えた)。ここを使用すると、番号付けが変更されます。つまり、-1または0をそれぞれ使用するようになります。この新しい種類の要素には小文字を使用します。ペナルティの対象となる質問の場合はペナルティが課される回答には-1を使用し、欠落または正解の場合は0を使用します。

    abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
    abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
    abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
    pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
    pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
    pqrstuvwxyyxwvutsrqp
    
  7. ;E€

    私たちは両方E€を見てきました;。現在の値に何かを追加し、すべての要素が等しい場合は1の形式を使用し、一部が異なる場合は0の形式を使用します(今回はありません!)。ここにはオペランドが欠落しているため、最後の値µ(つまり、ステップ3の出力)を使用します。ステップ3に戻って、要素からスペースを削除していないので、正解の場合は1、不正解または欠落した回答の場合は0になります(スペースが正解と一致しないため)。これからは、この1 =正しい、0 =正しくない/欠落している形式に大文字を使用し、0 =正しい/欠落している、-1 =間違っているために引き続き小文字を使用します。結果の値には405個の要素があり、次のようになります。

    abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
    abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
    abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
    pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
    pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
    pqrstuvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
    TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
    TSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVU
    TSRQP
    
  8. ṫ⁹

    先に述べた驚くべき偶然がここにあります。コードのこの部分について話す前に、私たちがしなければならない場所を検討したいと思います。

    各大文字は正解を表す+1を表します。最初の15の質問(AO)は文字列にそれぞれ5回出現し、最後の10の質問(PY)はそれぞれ6回出現します。そのビットは本当に魔法ではありません。プログラムで以前に番号135(5×15 + 6×10)を選択したときに、そのように設計しましたが、ここでの唯一の幸運は、5が奇数であるということです(つまり、最後の10最初の10回ではなく、余分に表示される質問)。この直前の15文字には、pthrough t(-1ペナルティ質問)が1回、uthrough y(-2ペナルティ質問)が2回含まれています。それも偶然ではありません。使ったからm0以前は、質問の余分なコピーは順序PQRSTUVWXYYXWVUTSRQPであり、後の質問はその文字列の中央付近で自然に発生します(したがって、「余分な」質問の最後の15を取得すると、エッジに近い質問の繰り返しが少なくなります。もちろん、「余分な」質問が最後に来るのは驚くことではありません)。

    間違った非欠損回答の場合は各小文字がスコアから1を引き、正解の場合は各大文字がスコアに1を加算するため、最後の135 + 15 = 150の要素を取得するだけで済みます。各種類の要素に正しい回数。リストの最後に部分文字列を取得するためのJellyのコマンドは次のとおりです。ただし、必要な要素の数ではなく、必要な最初の要素のインデックスを指定します。この時点で405の要素があり、150が必要なので、インデックス(405-150 + 1)または256から開始する必要があります。驚くべき偶然にも、256は存在する別個のオクテットの数であるため、ゼリーの短い表現()。これを実現するためにできることはほとんどありませんでした。ステップ4では、ラウンド数に達するためにリストの先頭にさらに135個の要素を追加しましたが、追加しなければならなかった135個の要素(プログラムのその時点ですぐに利用可能な値)であるという事実は非常に便利でした。この状況では基本的に他の数字はまったく役に立ちません。

    内部値は次のようになります。

    uvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    
  9. S

    最後に、質問から得られたスコアへの変更のリストができました。必要なのはS、を使用してそれらを合計するだけです。


2

パイソン293の 91バイト

f=lambda a,b,n=0:a>""and((a[0]==b[0])*(5+n/15)or-(n/15*n/10)*(a[0]<"^"))+f(a[1:],b[1:],n+1)

オンラインでお試しください!

@KritixiLithosのおかげで-2バイト


入力:

  • a_スキップされた質問に対する文字列としての学生の回答
  • b :正解
  • n:現在の質問0ベースの番号、デフォルトは0

あなたは行うことができますa[0]<'^'の代わりにa[0]!="_"バイト救うために
KritixiのLithos

私が考えてa>""働くことができる代わりにa!=""
KritixiのLithos

最初のチェックがa空のときに再帰を終了するだけの場合は、できませんa andか?空の文字列はfalseです。それ以外の場合はtrueです。
FlipTack

これは投げるだろう@FlipTack TypeError文字列を返します最後の再帰呼び出しとして
OVS

1

k、52バイト

関数は2つの文字列を取り、テストケースごとにフォーマットします

{+/(~x="_")*(+,/'(15 5 5#'0 -1 -2;15 10#'5 6))@'x=y}

例:

k){+/(~x="_")*(+,/'(15 5 5#'0 -1 -2;15 10#'5 6))@'x=y}["DBADBDCDBAEDABCD_E__A__C_";"DBADBDCDBAEDABCDBEEDACDCA"]
99

1

Haskell、84バイト

i x a b|a>'Z'=0|a==b=6-0^x|1<2= -x
w x=x<$[1..5*3^0^x]
(sum.).zipWith3 i(w=<<[0..2])

使用例:((sum.).zipWith3 i(w=<<[0..2])) "DBADBDCDBAEDABCD_E__A__C_" "DBADBDCDBAEDABCDBEEDACDCA"-> 99オンラインでお試しください!

仕組み:正しい結果のi x a b単一の回答のスコアと、間違った回答(非負の値)のペナルティを計算aします。あなたは(スキップした場合)を、スコアがある答えが正しければ(、 )、スコアがされ、それ以外のスコアがあります。bxa>'Z'0a==b6-0^x-x

w=<<[0..2]適用することにより、すべての25個の質問に対する罰則のリストを作成w01そして2、すなわち作る5*3^0^xそれぞれの数のコピー( - > 15回0、5回1と5回2)。

zipWith3iペナルティのリスト、回答のリスト、および正しい結果のリストに適用されます。最後に、すべてのスコアが追加されます(sum)。



1

JavaScript(ES6)、105 103 101 94 89 88 85 84 78 77バイト

ES6での最初のソリューション、おそらくJavascript Ooでの最初のソリューション

f=(s,a,i=24)=>i+1&&(s[i]>'Z'?0:s[i]==a[i]?5+(i>14):~(i>19)*(i>14))+f(s,a,i-1)

sは提出されたソリューションであり、aは正しいソリューションです。両方とも文字列として解釈されます。

78バイトの非再帰的なソリューションを次に示します。

s=>a=>eval([...s].map((c,i)=>c>'Z'?0:c==a[i]?5+(i>14):~(i>19)*(i>14)).join`+`)

カリー化構文を介して入力を受け取ります。

9バイトを節約してくれた@ETHproductionsに感謝します!します。s[i]c(-1-(i>19|0))~(i>19)

バイトを保存してくれた@Kritixi Lithosに感謝します!c=='_'c>'Z'

オンラインでお試しください!


これがJSでの最初のソリューションであると言えば、コードゴルフの主な言語は何ですか?私はこれまで、コードゴルフにPythonとbrainfuckを使用したことがあります。
0WJYxW9FMN

@ J843136028私の主な言語はPythonですが、C#でもかなりゴルフをしました。Haxeはしばらくレイオフを行ってきましたが、私はそれに戻るかもしれません。
Yytsi

クール!私は一度もBrainfuckを使用したことがないので、私の主な言語もPythonです。
0WJYxW9FMN

@ J843136028ええ、私は実際にあちこちであなたの答えを見てきました。バイオが得られるので、私は解決策を見つけるのにそれほど時間を費やさないので、ほとんどの場合、それらは興味の対象ではありません。BrainF * ckを使用したことはほとんどありません。短い問題を見つけるのに多くの時間がかかり、中程度の問題も解決できます。
Yytsi

BFの意味を知っています。人々が私の答えを見て驚いています。
0WJYxW9FMN
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.