Mempersiapkan tes pilihan ganda

12

pengantar

Catatan: ini bukan semacam metode untuk mendorong kecurangan. Seperti yang sudah dikatakan oleh Cᴏɴᴏʀ O'Bʀɪᴇɴ , belajar adalah solusi terbaik untuk lulus ujian: 3.

Pertimbangkan jawaban berikut untuk tes pilihan ganda:

ABCBCAAB

Ini adalah tabel yang menunjukkan apakah jawabannya cocok:

    A B C B C A A B

A   1 0 0 0 0 1 1 0
B   0 1 0 1 0 0 0 1
C   0 0 1 0 1 0 0 0

Ini memberi kita angka-angka berikut:

10000110, 01010001, 00101000

Tantangannya adalah untuk mencetak angka-angka biner ini. Tetapi penting untuk melihat huruf mana yang digunakan dalam tes pilihan ganda. Sebagai contoh:

ABCDCDBCDABC

Huruf tertinggi ini adalah D, yang merupakan huruf ke - 4 dalam alfabet . Oleh karena itu, kita perlu menampilkan 4 angka biner yang berbeda . Yaitu:

100000000100, 010000100010, 001010010001, 000101001000

Perhatikan bahwa Anda harus melihat huruf tertinggi . Perhatikan contoh berikut:

AACCACAC

Meskipun Btidak digunakan, kita perlu menampilkan hasil biner untuk B. Itu artinya, jawabannya adalah:

11001010, 00000000, 00110101

Tugas

Diberikan jawaban untuk tes pilihan ganda, mengeluarkan angka-angka biner. Anda dapat berasumsi bahwa input tidak akan kosong dan hanya berisi surat-surat[A-Z] . Alih-alih satu dan nol, Anda juga dapat menggunakan benar dan salah.


Kasus uji:

Input: ABBBABABA
Output: 100010101, 011101010

Input: AAAAAAAAA
Output: 111111111

Input: AFGHEEHFD
Output: 100000000 000000000 000000000 000000001 000011000 010000010 001000000 000100100

Input: Z
Output: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1

Input: ABCDCDBCDABC
Output: 100000000100, 010000100010, 001010010001, 000101001000

Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!

Adnan
sumber
Bisakah kita gunakan [a-z]saja?
FryAmTheEggman
@FryAmTheEggman Tentu saja :)
Adnan
Terkait
Adnan
tidak ada aturan untuk output yang ditentukan, apakah array 2D bools diperbolehkan?
Eumel
yang sepertinya agak tidak masuk akal tetapi juga bekerja untuk saya ^^
Eumel

Jawaban:

3

Pyth, 12 byte

mqLdzfsgRTzG

Output sebagai array boolean bersarang.

                Implicit: z=input
m               Map lambda d:
 qLdz            map equal-to-d over z
     f           over all letters T in the
           G     lowercase alphabet for which
      s           At least one char in z
       gRTz       >= T.

Coba di sini .

lirtosiast
sumber
6

Python 3, 71

Disimpan 22 byte berkat Ogaday.
Disimpan 3 byte berkat DSM.

Menyimpan banyak byte berkat array bools yang valid.

*k,=map(ord,input())
x=65
while x<=max(k):print([v==x for v in k]);x+=1

Mengambil input baris perintah huruf besar.

Morgan Thrapp
sumber
1
Gunakan pembongkaran yang bisa diperpanjang :*k,=map(ord,input())
Ogaday
Berbagai bool sekarang juga mungkin, jika itu membantu.
Adnan
3

PowerShell, 95 94 73 byte

param([char[]]$a)0..(($a|sort)[-1]-65)|%{$d=$_;-join($a|%{+!($_-$d-65)})}

Mengambil input sebagai string huruf besar, tetapi segera melemparkannya [char[]]. Kami kemudian beralih dari 0..ke nilai maksimal yang $adiambil secara alfabet (karenanya -65untuk mengkonversi dari ASCII). Misalnya, dengan ADCEB, ini dapat dianggap sebagai perulangan dari Ake E.

Setiap iterasi, kami menetapkan variabel pembantu $dsama dengan nilai alfabet saat ini (bukan ASCII). Kami kemudian mengulangi semua $a, setiap kali menempatkan salah satu 0atau 1pada pipa, berdasarkan apakah $_-$d-65itu benar atau salah (yaitu, apakah kita berada di "slot" yang tepat). Ini berfungsi karena setiap nilai non-nol di PowerShell adalah benar, artinya jika huruf kita saat $_ini tidak "menyamakan" slot yang kita masuki $d, maka !yang itu $false, atau 0.

Masing-masing array 0s dan 1s kemudian -joindiedit bersama dan dimasukkan kembali ke dalam pipa. Ketika loop luar berakhir, kami memiliki array string, yang akan mencetak satu string per baris.

Contohnya

PS C:\Tools\Scripts\golfing> .\preparing-a-multiple-choice-test.ps1 ABCDEFGH
10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001

PS C:\Tools\Scripts\golfing> .\preparing-a-multiple-choice-test.ps1 AFGHEEHFD
100000000
000000000
000000000
000000001
000011000
010000010
001000000
000100100

Sunting 1 - menyimpan byte dengan menggunakan Boolean-bukan bukannya -eq
Sunting 2 - menyimpan 21 byte lainnya dengan menghilangkan array tambahan $ b

AdmBorkBork
sumber
Berbagai bool sekarang juga mungkin, jika itu membantu.
Adnan
3

LabVIEW, 30 22 20 LabVIEW Primitif

Melewati dari az hingga jumlah semua bools sama dengan panjang input. kemudian Ubah bool menjadi angka.

Sekarang langsung ambil max daripada memeriksa jumlah bool.

Karena bool 2D layak sekarang saya menyimpan 2 Primitif dengan mengeluarkan kabel hijau di depan ?1:0bisa mengulanginya tetapi saya terlalu malas ...

kode baru kode lama

Eumel
sumber
Berbagai bool sekarang juga mungkin, jika itu membantu.
Adnan
2

Cjam, 25 byte

l{'A-i}%_:e>),\f{f=", "}

Mendesah,

Penjelasan

l{'A-i}%_:e>),\f{f=", "}
l                        e# get the input
 {'A-i}%                 e# get the normalized array
        _:e>             e# get the maximum value
            ),           e# create the array from 1..N
              \f{      } e# map over the created array
                 f=      e# 1 if match, 0 if not
                   ", "  e# add separator
Akangka
sumber
Selamat atas rep 1rt BTW!
Biru
Berbagai bool sekarang juga mungkin, jika itu membantu.
Adnan
2

Haskell, 46 34 byte

g x=(<$>x).(==)<$>['A'..maximum x]

Contoh penggunaan: g "ACDC"-> [[True,False,False,False],[False,False,False,False],[False,True,False,True],[False,False,True,False]].

Bagaimana itu bekerja:

        <$>['A'..maximum x]   -- for every letter from A to the highest letter in x
<$>x                          -- loop over x and
      ==                      -- compare the letter with the current element in x
                              -- which results in a boolean          
nimi
sumber
2

Pyth, 20 19 17 15 14 byte

VhxGeSzmq@GNdz

Penjelasan:

               - autoassign z = input()
V              - For N in range(V)
 hxGeSz
    eSz        - max(z)
  xG           - lowercase_alphabet.index(^)
 h             - +1
       mq@GNdz
       m     z - [V for d in z]
         @GN   - lowercase_alphabet[N]
        q   d  - is_equal(^, ^^)
               - print "".join(^)

Output array 2D bools

Coba di sini

Biru
sumber
2

ES6, 92 byte

s=>[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"].map(c=>[...s].map(m=>m==c&&!!(l=n),n++),n=0).slice(0,l)

Mengembalikan array array yang palsu dan trues. Jika Anda lebih suka array string nol dan satu, maka untuk 97 byte:

s=>[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"].map(c=>s.replace(/./g,m=>m==c?(l=n,1):0,n++),n=0).slice(0,l)
Neil
sumber
2

Oktaf, 19 byte

@(s)s==[65:max(s)]'

Menggunakan siaran otomatis Octave pada rentang Ake elemen maks dalam input untuk menghasilkan array boolean elemen pencocokan 2d.

Contoh:

Key = ABCDCDBCDABC

ans =

   1   0   0   0   0   0   0   0   0   1   0   0
   0   1   0   0   0   0   1   0   0   0   1   0
   0   0   1   0   1   0   0   1   0   0   0   1
   0   0   0   1   0   1   0   0   1   0   0   0

Cobalah di sini di ideone .

gelas kimia
sumber
1

Lua, 208 189 Bytes

Itu sulit di lua, seperti biasa, kita harus melakukan semuanya dari awal, dan itu membutuhkan banyak tempat! Program ini menggunakan string sebagai argumen, dan mencetak hasilnya :).

Sunting: @Adnan memberi tahu saya bahwa kami sekarang diizinkan untuk mengembalikan matriks boolean, jadi inilah versi baru! Sekarang adalah fungsi yang mengambil string karakter kapital dan mengembalikan matriks :).

function f(x)a={}b={}for i=1,#x do a[i]=x:sub(i,i)end table.sort(a)for i=1,a[#a]:byte()-64 do b[i]={}end x:gsub(".",function(c)for i=1,#b do z=b[i]z[#z+1]=i+64==c:byte()end end)return b end

Versi 208 Byte lama

Ini adalah yang bekerja dengan argumen dan hasil cetak.

a={}b={}x=arg[1]for i=1,#x do a[i]=x:sub(i,i)end table.sort(a)for i=1,a[#a]:byte()-64 do b[i]=""end x:gsub(".",function(c)for i=1,#b do b[i]=b[i]..(i+64==c:byte()and"1"or"0")end end)print(table.concat(b,","))

Tidak terseret dan penjelasan

function f(x)
a={}                   -- We need 2 arrays, and while b=a would have been shorter
b={}                   -- arrays in lua are passed by pointer, so it wouldn't have worked

for i=1,#x             -- iterate over the inpute to transform the string
do                     -- into an array
  a[i]=x:sub(i,i)      -- with each cells containing a characyer
end
table.sort(a)          -- sort the array/string

for i=1,               -- iterate n times were n is the place in the alphabet
       a[#a]:byte()-64 -- of the last element of the (sorted) array a
do
  b[i]={}              -- initialise cells in b up to n with empty arrays
end                    -- a cell's index is the position of a letter in the alphabet

x:gsub(".",function(c) -- for each character in the input
  for i=1,#b           -- iterate over each cells in b
  do
    z=b[i]             -- define z pointing on the array b[i]
    z[#z+1]=           -- insert into b[i] the result of the
       i+64==c:byte()  -- comparison of the current char, and the answer
  end
end)
return b
end

Mencoba untuk mencetak array di Lua akan menghasilkan pencetakan alamatnya dan menggabungkan bools tidak mungkin. Jadi, inilah fungsi yang akan membantu Anda jika Anda ingin menguji kiriman ini

function f(x)a={}b={}for i=1,#x do a[i]=x:sub(i,i)end table.sort(a)for i=1,a[#a]:byte()-64 do b[i]={}end x:gsub(".",function(c)for i=1,#b do z=b[i]z[#z+1]=i+64==c:byte()end end)return b end

function printBooleanMatrix(m)
  s="{"
  for i=1,#m
  do
    s=s.."{"
    for j=1,#m[i]
    do
      s=s..(m[i][j]and"1"or"0")..(j==#m[i]and""or",")
    end
    s=s.."}"..(i==#m and""or",\n")
  end
  print(s.."}")
end

printBooleanMatrix(f("ABBCCDDC"))
Katenkyo
sumber
Berbagai bool sekarang juga mungkin, jika itu membantu.
Adnan
@ Adnan yah, ini memungkinkan saya untuk menjatuhkan banyak byte. Saya sedang menulis fungsi untuk memiliki keluaran yang jelas untuk tujuan pengujian, kemudian memposting versi yang direvisi :)
Katenkyo
1

Perl, 84 byte

$\="\n";@i=split//,<>;pop@i;for$c('a'..(reverse sort@i)[0]){print map{/$c/?1:0}@i;}

Oh sayang, sepertinya aku telah menghancurkan stabilo.

Versi tidak disatukan:

# output formatting
$\ = "\n";
# get input chars as array
@i = split //, <>;
# lose the newline
pop @i;
# iterate over characters up to the max
for $c ('a'..(reverse sort @i)[0]) {
    # print 1 for each match, 0 otherwise
    print map { /$c/ ? 1 : 0 } @i;
}
David Morris
sumber
1

PHP, 106 92 90 87 byte

Menggunakan penyandian Windows-1252.

for($x=A;$x++<=max($z=str_split($argv[1]));print~Ó)for(;$c=$z[+$$x++];)echo+(++$c==$x);

Jalankan seperti ini ( -dditambahkan hanya untuk estetika):

php -d error_reporting=30709 -r 'for($x=A;$x++<=max($z=str_split($argv[1]));print~Ó)for(;$c=$z[+$$x++];)echo+(++$c==$x); echo"\n";' ABCDDHFHUYFSJGK
  • Disimpan 14 byte dengan menyarang loop sebaliknya
  • Disimpan 2 byte dengan menggunakan variabel variabel untuk mencegah $i=0
  • Menyimpan byte dengan membalikkan string dan menjatuhkan pembatas string
  • Menyimpan byte dengan menggerakkan gema (diubah menjadi cetakan agar pas) di dalam yang pertama untuk loop dan menjatuhkan kurung kurawal
  • Menyimpan byte dengan menambah di $xtempat lain, dan menambah $cuntuk kompensasi
aross
sumber
0

C #, 68 byte

c=>Enumerable.Range(65,c.Max()-64).Select(x=>c.Select(y=>x==y?1:0));

Jalankan di C # Pad

Fungsi anonim ini mengambil char[]input dan output sebagai IEnumerable<IEnumerable<int>>, dengan hanya 0 dan 1.

Arthur Rump
sumber
0

k, 15 byte

{x=/:65_!|/1+x}

Cobalah online!

zgrep
sumber