自己検証コードを書く


28

入力として文字列を受け取り、文字列が次の規則に従っているかどうかに応じて、trueまたはfalseの値を出力するコードを記述します。

各文字を互いの上にスタックし、バイナリに変換して各列を合計すると、すべての合計が同一になります。入力文字列には、印刷可能な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は、バイナリ表現が次のとおりであるため、偽の値を返す必要があります。

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を入力として処理するだけでよい」という句を明示的に除外する必要があると思います。
ジョナサンアラン

@Okxでは、入力文字列が1kB未満であると想定できます。入力は、7ビットを使用して表現できる印刷可能なASCIIのみであるため、はい:常に7つの整数(必ずしも数字ではない)の合計があります。
スティーヴィーグリフィン

2
@StewieGriffinそれはあまり良い説明ではありません。ASCII以外の回答があり、プログラムをプログラムに入力しようとしても、ASCIIしかサポートしていないため機能しない場合はどうなりますか?
Okx

回答:


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

以下はビット合計を含む16進ダンプです。

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)

あなたのコードはデニスのものによく似ています。
エリックアウトゴルファー

うん、後で見た。
ジョナサンアラン

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個あります。

hexdumpは次のとおりです。

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つ、2つのノーオペレーション)。

27のノーオペレーションを回避する方法は見つかりませんでした。すべての関数名と括弧は64未満または96を超えています。つまり、すべての「必要な」文字は6番目の位置に1があります(右から2 ^ 5)。解決策は23個のノーオペレーションしかありませんでしたが、コード自体は長かったです。実際のコードは25バイトであり、同等のバイナリのビットを数えると、次の列の合計があります。

15   22    6   15   10    9   13

右から6番目の位置(2 ^ 5)には22ビットがあり、右から4番目の位置(2 ^ 3)には6ビットしかありません。つまり、6を最大22 にするには、少なくとも 16バイトを追加する必要があります。ここで、コメント文字%は6番目の位置にビットを追加し、23に増やします。すべての印刷可能なASCII文字には、上位ビットになります1。したがって、17バイトを追加すると、2つの「トップスポット」(2 ^ 6および2 ^ 5)のそれぞれに少なくとも27ビットが得られます。現在、上位2つのスポットに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

1のみを含むベクトル(true)はOctaveでtrueと評価され、少なくとも1つのゼロを含むベクトルはOctaveで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.

1のみを含むベクトル(true)はOctaveでtrueと評価され、少なくとも 1つのゼロを含むベクトルはOctaveで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")

Hexdump:

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 = 59no-opsに加えてコメントを開始するための2バイトが必要になり、合計で143バイトになります。

プログラムの再配置中に、変数名として大文字を使用すると、6番目の位置セットにビットがないため、合計を平準化するのに役立つことがわかりました。Haskellでは変数名を大文字で始めることは許可されていないため_、先頭にを付加する必要があり 、6番目のビットも設定されません。

そうすることで、no-opsとbist sumをに追加する前に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、私は128を追加したので、私は、ビット4が設定されたものが必要)

純粋な印刷可能ASCIIの+1バイト:_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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.