Zorlu üniversite öğrencisinin GPA Hesaplayıcısı


13

GPA Hesaplayıcı

(GPA = Not Ortalaması)

Final haftasında stresli bir üniversite öğrencisisiniz. Sınavlarınız için çalışmak yerine, dönem sonunda hangi genel not ortalamasına sahip olacağınızı belirlemenin en iyisi olduğuna siz karar verirsiniz. Bu şekilde, Dean'in listesinde kalması için B yerine B yerine Calculus'ta A almak için bütün gece ayakta kalma kararınızı yedekleyecek verileriniz olacak!

Bir bilgisayar bilimi majör olmak, bu GPA'yı belirlemenin en havalı yolunu bulmak istiyorsunuz. Tabii ki en havalı yol en kısa kod ile! Bu , bayt en kısa kod kazanır!

ayrıntılar

  • Gittiğiniz kolej, kredi saatleriyle birlikte ölçeklendirilmiş temel bir GPA kullanır.
  • A'nın harf notu 4.0, B 3.0, C 2.0, D 1.0 ve F 0.0'dır.
  • GPA'nız ağırlıklı bir GPA'dır, bu nedenle 4 kredi saatlik bir sınıftaki A, 1 kredi saatlik bir sınıftaki A'nın 4 katı kadar sayar (Daha fazla ağırlık açıklaması için aşağıdaki örneklere bakın)
  • Kredi Saatleri 1-4 arasında değişir
  • Programınızın iki komut satırı girdisinin bir listesi olması gerekir: Not ve Kredi Saati. Bunları programınıza komut satırından girmenin en iyi yolunu belirleyebilirsiniz. Çok fazla girdi hakkında endişelenmenize gerek yoktur, ancak kodunuzun 19 kredi saatlik bir dönemi ele alabileceğinden emin olun.

    • yani Giriş: A 1 B 4 C 2…
  • Programınız 3 basamaklı GPA çıktısı almalıdır (örn. X.XX)

  • GPA'nızın iki ondalık basamağa yuvarlanması gerekir. İstediğiniz şekilde yuvarlayın (zemin, tavan, taban vb.)

Girdi Örnekleri (Tasarımınız için hangisinin daha iyi çalıştığını seçin)

  • A1B3C2F3B4
  • A1 B3 C2 F3 B4
  • A 1 B 3 C 2 F 3 B 4
  • A, 1 B, 3, C, 2, K, R3, B, 4
  • A1, B3, C2, F3 B4

Veya tüm notları, ardından kredi saatlerini listeleme biçimini kullandığınız yukarıdaki kombinasyonlardan herhangi biri:

  • yani ABAA 3 4 1 1

Örnekler

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 Lütfen hantal I / O formatlarından kaçınmaya çalışın .
JungHwan Min

1
@JungHwanMin Lütfen hangi G / Ç seçeneğini belirtmediğimi belirtmek ister misiniz? Yaklaşık 6 farklı esnek seçenek sundum, ancak bu senaryoya gerçekten uyması için belirtilmesi gerekiyor.
DevelopingDeveloper

3
@DevelopingDeveloper Your GPA needs to be rounded to two decimal places: Bunu başarmak için insanların GPA hesaplamasıyla ilgisi olmayan ek kod eklemeleri gerekir.
JungHwan Min

2
PPCG'ye hoş geldiniz. Benim düşünceme göre güzel ilk soru.
ElPedro

5
Bu oldukça ilginç bir soru olmasına rağmen, daha önce de söylediğim gibi, yuvarlamayı zorlamak ve çıkış 0'ları ile çıktı almak, bunu çok parçalı bir meydan okuma haline getiriyor; cevaplar gereksiz bir şekilde bayt eklemek zorunda, sadece çıkış özelliklerine uymak zorunda, bu da sıkıcı ve daha genel bir IMO'yu zorlaştırıyor.
23'te caird coinheringaahing

Yanıtlar:


5

Jöle ,  15  21 bayt (yuvarlama olmadan 12)

Sıkı biçimlendirme için +6 bayt (daha kısa sürede neredeyse kesinlikle mümkündür ancak yatak zamanı)

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

Hesaplanan not ortalamasını ve notları alan tam bir program hesaplanır.

Çevrimiçi deneyin!

İle hiçbir yuvarlanması 12 byte :

Oạ69.Ḟ×S÷⁹S¤

Nasıl?

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 - iyi nokta, o kısmı özledim. Sabit.
Jonathan Allan


4

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

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

Çevrimiçi deneyin!

Düzenleme: 4 bayt kaydetmek için girişi değiştirdi

Girdi biçimi: satır ayrılmış, krediler ve ardından not:

grade credits

Misal:

A 3
B 4
A 1
A 1


3

Wolfram Dili (Mathematica) , 39 bayt

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

Kredi saatlerinin bir listesini ve ardından bir dizi notu alır.

TIO (TIO) üzerinde çalışmaz, çünkü TIO Mathematica çekirdeğini kullanır (bu, rasgele hassas sayılar yazdırmak istemez)


2
-3 bayt kullanırsanızTr

3
Bu ikinci test durumu için başarısız olur. F = -1
J42161217 11:17

2
İşte 41baytlık bir düzeltme:N[(5-(LetterNumber@#2/. 6->5)).#/Tr@#,3]&
J42161217

@Jenny_mathy güzel yakala. Bunu nasıl özlediğime dair hiçbir fikrim yok ... Yine de, ekstra parantez aşağı doğru hareket ettirilerek golf edilebilir /..
JungHwan Min

2

JavaScript (ES6), 72 bayt

Giriş biçimi: A1B3C2F3B4

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

Test senaryoları


Hangi noktada searchgolfer oluyor parseInt?
Neil

@Neil parseIntmuhtemelen sadece birkaç destek notu ile golfçü olur. Ancak bir problem F = 0 ve D = 1 arasındaki boşluktur.
Arnauld

Hım, E'nin olmadığını bile fark etmemiştim ...
Neil

2

R , 64 bayt

function(G,H)sprintf("%.2f",(5-match(G,LETTERS[-5]))%*%H/sum(H))

Çevrimiçi deneyin!

bir hatayı düzelttiği için user2390246'ya teşekkürler!


Sanırım demek istiyorsunLETTERS[-5]
user2390246

@ user2390246 evet, elbette. bu benim aptallığımdı.
Giuseppe

2

Java, 211 bayt

Giriş formatı: 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*/
}

Diğer sürüm

Bağırsak frealing, farklı bir giriş biçimi (ABCF1324) kullanmanın kodu kısaltacağını söyledi. Öyle görünmüyordu. Aşağıdaki sürüm 234 bayt uzunluğundadır.

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

Merhaba ve hoşgeldin! Tam programlarla cevap vermeniz gerekmez, böylece böyle çok bayt çipleyebilirsiniz.
Nissa

2

Java 1.8 , 287249 Bayt

Bumptious sayesinde -38 bayt

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
Bunu kullanarak uzunluğu azalt? statik şamandıra m (String l) {return l.equals ("F")? 0 :( 'E'-l.charAt (0));}
Enfes Q Bangwhistle

1

Julia 0.6 , 46 43 42 bayt

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

Çevrimiçi deneyin!

açıklama

Girdi biçimi: gnotların vektörü; h: kredi saat vektörü

  • g%h: %Operatörü yeniden tanımlayın .
  • 69-Int.(g): G'nin her öğesi 'F','D','C','B','A'için -1,1,2,3,4sırasıyla dönüştürün .
  • max.( ,0): Kelepçe aralığı 0:4(eleman olarak).
  • Gerisi basit vektör matematik.
  • Yuvarlama maliyeti 9 bayttır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.