Answers:
lambda s:sum(map(ord,s))*3%61%37%9%7%2
一个好的ol'模链适用于输入字符串的ASCII值总和,从而提供了一种过拟合的解决方案。每个ASCII输入的总ASCII值是不同的,除了具有0 1
和1 0
给出相同结果的输入之外,这是可以得出的,因为所使用的所有逻辑门都是对称的。
该*3
分离出为输入,不同之处仅在比特否则相邻值,因为这些使它很难为MOD链分裂。mod链中数字的长度和大小会产生适当数量的熵,以适合18个二进制输出。
当然可以使用hash(s)
或来实现更短的解决方案id(s)
,但是我避免使用这些方法,因为它们与系统有关。
lambda s:'_AX0NRD'.find((s*9)[35])>>s.count('0')&1
稍微原则性的解决方案。对于输入中的每个零计数,每个逻辑门给出的结果都不相同,可以将其编码为1到6之间的一个三位数。通过取(s*9)[35]
,可以将每个可能的逻辑门映射到相应的数字,它们都是不同的。对于OR
,这结束时会读取其中一个位,因此该字符可能是0
或1
,但事实证明可以检查它是否为0
,并且无论如何a 1
都会正确给出1
结果。
*a%b%c%d%e%2
,没有什么真正的聪明。唯一有趣的是*
在mod前面放了一个;我没有尝试其他格式。
s=>341139>>parseInt(btoa(s),34)%86%23&1
parseInt()
无论我们使用哪个库,都无法使用解析空间。因此,我们改为注入输入字符串的base-64表示形式。这可能会生成=
填充字符(都不能解析parseInt()
),但是保证这些字符位于字符串的末尾并且可以安全地忽略。
我们解析为基数并应用模,然后是模,得出以下结果。这包括由于精度损失引起的不准确性。最终结果为,其真实索引的最高值为,从而导致19位查找位掩码。
input | to base-64 | parsed as base-34 | mod 86 | mod 23 | output
------------+----------------+-------------------+--------+--------+--------
"AND 0 0" | "QU5EIDAgMA==" | 1632500708709782 | 26 | 3 | 0
"AND 0 1" | "QU5EIDAgMQ==" | 1632500708709798 | 42 | 19 | 0
"AND 1 0" | "QU5EIDEgMA==" | 1632500708866998 | 34 | 11 | 0
"AND 1 1" | "QU5EIDEgMQ==" | 1632500708867014 | 50 | 4 | 1
"OR 0 0" | "T1IgMCAw" | 1525562056532 | 52 | 6 | 0
"OR 0 1" | "T1IgMCAx" | 1525562056533 | 53 | 7 | 1
"OR 1 0" | "T1IgMSAw" | 1525562075028 | 58 | 12 | 1
"OR 1 1" | "T1IgMSAx" | 1525562075029 | 59 | 13 | 1
"XOR 0 0" | "WE9SIDAgMA==" | 1968461683492630 | 48 | 2 | 0
"XOR 0 1" | "WE9SIDAgMQ==" | 1968461683492646 | 64 | 18 | 1
"XOR 1 0" | "WE9SIDEgMA==" | 1968461683649846 | 56 | 10 | 1
"XOR 1 1" | "WE9SIDEgMQ==" | 1968461683649862 | 72 | 3 | 0
"NAND 0 0" | "TkFORCAwIDA=" | 61109384461626344 | 62 | 16 | 1
"NAND 0 1" | "TkFORCAwIDE=" | 61109384461626350 | 70 | 1 | 1
"NAND 1 0" | "TkFORCAxIDA=" | 61109384461665650 | 64 | 18 | 1
"NAND 1 1" | "TkFORCAxIDE=" | 61109384461665656 | 72 | 3 | 0
"NOR 0 0" | "Tk9SIDAgMA==" | 1797025468622614 | 76 | 7 | 1
"NOR 0 1" | "Tk9SIDAgMQ==" | 1797025468622630 | 6 | 6 | 0
"NOR 1 0" | "Tk9SIDEgMA==" | 1797025468779830 | 84 | 15 | 0
"NOR 1 1" | "Tk9SIDEgMQ==" | 1797025468779846 | 14 | 14 | 0
"XNOR 0 0" | "WE5PUiAwIDA=" | 66920415258533864 | 0 | 0 | 1
"XNOR 0 1" | "WE5PUiAwIDE=" | 66920415258533870 | 8 | 8 | 0
"XNOR 1 0" | "WE5PUiAxIDA=" | 66920415258573170 | 2 | 2 | 0
"XNOR 1 1" | "WE5PUiAxIDE=" | 66920415258573176 | 10 | 10 | 1
NOR
?
NOR
。现在已修复。
ÇO₁*Ƶï%É
@mazzy的替代计算端口在其Powershell答案的注释中(*256%339%2
而不是*108%143%2
)提到。
说明:
Ç # Convert each character in the (implicit) input to a unicode value
O # Sum them together
₁* # Multiply it by 256
Ƶï% # Then take modulo-339
É # And finally check if it's odd (short for %2), and output implicitly
看到这个05AB1E尖矿(部分如何压缩大整数?)理解为什么Ƶï
是339
。
§01÷⌕⪪”&⌈4Y⍘LH⦄vü|⦃³U}×▷” S∨⁺NN⁴
在线尝试!链接是详细版本的代码。说明:压缩的字符串扩展为受支持的操作的列表,以便根据输入将给定操作的索引右移,由此提取的位成为结果。
XOR 001
AND 010
OR 011
NOR 100
NAND 101
XNOR 110
inputs 011
010
74字节版本适用于所有16个二进制操作,我将其任意命名为:零和少第二个优先级XOR或NOR XNOR NFIRST NGREATER NSECOND NLESS NAND NZERO。
§10÷÷⌕⪪”&↖VρS´↥cj/v⊗J[Rf↓⪫?9KO↘Y⦄;↙W´C>η=⁴⌕✳AKXIB|⊖\`⊖:B�J/≧vF@$h⧴” S∨N²∨N⁴
在线尝试!链接是详细版本的代码。
2|7|9|37|61|3*1#.3&u:
XNOR=:=/
NAND=:*:/
NOR=:+:/
".
使用eval ".
和标准库(已经包含正确的,,)AND
,有些有趣。OR
XOR
({7 6 9 8 14 1 b./)~1 i.~' XXNNA'E.~_2&}.
更多J风格的方法。
这里隐藏了一个非常通用的J技巧。通常,所需函数具有以下结构:“在一个输入上执行F,在另一个输入上执行H,然后在两个结果上执行G”。然后它应该像(F x) G H y
。以默认形式,它等效于(G~F)~H
:
x ((G~F)~H) y
x (G~F)~ H y
(H y) (G~F) x
(H y) G~ F x
(F x) G H y
如果G
是非对称原语,只需交换目标函数的左右参数,我们就可以保存一个字节。
现在继续上面的答案:
({7 6 9 8 14 1 b./)~1 i.~' XXNNA'E.~_2&}.
1 i.~' XXNNA'E.~_2&}. Processing right argument (X): the operation's name
_2&}. Drop two chars from the end
1 i.~' XXNNA'E.~ Find the first match's index as substring
Resulting mapping is [OR, XOR, XNOR, NOR, NAND, AND]
7 6 9 8 14 1 b./ Processing left argument (Y): all logic operations on the bits
7 6 9 8 14 1 b. Given two bits as left and right args, compute the six logic functions
/ Reduce by above
X{Y Operation on both: Take the value at the index
受xnor启发,但序列*108%143%2
短于原始*3%61%37%9%7%2
$args|% t*y|%{$n+=108*$_};$n%143%2
测试脚本:
$f = {
$args|% t*y|%{$n+=108*$_};$n%143%2
#$args|% t*y|%{$n+=3*$_};$n%61%37%9%7%2 # sequence by xnor
}
@(
,("AND 0 0", 0)
,("AND 0 1", 0)
,("AND 1 0", 0)
,("AND 1 1", 1)
,("XOR 0 0", 0)
,("XOR 0 1", 1)
,("XOR 1 0", 1)
,("XOR 1 1", 0)
,("OR 0 0", 0)
,("OR 0 1", 1)
,("OR 1 0", 1)
,("OR 1 1", 1)
,("NAND 0 0", 1)
,("NAND 0 1", 1)
,("NAND 1 0", 1)
,("NAND 1 1", 0)
,("NOR 0 0", 1)
,("NOR 0 1", 0)
,("NOR 1 0", 0)
,("NOR 1 1", 0)
,("XNOR 0 0", 1)
,("XNOR 0 1", 0)
,("XNOR 1 0", 0)
,("XNOR 1 1", 1)
) | % {
$s,$e = $_
$r = &$f $s
"$($r-eq$e): $s=$r"
}
输出:
True: AND 0 0=0
True: AND 0 1=0
True: AND 1 0=0
True: AND 1 1=1
True: XOR 0 0=0
True: XOR 0 1=1
True: XOR 1 0=1
True: XOR 1 1=0
True: OR 0 0=0
True: OR 0 1=1
True: OR 1 0=1
True: OR 1 1=1
True: NAND 0 0=1
True: NAND 0 1=1
True: NAND 1 0=1
True: NAND 1 1=0
True: NOR 0 0=1
True: NOR 0 1=0
True: NOR 1 0=0
True: NOR 1 1=0
True: XNOR 0 0=1
True: XNOR 0 1=0
True: XNOR 1 0=0
True: XNOR 1 1=1
xnor
。我认为这*108%143
更有吸引力:)另外,还有一对不错的一对*256%339
。这对知道如何使用位和字节的语言来说甚至更好。
x=>([a,c,d]=x.split` `,g=[c&d,c^d,c|d]["OR".search(a.slice(1+(b=/N[^D]/.test(a))))+1],b?1-g:g)
链接到代码和所有24个案例。
+9表示映射XNOR实例。
console.log(f("AND", 1, 1));
只是在同意后发布了xnor出色的Python 2答案的一部分,请对此答案进行投票而不是对此进行投票。
x=>Buffer(x).reduce((a,b)=>a+b)*3%61%37%9%7%2