作弊多项选择测试,第2部分


26

这是续集这种由挑战阿德南。如果您喜欢这个挑战,那么您也很可能会喜欢另一个挑战。看看这个!


多选题测试包含8个问题,每个问题有4个选择,可能会有答案:BCADBADA。转换为四个不同的数组,如果当前字母是答案,则为true和false,它将看起来像这样

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]

可以使用一些逻辑来压缩。的选择中的每一个ABCD可以由两个真/假值表示如下:

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]

也就是说,您的测试解决方案很简单:0011011110011010。通过将它们串联起来,我们得到二进制数 001101111001101014234十进制数。使用此十进制值作弊测试!

挑战

接受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 '16

原因是我首先受到阿德南(Adnan)的挑战的启发A=10, B=01,然后C=nor(A,B)是和D=and(A,B)。事后看来,反过来可能会更好,但是……现在太晚了……
Stewie Griffin

Answers:


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

05AB1E19 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

现在,我们只需要使用string对其进行索引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 2016年

@ ericw31415-即使没有明确地做,挑战实际上也是以相反的顺序描述这些按位操作(从“可以用一点逻辑来压缩。”开始
Arnauld

3
…… 有点逻辑……
尼尔(Neil)2016年

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操作码使用10位值(称为“ DECLE”)进行编码。实际函数的长度为24 DECLE,起始于$4809,结束于$4820

但是,CPU寄存器为16位宽,因此它将支持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

输出量

屏幕截图


(1)鉴于至少有一个编译器,多个仿真器和无版权的替换ROM文件是免费提供的,我认为它不违反任何PPCG提交规则。但是如果我错了,请告诉我。


1
我们以字节计分,因此将位数总数加起来,您的分数就是该值除以八的十进制(浮点数)结果。在这种情况下,为27.5个字节。
mbomb007 '09

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其中相等检查返回01。请查看下表,其中每一列对应一个输入,每一行对应一个操作,并且每个单元格都将显示该点的堆栈:

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

并且如果对任何人有用,如果将i1i2位重新转换为一个数字(即,当您想要映射时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];

没有按位运算符的版本70字节

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

变量在哪里$i定义?
ericw31415 2016年

@ ericw31415在第一使用可变的被初始化并且自动声明PHP这个变量与空引用
约克Hülsermann

那就是PHP(tm)
断定

3

Mathematica,75 73 68 66字节

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

感谢@MartinEnder节省了2个字节。


@MartinEnder #+##Infix工作,但是使用StringPart是不可避免的,因为的头"C"["B","A","D"][[#+##]]"C",不是ListStringJoin不起作用。
JungHwan Min

1
哦,我不知道,##2为整个列表。
马丁·恩德

3

Perl,42个字节

包括+1的 -n

在STDIN上输入:

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

只是代码:

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

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的缺乏像功能decbinbindec以及str_pad使PHP。


1
(65536+n).toString(2).slice(1)[+b[i+8]+2*b[i]]例如,它会更短。
尼尔

padStart,如果将来的ECMAscript版本接受它,则会节省更多的钱。
尼尔

1
取而代之的是{…;return }使用eval("…")
Cyoce '16

@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

朱莉娅73字节

给出一个函数f,以N作为输入并将答案作为字符串返回。

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

试试吧

根据一个char数组是否算作字符串,可以忽略联接(67个字节

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

试试吧


0

R,110字节

提出了R中的向量化解决方案。这应该可以通过将更聪明的int转换为二进制转换来解决。

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.