Zrobiłem IMC w tym roku. Czy ktoś to tutaj zrobił?
W artykule UKMT Intermediate Maths Challenge znajduje się dwadzieścia pięć pytań. Pierwsze piętnaście pytań da ci pięć ocen, jeśli dobrze je zrozumiesz. W przypadku pozostałych dziesięciu pytań otrzymujesz sześć punktów za ich prawidłowe wykonanie. W ostatnich dziesięciu pytaniach tracisz oceny, jeśli pomylisz się! W przypadku pytań od szesnastego do dwudziestego tracisz jedną ocenę, a w przypadku ostatnich pięciu pytań tracisz dwie oceny. Jeśli pozostawisz pytanie puste, żadne oceny nie zostaną przyznane ani odjęte. Za pomyłkę w pierwszym piętnastu pytaniach nie są odejmowane oceny. Papier jest wielokrotnego wyboru; możesz wybrać dowolną odpowiedź spośród A, B, C, D i E dla każdego pytania. Zawsze jest tylko jedna właściwa odpowiedź na każde pytanie.
Utwórz program / funkcję, która pobiera dwa ciągi i generuje wynik. Pierwszy ciąg będzie twoją odpowiedzią na artykuł. Jeśli pominiesz pytanie, użyj spacji, bajtu zerowego lub podkreślenia. W przeciwnym razie użyj litery A, B, C, D lub E. Wejścia mogą mieć wielkie lub małe litery. Drugi ciąg będzie poprawnymi odpowiedziami na każde pytanie w pracy. Twój program / funkcja wyświetli wynik. Skróć swój kod.
Przypadki testowe:
DDDDDDDDDDDDDDDDDDDDDDDDD
ABCDEABCDEABCDEABCDEABCDE
15
BDBEACCECEDDBDABBCBDAEBCD
BDBEACCECEDDBDABBCBDAEBCD
135
DBACBDCDBAEDABCDBEECACDC_
DBADBDCDBAEDABCDBEEDACDCA
117
_________________________
DABDABDABDABDABDABDABDABD
0
DBADBDCDBAEDABCD_E__A__C_
DBADBDCDBAEDABCDBEEDACDCA
99
_______________BBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAA
-15
Odpowiedzi:
C,
88878681 bajtówWypróbuj online!
źródło
ABCDE
wszystkie są poniżej punktu 95, myślę, że możesz użyć*a<95
.-(c/15+c/20)*(*a<95)
może się stać*a?-c/15-c/20:0
.Galaretka ,
262322 bajtówWypróbuj online!
Jak to działa
źródło
JavaScript (ES6),
706866 bajtówZaoszczędzono 2 bajty dzięki Neilowi
Zaoszczędzono 2 bajty dzięki produktom ETH
Przyjmuje odpowiedzi kandydatów
a
i poprawne odpowiedzic
w składni curry(a)(c)
. Oczekuje, że pominięte pytania zostaną oznaczone spacją.Przypadki testowe
Pokaż fragment kodu
źródło
/\w/g
aby zaoszczędzić dwa bajty.-j-(i>19)
jest tak samo jak-j^i>19
, choć nie jestem pewien.(-j)^(i>19)
więc tak, to działa.Python 2 ,
86858377 bajtówWypróbuj online!
Jak to działa
Definiuje to funkcję rekurencyjną f, która przyjmuje dwa nieoptymalne argumenty: t (odpowiedzi na test) i s (arkusz odpowiedzi). Gdy f jest wywoływany tylko z tymi dwoma argumentami, f inicjuje i do 24 , ostatniego indeksu zarówno t, jak i s .
Za każdym razem , gdy wywoływane jest f , najpierw sprawdza, czy ~ i (bitowe NIE z i ) jest prawdziwe / niezerowe. Ponieważ ~ (-1) = 0 , dzieje się tak, gdy i osiągnie wartość -1 . Jeśli zwracane jest i = -1 , ~ i = 0 , ale ponieważ i przyjmuje wartości od 24 do 0 (wszystkie indeksy t i s ), następuje
and
wykonanie następującego kodu, a f zwraca wynik.Chociaż i jest nieujemne, dzieje się tak. Pierwszy,
tworzy krotkę o długości 2 :
Iloraz
i/10
wynosi 0, jeśli 0 ≤ i <10 , 1, jeśli 10 ≤ i <20 , i 2, jeśli 20 ≤ i <25 . Łańcuchowe porównanie14<i<t[i]<'_'
zwraca wartość Prawda wtedy i tylko wtedy, gdy wszystkie poszczególne porównania zwracają wartość Prawda , tj. Wtedy i tylko wtedy, gdy i ≥ 15 (zakres pytań z karą), i jest mniejsze niż t [i] (zawsze prawda, ponieważ wszystkie liczby są mniejsze niż wszystkie iterowalne w Pythonie 2), a t [i] nie jest znakiem podkreślenia.Jeśli porównanie zwróci False , jednoargumentowy
-
zwraca 0, a całe wyrażenie przyjmuje wartość 0 . Jeśli jednak porównanie zwraca True , jednoargumentowe-
zwraca -1 , więc całe wyrażenie jest oceniane na 0, jeśli 0 ≤ i <10 , -1, jeśli 10 ≤ i <20 , i -2, jeśli 20 ≤ i <25 ; są to wyniki netto błędnych lub brakujących odpowiedzi dla wszystkich wskaźników i .5+i/15
zwraca 5 + 0 = 5, jeśli 0 ≤ i <15 i 5 + 1 = 6, jeśli 15 ≤ i <25 . Są to wyniki netto dla poprawnych odpowiedzi dla wszystkich wskaźników i .Ostatecznie,
[t[i]==s[i]]
wybiera pierwszy element skonstruowanej krotki jeśli T [I] i y [i] różne (nieprawidłowy albo brak odpowiedzi), a drugi, gdy są one równe (prawidłowa odpowiedź), a następnie dodaje wartość powrotu f wywołana zmniejszany I do tego wyniku. Gdy i osiągnie -1 , końcowy wynik został obliczony i zwrócony przez f .źródło
Mathematica, 114 bajtów
Czysta funkcja pobierająca uporządkowaną parę list znaków i zwracająca liczbę całkowitą.
m[Equal,#/."_"->u]
zwraca listę wartości logicznych, z wyjątkiem nieocenionych wpisów formularzau=="B"
w miejscach, w których odpowiedź była równa"_"
; od razuu==_->0
zamienia te nieocenione wpisy w0
s.Tr/@Partition[...,5]
dodaje te wpisy w górę o 5 jednocześnie, co daje listę jak{4False+True, 4False+True, 4False+True, 4False+True, 4False+True}
dla pierwszego przypadku testowego lub{5True, 5True, 5True, 2True, 2True}
ostatniego przypadku testowego. Następnie w każdej współrzędnej,True
iFalse
są przypisane do odpowiednich punktów, a wyniki są sumowane.źródło
Galaretka ,
2221 bajtówWypróbuj online!
Myślałem, że odpowiedź @ Dennisa była prawdopodobnie możliwa do pobicia. I po wypróbowaniu ogromnej liczby różnych możliwości i czerpaniu korzyści z niesamowitego przypadku, w końcu udało mi się!
Ten program pobiera parę [odpowiedzi ucznia, poprawne odpowiedzi] i wykorzystuje spacje do wskazania brakującej odpowiedzi.
Wyjaśnienie
Ten program używa dziwnych wewnętrznych formatów wejściowych, aby śledzić, co się dzieje, więc zrobimy to krok po kroku.
Z
To transponuje dane wejściowe, więc otrzymamy listę 25 elementów, po jednym dla każdego pytania; każdy element ma formę [odpowiedź ucznia, poprawna odpowiedź]. Element tego formularza wskażemy wielką literą;
A
w przypadku pytania 1,B
pytania 2 itd. Więc odpowiedzi są obecnie przechowywane jakom0
Jest to operacja „większego palindromu”; dołączamy odwrotność bieżącej wartości do samej wartości, uzyskując to:
ṁ135
Operator
ṁ
(formy) robi wiele rzeczy, ale w tym kontekście skutecznie bierze pierwsze 135 elementów nieskończonej listy utworzonej przez wielokrotne dołączanie do siebie bieżącej wartości. To daje nam następujące informacje (które dla wygody podzieliłem na grupy 50 elementów; jest to tylko wewnętrzna lista 135 par):µ;
µ
ustawia bieżącą wartość jako nową wartość domyślną dla brakujących argumentów. Natychmiast widzimy wbudowane narzędzie, w którym brakuje operandu;;
dołącza, ale nie określiliśmy, z czym się połączyć. W rezultacie bieżąca wartość jest dołączana do wartości z ostatniejµ
(która jest również wartością bieżącą), co daje nam następującą 270-elementową bieżącą wartość:t€⁶
Pamiętaj, że wszystkie powyższe duże litery reprezentują pary [odpowiedź ucznia, poprawna odpowiedź].
t€⁶
Działanie działa na każdym (€
) parę i usuwa (t
) przestrzenie (⁶
) z każdej strony pary (to znaczy jakiejkolwiek przestrzeni, które pojawiają się w para). Wciąż mamy tę samą złożoną listę 270 pytań z wieloma powtórzeniami, ale mają one postać [poprawna odpowiedź] (uczeń nie odpowiedział) lub [odpowiedź ucznia, prawidłowa odpowiedź] (uczeń odpowiedział).E€’
E€’
Operacja działa również na każdym (€
) elementu, a dzięki zastosowaniuE
zastępuje element z 1, jeżeli wszystkie elementy są równe (czyli uczeń nie odpowie albo dostaje prawo pytanie) lub 0 jeśli nie wszystkie elementy są równe (tzn. uczeń odpowiedział, ale źle zrozumiał pytanie). Użycie’
tutaj zmienia numerację, co oznacza, że teraz używamy odpowiednio -1 lub 0. Użyję małych liter dla tego nowego elementu, który używa -1 dla odpowiedzi, która byłaby ukarana, gdyby była na pytanie kwalifikujące się do kary, lub 0 dla brakującej lub poprawnej odpowiedzi:;E€
Widzieliśmy jedno
E€
i drugie;
; dodajemy coś do bieżącej wartości i używamy formatu 1, jeśli wszystkie elementy są równe, lub 0, jeśli niektóre są różne (nie’
tym razem!). Brakuje tutaj argumentu, więc używamy wartości z ostatniegoµ
(tj. Wyniku z kroku 3). W kroku 3 nie usunęliśmy spacji z elementów, więc będziemy mieć 1 za poprawną odpowiedź lub 0 za niepoprawną lub brakującą odpowiedź (ponieważ spacja nie pasuje do poprawnej odpowiedzi). Od tej pory będę używać wielkich liter 1 = poprawny, 0 = niepoprawny / brakujący format i nadal będę używać małych liter dla 0 = poprawny / brakujący, -1 = niepoprawny. Wynikowa wartość ma 405 elementów i wygląda następująco:ṫ⁹
Nadchodzi niesamowity zbieg okoliczności, o którym wspomniałem wcześniej. Zanim zacznę mówić o tym fragmencie kodu, chcę podsumować, gdzie musimy.
Każda wielka litera oznacza +1 dla poprawnej odpowiedzi; pierwsze 15 pytań (
A
doO
) pojawia się 5 razy w ciągu, a ostatnie 10 pytań (P
doY
) pojawia się 6 razy. Ten kawałek nie jest tak naprawdę magiczny; Zaprojektowałem to w ten sposób, gdy wcześniej wybrałem w programie liczbę 135 (czyli 5 × 15 + 6 × 10), a jedynym szczęściem jest to, że 5 jest liczbą nieparzystą (więc jest to ostatnia 10 pytania, które kończą się dodatkowymi czasami, zamiast pierwszych 10). W 15 litery tuż przed tym zawieraćp
przezt
(-1 pytania kar) jednorazowo, iu
przezy
(kwestionuje -2 penalty) dwa razy. To też nie jest duży zbieg okoliczności; ponieważ użyliśmym0
wcześniej dodatkowe kopie pytań są w kolejnościPQRSTUVWXYYXWVUTSRQP
, a późniejsze pytania naturalnie pojawią się w pobliżu środka tego ciągu (więc pobranie ostatnich 15 „dodatkowych” pytań da mniej powtórzeń tym w pobliżu krawędzi; i oczywiście nie jest zaskoczeniem, że „dodatkowe” pytania są ostatnie).Ponieważ każda mała litera odejmuje 1 od wyniku dla niepoprawnej, brakującej odpowiedzi, a każda wielka litera dodaje 1 do wyniku dla poprawnej odpowiedzi, dlatego po prostu musimy wziąć ostatnie 135 + 15 = 150 elementów, aby uzyskać każdy rodzaj elementu poprawną liczbę razy. Poleceniem Jelly do uzyskania podłańcucha na końcu listy jest
ṫ
; nie określa jednak liczby pożądanych elementów, a raczej indeks pierwszego żądanego elementu. W tym momencie mamy 405 elementów i chcemy 150, więc musimy zacząć od indeksu (405 - 150 + 1) lub 256. W zadziwiający zbieg okoliczności 256 to liczba różnych oktetów, które istnieją, a zatem ma krótka reprezentacja w Galaretce (⁹
). Niewiele mogłem zrobić, aby tak się stało; krok 4 dodał kolejne 135 elementów na początku listy, aby trafić w okrągły numer, ale fakt, że było to 135 elementów, które musiałem dodać (wartość, która była łatwo dostępna w tym momencie programu) był bardzo wygodny, w zasadzie każda inna liczba jest całkowicie nieprzydatna w tej sytuacji.Oto jak teraz wygląda wartość wewnętrzna:
S
Wreszcie, teraz mamy listę modyfikacji wyniku z pytań, wszystko, co musimy zrobić, to zsumować je za pomocą
S
i gotowe.źródło
Python 2 ,
9391 bajtówWypróbuj online!
-2 bajty dzięki @KritixiLithos
Wkład:
a
: Odpowiedzi ucznia jako ciąg,_
za pominięte pytanieb
: poprawne odpowiedzin
: liczba bieżących pytań0
, domyślnie0
źródło
a[0]<'^'
zamiasta[0]!="_"
oszczędzać bajtya>""
może działać zamiasta!=""
a
jest pusta, nie możesz tego zrobića and
? Pusty ciąg jest fałszywy, w przeciwnym razie jest prawdziwy.TypeError
jako, że ostatnie wywołanie rekurencyjne zwróci ciągk, 52 bajty
Funkcja przyjmuje 2 ciągi znaków, format na przypadki testowe
Przykład:
źródło
Haskell, 84 bajty
Przykład użycia:
((sum.).zipWith3 i(w=<<[0..2])) "DBADBDCDBAEDABCD_E__A__C_" "DBADBDCDBAEDABCDBEEDACDCA"
->99
. Wypróbuj online! .Jak to działa:
i x a b
oblicza wynik dla pojedynczej odpowiedzia
z poprawnym wynikiemb
i karęx
za złą odpowiedź (wartość nieujemna). Jeśli pominiesz (a>'Z'
), wynik jest0
, jeśli odpowiedź jest prawidłowa (a==b
), wynik jest6-0^x
, w przeciwnym razie wynik jest-x
.w=<<[0..2]
tworzy listę kar za wszystkie 25 pytań, stosującw
się do0
,1
i2
, czyli tworzenia5*3^0^x
kopii każdego numeru (-> 15 razy0
, 5 razy1
i 5 razy2
).zipWith3
dotyczyi
listy kar, listy odpowiedzi i listy poprawnych wyników. Wreszcie wszystkie wyniki są dodawane (sum
).źródło
Oktawa,
6154 bajtówWypróbuj online!
Poprzednia odpowiedź:
źródło
JavaScript (ES6),
10510310194898885847877 bajtówMoje pierwsze rozwiązanie w ES6, może nawet pierwsze w Javascript Oo
s jest przesłanym rozwiązaniem, a a jest poprawnym rozwiązaniem. Oba będą traktowane jako ciągi znaków.
Oto nierekurencyjne rozwiązanie o 78 bajtach:
Pobiera dane wejściowe poprzez składnię curry.
Dzięki @ETHproductions za oszczędność 9 bajtów!
s[i]
doc
i(-1-(i>19|0))
do~(i>19)
.Dzięki @Kritixi Lithos za uratowanie bajtu!
c=='_'
doc>'Z'
.Wypróbuj online!
źródło