Máy tính GPA của sinh viên đại học đang gặp khó khăn


13

Máy tính điểm trung bình

(Điểm trung bình = Điểm trung bình)

Bạn là một sinh viên đại học căng thẳng trong tuần chung kết. Thay vì học bài kiểm tra sắp tới, bạn quyết định tốt nhất là xác định điểm trung bình bạn sẽ có vào cuối học kỳ. Bằng cách này, bạn có dữ liệu để sao lưu quyết định thức suốt đêm để có được A trong Giải tích thay vì B để duy trì trong danh sách của Hiệu trưởng!

Là một chuyên gia khoa học máy tính, bạn muốn tìm ra cách thú vị nhất để xác định điểm trung bình này. Tất nhiên cách tuyệt vời nhất là với mã ngắn nhất! Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Chi tiết

  • Trường đại học mà bạn theo học sử dụng GPA cơ bản được chia tỷ lệ cùng với giờ tín dụng.
  • Một lớp chữ của A là 4.0, B là 3.0, C là 2.0, D là 1.0 và F là 0.0
  • Điểm trung bình của bạn là điểm trung bình trọng số, vì vậy điểm A trong lớp 4 giờ tín dụng gấp 4 lần điểm A trong lớp tín dụng 1 giờ (Xem ví dụ bên dưới để biết thêm về giải thích trọng số)
  • Giờ tín dụng dao động từ 1-4
  • Chương trình của bạn sẽ cần có một danh sách hai đầu vào dòng lệnh, Lớp và Giờ tín dụng. Bạn có thể xác định cách tốt nhất để nhập chúng vào chương trình của mình thông qua dòng lệnh. Bạn không cần phải lo lắng về quá nhiều đầu vào, nhưng đảm bảo mã của bạn có thể xử lý một học kỳ 19 tín dụng.

    • tức là đầu vào: A 1 B 4 C 2
  • Chương trình của bạn phải xuất GPA, sử dụng 3 chữ số (ví dụ X.XX)

  • Điểm trung bình của bạn cần được làm tròn đến hai chữ số thập phân. Làm tròn theo bất cứ cách nào bạn thích (sàn, trần, chân đế, vv.)

Ví dụ đầu vào (Chọn bất kỳ cái nào hoạt động tốt nhất cho thiết kế của bạn)

  • 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

Hoặc bất kỳ kết hợp nào ở trên nơi bạn sử dụng định dạng liệt kê tất cả các lớp, sau đó là giờ tín dụng của chúng:

  • tức là ABAA 3 4 1 1

Ví dụ

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 Vui lòng tránh các định dạng I / O cồng kềnh .
JungHwan Min

1
@JungHwanMin Vui lòng cho tôi biết tùy chọn I / O nào bạn muốn mà tôi không chỉ định? Tôi đã đưa ra khoảng 6 tùy chọn linh hoạt khác nhau, nhưng nó cần được chỉ định để thực sự phù hợp với kịch bản này.
DevelopingDeveloper

3
@DevelopingDeveloper Your GPA needs to be rounded to two decimal places: để đạt được điều này, mọi người cần thêm mã bổ sung không liên quan gì đến tính toán GPA.
JungHwan Min

2
Chào mừng đến với PPCG. Câu hỏi đầu tiên tốt đẹp trong quan điểm khiêm tốn của tôi.
ElPedro

5
Mặc dù đây là một câu hỏi khá thú vị, tôi đã đánh giá thấp, bởi vì, như tôi đã nói trước đây, việc làm tròn và xuất ra với các dấu 0 làm cho điều này trở thành một thách thức nhiều phần; câu trả lời là phải thêm byte một cách không cần thiết, chỉ đơn giản là để phù hợp với thông số kỹ thuật đầu ra, điều này làm cho một thách thức nhàm chán và tệ hơn là IMO tổng thể.
caird coinheringaahing

Câu trả lời:


5

Jelly ,  15  21 byte (12 không làm tròn)

+6 byte cho định dạng nghiêm ngặt (gần như chắc chắn có thể trong thời gian ít hơn nhưng đến giờ đi ngủ)

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

Một chương trình đầy đủ lấy điểm và số giờ tín dụng tương ứng in GPA được tính toán (Lưu ý: phương pháp làm tròn là sàn, như được cho phép trong OP).

Hãy thử trực tuyến!

Với không làm tròn cho 12 byte :

Oạ69.Ḟ×S÷⁹S¤

Làm sao?

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 - điểm tốt, tôi đã bỏ lỡ bit đó. Đã sửa.
Jonathan Allan


4

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

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

Hãy thử trực tuyến!

Chỉnh sửa: hoán đổi đầu vào xung quanh để lưu 4 byte

Định dạng đầu vào: dòng tách biệt, tín dụng theo sau bởi lớp:

grade credits

Thí dụ:

A 3
B 4
A 1
A 1


3

Ngôn ngữ Wolfram (Mathicala) , 39 byte

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

Đưa ra một danh sách các giờ tín dụng, và sau đó là một chuỗi các lớp.

Không hoạt động trên TIO vì TIO sử dụng nhân Mathicala (không muốn in các số chính xác tùy ý)


2
-3 byte nếu bạn sử dụngTr

3
Điều này không thành công cho trường hợp thử nghiệm thứ hai. Nó trả về 1,85 vì bạn đếm F = -1
J42161217

2
Đây là bản sửa lỗi 41byte:N[(5-(LetterNumber@#2/. 6->5)).#/Tr@#,3]&
J42161217

@Jenny_mathy bắt tốt. Tôi không biết làm thế nào tôi đã bỏ lỡ điều đó ... /.Mặc dù vậy, dấu ngoặc đơn bổ sung có thể được đánh xuống bằng cách di chuyển .
JungHwan Min

2

JavaScript (ES6), 72 byte

Định dạng đầu vào: A1B3C2F3B4

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

Các trường hợp thử nghiệm


Tại điểm nào searchtrở thành golfier hơn parseInt?
Neil

@Neil parseIntcó thể sẽ trở thành golf thủ chỉ với một vài điểm được hỗ trợ. Tuy nhiên, có một vấn đề là khoảng cách giữa F = 0 và D = 1.
Arnauld

Huh, tôi thậm chí không nhận thấy rằng không có E ...
Neil


2

Java, 211 byte

Định dạng đầu vào: A1B3C2F3B4

Chơi gôn

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

Không được ủng hộ

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

Phiên bản khác

Việc xào xáo ruột của tôi nói với tôi rằng sử dụng một định dạng đầu vào khác (ABCF1324) sẽ làm cho mã ngắn hơn. Có vẻ như nó đã không. Phiên bản dưới đây dài 234 byte.

Chơi gôn

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

Ung dung

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

Xin chào và chào mừng! Bạn không cần phải trả lời với các chương trình đầy đủ, vì vậy bạn có thể loại bỏ rất nhiều byte như thế.
Nissa

2

Java 1.8 , 287 249 byte

-38 byte nhờ Bumptious

Chơi gôn

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

Ung dung

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
Giảm chiều dài bằng cách sử dụng này? float 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 byte

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

Hãy thử trực tuyến!

Giải trình

Định dạng đầu vào g:: vector của các lớp; h: vectơ của giờ tín dụng

  • g%h: Xác định lại %toán tử.
  • 69-Int.(g): Chuyển đổi 'F','D','C','B','A'để -1,1,2,3,4tương ứng cho mỗi phần tử của g.
  • max.( ,0): Phạm vi kẹp đến 0:4(yếu tố khôn ngoan).
  • Phần còn lại là toán vector đơn giản.
  • Làm tròn chi phí 9 byte.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.