Saya melakukan IMC tahun ini. Apakah ada orang lain di sini yang melakukannya?
Dalam makalah Tantangan Matematika Menengah UKMT, ada dua puluh lima pertanyaan. Lima belas pertanyaan pertama memberi Anda lima nilai jika Anda melakukannya dengan benar. Untuk sepuluh pertanyaan lainnya, Anda mendapatkan enam nilai untuk membuatnya benar. Dalam sepuluh pertanyaan terakhir, Anda kehilangan nilai jika Anda salah! Untuk pertanyaan enam belas hingga dua puluh, Anda kehilangan satu nilai dan untuk lima pertanyaan terakhir, Anda kehilangan dua nilai. Jika Anda membiarkan pertanyaan kosong, tidak ada tanda yang diberikan atau dikurangi. Tidak ada nilai yang dikurangkan karena salah satu dari lima belas pertanyaan pertama salah. Makalah ini pilihan ganda; Anda dapat memilih jawaban apa pun dari A, B, C, D, dan E untuk setiap pertanyaan. Selalu ada satu jawaban yang tepat untuk setiap pertanyaan.
Buat program / fungsi yang membutuhkan dua string dan menghasilkan skor. String pertama akan menjadi jawaban Anda untuk kertas. Jika Anda melewatkan pertanyaan, gunakan spasi, byte nol atau garis bawah. Kalau tidak, gunakan huruf A, B, C, D atau E untuk jawabannya. Anda dapat memiliki input huruf besar atau kecil. String kedua akan menjadi jawaban yang benar untuk setiap pertanyaan di koran. Program / fungsi Anda kemudian akan menghasilkan skor. Buat kode Anda singkat.
Kasus uji:
DDDDDDDDDDDDDDDDDDDDDDDDD
ABCDEABCDEABCDEABCDEABCDE
15
BDBEACCECEDDBDABBCBDAEBCD
BDBEACCECEDDBDABBCBDAEBCD
135
DBACBDCDBAEDABCDBEECACDC_
DBADBDCDBAEDABCDBEEDACDCA
117
_________________________
DABDABDABDABDABDABDABDABD
0
DBADBDCDBAEDABCD_E__A__C_
DBADBDCDBAEDABCDBEEDACDCA
99
_______________BBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAA
-15
Jawaban:
C,
88878681 byteCobalah online!
sumber
ABCDE
semua di bawah poin 95, saya pikir Anda dapat menggunakan*a<95
.-(c/15+c/20)*(*a<95)
bisa menjadi*a?-c/15-c/20:0
.Jelly ,
262322 byteCobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6),
706866 byteDisimpan 2 byte berkat Neil
Disimpan 2 byte berkat ETHproductions
Mengambil jawaban pelamar
a
dan jawaban yang benarc
dalam sintaks currying(a)(c)
. Berharap pertanyaan yang dilewati akan ditandai dengan spasi.Uji kasus
Tampilkan cuplikan kode
sumber
/\w/g
untuk menghemat dua byte.-j-(i>19)
sama dengan-j^i>19
, meskipun saya tidak yakin.(-j)^(i>19)
demikian, ya, ini berfungsi.Python 2 ,
86858377 byteCobalah online!
Bagaimana itu bekerja
Ini mendefinisikan fungsi rekursif f yang mengambil dua argumen tidak optimal: t (jawaban atas tes) dan s (lembar jawaban). Ketika dipanggil hanya dengan dua argumen ini, f menginisialisasi i hingga 24 , indeks terakhir dari kedua t dan s .
Setiap kali f dipanggil, pertama-tama memeriksa apakah ~ i (bitwise BUKAN dari i ) adalah benar / tidak-nol. Sejak ~ (-1) = 0 , ini terjadi setelah i mencapai nilai -1 . Jika i = -1 , ~ i = 0 dikembalikan, tetapi karena saya mengambil nilai dari 24 hingga 0 (semua indeks t dan s ), kode berikut
and
dijalankan dan f mengembalikan hasilnya.Sementara saya non-negatif, berikut ini terjadi. Pertama,
menciptakan tuple dengan panjang 2 :
Hasil bagi
i/10
adalah 0 jika 0 ≤ i <10 , 1 jika 10 ≤ i <20 , dan 2 jika 20 ≤ i <25 . Perbandingan berantai14<i<t[i]<'_'
mengembalikan Benar jika dan hanya jika semua perbandingan individu mengembalikan Benar , yaitu, jika dan hanya jika saya ≥ 15 (kisaran pertanyaan dengan penalti), saya lebih kecil dari t [i] (selalu benar karena semua angka lebih kecil dari semua iterables di Python 2), dan t [i] bukan garis bawah.Jika perbandingan mengembalikan False , unary
-
mengembalikan 0 dan seluruh ekspresi bernilai 0 . Namun, jika perbandingan mengembalikan True , unary-
mengembalikan -1 , sehingga seluruh ekspresi bernilai 0 jika 0 ≤ i <10 , -1 jika 10 ≤ i <20 , dan -2 jika 20 ≤ i <25 ; ini adalah hasil bersih untuk jawaban yang salah atau tidak ada untuk semua indeks i .5+i/15
mengembalikan 5 + 0 = 5 jika 0 ≤ i <15 dan 5 + 1 = 6 jika 15 ≤ i <25 . Ini adalah hasil bersih untuk jawaban yang benar untuk semua indeks i .Akhirnya,
[t[i]==s[i]]
pilih elemen pertama dari tuple yang dikonstruksi jika t [i] dan s [i] berbeda (jawaban salah atau tidak ada) dan elemen kedua jika sama (jawaban benar), lalu tambahkan nilai pengembalian f yang disebut dengan decremented saya untuk hasil itu. Setelah saya mencapai -1 , skor akhir telah dihitung dan dikembalikan oleh f .sumber
Mathematica, 114 byte
Fungsi murni mengambil pasangan daftar karakter yang terurut dan mengembalikan integer.
m[Equal,#/."_"->u]
mengembalikan daftar boolean, kecuali untuk entri formulir yang tidak dievaluasiu=="B"
di tempat-tempat di mana jawabannya setara"_"
; lalu segera,u==_->0
ubah entri yang tidak dievaluasi menjadi0
s.Tr/@Partition[...,5]
menambahkan entri ini hingga 5 sekaligus, menghasilkan daftar seperti{4False+True, 4False+True, 4False+True, 4False+True, 4False+True}
untuk test case pertama atau{5True, 5True, 5True, 2True, 2True}
untuk case test terakhir. Kemudian di setiap koordinat,True
danFalse
dipetakan ke skor yang sesuai, dan hasilnya ditambahkan bersama.sumber
Jelly ,
2221 byteCobalah online!
Saya pikir jawaban @ Dennis mungkin bisa dikalahkan. Dan setelah mencoba sejumlah besar kemungkinan yang berbeda dan mengambil manfaat dari kebetulan yang luar biasa, akhirnya saya berhasil!
Program ini mengambil sepasang [jawaban siswa, jawaban benar] sebagai input, dan menggunakan spasi untuk menunjukkan jawaban yang hilang.
Penjelasan
Program ini menggunakan beberapa format input internal yang aneh untuk melacak apa yang terjadi, jadi kami akan mengambil langkah ini satu per satu.
Z
Ini mentranspos input, jadi kita akan berakhir dengan daftar 25 elemen, satu untuk setiap pertanyaan; setiap elemen berbentuk [jawaban siswa, jawaban benar]. Kami akan menunjukkan elemen formulir ini dengan huruf kapital;
A
untuk pertanyaan 1,B
untuk pertanyaan 2, dan seterusnya. Jadi jawabannya saat ini sedang disimpan sebagaim0
Ini adalah operasi "palindrome yang lebih besar"; kami menambahkan kebalikan dari nilai saat ini ke nilai itu sendiri, menghasilkan ini:
ṁ135
Operator
ṁ
(cetakan) melakukan sejumlah hal, tetapi dalam konteks ini, ia secara efektif mengambil 135 elemen pertama dari daftar tak terbatas yang dihasilkan dengan menambahkan nilai saat ini ke dirinya sendiri berulang kali. Itu memberi kita yang berikut ini (yang telah saya bagi ke dalam kelompok 50 elemen untuk kenyamanan; ini hanya daftar 135 pasangan secara internal):µ;
µ
menetapkan nilai saat ini sebagai default baru untuk operan yang hilang. Kami kemudian segera melihat builtin yang hilang operan;;
menambahkan, tapi kami belum menentukan apa yang harus ditambahkan. Akibatnya, nilai saat ini ditambahkan ke nilai pada yang terakhirµ
(yang juga merupakan nilai saat ini), memberi kami nilai 270-elemen saat ini:t€⁶
Ingat bahwa semua huruf kapital di atas mewakili pasangan [jawaban siswa, jawaban yang benar]. The
t€⁶
Operasi beroperasi pada masing-masing (€
pair), dan menghapus (t
) spasi (⁶
) dari kedua sisi dari pasangan (yaitu setiap ruang yang muncul dalam pasangan). Jadi kita masih memiliki daftar yang berbelit-belit dari 270 pertanyaan dengan banyak pengulangan, tetapi mereka dalam bentuk [jawaban yang benar] (siswa tidak menjawab) atau [jawaban siswa, jawaban yang benar] (siswa menjawab).E€’
The
E€’
operasi juga beroperasi pada setiap (€
) elemen, dan, karena penggunaanE
, menggantikan elemen dengan 1 jika semua elemen adalah sama (yaitu siswa tidak menjawab atau mendapat pertanyaan kanan), atau 0 jika tidak semua unsur-unsurnya sama (yaitu siswa menjawab tetapi mendapat pertanyaan yang salah). Penggunaan di’
sini mengubah penomoran, artinya sekarang kita menggunakan -1 atau 0. Saya akan menggunakan huruf kecil untuk elemen jenis baru ini, yang menggunakan -1 untuk jawaban yang akan dihukum jika itu pada pertanyaan yang memenuhi syarat penalti, atau 0 untuk jawaban yang hilang atau benar:;E€
Kami telah melihat keduanya
E€
dan;
sebelumnya; kami menambahkan sesuatu ke nilai saat ini, dan kami menggunakan format 1 jika semua elemen sama, atau 0 jika ada yang berbeda (tidak’
kali ini!). Ada operan yang hilang di sini, jadi kami menggunakan nilai pada yang terakhirµ
(yaitu output dari langkah 3). Kembali ke langkah 3, kami belum menghapus spasi dari elemen, jadi kami akan memiliki 1 untuk jawaban yang benar, atau 0 untuk jawaban yang salah atau tidak ada (karena spasi tidak akan cocok dengan jawaban yang benar). Mulai sekarang, saya akan menggunakan huruf kapital untuk ini 1 = benar, 0 = format salah / hilang, dan terus menggunakan huruf kecil untuk 0 = benar / hilang, -1 = salah. Nilai yang dihasilkan memiliki 405 elemen, dan terlihat seperti ini:ṫ⁹
Di sinilah kebetulan luar biasa yang saya sebutkan sebelumnya. Sebelum berbicara tentang sedikit kode ini, saya ingin mengetahui di mana kita harus pergi.
Setiap huruf kapital mewakili +1 untuk jawaban yang benar; 15 pertanyaan pertama (
A
sampaiO
) muncul masing-masing 5 kali dalam string, dan 10 pertanyaan terakhir (P
sampaiY
) muncul masing-masing 6 kali. Itu sedikit tidak benar-benar ajaib; Saya mendesain seperti itu ketika saya memilih angka 135 sebelumnya dalam program (yaitu 5 × 15 + 6 × 10), dan satu-satunya keberuntungan di sini adalah bahwa 5 kebetulan merupakan angka ganjil (jadi ini adalah 10 terakhir pertanyaan yang akhirnya muncul kali tambahan, bukan 10 yang pertama). Ke-15 surat segera sebelum ini berisip
melaluit
(pertanyaan penalti -1) sekali, dan sebelumnya, salinan tambahan dari pertanyaan berada di urutanu
melaluiy
(pertanyaan penalti -2) dua kali. Itu juga bukan kebetulan; karena kami menggunakanm0
PQRSTUVWXYYXWVUTSRQP
, dan pertanyaan selanjutnya akan muncul secara alami di dekat bagian tengah string tersebut (jadi mengambil 15 pertanyaan terakhir "ekstra" akan memberikan lebih sedikit pengulangan untuk yang di dekat tepi; dan tentu saja, tidak mengherankan bahwa "tambahan" pertanyaan datang terakhir).Karena setiap huruf kecil mengurangi 1 dari skor untuk jawaban yang salah, tidak hilang, dan setiap huruf besar menambahkan 1 pada skor untuk jawaban yang benar, oleh karena itu kita hanya perlu mengambil 135 + 15 = 150 elemen terakhir untuk mendapatkan setiap jenis elemen jumlah kali yang benar. Perintah Jelly untuk mendapatkan substring di akhir daftar adalah
ṫ
; Namun, itu tidak menentukan jumlah elemen yang Anda inginkan, melainkan indeks dari elemen pertama yang Anda inginkan. Kami memiliki 405 elemen pada titik ini, dan ingin 150, jadi kita perlu mulai dengan indeks (405 - 150 + 1), atau 256. Dalam suatu kebetulan yang luar biasa, 256 merupakan jumlah oktet berbeda yang ada, dan karenanya representasi singkat di Jelly (⁹
). Ada sangat sedikit yang bisa saya lakukan untuk mewujudkan hal ini; langkah 4 menambahkan 135 elemen ke awal daftar untuk mencapai angka bulat, tetapi fakta bahwa 135 elemen yang harus saya tambahkan (nilai yang sudah tersedia pada saat itu dalam program) sangat nyaman, dengan pada dasarnya nomor lain sama sekali tidak membantu dalam situasi ini.Beginilah nilai internal terlihat sekarang:
S
Akhirnya, sekarang kita punya daftar modifikasi untuk skor dari pertanyaan, yang perlu kita lakukan adalah menjumlahkannya dengan menggunakan
S
, dan kita selesai.sumber
Python 2 ,
9391 byteCobalah online!
-2 byte berkat @KritixiLithos
Memasukkan:
a
: Jawaban siswa sebagai string,_
untuk pertanyaan yang dilewatib
: jawaban yang benarn
: jumlah pertanyaan saat ini0
berbasis, default ke0
sumber
a[0]<'^'
alih - aliha[0]!="_"
menghemat bytea>""
dapat bekerja sebagai gantinyaa!=""
a
kosong, tidak bisakah Anda lakukana and
? String kosong itu salah, kalau tidak, itu benar.TypeError
sebagai panggilan rekursif terakhir akan mengembalikan stringk, 52 byte
Fungsi mengambil 2 string, format per kasus uji
Contoh:
sumber
Haskell, 84 byte
Contoh penggunaan:
((sum.).zipWith3 i(w=<<[0..2])) "DBADBDCDBAEDABCD_E__A__C_" "DBADBDCDBAEDABCDBEEDACDCA"
->99
. Cobalah online! .Cara kerjanya:
i x a b
menghitung skor untuk satu jawabana
dengan hasil yang benarb
dan penaltix
untuk jawaban yang salah (nilai non-negatif). Jika Anda melewatkan (a>'Z'
), skornya adalah0
, jika jawabannya benar (a==b
), skornya adalah6-0^x
, jika tidak, skornya adalah-x
.w=<<[0..2]
membuat daftar hukuman untuk semua 25 pertanyaan dengan menerapkanw
untuk0
,1
dan2
, yaitu membuat5*3^0^x
salinan dari setiap nomor (-> 15 kali0
, 5 kali1
dan 5 kali2
).zipWith3
berlakui
untuk daftar penalti, daftar jawaban dan daftar hasil yang benar. Akhirnya semua skor ditambahkan (sum
).sumber
Oktaf,
6154 byteCobalah online!
Jawaban sebelumnya:
sumber
JavaScript (ES6),
10510310194898885847877 byteSolusi pertama saya di ES6, mungkin bahkan pertama di Javascript Oo
s adalah solusi yang diajukan dan a adalah solusi yang benar. Keduanya akan diambil sebagai string.
Berikut adalah solusi non-rekursif pada 78 byte:
Mengambil input melalui sintaks currying.
Terima kasih kepada @ETHproductions untuk menghemat 9 byte!
s[i]
kec
dan(-1-(i>19|0))
ke~(i>19)
.Terima kasih kepada @Kritixi Lithos karena telah menghemat satu byte!
c=='_'
untukc>'Z'
.Cobalah online!
sumber