Tulis kode validasi diri

28

Tulis kode yang menggunakan string sebagai input, dan menampilkan nilai true atau falsey tergantung pada apakah string mengikuti aturan ini atau tidak:

Jika Anda menumpuk setiap karakter di atas satu sama lain, konversikan ke biner dan jumlah setiap kolom, maka semua jumlah harus identik. Anda dapat menganggap string input hanya berisi karakter ASCII yang dapat dicetak (titik kode 32 - 126).

Sebagai contoh:

Input O5vy_+~harus mengembalikan nilai kebenaran, karena representasi binernya adalah:

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

Input PPCGharus mengembalikan nilai falsey, karena representasi binernya adalah:

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

Twist adalah: Kode Anda harus mengembalikan nilai kebenaran jika digunakan sebagai input ke fungsi / program Anda. Yaitu kode harus mematuhi aturan yang sama seperti di atas (kode Anda dapat berisi karakter yang bukan ASCII 32-126).

Program / fungsi Anda hanya perlu menangani ASCII yang dapat dicetak sebagai input. Jika kode Anda mengandung sesuatu yang lain, 8 bit, 16 bit encoding, Unicode, set karakter yang dibuat khusus (atau sesuatu yang lain), maka representasi binernya harus mematuhi aturan yang sama, tetapi kode Anda tidak perlu menanganinya sebagai input.

Ini , jadi aturan standar berlaku.

Stewie Griffin
sumber
Berapa lama string input akan? Bisakah kita mengasumsikan jumlahnya akan selalu 7 digit?
Okx
Juga, jika program kami menggunakan karakter selain karakter ASCII, apa yang terjadi?
Okx
Saya kira "maka representasi biner dari itu harus mematuhi aturan yang sama" harus secara eksplisit mengecualikan klausa "hanya perlu menangani ASCII yang dapat dicetak sebagai input" (jika tidak, seseorang dapat menulis kode hanya dengan satu byte yang memetakan ke ASCII yang tidak dapat dicetak) .
Jonathan Allan
@Okx Anda dapat menganggap string input kurang dari 1kB. Input hanya akan dicetak ASCII yang dapat direpresentasikan menggunakan 7 bit, jadi ya: Selalu akan ada jumlah 7 integer (tidak harus angka).
Stewie Griffin
2
@StewieGriffin Itu bukan klarifikasi yang sangat bagus. Jika saya memiliki jawaban non-ASCII, dan Anda mencoba dan memasukkan program ke dalam program, dan itu tidak berfungsi karena hanya mendukung ASCII, apa yang terjadi?
Okx

Jawaban:

10

JavaScript (ES6), 123 122 120 110 byte

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

Di bawah ini adalah hexdump dengan jumlah bit.

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

Demo

Arnauld
sumber
10

MATL , 10 9 byte

BXs&=?I&]

Input adalah string yang diapit dengan tanda kutip tunggal (jika inputnya berisi qoute tunggal, lepas dari itu dengan menduplikasi).

Output adalah 3sebagai kebenaran dan tidak ada (output kosong) sebagai falsy.

Cobalah online!

Kode dalam biner adalah sebagai berikut:

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

Penjelasan

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)
Luis Mendo
sumber
8

Jelly , 11 10 byte

OBUSE&889.

Cobalah secara Online! Atau lihat tes dan input-sendiri (kode semua ASCII yang dapat dicetak, yang memiliki nilai yang sama di halaman kode Jelly, seperti yang terlihat di bawah).

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

Bagaimana?

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)
Jonathan Allan
sumber
Kode Anda sangat mirip dengan milik Dennis.
Erik the Outgolfer
Ya, saya melihat setelah.
Jonathan Allan
6

Jelly , 11 10 byte

OBUSE$*8?8

Tidak menggunakan no-ops atau komentar.

Cobalah online!

Rincian biner

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

Bagaimana itu bekerja

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.
Dennis
sumber
Apakah Jelly TC hanya menggunakan ASCII yang dapat dicetak?
Pavel
Saya kira tidak.
Dennis
1
Saya suka kode ini dimulai dengan OBUSEkarena kedengarannya seperti ABUSE.
Buah Esolanging
4

Mathematica, 88 byte

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

Berisi banyak karakter yang tidak dapat dicetak di antara tanda kutip. Memiliki 49 bit masing-masing.

Inilah 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_...}&
JungHwan Min
sumber
4

Oktaf, 53 52 byte

Membuat penulisan ulang lengkap membantu saya golf kode 5 byte, tapi saya harus menambahkan lebih banyak no-ops, menjadikannya net-save hanya 1 byte.

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

Saya tidak dapat menambahkan tautan TIO, karena tidak ada penerjemah online yang mengimplementasikan kotak alat komunikasi yang diperlukan de2bi. Mengubahnya sebagai dec2bingantinya akan biaya 4 byte (2 untuk kode kerja, dan dua no-ops).

Saya tidak menemukan cara untuk menghindari 27 no-ops. Semua nama fungsi dan tanda kurung berada di antara baik di bawah 64, atau lebih tinggi dari 96, yang berarti semua karakter "perlu" memiliki 1 di posisi ke-6 (dari kanan, 2 ^ 5). Saya punya solusi dengan hanya 23 no-ops, tetapi kode itu sendiri lebih panjang. Kode aktualnya adalah 25 byte, dan memiliki jumlah kolom berikut saat menghitung bit dari persamaan biner:

15   22    6   15   10    9   13

Ada 22 bit di posisi ke-6 dari kanan (2 ^ 5), dan hanya 6 bit di posisi ke-4 dari kanan (2 ^ 3). Itu berarti, kita harus menambahkan setidaknya 16 byte, untuk mendapatkan 6 hingga 22. Sekarang, karakter komentar %menambahkan sedikit ke posisi ke-6, meningkat menjadi 23. Semua karakter ASCII yang dapat dicetak membutuhkan setidaknya satu dari dua bit atas menjadi 1. Oleh karena itu, menambahkan 17 byte akan memberi kita setidaknya 27 bit di masing-masing dari dua "tempat teratas" (2 ^ 6 dan 2 ^ 5). Sekarang, kami memiliki 27 bit di dua tempat teratas, dan 22 bit di sisanya. Untuk mencapai kesetimbangan, kita harus menambahkan 10 byte, untuk mencapai 32 bit pada setiap posisi.

Penjelasan kode baru (52 byte):

@(_)~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

Vektor yang hanya mengandung 1s (true) dievaluasi menjadi true dalam Oktaf, dan vektor yang mengandung setidaknya satu nol dievaluasi menjadi false dalam Oktaf.

Penjelasan kode lama (53 byte):

@(_)!((_=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.

Vektor yang hanya mengandung 1s (true) dievaluasi menjadi true dalam Oktaf, dan vektor yang mengandung setidaknya satu nol dievaluasi menjadi false dalam Oktaf.

Stewie Griffin
sumber
3

JavaScript (ES6), 139 111 107 byte

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

Berisi 81 63 61 dari setiap bit.

Neil
sumber
2

Scala, 149 byte

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

Pemakaian:

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                                    |.....|

Tidak Terkumpul:

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

Penjelasan:

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
  //______________________________
corvus_192
sumber
1

J , 45 byte

[:(*/@:={.)[:+/2 #.inv 3 u:]NB.____UUUUUUUUDD

Cobalah online! Termasuk kasus uji untuk sebagian besar pengiriman yang diajukan, bersama dengan kode sumber.

Conor O'Brien
sumber
1

Haskell , 118 byte

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

Cobalah online! Penggunaan: _Z "some string"mengembalikan salah satuTrue atauFalse .

Ada beberapa karakter yang tidak dapat dicetak dalam komentar di baris terakhir, jadi di sini ada rangkaian program menggunakan karakter yang lolos:

"_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_____"

Setiap bit terjadi 68 kali.


Kode terpendek yang saya buat adalah 82 byte:

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

Namun jumlah bit untuk kode ini [33,28,41,48,20,79,46]begitu79 - 20 = 59 no-ops ditambah 2 byte untuk memulai komentar juga diperlukan, dengan total 143 byte.

Saat menata ulang program saya menemukan bahwa menggunakan huruf besar sebagai nama variabel membantu untuk meratakan jumlah karena mereka tidak memiliki bit di set posisi ke-6. Karena Haskell tidak mengizinkan nama variabel untuk memulai dengan huruf besar, mereka harus diawali dengan _, yang juga tidak mengatur bit ke-6.

Dalam melakukannya saya berakhir dengan solusi di atas yang memiliki 97 byte sebelum menambahkan no-ops dan bist sum [50,47,56,56,48,68,60], jadi (68 - 47) = 21, jadi hanya 21 byte yang perlu ditambahkan dalam komentar.

Laikoni
sumber
1

PHP, 95 93 91 byte

Saya sangat senang bahwa nama fungsi PHP tidak peka huruf besar kecil!

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

di mana *harus diganti dengan ASCII 151 (0x97). (PHP akan mengeluh tentang karakter kontrol dalam kode - terlepas dari \rdan \n, tapi saya butuh sesuatu dengan bit 4 set, jadi saya menambahkan 128.)

+1 byte untuk ASCII yang benar-benar dapat dicetak: Gunakan _7saja.

Jalankan dengan echo '<input>' | php -nR '<code>'atau coba online . Keluaran adalah 1untuk kebenaran, kosong untuk kepalsuan.

Titus
sumber
0

Python 2, 117 byte

Semua "spasi" adalah tab untuk mengurangi jumlah 0x20 bit.

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

Berisi 66 bit masing-masing. (Tidak ada yang '%07b'dijelaskan dalam masalah ini .)

Hex dump:

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                                   .....
kennytm
sumber
Jika Anda membaca deskripsi laporan bug ... "resolusi: bukan bug".
mbomb007