标记UKMT IMC论文


22

我今年做了IMC。这里还有其他人吗?

在UKMT中级数学挑战赛论文中,有25个问题。如果正确回答,前十五个问题将给您五个分数。对于其他十个问题,您将获得正确的六分。在最后十个问题中,如果您弄错了它们,您将失去分数!对于第十六至二十个问题,您将失去一分;对于最后五个问题,您将失去两分。如果您将问题留为空白,则不会授予或扣除任何分数。不会因前15个问题中的任何一个错误而扣分。本文是多项选择;您可以为每个问题从A,B,C,D和E中选择任何答案。每个问题始终只有一个正确答案。

创建一个使用两个字符串并输出分数的程序/函数。第一个字符串将是您对本文的回答。如果跳过问题,请使用空格,空字节或下划线。否则,请使用字母A,B,C,D或E作为答案。您可以输入为大写或小写。第二个字符串将是本文中每个问题的正确答案。然后,您的程序/功能将输出一个分数。使您的代码简短。

测试用例:

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
您的测试用例可能应该包含分数为负的提交。
丹尼斯,

Answers:



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用来节省两个字节。
尼尔

尽管我不确定,但我认为 -j-(i>19)与相同-j^i>19
ETHproductions'2

@ETHproductions确实。(-j)^(i>19)如此解析,是的,这可行。
Arnauld

4

Python 2中86个 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)

在线尝试!

怎么运行的

这定义了一个递归函数f,该函数采用两个非最佳参数:t(测试答案)和s(答案纸)。当仅使用这两个参数调用时,fi初始化为24,这是ts的最后一个索引。

每次˚F被调用时,它首先检查是否〜我(按位NOT )是truthy /非零。由于〜(-1)= 0,所以一旦i达到值-1就会发生这种情况。如果i = -1,则返回〜i = 0,但是当i取从240的值(ts的所有索引)时,将and执行下面的代码,并且f返回结果。

非负数时,会发生以下情况。第一,

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

创建一个长度为2的元组:

  • i/100,如果0≤| <101如果10≤我<20,和2如果20≤我<25。链式比较14<i<t[i]<'_'返回当且仅当所有个体的比较返回,即,当且仅当我≥15(与处罚问题的范围内),是小于T [1] ,因为所有的数字小于(总是如此Python 2中所有可迭代的元素,而t [i]不是下划线。

    如果比较返回False,则一元-返回0,整个表达式的计算结果为0。然而,如果比较返回,一元-返回-1,所以整个表达式评估为0,如果0≤| <10-1如果10≤我<20,和-2如果20≤我<25 ; 这些是所有索引i错误或缺失答案的最终结果。

  • 5+i/15返回5 + 0 = 5,如果0≤我<155 + 1 = 6,如果15≤我<25。这些是所有索引i正确答案的净结果。

最后,[t[i]==s[i]]如果t [i]s [i]不同(答案错误或缺失),则选择构造的元组的第一个元素;如果它们相等(正确答案),则选择第二个元素,然后将f的返回值加减要那个结果。一旦达到-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]返回布尔值列表,但u=="B"在答案相等的地方,该表单的未求值条目除外"_";然后立即u==_->0将这些未评估的条目转换为0s。Tr/@Partition[...,5]一次将这些条目加起来5,得到一个列表,如{4False+True, 4False+True, 4False+True, 4False+True, 4False+True}第一个测试用例或{5True, 5True, 5True, 2True, 2True}最后一个测试用例。然后在每个坐标中,True并将False其映射到适当的分数,并将结果相加在一起。


3

果冻22 21字节

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

在线尝试!

以为 @Dennis的答案可能不错。在尝试了多种不同的可能性并从一个惊人的巧合中受益之后,我终于做到了!

该程序将一对[学生的答案,正确答案]作为输入,并使用空格指示缺少的答案。

说明

该程序使用一些奇怪的内部输入格式来跟踪正在发生的事情,因此我们将一次一步。

  1. Z

    这将转置输入,因此我们最终得到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;否则,将其替换为0。元素是相等的(即学生回答了,但回答错了)。使用此处会更改编号,这意味着我们现在分别使用-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个字母包含p通过t(-1罚问题)一次,并u通过y(-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

Python 2中93个 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)

在线尝试!

-2个字节,感谢@KritixiLithos


输入:

  • a:学生的答案作为字符串,_用于跳过的问题
  • b : 正确答案
  • n:当前0基于问题的编号,默认为0

您可以做a[0]<'^'而不是a[0]!="_"节省字节
Kritixi Lithos

我认为a>""可以代替a!=""
Kritixi Lithos

如果您的初始检查在a为空时刚刚结束递归,您是否可以这样做a and?空字符串为false,否则为true。
FlipTack

@FlipTack这将引发a,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具有正确结果的单个答案的分数,b以及x针对错误答案(非负值)的罚款。如果您跳过(a>'Z'),则得分为0;如果答案是正确(a==b),则得分为6-0^x,否则得分为-x

w=<<[0..2]通过应用使其成为所有25个问题的处罚名单w012,即让5*3^0^x每个号码的副本( - > 15倍0,5倍1和5倍2)。

zipWith3适用i于罚款清单,答案清单和正确结果清单。最后,将所有分数相加(sum)。


1

八度,61 54字节

@(a,b)[a==b,-(a<95&a~=b)]*[(x=1:25>15)+5,(1:25>20)+x]'

在线尝试!

先前的答案:

@(a,b)(m=a==b)*(((f=kron(z=[0 0 0:2],z|1)')&1)+5)-(a<95&~m)*f

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`+`)

通过currying语法获取输入。

感谢@ETHproductions节省了9个字节!s[i]c(-1-(i>19|0))~(i>19)

感谢@Kritixi Lithos节省了一个字节!c=='_'c>'Z'

在线尝试!


说到这是您在JS中的第一个解决方案,那么代码高尔夫的主要语言是什么?我只用Python和Brainfuck进行代码高尔夫。
0WJYxW9FMN

@ J843136028我的主要语言是Python,但是我也很喜欢C#。Haxe已经裁员了一段时间,但我可能会回到正题。
Yytsi'2

凉!我只用过一次Brainfuck,所以我的主要语言也是Python。
0WJYxW9FMN

@ J843136028是的,实际上我在这里和那里都看到了您的答案。由于我的生物产量很高,所以我不会花太多时间来寻找解决方案,因此大多数时候它们并不会引起人们的兴趣。我对BrainF * ck所做的工作很少,因为找到简短的解决方案甚至是中间问题都需要花费大量时间。
Yytsi '02

我知道您对BF的意思。我很惊讶人们看到我的答案。
0WJYxW9FMN
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.