Gian lận một bài kiểm tra trắc nghiệm, phần 2


26

Đây là phần tiếp theo cho thử thách này của Adnan . Nếu bạn thích thử thách này, rất có thể bạn cũng sẽ thích thử thách khác. Kiểm tra nó ra!


Một bài kiểm tra trắc nghiệm với 8 câu hỏi, mỗi câu hỏi có 4 lựa chọn có thể có câu trả lời : BCADBADA. Chuyển đổi thành bốn mảng khác nhau, với đúng và sai nếu chữ cái hiện tại là câu trả lời, nó sẽ trông như thế này

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]

Điều này có thể được nén bằng cách sử dụng một chút logic. Mỗi phòng trong số lựa chọn A, B, CDcó thể được biểu diễn bởi hai / giá trị đúng sai hiển thị dưới đây:

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

Sử dụng logic này, chúng ta có thể nén bốn vectơ ở trên thành hai:

 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]

Đó là, các giải pháp cho thử nghiệm của bạn chỉ đơn giản là: 00110111, 10011010. Bằng cách ghép các số này, chúng ta có được số nhị phân 0011011110011010hoặc 14234số thập phân. Sử dụng giá trị thập phân này để gian lận trong bài kiểm tra của bạn!

Thử thách

Lấy một số Ntrong phạm vi (bao gồm) [0, 65535]và xuất ra một chuỗi với câu trả lời cho bài kiểm tra trắc nghiệm.

Các trường hợp thử nghiệm:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

Đầu ra có thể bằng chữ in hoa hoặc in thường, nhưng bạn không thể sử dụng các ký hiệu khác.


Là đầu ra phải là chuỗi như được hiển thị, hoặc các chữ cái có thể nằm trên các dòng riêng biệt, trong một danh sách, vv?
xnor

@xnor Tùy chọn :-)
Stewie Griffin

Tại sao không rõ ràng A = 00, B = 01, C = 10, D = 11?
dùng253751

Lý do là lần đầu tiên tôi đưa ra A=10, B=01, sau đó C=nor(A,B), và D=and(A,B), lấy cảm hứng từ thử thách của Adnan. Nhìn nhận lại có lẽ tốt hơn là làm theo cách khác, nhưng cũng ... quá muộn rồi ...
Stewie Griffin

Câu trả lời:


3

Thạch , 14 byte

d⁹+⁹BZḄḊị“BADC

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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".

10

05AB1E , 19 18 16 byte

Mã số:

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!

Giải trình:

Đầu tiên, chúng ta thêm 65536vào số ( žHlà hằng số được xác định 65536), cũng là 10000000000000000số nhị phân. Điều này là để đệm số với số không. Hãy lấy số 14234làm ví dụ. 14234 + 65536bằng 79770. Mà trong nhị phân là:

10011011110011010

Chúng tôi xóa ký tự đầu tiên, dẫn đến:

0011011110011010

Chúng tôi chia chuỗi thành hai phần bằng cách sử dụng :

00110111, 10011010

Sau đó, chúng tôi nén mảng bằng ø:

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

Chuyển đổi chúng trở lại thành số thập phân (sử dụng C) dẫn đến:

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

Bây giờ, chúng ta chỉ cần lập chỉ mục nó với chuỗi cbad. Phiên bản nén cho chuỗi này là ’c‰±’, cũng có thể được thử nghiệm ở đây . Cuối cùng, chúng ta có được các ký tự ở chỉ mục của mảng trên. Đối với ví dụ trên, kết quả này là:

1, 0, 2, 3, 1, 2, 3, 2
b  c  a  d  b  a  d  a

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

Phiên bản không đệ quy (55 byte)

Sử dụng một biểu thức chính quy, chúng ta có thể làm:

n=>"76543210".replace(/./g,i=>"CBAD"[n>>i&1|n>>+i+7&2])

Làm thế nào bạn nghĩ đến việc thực hiện các hoạt động bitwise?
ericw31415

@ ericw31415 - Ngay cả khi nó không hoạt động quá rõ ràng, thử thách thực sự là mô tả các hoạt động bitwise này theo thứ tự ngược lại (bắt đầu từ "Điều này có thể được nén bằng một chút logic." )
Arnauld

3
... một chút logic ...
Neil

4

Python 2, 53 byte

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

Kiểm tra nó trên Ideone .


Tôi đã cố gắng để sử dụng (n&257)%127nhưng nó lâu hơn. Quá xấu 127 là nguyên tố. Có lẽ bạn có thể nghĩ ra một cách để tối ưu hóa nó.
xnor

4

Lắp ráp CP-1610 , 24 DECLE (30 byte)

Mã này được dự định để chạy trên Intellivision . (1)

Mã op CP-1610 được mã hóa với giá trị 10 bit, được gọi là 'DECLE'. Hàm thực tế dài 24 DECLE, bắt đầu từ $4809và kết thúc tại $4820.

Các thanh ghi CPU là tuy nhiên rộng 16-bit, vì vậy nó sẽ hỗ trợ bất kỳ giá trị đầu vào trong 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

Đầu ra

ảnh chụp màn hình


(1) Được cấp ít nhất một trình biên dịch, một số trình giả lậpcác tệp ROM thay thế không có bản quyền có sẵn miễn phí, tôi nghĩ rằng nó không vi phạm bất kỳ quy tắc đệ trình PPCG nào. Nhưng xin vui lòng cho tôi biết nếu tôi sai.


1
Chúng tôi ghi điểm bằng byte, do đó cộng tổng số bit và điểm của bạn là kết quả thập phân (float) để chia giá trị đó cho tám. Trong trường hợp này, 27,5 byte.
mbomb007

3

CJam , 22 byte

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

Hãy thử trực tuyến!

Giải trình

Được hỗ trợ bởi ma thuật ...

Việc ánh xạ các cặp bit thành các chữ cái trong thử thách này là một chút tùy ý. Nếu chúng ta đại diện ABCDbởi 0, 1, 2, 3(vì vậy chúng ta chỉ có thể thêm chúng vào ký tự A) thì chúng ta muốn ánh xạ sau:

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

Ánh xạ này có thể được tính toán với một công thức nhỏ kỳ diệu : ((i1 == i2) + 1) ^ i1, trong đó kiểm tra đẳng thức trả về 0hoặc 1. Kiểm tra bảng sau, trong đó mỗi cột tương ứng với một đầu vào, mỗi hàng tương ứng với một thao tác và mỗi ô sẽ hiển thị ngăn xếp tại điểm đó:

[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]

Với ý nghĩ đó ở đây là toàn bộ mã nguồn:

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'
}

Một giải pháp thay thế có cùng số byte được cho là ít ma thuật hơn:

ri2bG0e[8/z2fb"CBAD"f=

Và trong trường hợp nó hữu ích với bất kỳ ai, nếu bạn biến các bit i1i2bit trở lại thành một số duy nhất (nghĩa là khi bạn muốn ánh xạ 0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3), điều này có thể được tính toán dễ dàng hơn nữa (~n - 1) & 3hoặc (~n - 1) % 4nếu ngôn ngữ của bạn được điều chỉnh theo giá trị âm. Tôi nghĩ rằng điều này có thể được viết chính xác như 3&~-~ntrong nhiều ngôn ngữ. Trong CJam, điều này hóa ra là một byte dài hơn, do chuyển đổi bổ sung trở lại từ cơ sở 2.


3

PHP, 57 byte

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

Phiên bản không có toán tử Bitwise 70 Byte

for(;$i<8;)echo CABD[($s=sprintf("%016b",$argv[1]))[$i]+$s[8+$i++]*2];

Biến $iđược định nghĩa ở đâu?
ericw31415

@ ericw31415 Trong lần đầu tiên sử dụng một biến được khởi tạo và tự động khai báo PHP biến này với tham chiếu null
Jörg Hülsermann

Đó là PHP (tm)
diễn ra vào

3

Toán học, 75 73 68 66 byte

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

Cảm ơn @MartinEnder đã lưu 2 byte.


@MartinEnder #+##Infixlàm việc, nhưng sử dụng StringPartlà không thể tránh khỏi vì người đứng đầu "C"["B","A","D"][[#+##]]"C", không phải List; StringJoinkhông hoạt động.
JungHwan Min

1
Ồ, tôi đã không nhận ra điều đó ##2là toàn bộ danh sách.
Martin Ender

3

Perl, 42 byte

Bao gồm +1 cho -n

Cung cấp đầu vào trên STDIN:

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

Chỉ cần mã:

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

3

JavaScript, 113 93 90 88 byte

Cảm ơn rất nhiều đến @Neil vì đã giúp tôi tiết kiệm 20 byte!
-3 byte nhờ @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]]')

Đáng buồn thay, JavaScript thiếu các chức năng như decbin, bindecstr_padrằng PHP có.


1
(65536+n).toString(2).slice(1)[+b[i+8]+2*b[i]]sẽ ngắn hơn, ví dụ.
Neil

padStart, nếu nó được chấp nhận vào phiên bản tương lai của ECMAscript, sẽ dẫn đến tiết kiệm lớn hơn.
Neil

1
Thay vì {…;return }sử dụngeval("…")
Cyoce

@Neil Có vẻ như padStartbây giờ tồn tại trong ECMAScript.
ericw31415

1

MATL, 16 byte

16&B8eXB'BADC'w)

Hãy thử trực tuyến!

hoặc Xác minh tất cả các trường hợp kiểm tra

Giải trình

        % 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

1

Julia, 73 byte

Cung cấp một hàm f lấy N làm đầu vào và trả về câu trả lời dưới dạng chuỗi.

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

Thử nó

Tùy thuộc vào nếu một mảng char được tính là chuỗi, người ta có thể bỏ qua phép nối ( 67 byte )

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

Thử nó


0

R, 110 byte

Đến với một giải pháp véc tơ trong R. Điều này có lẽ nên bằng cách chơi golf bằng cách đưa ra một chuyển đổi thông minh hơn int sang chuyển đổi nhị phân.

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.