UKMT IMC 용지 표시


22

나는 올해 IMC를했다. 여기 다른 사람이 했습니까?

UKMT 중급 수학 챌린지 논문에는 25 개의 질문이 있습니다. 처음 15 개의 질문은 당신이 올바르게 이해하면 5 점을줍니다. 다른 10 가지 질문에 대해서는 6 가지 점수를 얻습니다. 지난 10 개의 질문에서, 틀리면 점수를 잃게됩니다! 16에서 20까지의 질문에 대해서는 1 점을 잃고 마지막 5 개의 질문에 대해서는 2 점을 잃습니다. 질문을 비워두면 점수가 부여되거나 공제되지 않습니다. 처음 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-15 번 문제의 경우"가 "16-16 번 문제인 경우"여야합니까?
Greg Martin

1
건너 뛴 질문을 나타 내기 위해 null 바이트를 사용할 수 있습니까?
betseg

2
그리고 첫 번째 점수가 27-12 = 15가되어서는 안됩니까?
Greg Martin

1
UKMT 논문을 본 사람이 있습니까? 그들은 정말로 재미있다. ukmt.org.uk에서 퍼즐을 확인하십시오. 나는 수학 문제로부터 도전에 대한 대부분의 아이디어를 얻습니다.
0WJYxW9FMN

1
테스트 케이스에는 음수로 제출 된 제출물이 포함되어야합니다.
Dennis

답변:



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

자바 스크립트 (ES6), 70 68 66 바이트

Neil 덕분에 2 바이트 절약
2 바이트 절약 ETH 프로덕션 덕분에 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 바이트를 절약 할 수 있습니다 .
Neil

나는 생각 -j-(i>19) 과 동일 -j^i>19나는 확실하지 않다 불구하고.
ETHproductions

@ETHproductions 실제로. 이것은 (-j)^(i>19)그렇게 해석됩니다 . 그렇습니다.
Arnauld

4

파이썬 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 (답안지). 이 두 개의 인수로만 호출하면 fts 의 마지막 인덱스 인 i24로 초기화 합니다.

때마다 F는 경우는 먼저,라고 ~ 난 (NOT의 비트 내가 ) truthy / 비 제로이다. 이후 ~은 (-1) = 0 일단이 일어난다 나는 값에 도달 -1 . 경우 나 = -1 , ~ I는 0 = 반환되지만로 의 값 얻어 240 (모든 인덱스 t가s의 ) 코드 다음은 and실행되고 F 리턴 결과.

i 가 음이 아닌 동안 다음이 발생합니다. 먼저,

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

길이 2 의 튜플을 만듭니다 .

  • 몫이 i/10있다 0 만약 0 ≤ I <10 , (1) 만약 10 ≤ I <202 의 경우 20 ≤ I <25 . 체인화 비교 14<i<t[i]<'_'반환 진정한 경우 모든 개별 비교를 반환하는 경우에만 사실 , 즉, 경우에만, 내가 ≥ 15 (페널티 질문의 범위), 내가 보다 작은 [I] t 모든 숫자보다 작은 때문에 (항상 true 파이썬 2)의 모든 이터 러블과 t [i] 는 밑줄이 아닙니다.

    비교에서 False를 반환 하면 단항 -0을 반환 하고 전체 식은 0으로 평가됩니다 . 그러나, 비교 돌아 가면 단항 -복귀 -1 에 전체 표현식 평가하여 그렇게 0 만약 0 ≤ I <10 , -1 만약 10 ≤ I <20-2 만약 20 ≤ I <25 ; 이것은 모든 지수 i에 대한 오답 또는 누락 된 답변에 대한 최종 결과입니다 .

  • 5+i/150 ≤ i <15 인 경우 5 + 0 = 5를 반환 하고 15 ≤ i <25 인 경우 5 + 1 = 6을 반환 합니다. 이것은 모든 지수 i에 대한 정답에 대한 최종 결과입니다 .

마지막으로, t [i]s [i]가 다르면 (답이 잘못되거나 빠진 [t[i]==s[i]]경우) 구성된 튜플의 첫 번째 요소를 선택하고 두 개가 같으면 (정답) 두 번째 요소를 선택한 다음 감소 된 값으로 호출 된 f 의 반환 값을 추가합니다. 나는 그 결과에. 일단 내가 도달 -1 , 최종 스코어가 계산되었으며 의해 반환 F .


3

수학, 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

    이것은 입력을 바꿉니다. 그래서 우리는 각 질문에 대해 하나씩 25 개의 요소 목록으로 끝날 것입니다. 각 요소는 [학생 답변, 정답] 형식입니다. 이 양식의 요소를 대문자로 표시합니다. A1 번 문제, B2 번 문제 등이 있습니다. 따라서 답변은 현재 다음과 같이 저장됩니다.

    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 개의 문항 ( A~ O)은 문자열에서 5 번씩 나타나고 마지막 10 개의 문항 ( P~ Y)은 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

파이썬 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)

온라인으로 사용해보십시오!

@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마지막 재귀 호출이 문자열을 반환 할 때 a를
던집니다

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

하스켈, 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 개 질문에 대한 처벌의 목록을 만들어 w0, 12, 즉 만드는 5*3^0^x각 번호의 사본을 (-> 15 배 0, 5 배 1, 5 배 2).

zipWith3i위약금 목록, 답변 목록 및 정확한 결과 목록에 적용됩니다 . 마지막으로 모든 점수가 추가됩니다 ( sum).



1

자바 스크립트 (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

네, 실제로 여기저기서 당신의 답변을 보았습니다. 내 바이오 생산량으로, 나는 솔루션을 알아내는 데 많은 시간을 소비하지 않기 때문에 대부분의 시간에 관심이 없습니다. 나는 BrainF * ck를 거의 사용하지 않았다. 중간 문제에 이르기까지 짧은 해결책을 찾는 데 많은 시간이 걸리기 때문이다.
Yytsi

나는 당신이 BF에 대해 무엇을 의미하는지 안다. 사람들이 내 대답을 보는 것이 놀랍습니다.
0WJYxW9FMN
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.