고군분투하는 대학생의 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.