Позначте документ IMC UKMT


22

Я зробив ІМЦ цього року. Хтось ще тут це робив?

У документі UKMT Intermediate Maths Challenge є двадцять п’ять питань. Перші п’ятнадцять питань дають вам п’ять балів, якщо ви правильно їх зрозуміли. На інші десять питань ви отримуєте шість балів за те, щоб їх правильно виправити. В останніх десяти запитаннях ви втрачаєте бали, якщо ви їх неправильно зрозуміли! За шістнадцять до двадцяти питань ви втрачаєте одну оцінку, а за останні п’ять запитань - дві оцінки. Якщо ви залишите питання порожнім, жодна оцінка не присуджується та не нараховується. За помилку будь-якого з перших п’ятнадцяти питань не враховуються оцінки. Папір є множинним вибором; ви можете вибрати будь-яку відповідь з 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

Чи повинно бути "За запитання п’ятнадцять до двадцяти" "За запитання шістнадцять до двадцяти"?
Грег Мартін

1
Чи можемо ми використовувати нульовий байт для представлення пропущених питань?
betseg

2
І чи не повинен перший бал становити 27-12 = 15?
Грег Мартін

1
Хтось бачив / робив документи UKMT? Вони справді веселі. Ознайомтеся з загадками на ukmt.org.uk. Я отримую більшість своїх ідей для викликів із питань математики.
0WJYxW9FMN

1
Ваші тестові випадки, ймовірно, повинні містити подання з від’ємною оцінкою.
Денніс

Відповіді:


7

C, 88 87 86 81 байт

c,d;i(char*a,char*b){for(c=d=0;*b;c++,a++)d+=*a^*b++?*a?-c/15-c/20:0:5+c/15;d=d;}

Спробуйте в Інтернеті!


1
Оскільки ABCDEвсі знаходяться нижче точки 95, я думаю, ви можете використовувати *a<95.
Yytsi

2
Оскільки питання дозволяє брати нульовий байт замість підкреслення, -(c/15+c/20)*(*a<95)може стати *a?-c/15-c/20:0.
Денніс


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 байт

Збережено 2 байти завдяки Нілу.
Збережено 2 байти завдяки ETHproductions

Приймає відповіді заявника 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

@ETHproductions Дійсно. Це розбирається (-j)^(i>19)так, так, так, це працює.
Арнольд

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 (аркуш відповідей). Коли викликається лише за допомогою цих двох аргументів, f ініціалізує i до 24 , останній індекс обох t і s .

Кожен раз, коли викликається f , він спочатку перевіряє, чи ~ i ( бітовий НЕ з i ) є truthy / non-zero. Оскільки ~ (-1) = 0 , це відбувається, коли i досягне значення -1 . Якщо i = -1 , ~ i = 0 повертається, але оскільки я приймає значення від 24 до 0 (всі показники t і s ), andвиконується наступний код і f повертає результат.

Хоча я не негативний, відбувається таке. Спочатку,

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

створює кортеж довжиною 2 :

  • Коефіцієнт i/10дорівнює 0, якщо 0 ≤ i <10 , 1, якщо 10 ≤ i <20 , і 2, якщо 20 ≤ i <25 . Ланцюговий порівняння 14<i<t[i]<'_'повертає Істину тоді і лише тоді, коли всі індивідуальні порівняння повертають Істинне , тобто, якщо і лише якщо i ≥ 15 (діапазон питань із покаранням), i менше, ніж t [i] (завжди вірно, оскільки всі числа менші, ніж всі ітерабелі в Python 2), і t [i] не підкреслює.

    Якщо порівняння повертає помилкове значення , унар -повертає 0 і весь вираз оцінюється на 0 . Однак якщо порівняння повертає True , унар -повертає -1 , тому весь вираз оцінюється на 0, якщо 0 ≤ i <10 , -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] відрізняються (неправильна або відсутність відповіді), а другий, якщо вони рівні (правильна відповідь), потім додає повернене значення 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]повертає список булевих, за винятком неоцінених записів форми 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

Спробуйте в Інтернеті!

Я подумав , що відповідь @ Денніса, ймовірно, переможна. І, випробувавши величезну кількість різноманітних можливостей та скориставшись дивовижним збігом обставин, я нарешті це впорався!

Ця програма приймає пару [відповіді учня, правильні відповіді] як вхідні дані та використовує пробіли для позначення пропущеної відповіді.

Пояснення

Ця програма використовує кілька химерних внутрішніх форматів введення для відстеження того, що відбувається, тому ми будемо робити цей крок за часом.

  1. Z

    Це переміщує вхід, тож ми закінчимось списком з 25 елементів, по одному на кожне запитання; кожен елемент має форму [відповідь учня, правильна відповідь]. Ми позначимо елемент цієї форми з великої літери; Aдля питання 1, Bдля питання 2 тощо. Тож відповіді наразі зберігаються як

    ABCDEFGHIJKLMNOPQRSTUVWXY
    
  2. m0

    Це операція «більший паліндром»; ми додаємо реверс поточного значення до самого значення, отримуючи це:

    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    
  3. ṁ135

    Оператор (mold) робить ряд речей, але в цьому контексті він ефективно приймає перші 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 запитань ( Aчерез O) з’являються 5 разів у рядку, а останні 10 запитань - Pчерез Y6 разів. Цей біт насправді не магічний; Я створив це таким чином, коли раніше вибрав число 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 випадків є кількістю відомих октетів, які існують, і, таким чином, є коротке представництво в Jelly (). Я міг зробити дуже мало для того, щоб це сталося; крок 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? Порожній рядок помилковий, інакше це правда.
FlipTack

@FlipTack це призведе до TypeErrorтого, що останній рекурсивний виклик поверне рядок
вів

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 питань шляхом застосування wдо 0, 1і 2, тобто робити 5*3^0^xкопії кожного числа (-> 15 разів 0, 5 разів 1і 5 разів 2).

zipWith3застосовується iдо списку штрафних санкцій, списку відповідей та списку правильних результатів. Нарешті всі бали додаються ( 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 є поданням рішенням і є правильним рішенням. Обидва будуть сприйматися як рядки.

Ось нерекурсивне рішення на рівні 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 #. Хакс вже деякий час звільняється, але я можу повернутися до нього.
Yytsi

Класно! Я коли-небудь використовував мозковий ебать один раз, тому моєю основною мовою є також Python.
0WJYxW9FMN

@ J843136028 Так, я насправді бачив ваші відповіді тут і там. Як моя біодохідність, я не витрачаю стільки часу на пошук рішень, тож вони не цікавлять більшість часу. Я лише так мало зробив з BrainF * ck, оскільки потрібно багато часу, щоб знайти короткі рішення, навіть проміжні проблеми.
Yytsi

Я знаю, що ви маєте на увазі про BF. Я здивований, що люди дивляться на мої відповіді.
0WJYxW9FMN
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.