Faça um nivelador de competição de matemática


17

Gosto de participar de competições de matemática organizadas pela Mu Alpha Theta, uma sociedade de honra da matemática nos Estados Unidos. Nas competições, faço um teste de múltipla escolha com 30 perguntas. Existem cinco opções por pergunta, rotuladas de A a E.

Minha pontuação em um teste é de quatro pontos para cada resposta correta, zero ponto para uma pergunta deixada em branco e um ponto negativo para cada resposta errada.

Escreva um programa que classifique um teste de acordo com o sistema de pontuação acima. Deve haver dois componentes para a entrada: uma chave de resposta seguida por respostas. As perguntas deixadas em branco devem ser inseridas como espaços em branco. A primeira entrada deve conter apenas as letras AE (ou ae, sua escolha) e pode-se assumir que não há espaço em branco na entrada. A segunda entrada deve conter apenas espaços em branco e as letras AE (ou ae). Entradas que não implementam testes de 30 perguntas devem ser impressas Invalid testcomo saída.

A saída deve ser a nota ou Invalid test.

Bônus

Se o seu programa imprimir o número certo, o número deixado em branco e o número errado após a pontuação final (aR bB cW), retire 20 bytes.

Entrada de amostra

CABBDCABECDBACDBEAACADDBBBEDDA    //answer key
CABEDDABDC BACDBBAADE  CBBEDDA    //responses

Saída de amostra

Nenhum bônus

73

Bônus

73 (20R 3B 7W)

Aplicam-se regras padrão. O menor código em bytes vence.


O que devemos fazer com espaços na primeira linha?
lirtosiast

@ThomasKwa Não deve haver espaços na primeira linha. Invalid test.
quer

2
Parece que você alterou as regras após a publicação das respostas, o que invalidou pelo menos 2 delas. Não faça alterações que possam invalidar respostas após o lançamento de um desafio. É uma boa ideia usar o Sandbox para obter feedback antes da postagem.
Alex A.

Eu acho que isso teria sido mais interessante como dissimulada
cat

e quanto à distinção entre maiúsculas e minúsculas? Além disso, e se o meu idioma for ... desagradável pelo espaço em branco? posso especificar espaço em branco na entrada deve ser sublinhado?
gato

Respostas:


7

Pyth, 53 51

?&!-sJ.z+d<G5&FqR30lMJ+sm?qFd4_1CJ/eJd"Invalid test

Experimente online

As verificações são feitas verificando se a entrada inteira contém caracteres quando todos os espaços a-esão removidos e verificando se as duas seqüências têm comprimento 30.

O cálculo da pontuação é feita por fechando as duas linhas em conjunto, em seguida, por mapeamento de cada par para: (letters are equal) ? 4 : -1. Em seguida, basta somar os valores e adicionar o número de espaços na segunda linha de volta à pontuação.


11
Sem erros. (Atualmente, menos bytes do que a resposta de Dennis ...)
Arcturus

7

Sério , 86 bytes

,`;l5╙¬=);' UΣS" ABCDE"=(**;l`Mi@)=YWé"Invalid test"0WX@Z```i@;(=5*(' =D+`(;l@)5╙¬=IMΣ

Toma entrada como "CABBDCABECDBACDBEAACADDBBBEDDA", "CABEDDABDC BACDBBAADE CBBEDDA"

Experimente online (você precisará inserir manualmente a entrada porque os links permanentes não gostam de aspas)

Trabalhando no bônus agora. Não, adicionar o bônus custaria mais de 20 bytes.

Eu sabia que estava esquecendo algo ... Invalid Testnão estava sendo impresso no caso de um erro. Lá estão minhas esperanças de jogar Dennis fora do golfe.


Faz? Seriamente? Então eu tenho que upvote-lo
edc65

4

JavaScript (ES6), 134 bytes

Editar: os requisitos da pergunta foram alterados. Essa resposta é quando o programa precisa garantir que cada caractere de resposta seja AE, cada caractere de resposta seja AE ou espaço e ambos tenham comprimentos de 30, caso contrário, retornem Invalid test.

(a,r)=>[...a].map((q,i)=>q>"E"|q<"A"?x=1:(c=r[l=i])==" "?0:c>"E"|c<"A"?x=1:c==q?s+=4:s--,s=x=0)&&x|l!=29|r.length!=30?"Invalid test":s

Explicação

(a,r)=>                   // a = answer string, r = responses string
  [...a].map((q,i)=>      // iterate over answers, q = answer, i = question number
    q>"E"|q<"A"?x=1:      // x = 1 if answer is invalid
    (c=r[l=i])==" "?0:    // c = question response, l = answer length, add 0 for space
    c>"E"|c<"A"?x=1:      // x = 1 if response is invalid
    c==q?s+=4:s--,        // add 4 if correct, subtract 1 if incorrect
    s=x=0                 // s = total score, x = is invalid
  )&&
    x|l!=29|r.length!=30? // check input lengths for validity
      "Invalid test":
      s                   // return the score

Teste

<input type="text" id="answers" value="CABBDCABECDBACDBEAACADDBBBEDDA" /><br />
<input type="text" id="responses" value="CABEDDABDC BACDBBAADE  CBBEDDA" /><br />
<button onclick='result.innerHTML=(

(a,r)=>[...a].map((q,i)=>q>"E"|q<"A"?x=1:(c=r[l=i])==" "?0:c>"E"|c<"A"?x=1:c==q?s+=4:s--,s=x=0)&&x|l!=29|r.length!=30?"Invalid test":s

)(answers.value,responses.value)'>Go</button><pre id="result"></pre>



3

JavaScript (Firefox 31+), 86 bytes

(x,y)=>(r=i=0,[for(l of y)x[i++]==l?r+=4:r-=l!=' '],i!=30|i-x.length?'Invalid test':r)

Usa a compreensão da matriz proposta para o ES7. Portanto, o suporte é limitado ao Firefox no momento.

Com bônus, 106 bytes (126 - 20)

(x,y)=>[r=w=i=0,[for(l of y)x[i++]==l?r++:w+=l!=' '],`${r*4-w} (${r}R ${i-r-w}B ${w}W)`,'Invalid test'][i!=30||i-x.length?3:2]

Editar: Anteriormente, minha solução verificava apenas a resposta ou o tamanho da pergunta, agora verifica as duas.


Você pode omitir o f=no início e dizer que isso gera uma função lambda.
Conor O'Brien

11
@ CᴏɴᴏʀO'Bʀɪᴇɴ Obrigado, eu sempre esqueço que eles estão testando -_-
George Reith

Isso seria significativamente menor sem o bônus. 86 bytes:(x,y)=>(r=i=0,[for(l of y)x[i++]==l?r+=4:r-=l!=' '],i!=30|i-x.length?'Invalid test':r)
user81655

@ user81655 verdadeira, obrigado ... Eu tenho um pouco apanhados na mesma ... a corda modelo sozinho é de 34 bytes
George Reith

Tenho uma resposta muito semelhante, mas não copiei esta (minha primeira tentativa é precedente, mas a excluí porque não estava verificando os comprimentos). Dito isto: isso não é válido, apesar de três upvotes, pois não verifica o intervalo A ... E
edc65 26-26

2

Japonês , 71 bytes

Japt é uma versão abreviada do Ja vaScri pt . Intérprete

Ul ¥30©Vl ¥30«(U+V k"[A-E ]+" ?U¬r@VgZ ¥Y?X+4:VgZ ¥S?X:X-1,0 :`InvÃ. È.

Os dois .s no final devem ser os caracteres Unicode não imprimíveis U + 0017 e U + 0099, respectivamente.

Como funciona

Ul ==30&&Vl ==30&&!(U+V k"[A-E ]+" ?Uq r@VgZ ==Y?X+4:VgZ ==S?X:X-1,0 :"Invalid test
                    // Implicit: U = first input, V = second input
Ul ==30&&Vl ==30&&  // If both input lengths are 30, and
!(U+V k"[A-E ]+"?   // removing all ABCDE and spaces from (U+V) results in an empty string:
Uq r@            ,0 //  Reduce U with this function, starting with a value of 0:
VgZ ==Y?            //   If the matching char in V is equal to this char, 
X+4                 //    return previous value + 4.
:VgZ ==S?X          //   Else if the matching char in V is a space, return previous value.
:X-1                //   Else (if it's wrong), return previous value - 1.
:"Invalid test      // Else, return "Invalid test".
                    // Implicit: output last expression

Espero que exista uma maneira mais curta de garantir que ambos os comprimentos sejam iguais a 30. Sugestões são bem-vindas!


2

Haskell, 144 138 bytes

a%b|map length[a,b]==[30,30]&&"ABCDE"!a&&"ABCDE "!b=show$sum$zipWith(?)a b|0<1="Invalid test"
l!s=all(`elem`l)
_?' '=0
x?y|x==y=4|0<1=0-1

Seria cerca de 50 sem a validação. cheirar .

Uso: "ABCDEABCDEABCDEABCDEABCDEABCDE" % "AAAAABBBBBCCCCCDDDDDEEEEEAAAAA"


11
!pode ser definido como all(`elem`l)s, economizando 6 bytes.
Zgarb

11
... ou pointfree go: g=all.flip elem.
N

2

C #, 162 154 148 134 bytes

string g(string k,string a)=>k.Length!=30||a.Length!=30?"Invalid Test!":Enumerable.Range(0,30).Sum(e=>a[e]==' '?0:k[e]==a[e]?4:-1)+"";

Uso

g("CABBDCABECDBACDBEAACADDBBBEDDA", "CABEDDABDC BACDBBAADE  CBBEDDA")

Teste

http://csharppad.com/gist/15f7c9c3c8cfce471ff2


Você pode alterá-lo int s=0,i=0;for(;...para salvar 3 bytes.
precisa

Isso não funcionará se eu inserir 29 caracteres para a primeira entrada e 31 para a segunda. Ele deve imprimir "teste inválido", mas na verdade tentará avaliar.
Johan

@ noisyass2: string x (string k, string a) => k.Comprimento! = 30 || a.Comprimento! = 30? "Teste inválido!": Enumerable.Range (0,30) .Resumo (e => a [e] == ''? 0: k [e] == a [e]? 4: -1) + ""; (134 caracteres) e considera a entrada de Johans.
Stephan Schinkel

+1 para solução, mas isso se qualifica? OP disse programa completo.
Yytsi

Johan boa captura! @StephanSchinkel, obrigado pela idéia de usar o delegado e o bit Enum.range. Eu era capaz de fazer a barba de mais de 3 caracteres mudança da condição a 30 == (k.Length & a.length)
noisyass2

2

Ruby, 81 caracteres

->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}

Exemplo de execução:

2.1.5 :001 > ->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}['CABBDCABECDBACDBEAACADDBBBEDDA','CABEDDABDC BACDBBAADE  CBBEDDA']
 => 73 

2.1.5 :002 > ->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}['CCCATCH','CABEDDABDC BACDBBAADE  CBBEDDA']
 => "Invalid test" 

2

Java, 183 169 bytes

Essa foi uma boa parte da prática do Java 8:

String f(String a,String r){return a.length()==30&r.length()==30?""+IntStream.range(0,30).map(i->a.charAt(i)==r.charAt(i)?4:r.charAt(i)!=' '?-1:0).sum():"Invalid test";}

Eu não sou um jogador de golfe Java, mas acho que você pode salvar String.valueOfadicionando o int a uma string vazia ( ""+IntStream....) - também acredito que o Java permite um curto-circuito e, portanto, você pode remover um &e salvar um byte .
VisualMelon

@VisualMelon Ótimas dicas, obrigado. Estava me irritando quantos bytes String.valueOf pegaram!
RCB

2

brainfuck, 354 bytes

+[--[>]<<+>-],----------[[<<<]>>->[>>>],----------]<<<[<<<]>>+[<-[-------<+>]<.+[---<+>]<.++++++++.[-<+++>]<-.+++++++++++.---.-----.-[---<+>]<-.---[-<++++>]<.+++[-<+++>]<.[---<+>]<----.+.>]>[[>,----------->+++++++[<---<<+++>>>-]<[<<+[>>+<<-]]>[>]<<<[>[>+>+<<-]>>[<<+>>-]>[>>>]>----<<<<[<<<]>>[-]]>[>-<-]>[>>[>>>]>-----<<<<[<<<]>[-]]>>]----[>+++<--]>--.<]

Requer um intérprete que permita ir para a esquerda da célula 0. A saída é um byte assinado. Por exemplo, o byte 0x49é impresso para a entrada de exemplo e 0xFFé impresso para entrada com a mesma primeira linha, mas a segunda linha foi substituída por "C" e 29 espaços.

A pontuação começa em 0 e, à medida que a segunda linha de entrada é lida, essas alterações são feitas nela:

  • A entrada está correta: não faça nada
  • Entrada incorreta: Subtrair 5
  • A entrada é um espaço: Subtraia 4

Finalmente, 120 é adicionado. Funcionalmente, é o mesmo que assumir uma pontuação perfeita e aplicar penalidades, em vez de começar com 0.

Com comentários:

+[--[>]<<+>-]                          Get 29

,----------[[<<<]>>->[>>>],----------] Get first line of input; for each char sub one
                                       from the 29

<<<[<<<]>>+                            Add one to the cell that originally held 29

[                                      If the cell that originally held 29 is nonzero:

  Write "Invalid test"
  <-[-------<+>]<.+[---<+>]<.++++++++.[-<+++>]<-.+++++++++++.---.-----.-[---<+>]<-.---[-<++++>]<.+++[-<+++>]<.[---<+>]<----.+.

>]

>[                                     If the cell to the right is nonzero:

  This block is only ever entered if "Invalid test" isn't written!

  [                                      For all 30 characters of the first input:

    >,                                     Get char from second input to the right

    ----------                             Subtract 10 for consistency

    -                                      Subtract one more

    >+++++++[<---<<+++>>>-]                Subtract 21 (plus above lines = 32)

    <[                                     If it's nonzero:

      <<+[>>+<<-]                            Add 22 to the character

    ]

    >[>]<<<[                                 If the above block wasn't entered:

      >[>+>+<<-]>>[<<+>>-]                   Make a copy of the character from input 1

      >[>>>]>----                            Subtract 4 from the score

      <<<<[<<<]>>[-]                         Go to the cell just before first character

    ]

    >[>-<-]                                Subtract input 1 char from input 2 char

    >[                                     If the result is nonzero:

      >>[>>>]>-----                          Subtract 5 from the score

      <<<<[<<<]>[-]                          Go back to the result and set it to 0

    ]

    >>                                     Move on to next character

  ]

  ----[>+++<--]>--                       Add 120 to score (perfect score)

  .                                      Print score

  <                                      Go to an empty cell to kill loop

]

1

Python 3, 187 179 175 165 155 151

lambda a,b:(['Invalid test',sum([-1,4][i==j]for i,j in zip(a,b))+b.count(' ')][len(a)==len(b)==30and set(a)^set('ABCDE')==set(b)^set('ABCDE ')==set()])

1

JavaScript ES7, 102

Como sempre, o bônus não vale o esforço.

(k,h,t=i=0)=>[for(x of h)t+=k[i++]==x?4:1-x?0:-1]|/[^ A-E]/.test(k+h)|i-30|k.length-i?"Invalid test":t

Verificando espaços inválidos na primeira entrada (como isso faz sentido para mim) 112

(k,h,t=i=0)=>[for(x of h)(y=k[i++])>' '?t+=y==x?4:1-x?0:-1:k=h+h]|/[^ A-E]/.test(k+h)|i-30|k[i]?"Invalid test":t

Ugh, a validação ocupou metade do meu código quando tentei: (k,r,s=0)=>/^[A-E]{30}$/.test(k)&&/^[ A-E]{30}$/.test(r)?Object.keys(k).map(i=>k[i]==r[i]?s+=4:s-=r[i]!=' ').pop():'Invalid Test'é 129 bytes.
Neil

1

Python 2.7, 131, 116, 109 , 139

Eu tentei fazer uma solução python "curta" ... Bem, aqui está, sugestões são mais que bem-vindas

lambda c,d:d.count(' ')+sum([-1,4][a==b]for a,b in zip(c,d)if b!=' ')if not set('ABCDE ')^set(c+d)and len(c)==len(d)==30 else'Test Invalid'

A adição de mais alguns caracteres torna muito mais legível ...

def m(c, d):
    if len(c)==len(d)==30:return d.count(' ')+sum((a==b)*4+(a!=b)*-1 for a,b in zip(c,d)if b!=' ')
    return'Test Invalid'

1

Prolog, 165 bytes

Mais da metade dos bytes são para a verificação de testes inválidos.

Código:

p(X,X,4).
p(_,32,0).
p(_,_,-1).
A*B:-length(A,30),length(B,30),subset(A,`ABCDE`),subset(B,`ABCDE `),maplist(p,A,B,L),sum_list(L,S),write(S);write('Invalid Test').

Explicado:

p(X,X,4).                                       % If corresponding elements are equal, 4p
p(_,32,0).                                      % If answer is 'space', 0p
p(_,_,-1).                                      % Else, -1p
A*B:-length(A,30),length(B,30),                 % Check that input is of correct length
     subset(A,`ABCDE`),subset(B,`ABCDE `),      % Check that input has correct characters
     maplist(p,A,B,L),sum_list(L,S),write(S);   % Create a list of scores (L) and print sum
     write('Invalid Test').                     % If anything failed, write Invalid Test

Exemplo:

`CABBDCABECDBACDBEAACADDBBBEDDA`*`CABEDDABDC BACDBBAADE  CBBEDDA`.
73

Experimente online aqui


1

MATLAB, 92 90 bytes

Obrigado a Tom Carpenter por me ajudar a reduzir minha resposta em 2 bytes!

function c(q,a),if nnz(q)~=30,t='Invalid test';else s=q-a;t=5*nnz(~s)-sum(s<9);end,disp(t)

A função pode ser chamada atribuindo a folha de respostas a q e as respostas enviadas a a . por exemplo:

c('CABBDCABECDBACDBEAACADDBBBEDDA','CABEDDABDC BACDBBAADE  CBBEDDA')

A resposta é simplesmente impressa na tela. 8 bytes podem ser salvos se for permitido imprimir ans = 73


Você pode salvar 2 bytes substituindo numel(q)por nnz(q).
Tom Carpenter

1

C # 6.0 -> (270 - 20 = 250) 246 - 20 = 226 bytes

void m(string b,string c){if((b+c).Length==60){var a=new int[3];int s=0;for(int i=0;i<30;i++){if(b[i]==c[i]){a[0]++;s+=4;}else if(c[i]==' ')a[2]++;else{a[1]++;s--;}}Console.Write(s+$" ({a[0]} {a[2]} {a[1]})");}else Console.Write("Invalid test");}

Versão legível e não destruída:

    void m(string b, string c)
    {
        if ((b+c).Length==60)
        {
            var a = new int[3];
            int s = 0;
            for (int i = 0; i < 30; i++)
            {
                if (b[i]==c[i])
                {
                    a[0]++;
                    s+=4;
                }
                else if (c[i] == ' ')a[2]++;
                else
                {
                    a[1]++;
                    s--;
                }
            }
            Console.Write(s+$" ({a[0]} {a[2]} {a[1]})");
        }
        else Console.Write("Invalid test");
    }

Realmente queria receber o bônus: D


Bom trabalho! Alguns truques gerais que se aplicam aqui, você pode declarar ijunto com sfora do loop for. Você pode usar varpara declarar a, economizando 1 byte (viva!). Você não precisa de muitas chaves {}no seu código, o que é sempre uma boa maneira de aparar bytes, e sempre vale a pena olhar para uma tabela ASCII ao comparar caracteres (você pode obter um byte de c[i]==' 'alguma forma usando uma desigualdade). Você também deve contar as seqüências de trás para frente - nesse caso, você pode salvar pelo menos 1 byte, rejeitando um pouco o loop for.
VisualMelon

Infelizmente, atualmente seu envio não é cúmplice dos critérios, pois não é possível reconhecer entradas inválidas.
VisualMelon

@VisualMelon Ahh, eu me sinto tão burra. Eu escrevi esta submissão na escola, então eu esqueci de adicionar as coisas 'teste inválido' etc. eu vou adicioná-los :)
Yytsi

@VisualMelon Sim, isso foi enviado e escrito na escola no final da aula, eu vou editá-lo. Graças para os truques :)
Yytsi

0

Groovy 2.4.5, 107 bytes

Apenas uma tradução simples da resposta Java anterior .

f={a,b->a.length()==30&b.length()==30?(0..29).collect{a[it]==b[it]?4:b[it]!=' '?-1:0}.sum():'Invalid test'}

0

C, 273 - 20 = 253 bytes

#include<stdio.h>
#include<string.h>
int main(int c,char**v){char*p=v[1],*q=v[2],*s=" ABCDE",r[]={0,0,0};if(strspn(p,s+1)!=30||p[30]||strspn(q,s)!=30||q[30])puts("Invalid test");else{for(;*p;++q)++r[(*p++!=*q)+(*q==' ')];printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]);}}

Eu recebi o bônus, mesmo que me custasse 23 bytes apenas para imprimi-lo. :-(

Explicação

#include <stdio.h>
#include <string.h>
int main(int c,char**v)
{
    char *p=v[1], *q=v[2],      /* arguments */
        *s=" ABCDE",            /* valid chars */
        r[]={0,0,0};            /* results - right, wrong, blank */

    if (strspn(p,s+1) != 30     /* validity check - answer key begins with [A-E]{30} */
        || p[30]                /* and ends there */
        || strspn(q,s) != 30    /* same for answers, but allow space, too */
        || q[30])
    {
        puts("Invalid test");
    } else {
        for ( ;  *p;  ++q)      /* for each answer */
            ++r[(*p++!=*q)+(*q==' ')]; /* increment the appropriate counter */
        printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]); /* print result */
    }
}

Há duas vezes mais código para verificar se há entrada inválida do que para contar as respostas - o verdadeiro desafio do desafio está no forloop próximo ao fim. De fato, aqui está uma versão que assume que a entrada é sempre válida, em 163-20 = 143 bytes:

#include<stdio.h>
int main(int c,char**v){char*p=v[1],*q=v[2],r[]={0,0,0};for(;*p;++q)++r[(*p++!=*q)+(*q==' ')];printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]);}

E aquele que faz a mesma suposição e imprime apenas a pontuação, em 133 bytes:

#include<stdio.h>
int main(int c,char**v){char*p=v[1],*q=v[2],r[]={4,-1,0};for(c=0;*p;++q)c+=r[(*p++!=*q)+(*q==' ')];printf("%d",c);}

0

SAS 9.4, 291-20 = 271 bytes (com bônus) ou 231 bytes (sem bônus)

Com bônus:

data a;k='CABBDCABECDBACDBEAACADDBBBEDDA';r='CABEDDABDC BACDBBAADE  CBBEDDA';c=0;b=0;w=0;if length(k) ne 30 then put "Invalid test";do i=1 to 30;if substr(k,i,1)=substr(r,i,1) then c=c+1;else if substr(r,i,1) =' ' then b=b+1;else w=w+1;end;a=cat(c*4-w,' (',c,'R ',b,'B ',w,'W)');put a;run;

Sem bônus:

data a;k='CABBDCABECDBACDBEAACADDBBBEDDA';r='CABEDDABDC BACDBBAADE  CBBEDDA';c=0;if length(k) ne 30 then put "Invalid test";do i=1 to 30;if substr(k,i,1)=substr(r,i,1) then c=c+4;else if substr(r,i,1)ne' ' then c=c-1;end;put c;run;

O Sas não possui realmente uma entrada / saída, portanto, você precisará substituir k = '..' pela chave er = '..' pela resposta. A saída é impressa no log.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.