Напишіть самовивіряючий код


28

Напишіть код, який приймає рядок як вхідний і виводить значення truthy або falsey залежно від того, чи відповідає рядок цим правилам:

Якщо ви укладаєте кожен символ один на одного, конвертуйте у двійкові та підсумовуйте кожен стовпець, то всі суми повинні бути однаковими. Ви можете припустити, що вхідний рядок містить лише символи для друку 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, що друкується, як вхідний" (інакше можна було б написати код лише одним байтом, який відображає в ASCII, що не друкується) .
Джонатан Аллан

@Okx, ви можете припустити, що рядок введення менше 1 КБ. Вхід буде друкованим лише ASCII, який можна представити за допомогою 7 біт, тому так: завжди буде 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[_])

Нижче наводиться шістнадцятковий набір з трохи сум.

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

MATL , 10 9 байт

BXs&=?I&]

Введення - це рядок, укладений одинарними лапками (якщо вхід містить одинарні квоти, уникайте їх шляхом дублювання).

Вихід є 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.
Esolanging Fruit

4

Математика, 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 для робочого коду та два не потрібні).

Я не знайшов способу уникнути будь-якого з 27-ти опів. Усі назви функцій і круглі дужки знаходяться між або нижче 64, або вище 96, тобто всі "необхідні" символи мають "6" у 6-му положенні (праворуч, 2 ^ 5). У мене було рішення лише з 23 відсутністю, але сам код довший. Фактичний код становить 25 байт і має таку суму стовпців при підрахунку бітів двійкового еквівалента:

15   22    6   15   10    9   13

У 6-й позиції справа (2 ^ 5) є 22 біти в 6-й позиції, а праворуч - 6 бітів (4 ^ 3). Це означає, що нам потрібно додати щонайменше 16 байт, щоб отримати 6 до 22. Тепер персонаж коментаря %трохи додає до 6-ї позиції, збільшуючи його до 23. Усі друковані символи ASCII потребують принаймні одного з двох верхні біти 1. Тому додавання 17 байтів дасть нам щонайменше 27 біт у кожному з двох "верхніх точок" (2 ^ 6 та 2 ^ 5). Тепер у нас є 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

Вектор, що містить лише 1s (істинний), оцінюється як істинний в Octave, а вектор, що містить щонайменше один нуль, оцінюється як false в Octave.

Пояснення старого коду (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.

Вектор, що містить лише 1s (істинний), оцінюється як істинний в Octave, а вектор, що містить щонайменше один нуль, оцінюється як false в Octave.


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

Скала, 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"повертає Trueабо False.

У коментарі до останнього рядка є кілька недрукованих символів, тому ось рядок програми, що використовує втечені символи:

"_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-й біт.

Роблячи це, я закінчив вищезазначене рішення, яке має 97 байт, перед тим як додати no-ops та bist суму [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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.