Contrassegna un documento UKC IMC


22

Ho fatto l'IMC quest'anno. Qualcun altro qui l'ha fatto?

In un articolo della UKMT Intermediate Maths Challenge, ci sono venticinque domande. Le prime quindici domande ti danno cinque voti se le ottieni bene. Per le altre dieci domande, ottieni sei voti per averle giuste. Nelle ultime dieci domande, perdi punti se sbagli! Per le domande da sedici a venti, perdi un voto e per le ultime cinque domande, perdi due punti. Se si lascia vuota una domanda, nessun voto viene assegnato o dedotto. Non vengono detratti voti per aver sbagliato una delle prime quindici domande. Il documento è a scelta multipla; puoi scegliere qualsiasi risposta tra A, B, C, D ed E per ogni domanda. C'è sempre solo una risposta giusta per ogni domanda.

Crea un programma / funzione che prende due stringhe e genera un punteggio. La prima stringa sarà la tua risposta al documento. Se si salta una domanda, utilizzare uno spazio, un byte null o un carattere di sottolineatura. Altrimenti, usa la lettera A, B, C, D o E per la risposta. Puoi avere gli input maiuscoli o minuscoli. La seconda stringa sarà la risposta corretta per ogni domanda nel documento. Il tuo programma / funzione produrrà quindi un punteggio. Rendi il tuo codice breve.

Casi test:

DDDDDDDDDDDDDDDDDDDDDDDDD
ABCDEABCDEABCDEABCDEABCDE
15

BDBEACCECEDDBDABBCBDAEBCD
BDBEACCECEDDBDABBCBDAEBCD
135

DBACBDCDBAEDABCDBEECACDC_
DBADBDCDBAEDABCDBEEDACDCA
117

_________________________
DABDABDABDABDABDABDABDABD
0

DBADBDCDBAEDABCD_E__A__C_
DBADBDCDBAEDABCDBEEDACDCA
99

_______________BBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAA
-15

"Per le domande dai quindici ai venti" dovrebbe essere "Per le domande dai sedici ai venti"?
Greg Martin,

1
Possiamo usare un byte null per rappresentare domande saltate?
Betseg,

2
E il primo punteggio non dovrebbe essere 27-12 = 15?
Greg Martin,

1
Qualcuno ha visto / fatto i documenti UKMT? Sono davvero divertenti. Dai un'occhiata ai puzzle su ukmt.org.uk. Ricevo la maggior parte delle mie idee per le sfide dalle domande di matematica.
0WJYxL9FMN

1
I casi di test dovrebbero probabilmente includere un invio con un punteggio negativo.
Dennis,

Risposte:


7

C, 88 87 86 81 byte

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;}

Provalo online!


1
Dato che ABCDEsono tutti al di sotto del punto 95, penso che tu possa usare *a<95.
Yytsi,

2
Dal momento che la domanda consente di prendere byte null invece di trattini bassi, -(c/15+c/20)*(*a<95)può diventare *a?-c/15-c/20:0.
Dennis,


6

Gelatina , 26 23 22 byte

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

Provalo online!

Come funziona

=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 byte

Salvato 2 byte grazie a Neil
Salvato 2 byte grazie a ETHproductions

Accetta le risposte del candidato ae le risposte corrette cnella sintassi del curry (a)(c). Si aspetta che le domande saltate vengano contrassegnate con uno spazio.

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

Casi test


Se si modifica la domanda ignorata in un carattere non di parole (ad es. Spazio), è possibile utilizzare /\w/gper salvare due byte.
Neil,

Penso che -j-(i>19) sia lo stesso -j^i>19, anche se non sono sicuro.
ETHproductions

@ETHproductions Effettivamente. Questo è analizzato in questo (-j)^(i>19)modo, sì, funziona.
Arnauld,

4

Python 2 , 86 85 83 77 byte

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)

Provalo online!

Come funziona

Questo definisce una funzione ricorsiva f che accetta due argomenti non ottimali: t (le risposte al test) e s (il foglio delle risposte). Se chiamato solo con questi due argomenti, f inizializza da i a 24 , l'ultimo indice sia di t che di s .

Ogni volta che viene chiamato f , viene innanzitutto verificato se ~ i (NOT bit a bit di i ) è true / diverso da zero. Poiché ~ (-1) = 0 , ciò accade quando l' i raggiunge il valore -1 . Se viene restituito i = -1 , ~ i = 0 , ma poiché i assume valori da 24 a 0 (tutti gli indici di t e s ), andviene eseguito il codice seguente e f restituisce il risultato.

Mentre io non è negativo, succede quanto segue. Primo,

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

crea una tupla di lunghezza 2 :

  • Il quoziente i/10è 0 se 0 ≤ i <10 , 1 se 10 ≤ i <20 e 2 se 20 ≤ i <25 . Il confronto concatenato 14<i<t[i]<'_'restituisce True se e solo se tutti i singoli confronti restituiscono True , ovvero se e solo se i ≥ 15 (l'intervallo di domande con penalità), i è minore di t [i] (sempre true poiché tutti i numeri sono inferiori a tutti gli iterabili in Python 2) e t [i] non è un trattino basso.

    Se il confronto restituisce False , l'unario -restituisce 0 e l'intera espressione restituisce 0 . Tuttavia, se il confronto restituisce True , l'unario -restituisce -1 , quindi l'intera espressione viene valutata 0 se 0 ≤ i <10 , -1 se 10 ≤ i <20 e -2 se 20 ≤ i <25 ; questi sono i risultati netti per risposte errate o mancanti per tutti gli indici i .

  • 5+i/15restituisce 5 + 0 = 5 se 0 ≤ i <15 e 5 + 1 = 6 se 15 ≤ i <25 . Questi sono i risultati netti per le risposte corrette per tutti gli indici i .

Infine, [t[i]==s[i]]seleziona il primo elemento della tupla costruita se t [i] e s [i] differiscono (risposta errata o mancante) e il secondo se sono uguali (risposta corretta), quindi aggiunge il valore restituito di f chiamato con decrementato Ho a tale risultato. Una volta che i raggiunge -1 , il punteggio finale è stato calcolato e viene restituito da f .


3

Mathematica, 114 byte

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}}]&

Funzione pura che accetta una coppia ordinata di elenchi di caratteri e restituisce un numero intero. m[Equal,#/."_"->u]restituisce un elenco di valori booleani, ad eccezione delle voci non valutate del modulo u=="B"nei luoghi in cui la risposta era uguale "_"; poi subito u==_->0trasforma quelle voci non valutate in 0s. Tr/@Partition[...,5]aggiunge queste voci fino a 5 alla volta, risultando in un elenco come {4False+True, 4False+True, 4False+True, 4False+True, 4False+True}per il primo caso di test o {5True, 5True, 5True, 2True, 2True}per l'ultimo caso di test. Poi in ogni coordinata, Truee Falsevengono mappati ai punteggi appropriati, ei risultati vengono sommati.


3

Gelatina , 22 21 byte

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

Provalo online!

Pensavo che la risposta di Dennis fosse probabilmente battibile. E dopo aver provato un numero enorme di possibilità diverse e aver beneficiato di una straordinaria coincidenza, finalmente sono riuscito!

Questo programma accetta come input una coppia di [risposte dello studente, risposte corrette] e utilizza gli spazi per indicare una risposta mancante.

Spiegazione

Questo programma utilizza alcuni bizzarri formati di input interni per tenere traccia di ciò che sta accadendo, quindi faremo un passo alla volta.

  1. Z

    Questo traspone l'input, quindi finiremo con un elenco di 25 elementi, uno per ogni domanda; ogni elemento ha la forma [risposta dello studente, risposta corretta]. Indicheremo un elemento di questo modulo con una lettera maiuscola; Aper la domanda 1, Bper la domanda 2 e così via. Quindi le risposte sono attualmente archiviate come

    ABCDEFGHIJKLMNOPQRSTUVWXY
    
  2. m0

    Questa è un'operazione "maggiore palindromo"; aggiungiamo il contrario del valore corrente al valore stesso, producendo questo:

    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    
  3. ṁ135

    L' operatore (stampo) fa una serie di cose, ma in questo contesto prende effettivamente i primi 135 elementi della lista infinita prodotta aggiungendo ripetutamente il valore corrente a se stesso. Questo ci dà quanto segue (che ho suddiviso in gruppi di 50 elementi per comodità; questo è solo un elenco di 135 coppie internamente):

    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    
  4. µ;

    µimposta il valore corrente come nuovo predefinito per operandi mancanti. Vediamo quindi immediatamente un builtin in cui manca un operando; ;aggiunge, ma non abbiamo specificato cosa aggiungere. Di conseguenza, il valore corrente viene aggiunto al valore a partire dall'ultimo µ(che è anche il valore corrente), dandoci il seguente valore corrente di 270 elementi:

    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQPABCDEFGHIJKLMNO
    PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
    PQRSTUVWXYYXWVUTSRQPONMLKJIHGFEDCBAABCDEFGHIJKLMNO
    PQRSTUVWXYYXWVUTSRQP
    
  5. t€⁶

    Ricorda che tutte le lettere maiuscole sopra rappresentano coppie di [risposta dello studente, risposta corretta]. L' t€⁶operazione opera su ciascuna coppia ( ) ed elimina ( t) spazi ( ) da entrambi i lati della coppia (ovvero qualsiasi spazio che appare nella coppia). Quindi abbiamo ancora lo stesso elenco contorto di 270 domande con molte ripetizioni, ma sono nella forma [risposta corretta] (lo studente non ha risposto) o [risposta dello studente, risposta corretta] (lo studente ha risposto).

  6. E€’

    L' E€’operazione opera anche su ciascun elemento ( ) e, a causa dell'uso di E, sostituisce l'elemento con 1 se tutti gli elementi sono uguali (ovvero lo studente non ha risposto o ha risposto correttamente alla domanda), o 0 se non tutti i gli elementi sono uguali (cioè lo studente ha risposto ma ha sbagliato la domanda). L'uso di qui cambia la numerazione, il che significa che ora utilizziamo rispettivamente -1 o 0. Userò lettere minuscole per questo nuovo tipo di elemento, che usa -1 per una risposta che sarebbe penalizzata se fosse su una domanda ammissibile a penalità, o 0 per una risposta mancante o corretta:

    abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
    abcdefghijklmnopqrstuvwxyyxwvutsrqponmlkjihgfedcba
    abcdefghijklmnopqrstuvwxyyxwvutsrqpabcdefghijklmno
    pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
    pqrstuvwxyyxwvutsrqponmlkjihgfedcbaabcdefghijklmno
    pqrstuvwxyyxwvutsrqp
    
  7. ;E€

    Abbiamo visto entrambi E€e ;prima; stiamo aggiungendo qualcosa al valore corrente e stiamo usando un formato 1 se tutti gli elementi sono uguali o 0 se alcuni sono diversi (no questa volta!). C'è un operando mancante qui, quindi usiamo il valore come l'ultimo µ(ovvero l'output del passaggio 3). Nel passaggio 3, non avevamo eliminato gli spazi dagli elementi, quindi avremo 1 per una risposta corretta o 0 per una risposta errata o mancante (perché uno spazio non corrisponde alla risposta corretta). Da ora in poi, userò lettere maiuscole per questo 1 = corretto, 0 = formato errato / mancante e continuerò a usare lettere minuscole per 0 = corretto / mancante, -1 = errato. Il valore risultante ha 405 elementi e si presenta così:

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

    Ecco la sorprendente coincidenza di cui ho parlato prima. Prima di parlare di questo pezzetto di codice, voglio fare un bilancio di dove dobbiamo arrivare.

    Ogni lettera maiuscola rappresenta +1 per una risposta corretta; le prime 15 domande ( Aattraverso O) appaiono 5 volte ciascuna nella stringa e le ultime 10 domande ( Pattraverso Y) appaiono 6 volte ciascuna. Quel po 'non è davvero magico; L'ho progettato in quel modo quando ho scelto il numero 135 in precedenza nel programma (che è 5 × 15 + 6 × 10), e l'unico colpo di fortuna qui è che 5 sembra essere un numero dispari (quindi è l'ultimo 10 domande che finiscono per apparire i tempi supplementari, piuttosto che i primi 10). Le 15 lettere immediatamente precedenti il presente contengono pattraverso t(i -1 domande penalità) una volta, e uattraverso y(domande -2 di penalità) due volte. Anche questa non è una coincidenza; perché abbiamo usatom0prima, le copie extra delle domande sono nell'ordine PQRSTUVWXYYXWVUTSRQPe le domande successive si presentano naturalmente vicino al centro di quella stringa (quindi prendere le ultime 15 domande "extra" darà meno ripetizioni a quelle vicino ai bordi; e ovviamente, non è una sorpresa che le domande "extra" arrivino per ultime).

    Poiché ogni lettera minuscola sottrae 1 dal punteggio per una risposta errata e non mancante e ogni lettera maiuscola aggiunge 1 al punteggio per una risposta corretta, pertanto è necessario semplicemente prendere gli ultimi 135 + 15 = 150 elementi per ottenere ogni tipo di elemento il numero corretto di volte. Il comando di Jelly per ottenere una sottostringa alla fine di un elenco è ; tuttavia, non specifica il numero di elementi desiderati, ma piuttosto l'indice del primo elemento desiderato. A questo punto abbiamo 405 elementi e ne vogliamo 150, quindi dobbiamo iniziare dall'indice (405 - 150 + 1) o 256. In una sorprendente coincidenza, 256 sembra essere il numero di ottetti distinti che esistono, e quindi ha una breve rappresentazione in Jelly (). C'era ben poco che potessi fare per farlo accadere; il passaggio 4 ha aggiunto altri 135 elementi all'inizio dell'elenco per raggiungere il numero rotondo, ma il fatto che fossero 135 elementi che dovevo aggiungere (un valore che era prontamente disponibile in quel punto del programma) era davvero conveniente, con praticamente qualsiasi altro numero completamente inutile in questa situazione.

    Ecco come appare il valore interno ora:

    uvwxyyxwvutsrqpABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    ONMLKJIHGFEDCBAABCDEFGHIJKLMNOPQRSTUVWXYYXWVUTSRQP
    
  9. S

    Infine, ora abbiamo un elenco di modifiche al punteggio ottenuto dalle domande, tutto ciò che dobbiamo fare è sommarle usando S, e il gioco è fatto.


2

Python 2 , 93 91 byte

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)

Provalo online!

-2 byte grazie a @KritixiLithos


Ingresso:

  • a: Risposte dello studente come stringa, _per una domanda ignorata
  • b : risposte corrette
  • n: il numero della domanda corrente 0basata su, per impostazione predefinita è0

Puoi fare a[0]<'^'invece di a[0]!="_"salvare byte
Kritixi Lithos,

Penso che a>""possa funzionare invece dia!=""
Kritixi Lithos l'

Se il tuo controllo iniziale sta terminando la ricorsione quando aè vuoto, non puoi farlo a and? Una stringa vuota è falsa, altrimenti è vera.
FlipTack,

@FlipTack questo lancerebbe a TypeErrorpoiché l'ultima chiamata ricorsiva restituirebbe una stringa
ovs

1

k, 52 byte

La funzione richiede 2 stringhe, formato per i casi di test

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

Esempio:

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

1

Haskell, 84 byte

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])

Esempio di utilizzo: ((sum.).zipWith3 i(w=<<[0..2])) "DBADBDCDBAEDABCD_E__A__C_" "DBADBDCDBAEDABCDBEEDACDCA"-> 99. Provalo online! .

Come funziona: i x a bcalcola il punteggio per una singola risposta acon il risultato corretto be la penalità xper una risposta errata (un valore non negativo). Se salti ( a>'Z'), il punteggio è 0, se la risposta è corretta ( a==b), il punteggio è 6-0^x, altrimenti il ​​punteggio è -x.

w=<<[0..2]fa un elenco di sanzioni per tutte le 25 domande applicando wa 0, 1e 2, cioè facendo 5*3^0^xcopie di ogni numero (-> 15 volte 0, 5 volte 1e 5 volte 2).

zipWith3si applica iall'elenco delle penalità, all'elenco delle risposte e all'elenco dei risultati corretti. Alla fine vengono aggiunti tutti i punteggi ( sum).


1

Ottava, 61 54 byte

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

Provalo online!

Risposta precedente:

@(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 byte

La mia prima soluzione in ES6, forse anche prima in 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 è la soluzione inviata e a è la soluzione corretta. Entrambi saranno presi come stringhe.

Ecco una soluzione non ricorsiva a 78 byte:

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

Riceve input tramite la sintassi del curry.

Grazie a @ETHproductions per il risparmio di 9 byte! s[i]verso ce (-1-(i>19|0))verso ~(i>19).

Grazie a @Kritixi Lithos per aver salvato un byte! c=='_'a c>'Z'.

Provalo online!


Parlando di questa essendo la tua prima soluzione in JS, qual è la tua lingua principale per il codice golf? Ho sempre usato Python e Brainfuck per il code golf.
0WJYxL9FMN,

@ J843136028 La mia lingua principale è Python, ma ho giocato a golf anche con C #. Haxe è stato licenziato per un po ', ma potrei tornare su di esso.
Yytsi,

Freddo! Ho usato Brainfuck solo una volta, quindi anche la mia lingua principale è Python.
0WJYxL9FMN

@ J843136028 Sì, in realtà ho visto le tue risposte qua e là. Dato che le mie rese biologiche, non passo molto tempo a trovare soluzioni, quindi non sono interessanti per la maggior parte del tempo. Ho fatto così poco con BrainF * ck, poiché ci vuole molto tempo per trovare soluzioni brevi, anche a problemi intermedi.
Yytsi,

So cosa intendi per BF. Sono sorpreso che le persone guardino le mie risposte.
0WJYxL9FMN
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.