Calculadora GPA do estudante universitário em dificuldades


13

Calculadora GPA

(GPA = nota média)

Você é um estudante universitário estressado durante a semana das finais. Em vez de estudar para os próximos exames, você decide que é melhor determinar qual GPA terá no final do semestre. Dessa forma, você tem dados para fazer backup de sua decisão de ficar acordado a noite toda para colocar o A no cálculo, em vez de o B permanecer na lista do decano!

Sendo um especialista em ciência da computação, você deseja encontrar a maneira mais legal de determinar esse GPA. Claro que a maneira mais legal é com o código mais curto! Isso é , então o código mais curto em bytes vence!

Detalhes

  • A faculdade que você frequenta usa um GPA básico escalado junto com o horário de crédito.
  • Um grau de letra A é 4,0, B é 3,0, C é 2,0, D é 1,0 e F é 0,0
  • Seu GPA é um GPA ponderado; portanto, um A em uma classe de 4 horas de crédito conta 4 vezes mais que um A em uma classe de 1 hora de crédito (veja os exemplos abaixo para obter mais explicações de peso)
  • As horas de crédito variam de 1 a 4
  • Seu programa precisará ter uma lista de duas entradas de linha de comando, Grade e Hora de crédito. Você pode determinar a melhor maneira de inseri-las no seu programa através da linha de comando. Você não precisa se preocupar com muitas entradas, mas garanta que seu código possa lidar com um semestre de 19 horas de crédito.

    • ie Entrada: A 1 B 4 C 2…
  • Seu programa deve gerar o GPA, usando 3 dígitos (ou seja, X.XX)

  • Seu GPA precisa ser arredondado para duas casas decimais. Arredonde da maneira que desejar (piso, teto, base, etc.)

Exemplos de entrada (escolha o que for melhor para o seu design)

  • A1B3C2F3B4
  • A1 B3 C2 F3 B4
  • A 1 B 3 C 2 F 3 B 4
  • A, 1, B, 3, C, 2, F, 3, B, 4
  • A1, B3, C2, F3, B4

Ou qualquer uma das combinações acima, em que você usa o formato de listar todas as notas e o horário de crédito:

  • ie ABAA 3 4 1 1

Exemplos

Input - A 3 B 4 A 1 A 1
Output - 3.56
Explanation: (4.0 * 3 + 3.0 * 4 + 4.0 * 1 + 4.0 * 1)/(3+4+1+1) = 3.555556 rounded off to 3.56 

Input - A 4 F 2 C 3 D 4
Output - 2.00
Explanation: (4.0 * 4 + 0.0 * 2 + 2.0 * 3 + 1.0 * 4)/(4+2+3+4) = 2 rounded off to 2.00

2
@DevelopingDeveloper Por favor, tente evitar formatos de E / S complicados .
JungHwan Min

1
@JungHwanMin Informe qual opção de E / S você deseja que eu não especifiquei? Dei cerca de 6 opções flexíveis diferentes, mas ele precisa ser especificado para realmente se encaixar nesse cenário.
DevelopingDeveloper

3
@DevelopingDeveloper Your GPA needs to be rounded to two decimal places: para conseguir isso, as pessoas precisam adicionar código adicional que não tem nada a ver com o cálculo do GPA.
JungHwan Min

2
Bem-vindo ao PPCG. Primeira pergunta agradável na minha humilde opinião.
ElPedro

5
Apesar de ser uma pergunta bastante interessante, diminuí a votação, porque, como disse antes, forçar arredondamentos e saídas com zeros à direita faz deste um desafio de várias partes; as respostas estão tendo que adicionar bytes desnecessariamente, simplesmente para estar em conformidade com as especificações de saída, o que torna um desafio chato e pior na IMO geral.
caird coinheringaahing

Respostas:


5

Gelatina ,  15  21 bytes (12 sem arredondamento)

+6 bytes para a formatação estrita (quase certamente possível em menos, mas é hora de dormir)

Oạ69.Ḟ×S×ȷ2÷⁹S¤RLDż”.

Um programa completo que leva as notas e as respectivas horas de crédito que imprimem o GPA calculado (Nota: o método de arredondamento é o mínimo, conforme permitido no OP).

Experimente online!

Sem arredondamento para 12 bytes :

Oạ69.Ḟ×S÷⁹S¤

Quão?

Oạ69.Ḟ×S×ȷ2÷⁹S¤RLDż”. - Link: list of characters, grades; list of number, creditHours
                      -                                   e.g. "AFBDC", [5, 2, 4, 1, 2]
O                     - cast to ordinals (vectorises)          [65,70,66,68,67]
  69.                 - literal 69.5
 ạ                    - absolute difference (vectorises)       [4.5,0.5,3.5,1.5,2.5]
     Ḟ                - floor (vectorises)                     [4,0,3,1,2]
      ×               - multiply by creditHours (vectorises)   [20,0,12,1,4]
       S              - sum                                    37
         ȷ2           - literal 100
        ×             - multiply                               3700
              ¤       - nilad followed by link(s) as a nilad:
            ⁹         -   chain's right argument, creditHours  [5, 2, 4, 1, 2]
             S        -   sum                                  14
           ÷          - division                               264.2857142857143
               R      - range                                  [1,2,3,...,264]
                L     - length                                 264
                 D    - digits                                 [2,6,4]
                   ”. - literal '.'
                  ż   - zip together                           [[2,'.'],6,4]
                      - implicit print (smashing)              2.64

@nimi - bom ponto, eu perdi esse pedaço. Fixo.
Jonathan Allan


4

Perl 5 , 57 53 + 2 ( -an) = 59 55 bytes

$c+=$F[1];$\+=$F[1]*=!/F/&&69-ord}{printf'%.2f',$\/$c

Experimente online!

Editar: trocou a entrada para economizar 4 bytes

Formato de entrada: linha separada, créditos seguidos de nota:

grade credits

Exemplo:

A 3
B 4
A 1
A 1


3

Wolfram Language (Mathematica) , 39 bytes

N[(5-LetterNumber@#2/.-1->0).#/Tr@#,3]&

Leva uma lista de horas de crédito e, em seguida, uma série de notas.

Não funciona no TIO porque o TIO usa o kernel do Mathematica (que não deseja imprimir números de precisão arbitrários)


2
-3 bytes se você usarTr

3
Isso falhará no segundo caso de teste. Ele retorna 1,85 porque você conta F = -1
J42161217

2
Aqui está uma correção de 41 bytes:N[(5-(LetterNumber@#2/. 6->5)).#/Tr@#,3]&
J42161217

@Jenny_mathy nice catch. Eu não tenho idéia de como eu perdi isso ... O parêntese extra poderia ser diminuído movendo o /., no entanto.
JungHwan Min

2

JavaScript (ES6), 72 bytes

Formato de entrada: A1B3C2F3B4

f=([c,d,...s],a=b=0)=>c?f(s,a+~'DCBA'.search(c,b-=d)*d):(a/b).toFixed(2)

Casos de teste


Em que ponto se searchtorna mais golfista do que parseInt?
11117 Neil

A @Neil parseIntprovavelmente se tornaria mais golfista com apenas mais algumas notas suportadas. Um problema é a diferença entre F = 0 e D = 1, no entanto.
Arnauld

Huh, eu nem tinha notado que não há E ...
Neil

2

R , 64 bytes

function(G,H)sprintf("%.2f",(5-match(G,LETTERS[-5]))%*%H/sum(H))

Experimente online!

obrigado a user2390246 por corrigir um erro!


Eu acho que você quer dizerLETTERS[-5]
user2390246

@ user2390246 sim, é claro. isso foi bobagem da minha parte.
Giuseppe

2

Java, 211 bytes

Formato de entrada: A1B3C2F3B4

Golfe

interface A{static void main(String[] a){int p=0,t=0,h=0,s=0;for(int c:a[0].toCharArray())if(p++%2==0)t=c=='A'?4:c=='B'?3:c=='C'?2:c=='D'?1:0;else{s+=(c-=48)*t;h+=c;}System.out.print(Math.ceil(100d*s/h)/100);}}

Unglofed

static void main(String[] a) {
    int p=0, //position in string
    t=0, //temp var, used to store the grade between iterations
    h=0, //credit sum
    s=0; //sum of weighted grade

    for(int c:a[0].toCharArray())
        if(p++%2==0)
            //map c to grade value, assign to temp variable t
            t=c=='A'?4:c=='B'?3:c=='C'?2:c=='D'?1:0;
        else{
            //map c to credit value, add temp variable (grade from previous char) * value of this char (credit) to sum
            s+=(c-=48)*t;
            //also, add credit to credit sum
            h+=c;
        }
    System.out.print(Math.ceil(100d*s/h)/100); //grade sum / credit hours sum, to 2dp*/
}

Outra versão

Meu instinto me disse que usar um formato de entrada diferente (ABCF1324) tornaria o código mais curto. Parece que não. A versão abaixo tem 234 bytes.

Golfe

interface A{static void main(String[] b){char[] a=b[0].toCharArray();int l=a.length/2,h=0,s=0,g,c,i;for(i=0;i<l;i++){g=a[i];g=g=='A'?4:g=='B'?3:g=='C'?2:g=='D'?1:0;c=a[i+l]-48;s+=g*c;h+=c;}System.out.print(Math.ceil(100d*s/h)/100);}}a

Ungolfed

static void main(String[] b) {
    char[] a=b[0].toCharArray(); //char array
    int l=a.length/2, //first grade char
    h=0, //credit sum
    s=0, //sum of weighted grade
    g,c, //avoid declaration in for loop. grade and credit being iterated
    i; //avoid declaration in for loop
    for(i=0;i<l;i++) {
        g=a[i];//get char representing grade from array
        g=g=='A'?4:g=='B'?3:g=='C'?2:g=='D'?1:0; //convert to grade
        c=a[i+l]-48;//get char representing grade from array and convert to credit (48 is value of '0')
        s+=g*c; //add weighted grade to sum
        h+=c; //add credit to sum
    }
    System.out.print(Math.ceil(100d*s/h)/100); //grade sum / credit hours sum, to 2dp*/
}

Olá e bem-vindo! Você não precisa responder com programas completos, para poder eliminar muitos bytes assim.
Nissa

2

Java 1.8 , 287 249 bytes

-38 bytes graças ao Bumptious

Golfe

static String N(String[]j){float g=0;float b=0;for(int i=0;i<j.length;i+=2){g=((m(j[i])*Float.parseFloat(j[i+1])+g));b+=Double.parseDouble(j[i+1]);}return String.format("%.2f",g/b);}static float m(String l){return l.equals("F")?0:('E'-l.charAt(0));}

Ungolfed

interface C {
static void main(String[] z) throws Exception {
    String[] j = {"A", "4", "B", "3", "C", "2", "D", "1", "F", "1"};
    System.out.println(N(j));
}

static String N(String[] j) {
    float g = 0;
    float b = 0;
    for (int i = 0; i < j.length; i += 2) {
        g = ((m(j[i]) * Float.parseFloat(j[i + 1]) + g));
        b += Double.parseDouble(j[i + 1]);
    }
    return String.format("%.2f", g / b);
}

static float m(String l) {
    return l.equals("F") ? 0 : ('E' - l.charAt(0));
}
}

1
Reduzir o comprimento usando isso? float estático m (String l) {return l.equals ("F")? 0 :( 'E'-l.charAt (0));}
Bumptious Q Bangwhistle

1

Julia 0.6 , 46 43 42 bytes

g%h=round(max.(69-Int.(g),0)⋅h/sum(h),2)

Experimente online!

Explicação

Formato de entrada g:: vetor de notas; h: vetor de horas de crédito

  • g%h: Redefinir %operador.
  • 69-Int.(g): Converta 'F','D','C','B','A'para -1,1,2,3,4respectivamente para cada elemento de g.
  • max.( ,0): Faixa de fixação até 0:4(elemento).
  • O resto é matemática vetorial simples.
  • O arredondamento custa 9 bytes.
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.