Калькулятор середньої кваліфікації студента коледжу


13

GPA калькулятор

(GPA = середня оцінка балів)

Ви підкреслені студентом коледжу під час тижня фіналу. Замість того, щоб вчитися на те, щоб ви склали іспити, ви вирішили, що найкраще визначити, який середній бал ви будете мати в кінці семестру. Таким чином, у вас є дані, щоб створити резервну копію вашого рішення залишатись цілу ніч, щоб отримати A в обчисленні замість B, щоб залишитися в списку декана!

Будучи спеціалістом з інформатики, ви хочете знайти найкрутіший спосіб визначити цей GPA. Звичайно, найкрутіший спосіб - з найкоротшим кодом! Це , тому найкоротший код у байтах виграє!

Деталі

  • Коледж, в який ви вступаєте, використовує базовий бал середнього рівня, який масштабується разом із кредитними годинами.
  • Клас літери А - 4,0, В - 3,0, С - 2,0, D - 1,0, F - 0,0
  • Ваш GPA є зваженим GPA, тому A у 4-х класній годині налічує в 4 рази більше, ніж A у 1-х класній годині (див. Приклади для отримання більш вагомих пояснень)
  • Час кредитування становить від 1-4
  • У вашій програмі повинен бути список двох входів командного рядка, «Оцінка» та «Година кредитування». Ви можете визначити найкращий спосіб ввести їх у свою програму через командний рядок. Вам не потрібно турбуватися про занадто багато вкладень, але переконайтеся, що ваш код може працювати з 19 семестром кредитної години.

    • тобто введення: A 1 B 4 C 2…
  • Ваша програма повинна виводити GPA, використовуючи 3 цифри (тобто X.XX)

  • Ваш GPA повинен бути округлений до двох знаків після коми. Округніть, як вам завгодно (підлога, стеля, основа тощо)

Приклади введення (виберіть те, що найкраще підходить для вашого дизайну)

  • 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

Або будь-яка з перерахованих вище комбінацій, де ви використовуєте формат перерахування всіх сортів, а потім їх кількість годин:

  • тобто ABAA 3 4 1 1

Приклади

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 Будь ласка, намагайтеся уникати громіздких форматів вводу / виводу .
JungHwan Min

1
@JungHwanMin Будь ласка, дайте мені знати, який варіант вводу / виводу ви хотіли, що я не вказав? Я дав близько 6 різних гнучких варіантів, але це потрібно уточнити, щоб насправді вписатись у цей сценарій.
DevelopingDeveloper

3
@DevelopingDeveloper Your GPA needs to be rounded to two decimal places: щоб досягти цього, людям потрібно додати додатковий код, який не має нічого спільного з обчисленням GPA.
JungHwan Min

2
Ласкаво просимо до PPCG. Гарне перше питання на мою скромну думку.
ElPedro

5
Незважаючи на те, що це досить цікаве питання, я подав заяву, тому що, як я вже говорив раніше, примушення округлення та виведення з кінцевими 0-мами робить це багатосторонньою проблемою; відповіді доводиться надмірно додавати байти, просто відповідати вихідним специфікаціям, що робить виклик нудним і гіршим загальним ІМО.
caird coinheringaahing

Відповіді:


5

Желе ,  15  21 байт (12 без округлення)

+6 байт для суворого форматування (майже напевно можливе за менший час, але це час ліжка)

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

Повна програма з урахуванням оцінок та відповідних кредитних годин, яка друкує розрахований ГПД (Примітка: метод округлення повинен дорівнювати, як це дозволено в ОП).

Спробуйте в Інтернеті!

З НЕ округленням за 12 байт :

Oạ69.Ḟ×S÷⁹S¤

Як?

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 - хороший момент, я пропустив цей шматочок. Виправлено.
Джонатан Аллан


4

Perl 5 , 57 53 + 2 ( -an) = 59 55 байт

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

Спробуйте в Інтернеті!

Редагувати: поміняти вхід навколо, щоб зберегти 4 байти

Формат введення: рядки розділені, кредити з наступним ступенем:

grade credits

Приклад:

A 3
B 4
A 1
A 1


3

Мова Вольфрама (Mathematica) , 39 байт

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

Бере список кредитних годин, а потім рядок оцінок.

Не працює в TIO, оскільки TIO використовує ядро ​​Mathematica (яке не хоче друкувати довільні точні числа)


2
-3 байти, якщо ви використовуєтеTr

3
Це не вдається для другого тесту. Він повертає 1,85, тому що ви рахуєте F = -1
J42161217

2
Ось виправлення на 41 байт:N[(5-(LetterNumber@#2/. 6->5)).#/Tr@#,3]&
J42161217

@Jenny_mathy приємний улов. Я поняття не маю, як я пропустив це ... Хоча зайві дужки можна було пересунути, переміщуючи /..
JungHwan Min

2

JavaScript (ES6), 72 байти

Формат введення: A1B3C2F3B4

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

Тестові справи


У який момент searchстає гольфістом, ніж parseInt?
Ніл

@Neil parseInt, мабуть, стане гравцем із кількома підтримуваними класами. Одна з проблем - розрив між F = 0 і D = 1.
Арнольд

Ага, я навіть не помітив, що немає Е ...
Ніл


2

Java, 211 байт

Формат введення: A1B3C2F3B4

Гольф

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

Роздягнутий

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

Інша версія

Мій кишечник сказав мені, що використання іншого формату введення (ABCF1324) зробить код коротшим. Схоже, цього не сталося. Версія нижче - 234 байти.

Гольф

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

Безумовно

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

Привіт і ласкаво просимо! Вам не потрібно відповідати з повноцінними програмами, тому ви можете відключити безліч байтів.
Нісса

2

Java 1,8 , 287 249 байт

-38 байт завдяки Bumptious

Гольф

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

Безумовно

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
Скоротити довжину за допомогою цього? static float m (String l) {return l.equals ("F")? 0 :( 'E'-l.charAt (0));}
Bumpful Q Bangwhistle

1

Джулія 0,6 , 46 43 42 байт

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

Спробуйте в Інтернеті!

Пояснення

Формат введення g:: вектор класів; h: вектор кредитних годин

  • g%h: Оновлення %оператора.
  • 69-Int.(g): Перетворення 'F','D','C','B','A'до , -1,1,2,3,4відповідно , для кожного елемента р
  • max.( ,0): Діапазон затискання до 0:4(елементне).
  • Решта - проста векторна математика.
  • Округлення коштує 9 байт.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.