Nilai Pindai-tron Saya!

10

Pengujian standar biasanya dilengkapi dengan scan-tron atau beberapa jenis dokumen jawaban yang mencatat jawaban Anda. Komputer atau manusia kemudian akan memeriksa jawaban Anda dan menentukan nilai Anda. Jadi di sini, diberikan scan-tron dan kunci jawaban, tentukan skor dan pertanyaan terjawab jika ada. Scan-tron hanyalah sebuah dokumen dengan banyak baris dengan jawaban di mana pengguna mengisi (dalam hal ini, dilingkari). Contoh:

   ---
1. |a| b c d
   --- 

Seperti yang Anda lihat, ini adalah pertanyaan 1 dengan pilihan jawaban adipilih karena memiliki kotak di sekitarnya. Untuk tantangan, Anda akan diberikan scan-tron dengan npertanyaan ( 1 <= n <= 10) dengan hanya empat jawaban dilambangkan sebagai a, b, c, atau d. Kunci jawaban akan diberikan sebagai string tanpa spasi dan dengan semua huruf kecil. Contoh scan-tron dengan kunci jawaban:

Scan-tron
   ---
1. |a| b c d
   ---
     ---
2. a |b| c d
     ---
       ---
3. a b |c| d
       ---

Answer Key
abb

Anda dapat mengambil kunci jawaban dan memindai-tron sebagai input terpisah atau dalam urutan yang dipilih asalkan dapat diidentifikasi (yaitu kunci jawaban dipisahkan dari scan-tron). Skor akan dibulatkan ke sepersepuluh titik terdekat. Contoh output untuk yang di atas:

Score: 66.7
Missed #: 3

Jawaban lain yang dapat diterima adalah:

66.7 
3

atau jika beberapa pertanyaan terjawab

66.7
3 4 5

selama nomor pertanyaan untuk mereka yang terlewatkan dipisahkan dari spasi oleh dan tidak pada baris yang sama dengan skor.

Aturan dan Spesifikasi

  • Scan-tron dapat dimasukkan sebagai string multi-baris atau satu pertanyaan pada satu waktu (sebagai string dengan baris baru dapat diterima)
  • Diberikan kunci pindai dan jawab, Anda harus menampilkan skor pada satu baris dan pertanyaan terlewatkan pada baris lain, dengan angka-angka dipisahkan oleh spasi. Jika tidak ada pertanyaan yang terlewatkan, tidak ada nomor pertanyaan yang harus dikeluarkan
  • Skor dibulatkan ke sepersepuluh terdekat
  • Jawaban yang dipilih dikelilingi oleh kotak ini:

    ---
    | |
    ---
    
  • Pada scan-tron, setiap pertanyaan membutuhkan tiga spasi (bagian atas dan bawah kotak membutuhkan dua baris tambahan)
  • Harus berfungsi untuk contoh di atas
  • Asumsikan bahwa selalu ada hanya satu jawaban kotak

Kriteria Menang

Kode terpendek menang!

Anthony Pham
sumber
scan-tron dapat berupa daftar pertanyaan? Dan setiap pertanyaan menjadi string tunggal dengan baris baru?
Rod
@Rod Ya dan saya akan mengklarifikasi bahwa
Anthony Pham
2
Bahasa "terjawab" membingungkan bagi saya, karena pertanyaan "tidak terjawab" dapat berarti pertanyaan yang gagal dijawab oleh siswa (sebagai lawan dari makna nyata Anda, dijawab secara tidak benar ).
DLosc
@DLosc Akan selalu ada hanya satu jawaban yang dilingkari
Anthony Pham
Apakah skor seperti 50dapat diterima, atau haruskah demikian 50.0?
DLosc

Jawaban:

2

05AB1E , 43 byte

U|3ôø`\vyy'|k>èXNèQˆ}¯OXg/3°*2z+ïT/XgL¯_Ï‚»

Cobalah online!

Penjelasan

U                                            # store the answer key in X
 |3ô                                         # split the question-rows in chunks of 3
    ø`                                       # zip and flatten
      \                                      # discard top of stack, leaving the list of
                                             # answer rows on top
       v                                     # for each answer row
         y'|k                                # get the index of the first "|"
        y    >è                              # get the character after that from the row
               XNèQ                          # compare it to the corresponding entry in 
                                             # the answer key
                   ˆ                         # add it to the global list
                    }                        # end loop
                     ¯O                      # calculate the number of correct answers
                       Xg/                   # divide by the length of the answer key
                          3°*                # multiply by 1000
                             2z+             # add 0.5
                                ï            # convert to integer
                                 T/          # divide by 10
                                   XgL       # push range [1 ... len(answer key)]
                                      ¯_Ï    # keep only numbers corresponding to 
                                             # wrong answers
                                          ‚» # format output
Emigna
sumber
4

Ditumpuk , 68 +1 = 69 byte

'|'split[#'1-]NO neq::size:@z~>*[]YES' '#`out is0 sum z/100*1 nround

Cobalah online! +1 untuk -pbendera (skrip ini dapat dijalankan sebagai stacked -pe "...")

Mengambil dua input dari atas tumpukan.

Beberapa fitur menarik:

[#'1-]NO
[    ]NO   do not keep members where
 #'          its length
   1-          -1
             is truthy (in this case, not equal to zero).

Ini menghasilkan semua huruf yang dikelilingi oleh pipa.

:size:@z~>*[]YES
:                 duplicate indices of incorrect answers
 size             length of incorrect answers
     :@z          (stored into z)
        ~>        range from 1 to this length
          *       and multiply by this range
           []YES  keep truthy elements

Ini memberi kita semua nomor pertanyaan yang salah.

Conor O'Brien
sumber
3

Python 2 , 94 93 byte

-1 byte terima kasih kepada L3viathan

s,a=input()
l=len(s)
w=[i+1for i in range(l)if"|%s|"%a[i]not in s[i]]
print(l-len(w))*1e2/l,w

Cobalah online!

tongkat
sumber
Bagus, jauh lebih baik daripada milikku. Anda dapat menggantinya 100.dengan1e2
L3viathan
Saya tidak percaya ini memenuhi persyaratan untuk membulatkan skor ke "sepersepuluh poin terdekat," bukan?
DLosc
3

Pip , 49 46 44 48 45 byte

Ugh, pembulatan itu membutuhkan begitu banyak byte ... 44 byte kode, +1 untuk -sbendera.

(/2+m-m/#b*#P_FI{++nbNa?un}MZa@`\|..`b)//1/t

Mengambil input sebagai argumen baris perintah (halaman scan-tron perlu mengutip dan keluar dari baris baru jika Anda menjalankannya dari baris perintah yang sebenarnya). Keluarkan pertanyaan yang terlewatkan terlebih dahulu, kemudian skor. Cobalah online!

Penjelasan

Saya akan melakukan ini dalam dua bagian: daftar pertanyaan yang salah dan skor.

P_FI{++nbNa?un}MZa@`\|..`b
                            a,b are cmdline args, u is nil, n is newline (implicit)
                            Note that a string like n, in math contexts, is equivalent to 0
                 a@`\|..`   Find all occurrences in a of | followed by 2 chars
                            Because regex matches don't overlap, this does what we need
    {         }MZ        b  Zip with b and map this function to each pair of items:
     ++n                     Increment n (so the first time through, it's 1)
        bNa                  Is 2nd arg a substring of 1st?
           ?un               If so, return nil; if not, return n
                            Now we have a list containing nil for correct questions
                            and the question number for incorrect questions
 _FI                        Filter on identity function (keep only truthy values)
P                           Print, joining on spaces (-s flag)

(/2+m-m/#b*#...)//1/t
                       a,b are cmdline args, m is 1000 (implicit)
            ...        The code from the first part
           #           Length of that list (i.e. number of incorrect questions)
      m/#b*            Times 1000/(number of questions)
    m-                 Subtracted from 1000
 /2+                   Plus 1/2 (= 0.5)
                       We now have a number like 667.1666666666667
(              )//1    Int-divide by 1 to truncate
                   /t  and divide that by 10
                       Print (implicit)
DLosc
sumber
2

JavaScript (ES6), 88 byte

x=>y=>x.replace(/\w(?=\|)/g,c=>c==y[i++]?t++:a+=i+" ",a=i=t="")&&(t/i*1e3+.5|0)/10+`
`+a

Saya bisa menghemat 5 byte dengan menggunakan koma dan mengembalikan semuanya satu baris:

x=>y=>x.replace(/\w(?=\|)/g,c=>c==y[i++]?t++:a+=[,i],a=i=t="")&&(t/i*1e3+.5|0)/10+a
Produksi ETH
sumber
1

Batch, 242 byte

@echo off
set/as=c=0
set m=
set/pk=
:l
set/ac+=1
set/pt=
set/pl=
set/pt=
set "l=%l:*|=%
if %l:~,1%==%k:~,1% (set/as+=1)else set m=%m% %c%
set k=%k:~1%
if not "%k%"=="" goto l
set/as=(s*2000/c+1)/2
echo(%s:~,-1%.%s:~-1%
echo(%m%

Membaca di kunci jawaban di STDIN terlebih dahulu, lalu n*3baris pertanyaan. Catatan: Skor dicetak tanpa nol di depan jika kurang dari 1.0. Jawaban yang terlewatkan dicetak dengan spasi terdepan.

Neil
sumber
0

CJam , 47 45 byte

lqN/(;3%_'|f#:).=.=__:+\,d/e2XmOn:!_,,:).*0-p

Cobalah online!

Penjelasan

Program ini dalam tiga bagian utama:

Right/wrong list

l                    e# Read the first line of input (answer key)
 qN/                 e# Read the rest of the input and split it on newlines
    (;3%             e# Delete the first line, then select every 3rd line 
        _            e# Duplicate the array
         '|f#        e# Find the index of the first | in each answer
             :)      e# Increment each, gives the index of the selected letter for each answer
               .=    e# Vectorized get-element-at with the answer strings
                 .=  e# Vectorized equality check with the answer key

Setelah bagian ini, kita memiliki array 0s dan 1s, di mana 0menunjukkan jawaban yang salah dan jawaban 1yang benar.

Score

__              e# Duplicate the right/wrong list twice
  :+            e# Take the sum of it (number of right answers)
    \,          e# Swap top elements and take the length (total number of questions)
      d/        e# Divide (casting to double so it's not integer division)
        e2      e# Multiply by 10^2
          XmO   e# Round to 1 decimal place
             n  e# Pop and print with a newline

Setelah bagian ini, tumpukan hanya berisi daftar benar / salah, dan skor persentase telah dihasilkan.

Wrong answers

:!            e# Logically negate each element of the right/wrong list
  _,,:)       e# Generate the inclusive range 1...length(list)
       .*     e# Vectorized multiplication of the two lists
         0-   e# Remove any 0s from the result
           p  e# Print it
Kucing Bisnis
sumber
0

Jolf, 46 byte

Sepertinya saya tidak bisa memecahkan 46 byte. Saya punya dua solusi sejauh ini. Coba satu di sini!

ΆRγψ~mΖ mi«\|..»d?=€H.xSEhSdHήSmX*~1/-lζlγlζ_1

(Ganti dengan 0x7fyang berikutnya)

ΆRγψΜΖψGi'|d=1lHd?□=H.xShSEdHήSmX*~1/-lζlγlζ_1

Dalam kedua kasus, 15 byte untuk pembulatan: mX*~1/-lζlγlζ_1. Mereka, sebagian besar, sama, kecuali satu menggunakan pencocokan regex untuk mendapatkan hasil, dan yang lainnya terbagi pada pipa.

Conor O'Brien
sumber