Калькулятор среднего балла студента колледжа


13

GPA Calculator

(Средний балл = средний балл)

Вы утомлены студентом колледжа во время финальной недели. Вместо того, чтобы готовиться к экзаменам, вы решаете, что лучше всего определить, какой средний балл у вас будет в конце семестра. Таким образом, у вас есть данные, подтверждающие ваше решение не ложиться спать всю ночь, чтобы получить А в Исчислении вместо В, чтобы остаться в списке Дина!

Будучи специалистом в области компьютерных наук, вы хотите найти самый крутой способ определить этот средний балл. Конечно, самый крутой способ - самый короткий код! Это , поэтому выигрывает самый короткий код в байтах!

Детали

  • Колледж, в который вы поступаете, использует базовый средний балл, рассчитанный вместе с кредитными часами.
  • Буквенная оценка А - 4,0, В - 3,0, С - 2,0, D - 1,0, F - 0,0.
  • Ваш средний балл - это взвешенный средний балл, поэтому A в классе с 4 кредитными часами в 4 раза больше, чем A в классе с 1 кредитным часом (более подробные объяснения приведены в примерах ниже)
  • Кредитные часы варьируются от 1-4
  • Ваша программа должна иметь список из двух входов командной строки, Grade и Credit Hour. Вы можете определить лучший способ ввода их в вашу программу через командную строку. Вам не нужно беспокоиться о слишком большом количестве входных данных, но убедитесь, что ваш код может обработать семестр 19 кредитных часов.

    • т.е. вход: A 1 B 4 C 2…
  • Ваша программа должна выводить GPA, используя 3 цифры (то есть X.XX)

  • Ваш средний балл должен быть округлен до двух десятичных знаков. Закруглите как хотите (пол, потолок, основание и т. Д.)

Примеры ввода (выберите тот, который лучше всего подходит для вашего дизайна)

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

Или любая из вышеперечисленных комбинаций, где вы используете формат перечисления всех оценок, а затем их кредитных часов:

  • т.е. 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 Мин

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

3
@DevelopingDeveloper Your GPA needs to be rounded to two decimal places: чтобы достичь этого, люди должны добавить дополнительный код, который не имеет ничего общего с вычислением GPA.
JungHwan Мин

2
Добро пожаловать в PPCG. Хороший первый вопрос по моему скромному мнению.
ElPedro

5
Несмотря на то, что это довольно интересный вопрос, я понизил голос, потому что, как я уже говорил, форсирование округления и вывода с конечными нулями делает эту задачу сложной задачей; ответы должны излишне добавлять байты, просто чтобы соответствовать выходным спецификациям, что усложняет задачу и ухудшает общую IMO.
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

Wolfram Language (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 Мин

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.
Arnauld

Да, я даже не заметил, что нет E ...
Нил


2

Java, 211 байт

Формат ввода: A1B3C2F3B4

Golfed

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

Другая версия

Мой инстинктивный фрейлинг сказал мне, что использование другого формата ввода (ABCF1324) сделает код короче. Кажется, что нет. Версия ниже имеет длину 234 байта.

Golfed

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

Привет и добро пожаловать! От вас не требуется отвечать полными программами, поэтому вы можете скинуть много таких байтов.
Nissa

2

Java 1,8 , 287 249 байт

-38 байт благодаря Bumpious

Golfed

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
Уменьшить длину с помощью этого? static float m (String l) {return l.equals ("F")? 0 :( 'E'-l.charAt (0));}
Невероятный 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соответственно для каждого элемента g.
  • max.( ,0): Диапазон зажима до 0:4(поэлементно).
  • В остальном простая векторная математика.
  • Округление стоит 9 байтов.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.