เครื่องคิดเลขเกรดเฉลี่ยของนักศึกษาวิทยาลัยที่กำลังดิ้นรน


13

เครื่องคิดเลขเกรดเฉลี่ย

(เกรดเฉลี่ย = เกรดคะแนนเฉลี่ย)

คุณเป็นนักศึกษาวิทยาลัยเครียดในรอบชิงชนะเลิศสัปดาห์ แทนที่จะเรียนสำหรับการสอบที่กำลังจะมาถึงคุณตัดสินใจว่าจะเป็นการดีที่สุดที่จะกำหนดเกรดเฉลี่ยที่คุณจะได้เมื่อจบภาคการศึกษา วิธีนี้คุณมีข้อมูลสำรองการตัดสินใจพักทั้งคืนเพื่อรับ A ในแคลคูลัสแทนที่จะเป็น B เพื่ออยู่ในรายการของ Dean!

เป็นวิทยาการคอมพิวเตอร์ที่สำคัญที่คุณต้องการค้นหาวิธีเด็ดสุดในการกำหนดเกรดเฉลี่ยนี้ แน่นอนว่าวิธีที่ดีที่สุดคือใช้รหัสที่สั้นที่สุด! นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

รายละเอียด

  • วิทยาลัยที่คุณใช้เกรดเฉลี่ยขั้นต่ำพร้อมกับชั่วโมงเครดิต
  • เกรดตัวอักษร A คือ 4.0, B คือ 3.0, C คือ 2.0, D คือ 1.0 และ F คือ 0.0
  • เกรดเฉลี่ยของคุณเป็นเกรดเฉลี่ยถ่วงน้ำหนักดังนั้นเกรด A ใน 4 ชั่วโมงเครดิตจึงนับเป็น 4 เท่าของคะแนน A ในระดับเครดิต 1 ชั่วโมง (ดูตัวอย่างด้านล่างเพื่อดูคำอธิบายเรื่องน้ำหนักเพิ่มเติม)
  • ช่วงเวลาเครดิตเริ่มตั้งแต่ 1-4
  • โปรแกรมของคุณจะต้องมีรายการอินพุตสองบรรทัดคำสั่งเกรดและเครดิตชั่วโมง คุณสามารถกำหนดวิธีที่ดีที่สุดในการป้อนข้อมูลเหล่านี้ลงในโปรแกรมของคุณผ่านบรรทัดคำสั่ง คุณไม่จำเป็นต้องกังวลเกี่ยวกับอินพุตมากเกินไป แต่ให้แน่ใจว่ารหัสของคุณสามารถจัดการกับภาคเรียนเครดิต 19 ชั่วโมง

    • เช่นอินพุต: A 1 B 4 C 2 ...
  • โปรแกรมของคุณจะต้องส่งออกเกรดเฉลี่ยโดยใช้ 3 หลัก (เช่น X.XX)

  • เกรดเฉลี่ยของคุณจะต้องปัดเศษเป็นทศนิยมสองตำแหน่ง รอบในแบบที่คุณชอบ (พื้นเพดานฐาน ฯลฯ ... )

ตัวอย่างอินพุต (เลือกว่าอันไหนจะเหมาะกับการออกแบบของคุณที่สุด)

  • 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

หรือชุดค่าผสมใด ๆ ข้างต้นที่คุณใช้รูปแบบของรายการคะแนนทั้งหมดแล้วตามชั่วโมงเครดิต:

  • ie 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 โปรดพยายามหลีกเลี่ยงรูปแบบ I / O ที่ยุ่งยาก
JungHwan Min

1
@JungHwanMin โปรดแจ้งให้ฉันทราบว่าตัวเลือก I / O ใดที่คุณต้องการที่ฉันไม่ได้ระบุ? ฉันให้ตัวเลือกที่ยืดหยุ่นต่างกันประมาณ 6 ตัว แต่จำเป็นต้องระบุให้เหมาะสมกับสถานการณ์จริง
กำลังพัฒนาผู้พัฒนา

3
@DevelopingDeveloper Your GPA needs to be rounded to two decimal places: เพื่อให้บรรลุนี้ผู้คนจำเป็นต้องเพิ่มรหัสเพิ่มเติมที่ไม่มีส่วนเกี่ยวข้องกับการคำนวณเกรดเฉลี่ย
JungHwan Min

2
ยินดีต้อนรับสู่ PPCG คำถามแรกที่ดีในความเห็นต่ำต้อยของฉัน
ElPedro

5
แม้นี่จะเป็นคำถามที่น่าสนใจ แต่ฉันก็ลงคะแนนเพราะอย่างที่ฉันพูดไปก่อนหน้านี้การบังคับให้ปัดเศษและแสดงผลลัพธ์ด้วย 0 ต่อท้ายทำให้มันเป็นความท้าทายหลายส่วน คำตอบจะต้องเพิ่มไบต์โดยไม่จำเป็นเพียงเพื่อให้สอดคล้องกับรายละเอียดการส่งออกซึ่งทำให้ความท้าทายที่น่าเบื่อและ IMO โดยรวมแย่ลง
caird coinheringaahing

คำตอบ:


5

เยลลี่ ,  15  21 ไบต์ (12 โดยไม่มีการปัดเศษ)

+6 ไบต์สำหรับการจัดรูปแบบที่เข้มงวด (เกือบจะเป็นไปได้แน่นอนในเวลาน้อยลง แต่ถึงเวลานอน)

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

โปรแกรมเต็มรูปแบบที่ให้คะแนนและชั่วโมงเครดิตตามลำดับซึ่งจะพิมพ์เกรดเฉลี่ยที่คำนวณได้ (หมายเหตุ: วิธีการปัดเศษเป็นพื้นตามที่อนุญาตใน OP)

ลองออนไลน์!

โดยไม่มีการปัดเศษเป็น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 - จุดที่ดีฉันพลาดบิตนั้น แก้ไขแล้ว.
Jonathan Allan


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 (Mathematica)ขนาด 39 ไบต์

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

ทำรายการเครดิตเวลาแล้วเรียงคะแนน

ไม่ทำงานบน TIO เนื่องจาก TIO ใช้เคอร์เนล Mathematica (ซึ่งไม่ต้องการพิมพ์ตัวเลขที่มีความแม่นยำตามอำเภอใจ)


2
-3 ไบต์ถ้าคุณใช้Tr

3
สิ่งนี้ล้มเหลวสำหรับกรณีทดสอบครั้งที่สองมันคืนค่า 1.85 เพราะคุณนับ F = -1
J42161217

2
นี่คือ 41bytes แก้ไข: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กลายเป็น golfier กว่าparseInt?
Neil

@Neil parseIntอาจจะกลายเป็นนักกอล์ฟด้วยคะแนนที่ได้รับการสนับสนุนเพิ่มขึ้นอีกเล็กน้อย ปัญหาหนึ่งคือช่องว่างระหว่าง F = 0 และ D = 1 แม้ว่า
Arnauld

อืมฉันไม่ได้สังเกตุว่าไม่มี ... E
Neil


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

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 ไบต์

แข็งแรงเล่นกอล์ฟ

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 ไบต์ขอบคุณ 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));}

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 (สตริง l) {return l.equals ("F")? 0 :( 'E'-l.charAt (0));}
Q Bangwhistle Bumptious

1

Julia 0.6 , 46 43 42 ไบต์

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

ลองออนไลน์!

คำอธิบาย

รูปแบบอินพุตg:: vector ของเกรด; h: vector ของเครดิตชั่วโมง

  • g%h: กำหนด%โอเปอเรเตอร์ใหม่
  • 69-Int.(g): แปลง'F','D','C','B','A'เป็น-1,1,2,3,4ลำดับสำหรับแต่ละองค์ประกอบของ g
  • max.( ,0): ช่วงแคลมป์ถึง0:4(องค์ประกอบที่ฉลาด)
  • ส่วนที่เหลือเป็นเวกเตอร์คณิตศาสตร์ง่าย ๆ
  • ค่าใช้จ่ายในการปัดเศษ 9 ไบต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.