Kalkulator IPK mahasiswa yang sedang berjuang

13

Kalkulator IPK

(IPK = Indeks Prestasi Kumulatif)

Anda adalah mahasiswa yang stres selama minggu final. Alih-alih belajar untuk ujian Anda yang akan datang, Anda memutuskan yang terbaik untuk menentukan IPK apa yang akan Anda miliki di akhir semester. Dengan cara ini Anda memiliki data untuk mendukung keputusan Anda begadang semalaman untuk mendapatkan A dalam Kalkulus alih-alih B untuk tetap berada di daftar Dean!

Menjadi jurusan ilmu komputer Anda ingin menemukan cara paling keren untuk menentukan IPK ini. Tentu saja cara paling keren adalah dengan kode terpendek! Ini adalah , jadi kode terpendek dalam byte menang!

Detail

  • Perguruan tinggi yang Anda kunjungi menggunakan IPK dasar yang diskalakan bersama dengan jam kredit.
  • Nilai huruf A adalah 4.0, B adalah 3.0, C adalah 2.0, D adalah 1.0, dan F adalah 0.0
  • IPK Anda adalah IPK tertimbang, sehingga nilai A dalam kelas 4 jam kredit dihitung 4 kali lebih banyak dari nilai A dalam kelas jam 1 kredit (Lihat contoh di bawah ini untuk penjelasan lebih lanjut tentang bobot)
  • Jam Kredit berkisar 1-4
  • Program Anda harus memiliki daftar dua input baris perintah, Grade dan Jam Kredit. Anda dapat menentukan cara terbaik untuk memasukkan ini ke dalam program Anda melalui baris perintah. Anda tidak perlu khawatir tentang terlalu banyak input, tetapi pastikan kode Anda dapat menangani semester 19 jam kredit.

    • yaitu Input: A 1 B 4 C 2 ...
  • Program Anda harus menampilkan IPK, menggunakan 3 digit (yaitu X.XX)

  • IPK Anda harus dibulatkan ke dua tempat desimal. Bulat dengan cara apa pun yang Anda suka (lantai, langit-langit, alas, dll ...)

Contoh Input (Pilih mana yang paling cocok untuk desain Anda)

  • 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

Atau salah satu kombinasi di atas di mana Anda menggunakan format daftar semua nilai, lalu jam kreditnya:

  • yaitu ABAA 3 4 1 1

Contohnya

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
Pengembang Berkembang
sumber
2
@DevelopingDeveloper Cobalah untuk menghindari format I / O yang rumit .
JungHwan Min
1
@JungHwanMin Tolong beri tahu saya opsi I / O yang Anda inginkan yang tidak saya sebutkan? Saya memberi sekitar 6 opsi fleksibel yang berbeda, tetapi harus ditentukan agar benar-benar sesuai dengan skenario ini.
DevelopingDeveloper
3
@DevelopingDeveloper Your GPA needs to be rounded to two decimal places: untuk mencapai ini, orang perlu menambahkan kode tambahan yang tidak ada hubungannya dengan perhitungan IPK.
JungHwan Min
2
Selamat datang di PPCG. Pertanyaan pertama yang bagus menurut saya.
ElPedro
5
Meskipun ini menjadi pertanyaan yang cukup menarik, saya menurunkan suara, karena, seperti yang saya katakan sebelumnya, memaksa pembulatan dan keluaran dengan trailing 0s menjadikan ini tantangan multi-bagian; jawaban harus tidak perlu menambahkan byte, hanya untuk menyesuaikan dengan spesifikasi output, yang membuat tantangan membosankan dan IMO keseluruhan lebih buruk.
caird coinheringaahing

Jawaban:

5

Jelly ,  15  21 byte (12 tanpa pembulatan)

+6 byte untuk pemformatan ketat (hampir pasti dimungkinkan dalam waktu kurang tapi sudah waktunya tidur)

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

Program lengkap yang mengambil nilai dan jam kredit masing-masing yang mencetak IPK yang dihitung (Catatan: metode pembulatan ke lantai, sebagaimana diizinkan dalam OP).

Cobalah online!

Tanpa pembulatan selama 12 byte :

Oạ69.Ḟ×S÷⁹S¤

Bagaimana?

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
Jonathan Allan
sumber
@nimi - poin bagus, saya melewatkan sedikit itu. Tetap.
Jonathan Allan
4

Python 3 , 66 byte

-5 byte terima kasih kepada Rod.

lambda g,c:'%.2f'%sum('FDCBA'.find(i)*j/sum(c)for i,j in zip(g,c))

Cobalah online!

benar-benar manusiawi
sumber
1
Anda memiliki tambahan (), Anda juga dapat memindahkan /sum(c)untuk menyimpan 3 byte mencapai 66 byte
Rod
4

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

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

Cobalah online!

Sunting: menukar input sekitar untuk menghemat 4 byte

Format input: dipisahkan garis, kredit diikuti dengan nilai:

grade credits

Contoh:

A 3
B 4
A 1
A 1
Xcali
sumber
3

Python 2 , 69 byte

lambda x:'%.2f'%sum('FDCBA'.find(a)*b*1./sum(zip(*x)[1])for a,b in x)

Cobalah online!

tongkat
sumber
3

Bahasa Wolfram (Mathematica) , 39 byte

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

Mengambil daftar jam kredit, dan kemudian serangkaian nilai.

Tidak berfungsi pada TIO karena TIO menggunakan kernel Mathematica (yang tidak ingin mencetak angka presisi yang berubah-ubah)

JungHwan Min
sumber
2
-3 byte jika Anda menggunakanTr
3
Ini gagal untuk kasus uji kedua. Ini mengembalikan 1,85 karena Anda menghitung F = -1
J42161217
2
Berikut ini adalah perbaikan 41bytes:N[(5-(LetterNumber@#2/. 6->5)).#/Tr@#,3]&
J42161217
@Jenny_mathy tangkapan yang bagus. Saya tidak tahu bagaimana saya melewatkan itu ... Kurung tambahan bisa diturunkan dengan memindahkannya /..
JungHwan Min
2

JavaScript (ES6), 72 byte

Masukkan format: A1B3C2F3B4

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

Uji kasus

Arnauld
sumber
Pada titik apa searchgolf menjadi lebih parseInt?
Neil
@ Neil parseIntmungkin akan menjadi Golfier hanya dengan beberapa nilai lebih didukung. Satu masalah adalah perbedaan antara F = 0 dan D = 1.
Arnauld
Huh, saya bahkan tidak memperhatikan bahwa tidak ada E ...
Neil
2

R , 64 byte

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

Cobalah online!

terima kasih kepada pengguna2390246 untuk memperbaiki bug!

Giuseppe
sumber
Saya pikir maksud AndaLETTERS[-5]
user2390246
@ user2390246 ya, tentu saja. itu konyol saya.
Giuseppe
2

Java, 211 byte

Format input: A1B3C2F3B4

Golf

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

Versi lain

Frealing usus saya mengatakan kepada saya bahwa menggunakan format input yang berbeda (ABCF1324) akan membuat kode lebih pendek. Sepertinya tidak. Versi di bawah ini adalah 234 byte.

Golf

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

Tidak disatukan

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*/
}
PStigerID
sumber
Halo dan selamat datang! Anda tidak diharuskan untuk menjawab dengan program penuh, sehingga Anda dapat memotong banyak byte seperti itu.
Nissa
2

Java 1.8 , 287 249 Bytes

-38 byte berkat Bumptious

Golf

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

Tidak disatukan

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));
}
}
Pengembang Berkembang
sumber
1
Kurangi panjang dengan menggunakan ini? static float m (String l) {return l.equals ("F")? 0 :( 'E'-l.charAt (0));}
Bumptious Q Bangwhistle
1

Julia 0,6 , 46 43 42 byte

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

Cobalah online!

Penjelasan

Format input g:: vektor nilai; h: vektor jam kredit

  • g%h: Tetapkan ulang % operator.
  • 69-Int.(g): Konversikan 'F','D','C','B','A'ke -1,1,2,3,4masing-masing untuk setiap elemen g.
  • max.( ,0): Kisaran penjepit ke 0:4(elemen-bijaksana).
  • Sisanya adalah matematika vektor sederhana.
  • Pembulatan biaya 9 byte.
LukeS
sumber