Eu fiz o IMC este ano. Mais alguém aqui fez isso?
Em um artigo do UKMT Intermediate Maths Challenge, existem 25 perguntas. As primeiras quinze perguntas dão cinco notas, se você as acertar. Nas outras dez perguntas, você recebe seis notas para acertá-las. Nas últimas dez perguntas, você perde notas se errar! Nas perguntas dezesseis a vinte, você perde uma nota e nas últimas cinco perguntas, você perde duas notas. Se você deixar uma pergunta em branco, nenhuma marca será concedida ou deduzida. Nenhuma marca é deduzida por se ter errado uma das primeiras quinze perguntas. O artigo é de múltipla escolha; você pode escolher qualquer resposta entre A, B, C, D e E para cada pergunta. Sempre há apenas uma resposta certa para cada pergunta.
Crie um programa / função que use duas strings e produza uma pontuação. A primeira sequência será sua resposta ao artigo. Se você pular uma pergunta, use um espaço, um byte nulo ou um sublinhado. Caso contrário, use a letra A, B, C, D ou E para a resposta. Você pode ter as entradas em maiúsculas ou minúsculas. A segunda sequência será a resposta correta para cada pergunta do artigo. Seu programa / função produzirá uma pontuação. Faça seu código curto.
Casos de teste:
DDDDDDDDDDDDDDDDDDDDDDDDD
ABCDEABCDEABCDEABCDEABCDE
15
BDBEACCECEDDBDABBCBDAEBCD
BDBEACCECEDDBDABBCBDAEBCD
135
DBACBDCDBAEDABCDBEECACDC_
DBADBDCDBAEDABCDBEEDACDCA
117
_________________________
DABDABDABDABDABDABDABDABD
0
DBADBDCDBAEDABCD_E__A__C_
DBADBDCDBAEDABCDBEEDACDCA
99
_______________BBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAA
-15
Respostas:
C,
88878681 bytesExperimente online!
fonte
ABCDE
estão todos abaixo do ponto 95, acho que você pode usar*a<95
.-(c/15+c/20)*(*a<95)
pode se tornar*a?-c/15-c/20:0
.Geléia ,
262322 bytesExperimente online!
Como funciona
fonte
JavaScript (ES6),
706866 bytesEconomizou 2 bytes graças a Neil
Economizou 2 bytes graças a ETHproductions
Leva as respostas do candidato
a
e as respostas corretasc
na sintaxe do curry(a)(c)
. Espera que as perguntas ignoradas sejam marcadas com um espaço.Casos de teste
Mostrar snippet de código
fonte
/\w/g
para salvar dois bytes.-j-(i>19)
é o mesmo que-j^i>19
, embora não tenha certeza.(-j)^(i>19)
maneira: sim, isso funciona.Python 2 ,
86858377 bytesExperimente online!
Como funciona
Isso define uma função recursiva f que recebe dois argumentos não ideais: t (as respostas para o teste) es (a folha de respostas). Quando chamado apenas com estes dois argumentos, f inicializa i a 24 , o último índice de ambos t e s .
Toda vez que f é chamado, primeiro verifica se ~ i (o bit a bit NÃO de i ) é verdadeiro / diferente de zero. Como ~ (-1) = 0 , isso acontece quando i atinge o valor -1 . Se i = -1 , ~ i = 0 é retornado, mas como i toma valores de 24 a 0 (todos os índices de t e s ), o código seguinte
and
é executado e f retorna o resultado.Enquanto i não é negativo, acontece o seguinte. Primeiro,
cria uma tupla de comprimento 2 :
O quociente
i/10
é 0 se 0 ≤ i <10 , 1 se 10 ≤ i <20 e 2 se 20 ≤ i <25 . A comparação encadeada14<i<t[i]<'_'
retorna True se e somente se todas as comparações individuais retornarem True , ou seja, se e somente se i ≥ 15 (o intervalo de perguntas com penalidade), i for menor que t [i] (sempre verdadeiro, pois todos os números são menores que todas as iteráveis no Python 2), e t [i] não é um sublinhado.Se a comparação retornar Falso , o unário
-
retornará 0 e a expressão inteira será avaliada como 0 . No entanto, se a comparação retornar True , o unário-
retornará -1 , então a expressão inteira será avaliada como 0 se 0 ≤ i <10 , -1 se 10 ≤ i <20 e -2 se 20 ≤ i <25 ; estes são os resultados líquidos de respostas erradas ou ausentes para todos os índices i .5+i/15
retorna 5 + 0 = 5 se 0 ≤ i <15 e 5 + 1 = 6 se 15 ≤ i <25 . Estes são os resultados líquidos para respostas corretas para todos os índices i .Finalmente,
[t[i]==s[i]]
seleciona o primeiro elemento da tupla construída se t [i] e s [i] diferem (resposta incorreta ou ausente) e o segundo se for igual (resposta correta) e, em seguida, adiciona o valor de retorno de f chamado com decrementado eu para esse resultado. Quando eu atingir -1 , a pontuação final será calculada e retornada por f .fonte
Mathematica, 114 bytes
Função pura pegando um par ordenado de listas de caracteres e retornando um número inteiro.
m[Equal,#/."_"->u]
retorna uma lista de booleanos, exceto para entradas não avaliadas do formuláriou=="B"
em locais onde a resposta foi igual"_"
; então, imediatamente,u==_->0
transforma essas entradas não avaliadas em0
s.Tr/@Partition[...,5]
adiciona essas entradas 5 por vez, resultando em uma lista como{4False+True, 4False+True, 4False+True, 4False+True, 4False+True}
para o primeiro caso de teste ou{5True, 5True, 5True, 2True, 2True}
o último caso de teste. Em seguida, em cada coordenada,True
eFalse
são mapeados para as contagens apropriadas, e os resultados são adicionados juntos.fonte
Geléia ,
2221 bytesExperimente online!
Eu pensei que a resposta de @ Dennis provavelmente era superável. E depois de experimentar um grande número de possibilidades diferentes e me beneficiar de uma incrível coincidência, finalmente consegui!
Este programa usa um par de [respostas dos alunos, respostas corretas] como entrada e usa espaços para indicar uma resposta ausente.
Explicação
Este programa usa alguns formatos de entrada internos bizarros para acompanhar o que está acontecendo, por isso daremos um passo de cada vez.
Z
Isso transpõe a entrada; portanto, terminaremos com uma lista de 25 elementos, um para cada pergunta; cada elemento tem a forma [resposta do aluno, resposta correta]. Indicaremos um elemento deste formulário com uma letra maiúscula;
A
para a pergunta 1,B
para a pergunta 2 e assim por diante. Portanto, as respostas estão atualmente sendo armazenadas comom0
Esta é uma operação "maior palíndromo"; anexamos o reverso do valor atual ao próprio valor, produzindo o seguinte:
ṁ135
O
ṁ
operador (molde) faz várias coisas, mas, nesse contexto, efetivamente pega os primeiros 135 elementos da lista infinita produzidos, acrescentando o valor atual a si mesmo repetidamente. Isso nos dá o seguinte (que dividimos em grupos de 50 elementos por conveniência; esta é apenas uma lista de 135 pares internamente):µ;
µ
define o valor atual como o novo padrão para os operandos ausentes. Em seguida, vemos imediatamente um componente que está faltando um operando;;
acrescenta, mas não especificamos com o que anexar. Como resultado, o valor atual é anexado ao valor do últimoµ
(que também é o valor atual), fornecendo o seguinte valor atual de 270 elementos:t€⁶
Lembre-se de que todas as letras maiúsculas acima representam pares de [resposta do aluno, resposta correta]. A
t€⁶
operação opera em cada (€
) par e exclui (t
) espaços (⁶
) de ambos os lados do par (ou seja, qualquer espaço que apareça no par). Portanto, ainda temos a mesma lista complicada de 270 perguntas com muitas repetições, mas elas têm a forma [resposta correta] (o aluno não respondeu) ou [resposta do aluno, resposta correta] (o aluno respondeu).E€’
A
E€’
operação também opera em cada€
elemento ( ) e, devido ao uso deE
, substitui o elemento por 1 se todos os elementos forem iguais (ou seja, o aluno não respondeu ou acertou a pergunta) ou 0, se não todos. os elementos são iguais (ou seja, o aluno respondeu, mas errou a pergunta). O uso de’
aqui altera a numeração, o que significa que agora usamos -1 ou 0, respectivamente. Usarei letras minúsculas para esse novo tipo de elemento, que usa -1 para uma resposta que seria penalizada se estivesse em uma pergunta elegível à penalidade ou 0 para uma resposta correta ou ausente:;E€
Já vimos tanto
E€
e;
antes; estamos acrescentando algo ao valor atual e usando o formato 1 se todos os elementos forem iguais ou 0 se alguns forem diferentes (não’
desta vez!). Há um operando ausente aqui, então usamos o valor do últimoµ
(ou seja, a saída da etapa 3). Na etapa 3, não havíamos excluído espaços dos elementos, portanto, teremos 1 para uma resposta correta ou 0 para uma resposta incorreta ou ausente (porque um espaço não corresponde à resposta correta). A partir de agora, usarei letras maiúsculas para este formato 1 = correto, 0 = incorreto / ausente e continuarei a usar letras minúsculas para 0 = correto / ausente, -1 = incorreto. O valor resultante possui 405 elementos e se parece com isso:ṫ⁹
Aí vem a incrível coincidência que mencionei anteriormente. Antes de falar sobre esse trecho do código, quero fazer um balanço de onde devemos chegar.
Cada letra maiúscula representa +1 para uma resposta correta; as 15 primeiras perguntas (
A
aO
) aparecem 5 vezes cada na string e as últimas 10 perguntas (P
aY
) aparecem 6 vezes cada. Essa parte não é realmente mágica; Eu o projetei dessa maneira quando escolhi o número 135 no início do programa (que é 5 × 15 + 6 × 10), e o único golpe de sorte aqui é que 5 passa a ser um número ímpar (então são os últimos 10 perguntas que acabam aparecendo nos horários extras, em vez dos 10 primeiros). As 15 letras imediatamente anteriores a isso contêmp
atravést
(as questões de penalidade -1) uma vez eu
atravésy
(as questões de penalidade -2) duas vezes. Isso também não é muita coincidência; porque nós usamosm0
anteriormente, as cópias extras das perguntas estão na ordemPQRSTUVWXYYXWVUTSRQP
e as perguntas posteriores ocorrerão naturalmente perto do meio dessa sequência (portanto, fazer as últimas 15 perguntas "extras" fornecerá menos repetições para as próximas às bordas; e é claro que não é surpresa que as perguntas "extras" venham por último).Como cada letra minúscula subtrai 1 da pontuação para uma resposta incorreta e ausente, e cada letra maiúscula adiciona 1 à pontuação para uma resposta correta, portanto, precisamos simplesmente usar os últimos 135 + 15 = 150 elementos para obter cada tipo de elemento o número correto de vezes. O comando de Jelly para obter uma substring no final de uma lista é
ṫ
; no entanto, não especifica o número de elementos que você deseja, mas o índice do primeiro elemento que você deseja. Temos 405 elementos neste momento e queremos 150, portanto, precisamos começar no índice (405 - 150 + 1) ou 256. Em uma incrível coincidência, 256 passa a ser o número de octetos distintos que existem e, portanto, tem uma breve representação em Jelly (⁹
) Havia muito pouco que eu pudesse fazer para que isso acontecesse; a etapa 4 adicionou outros 135 elementos ao início da lista para atingir o número da rodada, mas o fato de serem 135 elementos que eu tinha que adicionar (um valor que estava prontamente disponível naquele ponto do programa) era realmente conveniente, com basicamente qualquer outro número sendo completamente inútil nessa situação.Aqui está como o valor interno parece agora:
S
Por fim, agora temos uma lista de modificações na pontuação das perguntas, tudo o que precisamos fazer é somar e usar
S
.fonte
Python 2 ,
9391 bytesExperimente online!
-2 bytes graças a @KritixiLithos
Entrada:
a
: Respostas do aluno como uma string,_
para a pergunta ignoradab
: respostas corretasn
: o número do atual0
baseado em perguntas , o padrão é0
fonte
a[0]<'^'
vez dea[0]!="_"
salvar bytes, você pode fazer o seguintea>""
pode funcionar em vez dea!=""
a
está vazia, você não pode simplesmente fazera and
? Uma cadeia vazia é falsa, caso contrário, é verdadeira.TypeError
como a última chamada recursiva retornaria uma stringk, 52 bytes
A função usa 2 strings, formato de acordo com os casos de teste
Exemplo:
fonte
Haskell, 84 bytes
Exemplo de uso:
((sum.).zipWith3 i(w=<<[0..2])) "DBADBDCDBAEDABCD_E__A__C_" "DBADBDCDBAEDABCDBEEDACDCA"
->99
. Experimente online! .Como funciona:
i x a b
calcula a pontuação para uma única respostaa
com resultado corretob
e a penalidadex
por uma resposta errada (um valor não negativo). Se você pular (a>'Z'
), a pontuação será0
, se a resposta estiver correta (a==b
), a pontuação será6-0^x
, caso contrário, a pontuação será-x
.w=<<[0..2]
faz uma lista de penalidades para todas as 25 perguntas aplicandow
a0
,1
e2
, ou seja, fazendo5*3^0^x
cópias de cada número (-> 15 vezes0
, 5 vezes1
e 5 vezes2
).zipWith3
aplicai
- se à lista de penalidades, lista de respostas e lista de resultados corretos. Finalmente, todas as pontuações são adicionadas (sum
).fonte
Oitava,
6154 bytesExperimente online!
Resposta anterior:
fonte
JavaScript (ES6),
10510310194898885847877 bytesMinha primeira solução no ES6, talvez até a primeira no Javascript Oo
s é a solução enviada e um é a solução correta. Ambos serão tomados como seqüências de caracteres.
Aqui está uma solução não recursiva em 78 bytes:
Recebe entrada através da sintaxe de currying.
Obrigado a @ETHproductions por salvar 9 bytes!
s[i]
parac
e(-1-(i>19|0))
para~(i>19)
.Agradecemos ao @Kritixi Lithos por salvar um byte!
c=='_'
parac>'Z'
.Experimente online!
fonte