Kalkulator GPA walczącego studenta

13

Kalkulator GPA

(GPA = średnia ocen)

Jesteś zestresowanym studentem podczas tygodnia finałów. Zamiast uczyć się do zbliżających się egzaminów, decydujesz, że najlepiej jest ustalić, jaki GPA będziesz mieć na koniec semestru. W ten sposób masz dane, aby poprzeć decyzję o pozostaniu przez całą noc, aby dostać A w rachunku zamiast B, aby pozostać na liście dziekana!

Będąc informatyką chcesz znaleźć najfajniejszy sposób na określenie tego GPA. Oczywiście najfajniejszym sposobem jest najkrótszy kod! To jest , więc wygrywa najkrótszy kod w bajtach!

Detale

  • Uczelnia, do której się wybierasz, korzysta z podstawowego GPA skalowanego wraz z godzinami kredytowania.
  • Litera A to 4.0, B to 3.0, C to 2.0, D to 1.0, a F to 0.0
  • Twój GPA jest GPA ważonym, więc A w klasie 4 godzin kredytowych liczy 4 razy więcej niż A w klasie 1 godziny kredytowej (więcej przykładów wyjaśniono poniżej)
  • Godziny kredytu wahają się od 1-4
  • Twój program będzie musiał mieć listę dwóch danych wejściowych wiersza poleceń, oceny i godziny kredytu. Możesz określić najlepszy sposób wprowadzenia ich do swojego programu za pomocą wiersza poleceń. Nie musisz się martwić o zbyt wiele danych wejściowych, ale upewnij się, że Twój kod może obsłużyć 19-godzinny semestr kredytu.

    • tj. Wejście: A 1 B 4 C 2…
  • Twój program musi wyprowadzać GPA, używając 3 cyfr (tj. X.XX)

  • Twój GPA musi być zaokrąglony do dwóch miejsc po przecinku. Zaokrąglaj w dowolny sposób (podłoga, sufit, podstawa itp.)

Przykłady wprowadzania (wybierz, który z nich najlepiej pasuje do twojego projektu)

  • 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

Lub dowolną z powyższych kombinacji, w których używasz formatu wyświetlania wszystkich ocen, a następnie ich godzin kredytowych:

  • tj. ABAA 3 4 1 1

Przykłady

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
DevelopingDeveloper
źródło
2
@DevelopingDeveloper Staraj się unikać uciążliwych formatów We / Wy .
JungHwan Min
1
@JungHwanMin Daj mi znać, której opcji We / Wy chciałeś, a której nie podałem? Dałem około 6 różnych elastycznych opcji, ale należy je określić, aby faktycznie pasowały do ​​tego scenariusza.
DevelopingDeveloper
3
@DevelopingDeveloper Your GPA needs to be rounded to two decimal places: aby to osiągnąć, ludzie muszą dodać dodatkowy kod, który nie ma nic wspólnego z obliczeniami GPA.
JungHwan Min
2
Witamy w PPCG. Ładne pierwsze pytanie w mojej skromnej opinii.
ElPedro,
5
Pomimo tego, że jest to dość interesujące pytanie, przegłosowałem, ponieważ, jak powiedziałem wcześniej, wymuszanie zaokrąglania i wyprowadzania z zerowymi zerami czyni z tego wyzwanie wieloczęściowe; odpowiedzi muszą niepotrzebnie dodawać bajty, aby dostosować się do specyfikacji wyjściowych, co sprawia, że ​​wyzwanie jest nudne i gorsze ogólnie dla IMO.
caird coinheringaahing

Odpowiedzi:

5

Galaretka ,  15  21 bajtów (12 bez zaokrąglania)

+6 bajtów dla ścisłego formatowania (prawie na pewno możliwe w mniejszym, ale pora spania)

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

Pełny program uwzględniający oceny i odpowiednie godziny kredytowe, w którym drukowane są obliczone GPA (uwaga: metoda zaokrąglania jest do podłogi, jak dopuszcza się w PO).

Wypróbuj online!

Bez zaokrąglania dla 12 bajtów :

Oạ69.Ḟ×S÷⁹S¤

W jaki sposób?

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
Jonathan Allan
źródło
@nimi - dobra uwaga, tęskniłem za tym. Naprawiony.
Jonathan Allan,
4

Python 3 , 66 bajtów

-5 bajtów dzięki Rod.

lambda g,c:'%.2f'%sum('FDCBA'.find(i)*j/sum(c)for i,j in zip(g,c))

Wypróbuj online!

całkowicie ludzki
źródło
1
Masz dodatkowy (), możesz także przesunąć, /sum(c)aby zapisać 3 bajty, osiągając 66 bajtów
Rod
4

Perl 5 , 57 53 + 2 ( -an) = 59 55 bajtów

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

Wypróbuj online!

Edycja: zamieniłem wejście, aby zapisać 4 bajty

Format wejściowy: oddzielone linie, kredyty i ocena:

grade credits

Przykład:

A 3
B 4
A 1
A 1
Xcali
źródło
3

Python 2 , 69 bajtów

lambda x:'%.2f'%sum('FDCBA'.find(a)*b*1./sum(zip(*x)[1])for a,b in x)

Wypróbuj online!

Pręt
źródło
3

Wolfram Language (Mathematica) , 39 bajtów

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

Pobiera listę godzin kredytowych, a następnie szereg ocen.

Nie działa na TIO, ponieważ TIO używa jądra Mathematica (który nie chce drukować liczb o dowolnej dokładności)

JungHwan Min
źródło
2
-3 bajty, jeśli używaszTr
3
Nie udaje się to w drugim przypadku testowym. Zwraca 1,85, ponieważ policzono F = -1
J42161217,
2
Oto poprawka 41 bajtów:N[(5-(LetterNumber@#2/. 6->5)).#/Tr@#,3]&
J42161217,
@Jenny_mathy nice catch. Nie mam pojęcia, jak mi to umknęło ... Dodatkowe nawiasy można jednak pograć, przesuwając /..
JungHwan Min.
2

JavaScript (ES6), 72 bajty

Format wejściowy: A1B3C2F3B4

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

Przypadki testowe

Arnauld
źródło
W którym momencie searchstaje się bardziej golfisty parseInt?
Neil,
@Neil parseIntprawdopodobnie stałby się bardziej golfistą z kilkoma innymi obsługiwanymi ocenami. Jednym problemem jest jednak różnica między F = 0 a D = 1.
Arnauld,
Huh, nawet nie zauważyłem, że nie ma E ...
Neil,
2

R , 64 bajty

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

Wypróbuj online!

dzięki dla użytkownika2390246 za naprawienie błędu!

Giuseppe
źródło
Myślę, że masz na myśliLETTERS[-5]
user2390246
@ user2390246 tak, oczywiście. to było głupie z mojej strony.
Giuseppe,
2

Java, 211 bajtów

Format wejściowy: A1B3C2F3B4

Grał w golfa

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

Nieklofowany

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*/
}

Inna wersja

Moje przeczucie powiedziało mi, że użycie innego formatu wejściowego (ABCF1324) skróci kod. Wygląda na to, że nie. Poniższa wersja ma 234 bajty.

Grał w golfa

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

Nie golfił

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*/
}
PStigerID
źródło
Cześć i witaj! Nie musisz odpowiadać przy użyciu pełnych programów, więc możesz odkurzyć wiele takich bajtów.
Nissa,
2

Java 1.8 , 287 249 bajtów

-38 bajtów dzięki Bumptious

Grał w golfa

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

Nie golfił

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));
}
}
DevelopingDeveloper
źródło
1
Skrócić długość, używając tego? static float m (String l) {return l.equals ("F")? 0 :( 'E'-l.charAt (0));}
Bumptious Q Bangwhistle 12.12.17
1

Julia 0,6 , 46 43 42 bajtów

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

Wypróbuj online!

Wyjaśnienie

Format wejściowy g:: wektor ocen; h: wektor godzin kredytowych

  • g%h: Przedefiniuj %operatora.
  • 69-Int.(g): Konwersja 'F','D','C','B','A'do -1,1,2,3,4, odpowiednio, dla każdego elementu g.
  • max.( ,0): Zakres cęgów do 0:4(pod względem elementu).
  • Reszta to prosta matematyka wektorowa.
  • Zaokrąglenie kosztuje 9 bajtów.
Łukasza
źródło