การโกงการทดสอบแบบเลือกตอบส่วนที่ 2


26

นี้เป็นผลสืบเนื่องไปนี้ความท้าทายโดยAdnan ถ้าคุณชอบความท้าทายนี้คุณก็มีโอกาสที่จะชอบสิ่งนี้เช่นกัน ลองดูสิ!


การทดสอบหลายทางเลือกที่มี 8 คำถามแต่ละคนมี 4 BCADBADAตัวเลือกอาจมีคำตอบ: แปลงเป็นสี่อาร์เรย์ที่ต่างกันด้วยจริงและเท็จถ้าตัวอักษรปัจจุบันคือคำตอบมันจะมีลักษณะเช่นนี้

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]

สิ่งนี้สามารถบีบอัดโดยใช้ตรรกะเล็กน้อย แต่ละทางเลือกA, B, CและDสามารถแสดงโดยสองค่าจริง / เท็จแสดงด้านล่าง:

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

การใช้ตรรกะนี้เราสามารถบีบเวกเตอร์สี่ตัวข้างบนเป็นสอง:

 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]

00110111นั่นคือวิธีการทดสอบของคุณเป็นเพียง: 10011010, การต่อสิ่งเหล่านี้เข้าด้วยกันเราจะได้เลขฐานสอง 0011011110011010หรือเป็น14234ทศนิยม ใช้ค่าทศนิยมนี้เพื่อโกงการทดสอบของคุณ!

ท้าทาย

ใช้ตัวเลขNในช่วง (รวม) [0, 65535]และส่งออกสตริงพร้อมคำตอบสำหรับการทดสอบแบบปรนัย

กรณีทดสอบ:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

ผลลัพธ์อาจเป็นตัวอักษรตัวพิมพ์ใหญ่หรือเล็ก แต่คุณไม่สามารถใช้สัญลักษณ์อื่นได้


เอาต์พุตต้องเป็นสตริงตามที่แสดงหรือตัวอักษรสามารถอยู่ในบรรทัดแยกกันในรายการ ฯลฯ ได้หรือไม่?
xnor

@xnor ไม่บังคับ :-)
Stewie Griffin

ทำไมไม่ชัดเจน A = 00, B = 01, C = 10, D = 11
user253751

เหตุผลที่ฉันทำครั้งแรกA=10, B=01แล้วC=nor(A,B)และD=and(A,B)แรงบันดาลใจจากความท้าทายของ Adnan ย้อนหลังก็อาจจะได้รับดีกว่าที่จะทำวิธีอื่น ๆ แต่ดี ... สายเกินไปในขณะนี้ ...
สตีวีกริฟฟิ

คำตอบ:


3

เยลลี่ขนาด 14 ไบต์

d⁹+⁹BZḄḊị“BADC

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทุก

มันทำงานอย่างไร

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 ไบต์

รหัส:

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

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!

คำอธิบาย:

ก่อนอื่นเราเพิ่ม65536หมายเลข ( žHเป็นค่าคงที่ที่กำหนด65536) ซึ่งอยู่10000000000000000ในเลขฐานสอง นี่คือการปัดตัวเลขด้วยเลขศูนย์ ลองดูตัวเลข14234เป็นตัวอย่าง จะมีค่าเท่ากับ14234 + 65536 79770ซึ่งในไบนารีคือ:

10011011110011010

เราลบอักขระตัวแรกออกเป็นผลให้:

0011011110011010

เราแบ่งสตริงออกเป็นสองชิ้นโดยใช้:

00110111, 10011010

หลังจากนั้นเราจะซิปอาร์เรย์ด้วยø:

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

การแปลงกลับเป็นทศนิยม (โดยใช้C) ผลลัพธ์เป็น:

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

cbadตอนนี้เราจะต้องดัชนีกับสตริง รุ่นบีบอัดสตริงนี้อยู่’c‰±’ซึ่งยังสามารถทดสอบได้ที่นี่ ในที่สุดเราก็ได้ตัวละครที่ดัชนีของอาร์เรย์ข้างต้น สำหรับตัวอย่างข้างต้นผลลัพธ์นี้ใน:

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

6

JavaScript (ES6), 55 48 ไบต์

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

รุ่นที่ไม่ใช่แบบเรียกซ้ำ (55 ไบต์)

ด้วยการใช้นิพจน์ทั่วไปเราสามารถทำ:

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

คุณคิดอย่างไรกับการทำงานระดับบิต
ericw31415

@ ericw31415 - แม้ว่ามันจะไม่ได้ทำอย่างชัดเจนความท้าทายคือการอธิบายการดำเนินงานระดับบิตเหล่านี้ในลำดับที่กลับกัน (เริ่มต้นที่"นี้สามารถบีบอัดโดยใช้ตรรกะบิต" )
Arnauld

3
... ตรรกะนิดหน่อย ...
Neil

4

Python 2, 53 ไบต์

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

ทดสอบบนIdeone


ฉันพยายามใช้(n&257)%127แต่นานกว่านี้ แย่เกินไปที่ 127 คือนายก บางทีคุณอาจคิดวิธีเพิ่มประสิทธิภาพ
xnor

4

ชุดประกอบCP-1610 , 24 DECLE (30 ไบต์)

รหัสนี้มีวัตถุประสงค์ที่จะทำงานบนIntellivision (1)

CP-1610 opcode ถูกเข้ารหัสด้วยค่า 10 บิตหรือที่เรียกว่า 'DECLE' ฟังก์ชั่นที่เกิดขึ้นจริงคือ 24 DECLEs ยาวเริ่มต้นที่และสิ้นสุดที่$4809$4820

ซีพียูลงทะเบียนมี แต่ 16 บิตกว้างจึงจะให้การสนับสนุนค่าป้อนข้อมูลใด ๆ ใน..0x00000xFFFF

                            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

เอาท์พุต

ภาพหน้าจอ


(1) ได้รับอย่างน้อยหนึ่งคอมไพเลอร์อีมูเลเตอร์หลายตัวและไฟล์ ROM ทดแทนที่ไม่มีลิขสิทธิ์มีให้ใช้งานฟรีฉันคิดว่ามันไม่ได้ละเมิดกฎการส่ง PPCG ใด ๆ แต่โปรดแจ้งให้เราทราบหากฉันผิด


1
เราให้คะแนนเป็นไบต์ดังนั้นเพิ่มจำนวนบิตทั้งหมดและคะแนนของคุณคือผลลัพธ์ทศนิยม (ลอย) จากการหารค่านั้นแปด ในกรณีนี้ 27.5 ไบต์
mbomb007

3

CJam , 22 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ขับเคลื่อนด้วยเวทมนตร์ ...

การแมปของคู่บิตกับตัวอักษรในความท้าทายนี้เป็นบิตโดยพลการ หากเราเป็นตัวแทนABCDโดย0, 1, 2, 3(เพื่อให้เราสามารถเพิ่มพวกเขาไปยังตัวละครA) แล้วเราต้องการการทำแผนที่ดังต่อไปนี้:

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

แมปนี้สามารถคำนวณด้วยสูตรเล็ก ๆ น้อย ๆ ที่มีมนต์ขลัง: ((i1 == i2) + 1) ^ i1ที่ผลตอบแทนที่เท่าเทียมกันตรวจสอบหรือ0 1ตรวจสอบตารางต่อไปนี้โดยที่แต่ละคอลัมน์สอดคล้องกับหนึ่งอินพุตแต่ละแถวสอดคล้องกับการดำเนินการเดียวและแต่ละเซลล์จะแสดงสแต็ก ณ จุดนั้น:

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

โดยที่ในใจนี่คือรายละเอียดแบบเต็มของรหัสที่มา:

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

โซลูชันทางเลือกที่มีจำนวนไบต์เดียวกันซึ่งมีเวทย์มนตร์น้อย:

ri2bG0e[8/z2fb"CBAD"f=

และในกรณีที่มันมีประโยชน์กับทุกคนถ้าคุณเปลี่ยนi1และi2บิตกลับเป็นตัวเลขเดียว (เช่นเมื่อคุณต้องการแมป0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3) สิ่งนี้สามารถคำนวณได้ง่ายยิ่งขึ้น(~n - 1) & 3หรือ(~n - 1) % 4ถ้าภาษาของคุณได้รับโมดูโลในค่าลบที่ถูกต้อง ฉันคิดว่าสิ่งนี้สามารถเขียนได้กระชับเหมือน3&~-~nในหลายภาษา ใน CJam สิ่งนี้กลายเป็นไบต์นานกว่าเนื่องจากการแปลงเพิ่มเติมจากฐาน 2


3

PHP, 57 ไบต์

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

รุ่นที่ไม่มีตัวดำเนินการ Bitwise 70 ไบต์

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

ตัวแปร$iกำหนดไว้ที่ไหน?
ericw31415

@ ericw31415 ในการใช้งานครั้งแรกของตัวแปรจะเริ่มต้นและประกาศ PHP ตัวแปรนี้โดยอัตโนมัติด้วยการอ้างอิงที่เป็นโมฆะ
JörgHülsermann

นั่นคือ PHP (tm)
tomsmeding

3

Mathematica, 75 73 68 66 ไบต์

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

ขอบคุณ @MartinEnder สำหรับการบันทึก 2 ไบต์


@MartinEnder #+##และInfixทำงาน แต่ใช้StringPartหลีกเลี่ยงไม่ได้เพราะหัวหน้า"C"["B","A","D"][[#+##]]คือ"C"ไม่List; StringJoinไม่ทำงาน
JungHwan Min

1
โอ้ฉันไม่ได้ตระหนัก#และ#2เป็นรายการทั้งหมด
Martin Ender


3

JavaScript, 113 93 90 88 ไบต์

ขอขอบคุณ @Neil ที่ช่วยฉันประหยัด 20 ไบต์!
-3 ไบต์ขอบคุณ @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]]')

เศร้า, JavaScript ขาดฟังก์ชั่นเช่นdecbin, bindecและstr_padว่า PHP มี


1
(65536+n).toString(2).slice(1)และ[+b[i+8]+2*b[i]]จะสั้นลงเช่น
Neil

padStartหากได้รับการยอมรับให้เป็นเวอร์ชัน ECMAscript ในอนาคตจะส่งผลให้ประหยัดได้มากขึ้น
Neil

1
แทนที่จะ{…;return }ใช้ให้ใช้eval("…")
Cyoce

@Neil ดูเหมือนว่าpadStartตอนนี้มีอยู่ใน ECMAScript
ericw31415

1

MATL, 16 ไบต์

16&B8eXB'BADC'w)

ลองออนไลน์!

หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

        % 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 ไบต์

ให้ฟังก์ชันที่รับ N เป็นอินพุตและส่งคืนคำตอบเป็นสตริง

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

ลองมัน

ขึ้นอยู่กับว่าอาร์เรย์ถ่านนับเป็นสตริงเราสามารถละเว้นการรวม ( 67 ไบต์ )

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

ลองมัน


0

R, 110 ไบต์

มากับวิธีแก้ปัญหาแบบเวกเตอร์ในอาร์นี่น่าจะเป็นสิ่งที่เกิดขึ้นได้โดยการแปลงอย่างชาญฉลาดด้วยการแปลง int เป็นไบนารี่

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.