编写自我验证代码


28

编写将字符串作为输入并根据字符串是否遵循以下规则输出真值或伪值的代码:

如果将每个字符堆叠在一起,将其转换为二进制并对每一列求和,则所有和应相同。您可以假设输入字符串仅包含可打印的ASCII字符(代码点32-126)。

举个例子:

输入O5vy_+~应返回真实值,因为其二进制表示为:

1001111  | O
0110101  | 5
1110110  | v
1111001  | y
1011111  | _
0101011  | +
1111110  | ~
-------
5555555  <- Sum of bits in each column. Should give a truthy value.

输入PPCG应返回falsey值,因为其二进制表示为:

1010000  | P
1010000  | P
1000011  | C
1000111  | G
-------
4020122  <- Should give a falsey value

不同之处在于:如果将代码用作函数/程序的输入,则代码应返回真实值。也就是说,代码必须遵守与上述相同的规则(您的代码可以包含非ASCII 32-126的字符)。

您的程序/功能仅需要处理可打印的ASCII作为输入。如果您的代码包含其他内容(8位,16位编码,Unicode,自定义字符集(或其他)),则其二进制表示应遵循相同的规则,但是您的代码无需处理它作为输入。

这是,因此适用标准规则。


输入字符串将持续多长时间?我们可以假设总和始终为7位数字吗?
Okx

另外,如果我们的程序使用ASCII字符以外的字符,会发生什么情况?
Okx

我猜想“然后,它的二进制表示应该遵循相同的规则”应该明确排除“仅需要处理可打印的ASCII作为输入”子句(否则,可以只用一个字节编写映射到不可打印的ASCII的代码) 。
乔纳森·艾伦,

@Okx,您可以假定输入字符串小于1kB。输入将仅是可以使用7位表示的可打印ASCII,因此可以:始终有7个整数(不一定是数字)总和。
Stewie Griffin

2
@StewieGriffin这不是一个很好的说明。如果我有一个非ASCII答案,而您尝试将程序输入程序中,但由于它仅支持ASCII而无法正常工作,会发生什么?
Okx

Answers:


10

的JavaScript(ES6),123个 122 120 110字节

S=>[...S].map(S=>R.map((_GSSSSSSVWWW,V)=>R[V]-=S.charCodeAt()>>V&1),R=[_=3^3,_,_,_,_,_,_])&&!R.some(S=>S^R[_])

以下是带有位总和的十六进制转储。

Addr. | Dump                                            | #6 #5 #4 #3 #2 #1 #0
------+-------------------------------------------------+---------------------
00-0F | 53 3D 3E 5B 2E 2E 2E 53 5D 2E 6D 61 70 28 53 3D |  8 11  9 11  9  9  9
10-1F | 3E 52 2E 6D 61 70 28 28 5F 47 53 53 53 53 53 53 | 20 18 19 17 14 20 19
20-2F | 56 57 57 57 2C 56 29 3D 3E 52 5B 56 5D 2D 3D 53 | 30 24 32 25 26 30 29
30-3F | 2E 63 68 61 72 43 6F 64 65 41 74 28 29 3E 3E 56 | 41 37 37 32 34 38 36
40-4F | 26 31 29 2C 52 3D 5B 5F 3D 33 5E 33 2C 5F 2C 5F | 47 47 48 43 44 47 46
50-5F | 2C 5F 2C 5F 2C 5F 2C 5F 5D 29 26 26 21 52 2E 73 | 54 57 55 54 56 56 54
60-6D | 6F 6D 65 28 53 3D 3E 53 5E 52 5B 5F 5D 29       | 64 64 64 64 64 64 64

演示版


10

MATL10 9字节

BXs&=?I&]

输入是用单引号引起来的字符串(如果输入包含单qoutes,请通过重复转义)。

输出是 3真实的,没有东西(空输出)是虚假的。

在线尝试!

二进制代码如下:

B     1 0 0 0 0 1 0
X     1 0 1 1 0 0 0
s     1 1 1 0 0 1 1
&     0 1 0 0 1 1 0
=     0 1 1 1 1 0 1
?     0 1 1 1 1 1 1
I     1 0 0 1 0 0 1
&     0 1 0 0 1 1 0
]     1 0 1 1 1 0 1

Sum   5 5 5 5 5 5 5

说明

B      % Input string (implicit). Convert each char to its ASCII code, and 
       % then to binary. This gives a binary matrix, with each char of the 
       % input corresponding to a row
Xs     % Sum of each column. Gives a row vector
&=     % All pairwise equality comparisons
?      % If all are true
  I    %    Push 3
  &    %    Specify that the next function, namely implicit display, will 
       %    take one input, instead of the whole stack which is the default
]      % End
       % Display (implicit)

8

果冻11 10 字节

OBUSE&889.

在线尝试!或者查看测试和自我输入(该代码都是可打印的ASCII,在Jelly的代码页中具有相同的值,如下所示)。

Char -> Hex -> Decimal -> Binary
O       0x4F   79         0b1001111
B       0x42   66         0b1000010
U       0x55   85         0b1010101
S       0x53   83         0b1010011
E       0x45   69         0b1000101
&       0x26   38         0b0100110
8       0x38   56         0b0111000
8       0x38   56         0b0111000
9       0x39   57         0b0111001
.       0x2E   46         0b0101110
                            -------
                            5555555

怎么样?

OBUSE&889. - Main link: string
O          - cast to ordinals
 B         - convert to binary
  U        - upend (reverses each to prepare for vectorised sum)
   S       - sum (vectorises)
    E      - all equal? (yields 1 if all bit-sums are equal and 0 if not)
      889. - 889.0
     &     - bitwise and (1 & 889.0 is 1; and 0 & 889.0 is 0)

您的代码看起来很像丹尼斯的代码。
Erik the Outgolfer '17

是的,我看到了。
乔纳森·艾伦,

6

果冻11 10字节

OBUSE$*8?8

不使用禁止操作或评论。

在线尝试!

二进制分解

O  1 0 0 1 1 1 1
B  1 0 0 0 0 1 0
U  1 0 1 0 1 0 1
S  1 0 1 0 0 1 1
E  1 0 0 0 1 0 1
$  0 1 0 0 1 0 0
*  0 1 0 1 0 1 0
8  0 1 1 1 0 0 0
?  0 1 1 1 1 1 1
8  0 1 1 1 0 0 0
————————————————
∑  5 5 5 5 5 5 5

怎么运行的

OBUSE$*8?8  Main link. Argument: s (string)

O           Ordinal; map all characters in s to their code points.
 B          Binary; convert each code point to base 2.
  U         Upend; reverse each binary array to right-align the digits.
       8?   If 8 is non-zero (it is):
   SE$          Sum the corresponding digits and test the the sums for equality.
            Else (never happens):
      *  8      Raise all binary digits to the eighth power.

Jelly TC是否仅使用可打印的ASCII?
帕维尔

我不这么认为。
丹尼斯

1
我喜欢这段代码开头,OBUSE因为它听起来像ABUSE
硕果累累

4

Mathematica,88个字节

Total@IntegerDigits[ToCharacterCode@#,2,7]~MatchQ~{"?";a_ ..}&

在引号之间包含许多不可打印的字符。每位具有49。

这是十六进制转储:

0000-0010:  54 6f 74 61-6c 40 49 6e-74 65 67 65-72 44 69 67  Total@In tegerDig
0000-0020:  69 74 73 5b-54 6f 43 68-61 72 61 63-74 65 72 43  its[ToCh aracterC
0000-0030:  6f 64 65 40-23 2c 32 2c-37 5d 7e 4d-61 74 63 68  ode@#,2, 7]~Match
0000-0040:  51 7e 7b 22-3f 1f 1f 1f-1f 1f 1f 1f-1f 1f 1f 1f  Q~{"?... ........
0000-0050:  1f 1f 1f 1f-1f 1a 1a 1a-1a 18 18 18-18 18 10 22  ........ ......."
0000-0058:  3b 61 5f 20-2e 2e 7d 26                          ;a_...}&

4

八度,53 52字节

进行完整的重写有助于我将代码打成5字节,但是我不得不添加更多无操作,从而使其净节省只有1个字节。

@(_)~diff(sum(de2bi(+_)))%RRPPPVVVW?????????________

我无法添加TIO链接,因为没有一个在线解释器实现了所需的通信工具箱de2bi。更改为dec2bin相反,将将花费4个字节(工作代码为2个字节,两个无操作)。

我发现没有办法避免27次无操作中的任何一个。所有函数名称和括号都在64以下或96之间,这意味着所有“必需”字符在第6个位置(从右侧2 ^ 5)都具有1。我只有23个无操作的解决方案,但是代码本身更长。实际代码为25个字节,并且在计算二进制等价位数时具有以下列总和:

15   22    6   15   10    9   13

右边(2 ^ 5)的第6位只有22位,右边(2 ^ 3)的第4位只有6位。这意味着,我们必须至少添加16个字节,才能使6个字节最多达到22个字节。现在,注释字符%在第6个位置添加一个位,将其增加到23个。所有可打印的ASCII字符至少需要两个字节之一最高位1。因此,添加17个字节将使我们在两个“顶部”(2 ^ 6和2 ^ 5)中的每个位置至少具有27位。现在,我们在前两个位置有27位,在其余两个位置有22位。为了达到平衡,我们必须添加10个字节,以使每个位置的偶数位达到32位。

新代码的说明(52个字节):

@(_)~diff(sum(de2bi(+_)))
@(_)      % An anonymous function that take a variable _ as input
          % We use underscore, instead of a character, since it has the
          % most suitable binary represetation
              de2bi(+_)    % Convert the input string to a binary matrix
          sum(de2bi(+_))   % Take the sum of each column
     diff(sum(de2bi(+_)))  % And calculate the difference between each sum
    ~diff(sum(de2bi(+_)))  % Negate the result, meaning 0 becomes true, 
                           % and everything else becomes false

在Octave中,将仅包含1(真)的向量评估为true,在Octave中,将将至少包含0的向量评估为false。

旧代码的解释(53字节):

@(_)!((_=sum(de2bi(+_)))-_(1))%RRRFVVVVVVVVV_____????

@(_)      % An anonymous function that take a variable _ as input
          % We use underscore, instead of a character, since it has the
          % most suitable binary represetation
    !     % Negate the result, meaning 0 becomes true, and everything else becomes false
        de2bi(+_)         % Convert the input string to a binary matrix
    sum(de2bi(+_))        % Take the sum of each column
 (_=sum(de2bi(+_)))       % Assign the result to a new variable, also called _
                          % It's not a problem that we use the same variable name, due
                          % to the order of evaluation
((_=sum(de2bi(+_)))-_(1)) % Subtract the first element of the new variable _
                          % If all elements of the new variable _ are identical, then this
                          % should give us a vector containing only zeros,
                          % otherwise, at least one element should be non-zero
!((_=sum(de2bi(+_)))-_(1))  % And finally, we negate this.

在Octave中,将仅包含1(真)的向量评估为true,在Octave中,将将至少包含0 的向量评估为false。


3

的JavaScript(ES6),139个 111 107字节

f=
S=>![...""+1E6].some((____________ABQWWWWWWWWW,P)=>P*=R^(R^=R,[...S].map(Q=>R+=Q.charCodeAt()>>P&1),R),R=0)
<textarea oninput=o.textContent=f(this.value) style=width:100% rows=10>S=>![...""+1E6].some((____________ABQWWWWWWWWW,P)=>P*=R^(R^=R,[...S].map(Q=>R+=Q.charCodeAt()>>P&1),R),R=0)</textarea><div id=o>true

每个位包含81 63 61。


2

Scala,149个字节

_.map(C=>("0"*7++(BigInt(C)toString 2))takeRight 7 map(_-48)).transpose.map(_.sum).toSet.size==1//______________________________

用法:

val f:(String=>Any)=_.map(C=>("0"*7++(BigInt(C)toString 2))takeRight 7 map(_-48)).transpose.map(_.sum).toSet.size==1//______________________________
println(f("string here")

十六进制转储:

00000000  5f 2e 6d 61 70 28 43 3d  3e 28 22 30 22 2a 37 2b  |_.map(C=>("0"*7+|
00000010  2b 28 42 69 67 49 6e 74  28 43 29 74 6f 53 74 72  |+(BigInt(C)toStr|
00000020  69 6e 67 20 32 29 29 74  61 6b 65 52 69 67 68 74  |ing 2))takeRight|
00000030  20 37 20 6d 61 70 28 5f  2d 34 38 29 29 2e 74 72  | 7 map(_-48)).tr|
00000040  61 6e 73 70 6f 73 65 2e  6d 61 70 28 5f 2e 73 75  |anspose.map(_.su|
00000050  6d 29 2e 74 6f 53 65 74  2e 73 69 7a 65 3d 3d 31  |m).toSet.size==1|
00000060  2f 2f 5f 5f 5f 5f 5f 5f  5f 5f 5f 5f 5f 5f 5f 5f  |//______________|
00000070  5f 5f 5f 5f 5f 5f 5f 5f  5f 5f 5f 5f 5f 5f 5f 5f  |________________|
00000080  1f 1f 1f 1f 1e 1e 1e 1e  16 16 16 16 16 12 12 10  |................|
00000090  10 10 10 10 10                                    |.....|

取消高尔夫:

string =>
  string.map(char =>
    (
      "0" * 7 ++ BigInt(char).toString(2)
    ).takeRight(7).map(n=>n-48)
  ).transpose
  .map(bits=>bits.sum)
  .toSet
  .size == 1
  //______________________________

说明:

string =>                      //create an anonymous function with a parameter string
  string.map(char =>           //map each char in the string to
    (
      "0" * 7                  //a string of 7 zeroes
      ++                       //concatenated with
      BigInt(char).toString(2) //the ascii value as a binary string
    ).takeRight(7)             //the last 7 items from this sequence
    .map(n=>n-48)              //where each digit is mapped to its numerical value
  ).transpose                  //transpose, so the colums become rows and vice-versa
  .map(bits=>bits.sum)         //maps the bits in each column to their sum
  .toSet                       //and convert the sequence of sums to a set
  .size == 1                   //which has 1 element of the sums are the same
  //______________________________


1

Haskell,118个字节

_R _S=mod _S 2:_R(div _S 2)
_Z _S|_V:_W<-take 7.foldl1(zipWith(+))$_R.fromEnum<$>_S=all(==_V)_W
--________

在线尝试!用法:_Z "some string"返回TrueFalse

最后一行的注释中有一些无法打印的字符,因此这是使用转义字符的程序字符串:

"_R _S=mod _S 2:_R(div _S 2)\n_Z _S|_V:_W<-take 7.foldl1(zipWith(+))$_R.fromEnum<$>_S=all(==_V)_W\n--___\US\US\US\ETB\DC3\DC3\DC3\DC3\DC3\DC3\DC2\DC2_____"

每一位发生68次。


我想出的最短代码是82个字节:

b n=mod n 2:b(div n 2)
(all=<<(==).head).take 7.foldl1(zipWith(+)).map(b.fromEnum)

但是,此代码的位总和为[33,28,41,48,20,79,46],因此将需要79 - 20 = 59无操作数加上2个字节来开始注释,总共需要143个字节。

在重新排列程序时,我发现使用大写字母作为变量名称有助于求和,因为它们在第6位没有位。由于Haskell不允许变量名以大写字母开头,因此需要在它们前面加上 _,这也不会设置第6位。

这样做之后,我得到了上述解决方案,该解决方案在将no-ops和bist之和添加到之前有97个字节[50,47,56,56,48,68,60],因此(68 - 47) = 21,在注释中只需添加21个字节。


1

PHP,95 93 91字节

我很高兴PHP函数名称不区分大小写!

FOR(ZZSSSSQ__*;$W=ORD($argn[$T++]);)FOR($V=7;$V--;)$R[$V]+=$W>>$V&1;PRINT MIN($R)==MAX($R);

其中*必须用ASCII 151(0x97)替换。(PHP会抱怨代码中的任何控制字符- \r和和之外\n,但我需要设置4位,因此我添加了128。)

+1字节用于纯可打印ASCII:_7改为使用。

在线运行echo '<input>' | php -nR '<code>'或对其进行测试。输出1为真,虚假为空。


0

Python 2,117字节

所有“空格”都是制表符,以减少0x20位的数量。

def Y(S):
    O=map(sorted,zip(*['{:07b}'.format(ord(W))for   W   in  S]))
    return  O[1:]==O[:-1]#V_____________

每位包含66位。(本期没有'%07b'解释。)

十六进制转储:

00000000: 64 65 66 09 59 28 53 29 3a 0a 09 4f 3d 6d 61 70  def.Y(S):..O=map
00000010: 28 73 6f 72 74 65 64 2c 7a 69 70 28 2a 5b 27 7b  (sorted,zip(*['{
00000020: 3a 30 37 62 7d 27 2e 66 6f 72 6d 61 74 28 6f 72  :07b}'.format(or
00000030: 64 28 57 29 29 66 6f 72 09 57 09 69 6e 09 53 5d  d(W))for.W.in.S]
00000040: 29 29 0a 09 72 65 74 75 72 6e 09 4f 5b 31 3a 5d  ))..return.O[1:]
00000050: 3d 3d 4f 5b 3a 2d 31 5d 23 56 5f 5f 5f 5f 5f 5f  ==O[:-1]#V______
00000060: 5f 5f 5f 5f 5f 5f 5f 16 16 16 16 16 16 16 16 16  _______.........
00000070: 16 16 14 14 10                                   .....

如果您阅读了错误报告的说明...“解决:不是错误”。
mbomb007 '17
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.