Написать код для подтверждения


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, вы можете считать, что входная строка меньше 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[_])

Ниже приводится hexdump с битовыми суммами.

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)

Ваш код очень похож на код Дениса.
Эрик Outgolfer

Да, я видел после.
Джонатан Аллан

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

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 для рабочего кода и два отсутствия операций).

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

15   22    6   15   10    9   13

В 6-й позиции справа есть 22 бита (2 ^ 5) и только в 6-й позиции справа (2 ^ 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

Вектор, содержащий только 1 с (истина), оценивается как истинный в Октаве, а вектор, содержащий по крайней мере один ноль, оценивается как ложный в Октаве.

Объяснение старого кода (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 с (истина), оценивается как истинный в Октаве, а вектор, содержащий по крайней мере один ноль, оценивается как ложный в Октаве.


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

Ungolfed:

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 дополнительно потребуются no-ops плюс 2 байта для начала комментария, всего 143 байта.

Переставляя программу, я обнаружил, что использование заглавных букв в качестве имен переменных помогает выровнять суммы, потому что у них нет установленного бита в шестой позиции. Поскольку 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.