고군분투하는 대학생의 GPA 계산기


13

GPA 계산기

(GPA = 학년 평균)

마지막 주 동안 스트레스를받는 대학생입니다. 시험에 대비하여 공부하는 대신 학기 말에 어떤 GPA를받을 것인지 결정하는 것이 가장 좋습니다. 이런 식으로 당신은 밤새 머 무르 겠다는 결정을 뒷받침 할 데이터를 가지고 B 대신에 미적분학으로 A를 학장의 명단에 남길 수 있습니다!

컴퓨터 과학 전공이기 때문에이 GPA를 결정하는 가장 멋진 방법을 찾고 싶습니다. 물론 가장 멋진 방법은 가장 짧은 코드입니다! 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!

세부

  • 당신이가는 대학은 학점과 함께 기본 GPA 척도를 사용합니다.
  • A의 문자 등급은 4.0, B는 3.0, C는 2.0, D는 1.0, F는 0.0입니다.
  • GPA는 가중 GPA이므로 4 학점 시간 클래스의 A는 1 학점 시간 클래스의 A보다 4 배 더 큽니다 (자세한 설명은 아래 예 참조).
  • 신용 시간 범위는 1-4입니다.
  • 프로그램에는 Grade 및 Credit Hour라는 두 가지 명령 줄 입력 목록이 있어야합니다. 명령 행을 통해 프로그램에 입력하는 가장 좋은 방법을 결정할 수 있습니다. 너무 많은 입력에 대해 걱정할 필요는 없지만 코드가 19 학점을 처리 할 수 ​​있는지 확인하십시오.

    • 즉 입력 : A 1 B 4 C 2…
  • 프로그램은 3 자리 숫자 (예 : X.XX)를 사용하여 GPA를 출력해야합니다.

  • 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 성가신 I / O 형식 을 피하십시오 .
— JungHwan Min

1
@JungHwanMin 지정하지 않은 I / O 옵션을 알려주십시오. 나는 약 6 가지의 유연한 옵션을 제공했지만 실제로이 시나리오에 맞도록 지정해야합니다.
— 개발

3
@DevelopingDeveloper Your GPA needs to be rounded to two decimal places:이를 달성하기 위해서는 사람들이 GPA 계산과 관련이없는 추가 코드를 추가해야합니다.
— JungHwan Min

2
PPCG에 오신 것을 환영합니다. 내 겸손한 의견에 좋은 첫 번째 질문입니다.
— ElPedro

5
이것은 상당히 흥미로운 질문 임에도 불구하고, 이전에 말했듯이 반올림을 강제하고 후행 0으로 출력하면 이것이 여러 부분으로 어려워집니다. 답은 불필요하게 바이트를 추가해야하며, 단순히 출력 사양을 따르기 때문에 지루하고 어려운 전체 IMO가됩니다.
— caird coinheringaahing

답변:


5

젤리 ,  15  21 바이트 (반올림없이 12)

엄격한 서식의 경우 +6 바이트 (거의 확실히 가능하지만 취침 시간 임)

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

계산 된 GPA를 인쇄하는 등급 및 해당 학점을 수강하는 전체 프로그램

온라인으로 사용해보십시오!

와 에 대한 라운딩 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

펄 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가 Mathematica 커널을 사용하기 때문에 TIO에서 작동하지 않습니다 (임의의 정밀 숫자를 인쇄하고 싶지 않음)


2
사용하는 경우 -3 바이트Tr

3
이것은 두 번째 테스트 사례에서 실패합니다. F = 1을 계산하기 때문에 1.85를 반환합니다.
— J42161217

2
다음은 41 바이트 수정입니다.N[(5-(LetterNumber@#2/. 6->5)).#/Tr@#,3]&
— J42161217

@Jenny_mathy 멋진 캐치. 나는 그것을 어떻게 놓쳤는 지 전혀 모른다.. 그러나을 움직여 여분의 괄호를 아래로 내릴 수있다 /..
— JungHwan Min

2

자바 스크립트 (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

@Neil은 parseInt아마 몇 가지 더 지원 성적 golfier 될 것입니다. 그러나 한 가지 문제는 F = 0과 D = 1 사이의 간격입니다.
— Arnauld

허, 나는 심지어 전자가 없다는 것을 눈치 채지 못했습니다 ...
— Neil


2

자바, 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*/
}

안녕하세요, 환영합니다! 완전한 프로그램으로 답할 필요는 없으므로 그렇게 많은 바이트를 제거 할 수 있습니다.
— Nissa

2

자바 1.8 , 287 249 바이트

Bumptious 덕분에 -38 바이트

골프

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));}
— 엄청난 Q Bangwhistle

1

Julia 0.6 , 46 43 42 바이트

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

온라인으로 사용해보십시오!

설명

입력 형식 : g: 성적 벡터; h: 신용 시간의 벡터

  • g%h: %연산자를 재정의 합니다.
  • 69-Int.(g): g의 각 요소에 대해 각각 변환 'F','D','C','B','A'합니다 -1,1,2,3,4.
  • max.( ,0): 클램프 범위는 0:4(요소 단위)입니다.
  • 나머지는 간단한 벡터 수학입니다.
  • 반올림 비용은 9 바이트입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.