Menyontek tes pilihan ganda, bagian 2

26

Ini adalah sekuel dari tantangan ini oleh Adnan . Jika Anda menyukai tantangan ini, kemungkinan Anda juga akan menyukai tantangan yang lain. Saksikan berikut ini!


Sebuah tes pilihan ganda dengan 8 pertanyaan masing-masing dengan 4 pilihan mungkin memiliki jawaban: BCADBADA. Dikonversi menjadi empat array yang berbeda, dengan benar dan salah jika huruf saat ini adalah jawabannya, akan terlihat seperti ini

Q#: 1  2  3  4  5  6  7  8
    B  C  A  D  B  A  D  A
A: [0, 0, 1, 0, 0, 1, 0, 1]
B: [1, 0, 0, 0, 1, 0, 0, 0]
C: [0, 1, 0, 0, 0, 0, 0, 0]
D: [0, 0, 0, 1, 0, 0, 1, 0]

Ini dapat dikompres menggunakan sedikit logika. Masing-masing pilihan A, B, Cdan Ddapat diwakili oleh dua / nilai-nilai palsu yang benar ditunjukkan di bawah ini:

A: 1 0
B: 0 1
C: 0 0
D: 1 1

Dengan menggunakan logika ini, kita dapat memampatkan empat vektor di atas menjadi hanya dua:

 1  2  3  4  5  6  7  8
 B  C  A  D  B  A  D  A
[0, 0, 1, 1, 0, 1, 1, 1]
[1, 0, 0, 1, 1, 0, 1, 0]

Artinya, solusi untuk pengujian Anda adalah: 00110111, 10011010. Dengan menggabungkan ini, kita mendapatkan angka biner 0011011110011010, atau 14234dalam desimal. Gunakan nilai desimal ini untuk menipu pada tes Anda!

Tantangan

Ambil angka Ndalam kisaran (inklusif) [0, 65535], dan keluarkan string dengan jawaban untuk tes pilihan ganda.

Kasus uji:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

Outputnya mungkin dalam huruf besar atau kecil, tetapi Anda tidak dapat menggunakan simbol lainnya.

Stewie Griffin
sumber
Apakah output harus berupa string seperti yang ditunjukkan, atau dapatkah huruf-hurufnya berada pada baris yang terpisah, dalam daftar, dll?
xnor
@xnor Opsional :-)
Stewie Griffin
Mengapa tidak jelas A = 00, B = 01, C = 10, D = 11?
user253751
Alasannya adalah saya pertama kali membuat A=10, B=01, kemudian C=nor(A,B), dan D=and(A,B), terinspirasi oleh tantangan Adnan. Kalau dipikir-pikir, mungkin lebih baik melakukannya sebaliknya, tapi yah ... Sudah terlambat sekarang ...
Stewie Griffin

Jawaban:

3

Jelly , 14 byte

d⁹+⁹BZḄḊị“BADC

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

d⁹+⁹BZḄḊị“BADC  Main link. Argument: n

d⁹              Divmod 256; yield [n : 256, n % 256].
  +⁹            Add 256; yield [n : 256 + 256, n % 256 + 256].
    B           Binary; convert both integers to base 2.
     Z          Zip; group the quotient bits with corresponding remainder bits.
      Ḅ         Unbinary; convert from base 2 to integer.
       Ḋ        Dequeue; discard the first integer, which corresponds to the
                dummy value introduced by adding 256 to quotient and remainder.
        ị“BADC  Index into that string, mapping [1, 2, 3, 0] to "BADC".
Dennis
sumber
10

05AB1E , 19 18 16 byte

Kode:

žH+b¦2äøC’c‰±’sè

Menggunakan pengkodean CP-1252 . Cobalah online!

Penjelasan:

Pertama, kita menambahkan 65536angka ( žHadalah konstanta yang didefinisikan 65536), yang juga 10000000000000000dalam biner. Ini untuk mengisi angka dengan nol. Mari kita ambil nomornya 14234sebagai contoh. 14234 + 65536sama dengan 79770. Yang dalam biner adalah:

10011011110011010

Kami menghapus karakter pertama, menghasilkan:

0011011110011010

Kami membagi string menjadi dua bagian menggunakan :

00110111, 10011010

Setelah itu, kita beri zip array ø:

01, 00, 10, 11, 01, 10, 11, 10

Mengubahnya kembali menjadi desimal (menggunakan C) menghasilkan:

1, 0, 2, 3, 1, 2, 3, 2

Sekarang, kita hanya perlu mengindeksnya dengan string cbad. Versi terkompresi untuk string ini adalah ’c‰±’, yang juga dapat diuji di sini . Akhirnya, kita mendapatkan karakter di indeks array di atas. Untuk contoh di atas, ini menghasilkan:

1, 0, 2, 3, 1, 2, 3, 2
b  c  a  d  b  a  d  a
Adnan
sumber
6

JavaScript (ES6), 55 48 byte

f=(n,i=8)=>i--?"CBAD"[n>>i&1|n>>i+7&2]+f(n,i):''

console.log(f(14234)); // BCADBADA
console.log(f(38513)); // ABBDCAAB
console.log(f(0));     // CCCCCCCC
console.log(f(120));   // CBBBBCCC
console.log(f(65535)); // DDDDDDDD
console.log(f(39253)); // ABCDABCD

Versi non-rekursif (55 byte)

Dengan menggunakan ekspresi reguler, kita dapat melakukan:

n=>"76543210".replace(/./g,i=>"CBAD"[n>>i&1|n>>+i+7&2])
Arnauld
sumber
Bagaimana menurut Anda melakukan operasi bitwise?
ericw31415
@ ericw31415 - Bahkan jika itu tidak dilakukan secara eksplisit, tantangan sebenarnya menggambarkan operasi bitwise ini dalam urutan terbalik (mulai dari "Ini dapat dikompresi menggunakan sedikit logika." )
Arnauld
3
... sedikit logika ...
Neil
4

Python 2, 53 byte

f=lambda n,k=8:k*'_'and f(n/2,k-1)+'CBAD'[n>>7&2|n&1]

Uji di Ideone .

Dennis
sumber
Saya mencoba menggunakan (n&257)%127tetapi lebih lama. Sayang sekali itu prima. Mungkin Anda bisa memikirkan cara untuk mengoptimalkannya.
xnor
4

Perakitan CP-1610 , 24 DECLEs (30 byte)

Kode ini dimaksudkan untuk dijalankan pada Intellivision . (1)

Sebuah opcode CP-1610 dikodekan dengan nilai 10-bit, yang dikenal sebagai 'DECLE'. Fungsi sebenarnya adalah 24 DECLE, mulai dari $4809dan berakhir pada $4820.

Register CPU Namun 16-bit lebar, sehingga akan mendukung setiap nilai input dalam 0x0000.. 0xFFFF.

                            ROMW  10            ; use 10-bit ROM
                            ORG   $4800         ; start program at address $4800
4800 0002                   EIS                 ; enable interrupts (to enable display)

                    ;; ---- usage example
4801 0001                   SDBD                ; load parameter in R0
4802 02B8 009A 0037         MVII  #14234, R0    ;
4805 0004 0148 0009         CALL  cheat         ; call function
4808 0017                   DECR  PC            ; infinite loop

                    ;; ---- 'Cheat Your Test' function
                    cheat   PROC  

4809 0082                   MOVR  R0,     R2    ; copy R0 to R2
480A 0040                   SWAP  R0            ; swap LSB/MSB in R0
480B 02BC 0214              MVII  #$214,  R4    ; R4 = pointer to 2nd row of screen memory

480D 01DB           @@loop  CLRR  R3            ; clear R3
480E 0052                   RLC   R2            ; extract highest bit of R2 to carry
480F 0053                   RLC   R3            ; inject carry into R3
4810 0050                   RLC   R0            ; extract highest bit of R0 to carry
4811 0053                   RLC   R3            ; inject carry into R3
4812 0001                   SDBD                ; add pointer to lookup table to R3
4813 02FB 001D 0048         ADDI  #@@tbl, R3    ;
4816 029B                   MVI@  R3,     R3    ; read character value
4817 0263                   MVO@  R3,     R4    ; write it to screen memory (also does R4++)
4818 037C 021C              CMPI  #$21C,  R4    ; 8 characters written? ...
481A 0225 000E              BLT   @@loop        ; ... if not, jump to @@loop

481C 00AF                   JR    R5            ; return

481D 011F 0117      @@tbl   DECLE $11F, $117    ; characters 'B', 'C', 'A' and 'D'
481F 010F 0127              DECLE $10F, $127    ; in white, using the built-in font

                            ENDP

Keluaran

tangkapan layar


(1) Memang setidaknya satu kompiler, beberapa emulator dan file ROM pengganti bebas-hak cipta tersedia secara bebas, saya pikir itu tidak melanggar aturan pengiriman PPCG. Tapi tolong beri tahu saya kalau saya salah.

Arnauld
sumber
1
Kami skor dalam byte, jadi tambahkan jumlah total bit, dan skor Anda adalah hasil desimal (float) dari membagi nilai tersebut dengan delapan. Dalam hal ini, 27,5 byte.
mbomb007
3

CJam , 22 byte

ri2bG0e[8/:.{1$=)^'A+}

Cobalah online!

Penjelasan

Didukung oleh sihir ...

Pemetaan pasangan bit ke huruf dalam tantangan ini agak sewenang-wenang. Jika kita wakili ABCDdengan 0, 1, 2, 3(jadi kita bisa menambahkannya ke karakter A) maka kita ingin pemetaan berikut:

i1   i2   o
0    0    2
0    1    1
1    0    0
1    1    3

Pemetaan ini dapat dihitung dengan rumus kecil ajaib:, ((i1 == i2) + 1) ^ i1tempat pemeriksaan kesetaraan kembali 0atau 1. Periksa tabel berikut ini, di mana setiap kolom sesuai dengan satu input, setiap baris sesuai dengan satu operasi, dan setiap sel akan menunjukkan tumpukan pada titik itu:

[i1, i2]:  [0, 0]     [0, 1]     [1, 0]     [1, 1]
copy i1:   [0, 0, 0]  [0, 1, 0]  [1, 0, 1]  [1, 1, 1]
equals:    [0, 1]     [0, 0]     [1, 0]     [1, 1]
inc:       [0, 2]     [0, 1]     [1, 1]     [1, 2]
xor:       [2]        [1]        [0]        [3]

Dengan mengingat hal tersebut di sini adalah uraian lengkap dari kode sumber:

ri     e# Read input, convert to integer.
2b     e# Get binary representation.
G0e[   e# Pad to 16 bits with zeros.
8/     e# Split into two halves of 8 bits each.
:.{    e# For each pair of bits, i1 and i2...
  1$   e#   Copy i1.
  =    e#   Check equality with i2.
  )    e#   Increment.
  ^    e#   Bitwise XOR.
  'A+  e#   Add to 'A'
}

Solusi alternatif dengan jumlah byte yang sama yang jelas kurang ajaib:

ri2bG0e[8/z2fb"CBAD"f=

Dan jika itu berguna bagi siapa pun, jika Anda mengubah bit i1dan i2kembali menjadi satu nomor (yaitu ketika Anda ingin pemetaan 0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3) ini dapat dihitung lebih mudah karena (~n - 1) & 3atau (~n - 1) % 4jika bahasa Anda mendapat modulo pada nilai negatif dengan benar. Saya pikir ini dapat ditulis secara ringkas seperti 3&~-~ndalam banyak bahasa. Dalam CJam ini ternyata menjadi satu byte lebih lama, karena konversi tambahan kembali dari basis 2.

Martin Ender
sumber
3

PHP, 57 Bytes

for($i=8;$i--;)echo CBAD[($n=$argv[1])>>$i+7&2|$n>>$i&1];

Versi tanpa operator Bitwise 70 Bytes

for(;$i<8;)echo CABD[($s=sprintf("%016b",$argv[1]))[$i]+$s[8+$i++]*2];
Jörg Hülsermann
sumber
Di mana variabel $ididefinisikan?
ericw31415
@ ericw31415 Dalam penggunaan pertama variabel diinisialisasi dan secara otomatis menyatakan PHP variabel ini dengan referensi nol
Jörg Hülsermann
Itu PHP (tm)
mulai
3

Mathematica, 75 73 68 66 byte

StringPart["CBAD",#+##+1]&@@IntegerDigits[#,2,16]~Partition~8<>""&

Terima kasih kepada @MartinEnder karena telah menghemat 2 byte.

JungHwan Min
sumber
@ MartinEnder #+##dan Infixbekerja, tetapi menggunakan StringParttidak bisa dihindari karena kepala "C"["B","A","D"][[#+##]]adalah "C", bukan List; StringJointidak bekerja
JungHwan Min
1
Oh, saya tidak menyadarinya #dan #2merupakan seluruh daftar.
Martin Ender
3

Perl, 42 byte

Termasuk +1 untuk -n

Berikan masukan pada STDIN:

perl -nE 'say+(A..D)[2-($`>>8-$_&257)%127]for/$/..8' <<< 39253

Hanya kode:

say+(A..D)[2-($`>>8-$_&257)%127]for/$/..8
Ton Hospel
sumber
3

JavaScript, 113 93 90 88 byte

Terima kasih banyak kepada @Neil karena membantu saya menghemat 20 byte!
-3 byte terima kasih kepada @Cyoce

n=>{r="";b=("0".repeat(15)+n.toString(2)).slice(-16);for(i=0;i<8;i++)r+="CBAD"[parseInt(b[i]+b[i+8],2)];return r}

n=>{r="";b=(65536+n).toString(2).slice(1);for(i=0;i<8;i++)r+="CBAD"[+b[i+8]+2*b[i]];return r}

n=>eval('r="";b=(65536+n).toString(2).slice(1);for(i=0;i<8;i++)r+="CBAD"[+b[i+8]+2*b[i]]')

n=>eval('r="";b=n.toString(2).padStart(16,0);for(i=0;i<8;i++)r+="CBAD"[+b[i+8]+2*b[i]]')

Sayangnya, JavaScript tidak memiliki fungsi seperti decbin, bindec, dan str_padbahwa PHP memiliki.

ericw31415
sumber
1
(65536+n).toString(2).slice(1)dan [+b[i+8]+2*b[i]]akan lebih pendek, misalnya.
Neil
padStart, jika itu diterima ke dalam versi ECMAscript di masa depan, akan menghasilkan penghematan yang lebih besar.
Neil
1
Alih-alih {…;return }, gunakaneval("…")
Cyoce
@Neil Tampaknya padStartsekarang ada dalam ECMAScript.
ericw31415
1

MATL, 16 byte

16&B8eXB'BADC'w)

Cobalah secara Online!

atau Verifikasi semua kasus uji

Penjelasan

        % Implicitly grab input
16&B    % Convert to binary string with at least 16 bits
8e      % Reshape the resulting string to have 8 rows and 2 columns
XB      % Convert each row from binary to decimal
'BADC'  % Push this string literal
w)      % Use the decimal numbers to index into this string (modular indexing)
        % Implicitly display the resulting string
Suever
sumber
1

Julia, 73 Bytes

Memberikan fungsi untuk mengambil N sebagai input dan mengembalikan jawaban sebagai string.

f(N)=(b=bin(N,16);join(["CBAD"[parse("0b$(b[i])$(b[i+8])")+1]for i=1:8]))

Cobalah

Bergantung jika array char dihitung sebagai string, seseorang dapat menghilangkan gabungan ( 67 Bytes )

f(N)=(b=bin(N,16);["CBAD"[parse("0b$(b[i])$(b[i+8])")+1]for i=1:8])

Cobalah

pasbi
sumber
0

R, 110 byte

Datang dengan solusi vektor dalam R. Ini mungkin harus dengan golfable dengan datang dengan konversi yang lebih cerdas ke konversi biner.

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
Billywob
sumber