Hice el IMC este año. ¿Alguien más aquí lo hizo?
En un documento del Reto Intermedio de Matemáticas de UKMT, hay veinticinco preguntas. Las primeras quince preguntas le dan cinco puntos si las contesta correctamente. Para las otras diez preguntas, obtienes seis puntos por acertar. ¡En las últimas diez preguntas, pierde puntos si se equivoca! Para las preguntas 16 a 20, pierde una nota y para las últimas cinco preguntas, pierde dos puntos. Si deja una pregunta en blanco, no se otorgan ni se deducen las marcas. No se deducen marcas por haber respondido mal alguna de las primeras quince preguntas. El papel es de opción múltiple; Puede elegir cualquier respuesta de A, B, C, D y E para cada pregunta. Siempre hay una sola respuesta correcta para cada pregunta.
Cree un programa / función que tome dos cadenas y genere una puntuación. La primera cadena serán sus respuestas al documento. Si omite una pregunta, use un espacio, un byte nulo o un guión bajo. De lo contrario, use la letra A, B, C, D o E para la respuesta. Puede tener las entradas en mayúscula o minúscula. La segunda cadena será las respuestas correctas para cada pregunta en el documento. Su programa / función generará una puntuación. Haz tu código corto.
Casos de prueba:
DDDDDDDDDDDDDDDDDDDDDDDDD
ABCDEABCDEABCDEABCDEABCDE
15
BDBEACCECEDDBDABBCBDAEBCD
BDBEACCECEDDBDABBCBDAEBCD
135
DBACBDCDBAEDABCDBEECACDC_
DBADBDCDBAEDABCDBEEDACDCA
117
_________________________
DABDABDABDABDABDABDABDABD
0
DBADBDCDBAEDABCD_E__A__C_
DBADBDCDBAEDABCDBEEDACDCA
99
_______________BBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAA
-15
Respuestas:
C,
88878681 bytesPruébalo en línea!
fuente
ABCDE
todos están por debajo del punto 95, creo que puedes usarlos*a<95
.-(c/15+c/20)*(*a<95)
puede convertirse*a?-c/15-c/20:0
.Jalea ,
262322 bytesPruébalo en línea!
Cómo funciona
fuente
JavaScript (ES6),
706866 bytesGuardado 2 bytes gracias a Neil
Guardado 2 bytes gracias a ETHproductions
Toma las respuestas del solicitante
a
y las respuestas correctasc
en la sintaxis curry(a)(c)
. Espera que las preguntas omitidas se marquen con un espacio.Casos de prueba
Mostrar fragmento de código
fuente
/\w/g
para guardar dos bytes.-j-(i>19)
es lo mismo-j^i>19
, aunque no estoy seguro.(-j)^(i>19)
así, sí, esto funciona.Python 2 ,
86858377 bytesPruébalo en línea!
Cómo funciona
Esto define una función recursiva f que toma dos argumentos no óptimos: t (las respuestas a la prueba) ys (la hoja de respuestas). Cuando se llama solo con estos dos argumentos, f inicializa i a 24 , el último índice de t y s .
Cada vez que se llama f , primero verifica si ~ i (el NO a nivel de bit de i ) es verdadero / no cero. Como ~ (-1) = 0 , esto sucede una vez que i alcanza el valor -1 . Si i = -1 , ~ i = 0 se devuelve, pero como i toma valores desde 24 a 0 (todos los índices de t y s ), el siguiente código
and
es ejecutado y f devuelve el resultado.Mientras i es no negativo, ocurre lo siguiente. Primero,
crea una tupla de longitud 2 :
El cociente
i/10
es 0 si 0 ≤ i <10 , 1 si 10 ≤ i <20 y 2 si 20 ≤ i <25 . La comparación encadenada14<i<t[i]<'_'
devuelve Verdadero si y solo si todas las comparaciones individuales devuelven Verdadero , es decir, si y solo si i ≥ 15 (el rango de preguntas con penalización), i es menor que t [i] (siempre cierto ya que todos los números son menores que todos los iterables en Python 2), y t [i] no es un guión bajo.Si la comparación devuelve False , el unario
-
devuelve 0 y toda la expresión se evalúa a 0 . Sin embargo, si la comparación devuelve Verdadero , el unario-
devuelve -1 , por lo que toda la expresión se evalúa a 0 si 0 ≤ i <10 , -1 si 10 ≤ i <20 y -2 si 20 ≤ i <25 ; Estos son los resultados netos de respuestas incorrectas o faltantes para todos los índices i .5+i/15
devuelve 5 + 0 = 5 si 0 ≤ i <15 y 5 + 1 = 6 si 15 ≤ i <25 . Estos son los resultados netos para las respuestas correctas para todos los índices i .Finalmente,
[t[i]==s[i]]
selecciona el primer elemento de la tupla construido si t [i] y s [i] difieren (mal o respuesta que falta) y el segundo si son iguales (respuesta correcta), luego se agrega el valor de retorno de f llamada con decrementa yo a ese resultado. Una vez i alcanza -1 , la puntuación final se ha calculado y se devuelve por f .fuente
Mathematica, 114 bytes
Función pura que toma un par ordenado de listas de caracteres y devuelve un número entero.
m[Equal,#/."_"->u]
devuelve una lista de booleanos, excepto las entradas no evaluadas del formulariou=="B"
en lugares donde la respuesta es igual"_"
; luego, de inmediato,u==_->0
convierte esas entradas no evaluadas en0
s.Tr/@Partition[...,5]
agrega estas entradas hasta 5 a la vez, dando como resultado una lista como{4False+True, 4False+True, 4False+True, 4False+True, 4False+True}
para el primer caso de prueba o{5True, 5True, 5True, 2True, 2True}
para el último caso de prueba. Luego, en cada coordenada,True
yFalse
se asignan a las puntuaciones apropiadas, y los resultados se suman.fuente
Jalea ,
2221 bytesPruébalo en línea!
me pensamiento @ respuesta de Dennis fue probablemente puede derrotar. Y después de probar una gran cantidad de posibilidades diferentes y beneficiarme de una sorprendente coincidencia, ¡finalmente lo logré!
Este programa toma un par de [respuestas del estudiante, respuestas correctas] como entrada y usa espacios para indicar una respuesta que falta.
Explicación
Este programa utiliza algunos formatos de entrada internos extraños para realizar un seguimiento de lo que está sucediendo, por lo que lo haremos paso a paso.
Z
Esto transpone la entrada, por lo que terminaremos con una lista de 25 elementos, uno para cada pregunta; cada elemento tiene la forma [respuesta del alumno, respuesta correcta]. Indicaremos un elemento de este formulario con una letra mayúscula;
A
para la pregunta 1,B
para la pregunta 2, y así sucesivamente. Entonces las respuestas se almacenan actualmente comom0
Esta es una operación de "mayor palíndromo"; agregamos el reverso del valor actual al valor en sí mismo, produciendo esto:
ṁ135
El
ṁ
operador (molde) hace una serie de cosas, pero en este contexto, toma efectivamente los primeros 135 elementos de la lista infinita producidos al agregar el valor actual a sí mismo repetidamente. Eso nos da lo siguiente (que he dividido en grupos de 50 elementos por conveniencia; esto es solo una lista de 135 pares internamente):µ;
µ
establece el valor actual como el nuevo valor predeterminado para los operandos faltantes. Entonces vemos de inmediato una construcción que le falta un operando;;
agrega, pero no hemos especificado con qué agregar. Como resultado, el valor actual se agrega al valor del últimoµ
(que también es el valor actual), dándonos el siguiente valor actual de 270 elementos:t€⁶
Recuerde que todas las letras mayúsculas arriba representan pares de [respuesta del estudiante, respuesta correcta]. La
t€⁶
operación opera en cada (€
) par y elimina (t
) espacios (⁶
) de cualquier lado del par (es decir, cualquier espacio que aparezca en el par). Así que todavía tenemos la misma lista enrevesada de 270 preguntas con muchas repeticiones, pero son de la forma [respuesta correcta] (el estudiante no respondió) o [respuesta del estudiante, respuesta correcta] (el estudiante sí respondió).E€’
La
E€’
operación también opera en cada€
elemento ( ) y, debido al uso deE
, reemplaza el elemento con 1 si todos los elementos son iguales (es decir, el estudiante no respondió o respondió correctamente), o 0 si no todos los elementos son iguales (es decir, el alumno respondió pero se equivocó). El uso de’
aquí cambia la numeración, lo que significa que ahora usamos -1 o 0 respectivamente. Usaré letras minúsculas para este nuevo tipo de elemento, que usa -1 para una respuesta que sería penalizada si se tratara de una pregunta elegible para penalización, o 0 para una respuesta faltante o correcta:;E€
Hemos visto ambos
E€
y;
antes; estamos agregando algo al valor actual, y estamos usando un formato de 1 si todos los elementos son iguales, o 0 si algunos son diferentes (¡no’
esta vez!). Aquí falta un operando, por lo que usamos el valor del últimoµ
(es decir, la salida del paso 3). En el paso 3, no habíamos eliminado espacios de los elementos, por lo que tendremos 1 para una respuesta correcta o 0 para una respuesta incorrecta o faltante (porque un espacio no coincidirá con la respuesta correcta). De ahora en adelante, usaré letras mayúsculas para este formato 1 = correcto, 0 = incorrecto / faltante, y continuaré usando letras minúsculas para 0 = correcto / faltante, -1 = incorrecto. El valor resultante tiene 405 elementos, y se ve así:ṫ⁹
Aquí viene la sorprendente coincidencia que mencioné anteriormente. Antes de hablar sobre este fragmento de código, quiero hacer un balance de dónde tenemos que llegar.
Cada letra mayúscula representa +1 para una respuesta correcta; las primeras 15 preguntas (
A
hastaO
) aparecen 5 veces cada una en la cadena, y las últimas 10 preguntas (P
hastaY
) aparecen 6 veces cada una. Esa parte no es realmente mágica; Lo diseñé de esa manera cuando elegí el número 135 anteriormente en el programa (que es 5 × 15 + 6 × 10), y el único golpe de suerte aquí es que 5 es un número impar (así que son los últimos 10 preguntas que terminan apareciendo los tiempos extra, en lugar de los primeros 10). Las 15 letras inmediatamente anteriores a este contienenp
a través det
(las -1 preguntas de penalización) una vez, yu
a través dey
(preguntas el -2 de penalización) dos veces. Eso tampoco es una gran coincidencia; porque usamosm0
anteriormente, las copias adicionales de las preguntas están en el ordenPQRSTUVWXYYXWVUTSRQP
, y las preguntas posteriores ocurrirán naturalmente cerca del medio de esa cadena (por lo tanto, tomar las últimas 15 preguntas "adicionales" dará menos repeticiones a las que están cerca de los bordes; y por supuesto, no es una sorpresa que las preguntas "adicionales" sean las últimas).Debido a que cada letra minúscula resta 1 del puntaje para obtener una respuesta incorrecta y no falta, y cada letra mayúscula agrega 1 al puntaje para obtener una respuesta correcta, por lo tanto, simplemente necesitamos tomar los últimos 135 + 15 = 150 elementos para obtener cada tipo de elemento el número correcto de veces. El comando de Jelly para obtener una subcadena al final de una lista es
ṫ
; sin embargo, no especifica la cantidad de elementos que desea, sino el índice del primer elemento que desea. Tenemos 405 elementos en este punto, y queremos 150, por lo que necesitamos comenzar en el índice (405 - 150 + 1), o 256. En una sorprendente coincidencia, 256 es el número de octetos distintos que existen, y por lo tanto tiene una breve representación en Jelly (⁹
) Había muy poco que pudiera hacer para que esto sucediera; el paso 4 agregó otros 135 elementos al comienzo de la lista para alcanzar el número redondo, pero el hecho de que fueran 135 elementos que tuve que agregar (un valor que estaba fácilmente disponible en ese punto del programa) fue realmente conveniente, básicamente, cualquier otro número es completamente inútil en esta situación.Así es como se ve el valor interno ahora:
S
Finalmente, ahora tenemos una lista de modificaciones al puntaje de las preguntas, todo lo que tenemos que hacer es sumarlas usando
S
, y hemos terminado.fuente
Python 2 ,
9391 bytesPruébalo en línea!
-2 bytes gracias a @KritixiLithos
Entrada:
a
: Respuestas del alumno como una cadena,_
para la pregunta omitidab
: respuestas correctasn
: el número de la pregunta actual0
basada en valores predeterminados0
fuente
a[0]<'^'
lugar dea[0]!="_"
guardar bytesa>""
puede funcionar en lugar dea!=""
a
está vacía, ¿no puede hacerloa and
? Una cadena vacía es falsa, de lo contrario es verdad.TypeError
como la última llamada recursiva devolvería una cadenak, 52 bytes
La función toma 2 cadenas, formato según los casos de prueba
Ejemplo:
fuente
Haskell, 84 bytes
Ejemplo de uso:
((sum.).zipWith3 i(w=<<[0..2])) "DBADBDCDBAEDABCD_E__A__C_" "DBADBDCDBAEDABCDBEEDACDCA"
->99
. Pruébalo en línea! .Cómo funciona:
i x a b
calcula el puntaje de una sola respuestaa
con el resultado correctob
y la penalizaciónx
por una respuesta incorrecta (un valor no negativo). Si omite (a>'Z'
), la puntuación es0
, si la respuesta es correcta (a==b
), la puntuación es6-0^x
, de lo contrario, la puntuación es-x
.w=<<[0..2]
hace una lista de todas las sanciones por 25 preguntas mediante la aplicaciónw
a0
,1
y2
, es decir, hacer5*3^0^x
copias de cada número (-> 15 veces0
, 5 veces1
y 5 veces2
).zipWith3
se aplicai
a la lista de penalizaciones, lista de respuestas y lista de resultados correctos. Finalmente se suman todos los puntajes (sum
).fuente
Octava,
6154 bytesPruébalo en línea!
Respuesta anterior:
fuente
Javascript (ES6),
10510310194898885847877 bytesMi primera solución en ES6, tal vez incluso primero en Javascript Oo
s es la solución presentada y a es la solución correcta. Ambos serán tomados como cadenas.
Aquí hay una solución no recursiva de 78 bytes:
Toma información a través de la sintaxis de curry.
¡Gracias a @ETHproductions por guardar 9 bytes!
s[i]
ac
y(-1-(i>19|0))
a~(i>19)
.¡Gracias a @Kritixi Lithos por guardar un byte!
c=='_'
ac>'Z'
.Pruébalo en línea!
fuente