Первичная ( двоичная-простая ) строка - это строка, которая при записи в виде двоичной сетки каждая строка и столбец имеет простое общее число.
Это довольно расплывчатое объяснение, поэтому давайте разберем его с проработанным примером ...
Для этого примера мы будем использовать строку bunny
:
Сначала найдите кодовую точку ASCII каждого символа и его двоичное представление:
Char | ASCII | Binary
b 98 1100010
u 117 1110101
n 110 1101110
n 110 1101110
y 121 1111001
Возьмите эти двоичные значения сверху вниз и расположите их в сетке (при необходимости добавляя начальные нули):
1 1 0 0 0 1 0
1 1 1 0 1 0 1
1 1 0 1 1 1 0
1 1 0 1 1 1 0
1 1 1 1 0 0 1
Затем посчитайте количество 1
s в каждой строке и столбце:
1 1 0 0 0 1 0 > 3
1 1 1 0 1 0 1 > 5
1 1 0 1 1 1 0 > 5
1 1 0 1 1 1 0 > 5
1 1 1 1 0 0 1 > 5
v v v v v v v
5 5 2 3 3 3 2
Если и только если каждое отдельное общее число является простым (например, здесь), тогда строка является допустимым двоичным простым числом.
Соревнование
Ваша задача - создать функцию или программу, которая при задании строки возвращает / выводит, truthy
если строка является основной, и в falsy
противном случае.
Правила / Подробнее
- Вы можете предположить, что символы строки всегда будут в диапазоне ASCII
33-126
(включительно). - Строка не будет пустой.
- Primenary строка не не должна иметь основную длину - например,
W1n*
действует, несмотря на наличие 4 -х символов. - Это код-гольф , поэтому выигрывает самый короткий ответ (в байтах) - но все предложения приветствуются.
- Стандартные лазейки запрещены.
Тестовые случаи
'husband' -> True
'HOTJava' -> True
'COmPaTIBILE' -> True
'AuT0HACk' -> True
'PPCW' -> False
'code-golf' -> False
'C++' -> False
'/kD' -> False
'HI' -> False
'A' -> False
Существует также рабочий, но невероятно подробный пример Python на repl.it, с которым вы можете протестировать свое решение.
husband
это действительно? Или любой из них? Большая проблема, хотя!False
, правильно?0
и1
не являются простыми, и каждая входная строка из 1-2 символов, содержащая только символы в данном диапазоне, гарантированно содержит по крайней мере один0
или1
в виде вертикальной суммы. Вы должны добавить несколько строк из 1 и 2 символов в качестве тестовых случаев.false
. Могут быть введены 2 символьных входа, но не в диапазоне ASCII, который мы используем, поэтому для этого сценария вы правы.Ответы:
MATL, 10 байт
Попробуйте онлайн!
Это идеальный язык для работы. Это в значительной степени буквальная транслитерация спецификации вызова.
Так как любой ноль приводит к ошибочности массива MATL в соответствии с мета , больше ничего не требуется - в основном,
A
вызывается неявное?
(если).источник
a
должен быть ложным, но возвращается1 1
? (его столбцы не складываются в простые числа)BtXsw!shZp
что это исправить и стать победителем на 10.Желе ,
13 1211 байтTryItOnline! или все тестовые случаи
Как?
источник
05AB1E , 17 байт
Попробуйте онлайн!
источник
Желе , 15 байт
Попробуйте онлайн! или Проверьте все контрольные примеры. ,
объяснение
источник
Mathematica, 75 байт
Безымянная функция принимает строку в качестве ввода и возвращает
True
илиFalse
.ToCharacterCode@#
преобразует ввод в список его значений ASCII;IntegerDigits[...,2,7]
превращает каждое значение в список его битов, дополняемый до длины 7, если необходимо. Итак, теперь у нас есть двумерный массив, и нам нужны все суммы строк и столбцов; и вот, символ-спазм{+##&@@#,+##&@@@#}&@...
делает именно это (он применяет+##&
функцию «суммировать все аргументы» к списку векторов в первой координате, используя@@
, и к каждому вектору как свой собственный список целых чисел во второй координате, используя@@@
) , Затем мы просто проверяем, есть ли результатыPrimeQ
, сглаживаем списокJoin@@
и беремAnd
все эти значения.источник
Рубин
-rprime
, 100 байтПопробуйте онлайн!
объяснение
источник
Perl,
151121111 + 3 = 114 байтБежать с
-lF
. Программа будет работать правильно только для первого входа. Завершите программу и снова запустите ваш следующий ввод.Спасибо @Dada за то, что дали мне знать, что
//
послеF
были излишни. Дополнительный байт можно удалить (для 112), отправив входные данные через viaecho -n
, но я чувствую, что это технически добавляет больше кода, так что YMMV.Удобочитаемый:
источник
//
после-F
, и вы можете взять ввод без окончательного перевода строки (сecho -n
), чтобы избавиться от-l
флага.Python 3,
228227225 байтНе очень хороший ответ, я не мог играть в гольф столько, сколько хотел бы, но я потратил так много времени на это, я чувствую, что должен опубликовать это. Предложения по сокращению байтов будут с благодарностью.
Редактировать 1: заменить
e[0]%8==0
наe[0]%8<1
, теряя байт. Спасибо Flp.Tkc!Правка 2: замена (i + 1) на - ~ i, потеря двух дополнительных байтов. Спасибо Эрику за то, что он показал, насколько плохи мои знания на уровне битов :). Тестируя эту ревизию, я обнаружил, что
kappa
это действительно так ...источник
e[0]%8==0
наe[0]%8<1
?<1
, не так<0
ли?Groovy,
151137 байтНикакой проверки на простоту в заводной ...
p={x->x<3||(2..(x**0.5)).every{x%it}};
- Закрытие для тестирования простоты.y={it.every{p(it.count("1"))}};
- Закрытие, чтобы гарантировать, что все значения «1» для переданного двоичного двумерного массива являются простыми.x=it.collect{0.toString((int)it,2) as List};
- Покрытие из строки в двоичный массив.y(x)&&y(x.transpose())
- Для всех простых проверенных сумм в основной матрице и транспонированной матрице убедитесь, что они возвращают true.источник
Pyth , 37 байт
Попробуйте онлайн!
источник
Брахилог , 14 байт
Попробуйте онлайн!
Выходы через успех или неудачу. (В случае успеха, список всех сумм столбцов и строк доступен через выходную переменную.
источник
O5AB1E, 12 байтов
Попробуйте онлайн!
Это мой первый код для гольфа, так что будьте спокойны :)
источник
Python 3 ,
209189180171160 байтовСпасибо кальмар за -9 байт :)
Попробуйте онлайн!
источник
t+
в выражении map?t
имеет все строки, а[[t[i][j]..i..]..j..]
транспонированt
, то есть столбцы. Если есть более короткий способ транспонирования матрицы, мы можем сохранить больше байтов :)beezz
должен вернуть false, но не возвращает. Это потому, что основная проверка не пройдена, она возвращаетTrue
4 бита. Попробуйprint(p('1111'))
. Исправлено сейчас. Все тестовые случаи не покрывали это, потому что все используемые символы являются основными.K (ок) ,
4033 байтаРешение:
Попробуйте онлайн!
Объяснение:
Половина создает матрицу, другая половина проверяет первичность.
источник
PHP, 173 байта
Протестируйте это онлайн
источник
JavaScript, 234 байта
Мы получаем горизонтальные значения, конвертируя число в двоичное, удаляя нули с помощью замены строки, а затем считая 1. Вертикальные суммы получаются путем циклического перехода от 1 до 7 и использования побитового И с 2, повышенными до n-й степени
источник
Math.pow(2,i)
можно сократить до(1<<i)
предположенияi<32
, возможно, сэкономив 7 байт, а может и нет.Clojure, 180 байт
Там может быть более короткий способ создания списков битов, а также тест на простоту.
источник
Perl 5
-MList::Util=all,sum -pF
,9692 байтаПопробуйте онлайн!
источник
Python 3, 164 байта
источник
Ruby 2,7
-rprime
, 95 байтНет ссылки на TiO, потому что TiO по-прежнему работает на Ruby 2.5.5. 😭
объяснение
Довольно просто Первая строка получает двоичные цифры каждого символа в виде массива, дополненного семью цифрами, что на самом деле должно быть проще:
Проверьте , что номером блока параметров (
@1
) и beginless диапазон (..6
) жаркость .Вторая строка суммирует строки и столбцы и проверяет, все ли они простые:
источник
JavaScript (Node.js) ,
149146...134130129 байтПопробуйте онлайн!
объяснение
Как это вообще работает !?
y.charCodeAt()&2**i
y.charCodeAt()
если0 <= i < 7
и 0 в противном случае.i < 7
код, по-видимому, работает как обычно.7 <= i <= 32
, так как соответствующий битy.charCodeAt()
равен 0, результат равен 0, как и ожидалось.32 < i < 1024
, так какint32(2**i) == 0
, результат равен 0, как и ожидалось.1024 <= i
,2**i == Infinity
и с тех порint32(Infinity) == 0
, результат равен 0, как и ожидалось.(P=r=>n%--r?P(r):~-r)(n)
R = --r = r - 1
.n % R == 0
илиn % R is NaN
.n % R == 0
:R
является факторомn
.R == 1
, тогдаn
прост, потому что все1 < R < n
не могут разделитьn
. Вернуть 0 (ложь).R == -1
тогдаn == 0
. Вернуть -2 (правда).R - 1
туда , гдеR - 1 > 0
(правда).n % R is NaN
: Неверный модульный расчет.R == 0
:n == 1
. Вернуть -1 (правда).n is NaN
:R is NaN
. Вернуть -1 (правда).R == 1
эта функция может вернуть ложное значение, указывая, чтоn
это простое число.источник