Задний план
Вдохновленный очень удобной интерпретацией Octave (и, как следствие, MATL) матриц истина / ложь, Jelly получил атом Ȧ ( все в стиле Octave ).
Ȧ принимает массив в качестве входных данных и возвращает 1, если массив не пустой и не содержит числа 0 (целое число, число с плавающей запятой или комплексное) где-либо в древовидной структуре ; в противном случае возвращается 0 .
Например, массив [[]] является правдивым, потому что он не пуст и не содержит нулей, но [[0]] является ложным, потому что он содержит 0 на самом внутреннем уровне.
задача
На выбранном вами языке программирования напишите полную программу или функцию, которая принимает в качестве входных данных возможно пустой, возможно зубчатый массив целых чисел и печатает или возвращает истинное или ложное значение, указывающее, вернет ли Ȧ 1 или 0 соответственно.
Ваша заявка должна соответствовать следующим правилам.
Значения достоверности и ложности должны быть согласованы для всех входных данных , т. Е. Все массивы, для которых Ȧ возвращает 1, должны отображаться на одно и то же значение истинности, а все массивы, для которых Ȧ возвращает 0, должны отображаться на одно и то же значение ложных значений.
Поскольку полные программы могут принимать только строковые представления массивов в качестве входных данных, это разрешено. Тем не менее, вы должны использовать каноническое представление вашего языка, возвращенное
repr
или подобное.В частности, вы не можете предполагать, что первому элементу массива будет предшествовать пробел.
Если (и только если) ваш язык не может представлять неровные массивы изначально, вы можете взять строковое представление ввода, используя канонический синтаксис любого ранее существовавшего языка программирования.
Если у вашего языка есть несколько способов представления зубчатых массивов (например, списков и кортежей), вам нужно поддерживать только один из них.
Если на вашем языке есть встроенная программа, которая сама по себе является действительным предложением для этого задания, вы не можете использовать ее в своем ответе . Все остальные встроенные модули разрешены.
Вам предлагается публиковать ответы, используя манипуляции с массивами и строками, даже если один из них значительно короче другого.
Действуют все стандартные правила игры в гольф .
Пусть победит самый короткий код в байтах!
Правдивые тесты
[1]
[10]
[[]]
[[[[1]]]]
[[], [1], [1, 2]]
[[1], [1, [2]], [1, [2, [3]]]]
[[8], [8, [9]], [8, [9, [10]]]]
Ложные тесты
[]
[0]
[0, -1]
[-1, 0]
[[[[0]]]]
[[0], [1, 2], [3, 4, 5]]
[[8], [8, [9]], [8, [9, [1, 0]]]]
[-1, 0, 0, 0]
Object
... мой любимый язык - это Haskell, где это не так. Ни в C, по крайней мере, не так, чтобы вы могли безопасно смешивать массивы и целые. Оба этих языка вполне способны использовать зубчатые массивы, но все еще не могут использовать их для этой проблемы.Ответы:
Желе, 3 байта
F
выравнивает список ввода.ṭ
привязывает исходный список ввода как элемент, который ложен тогда и только тогда, когда он пуст.Ạ
затем проверяет, является ли какой-либо элемент в плоском списке или сам исходный список ложным.(Оригинальный ответ)
Спасибо Деннису за поддержку в поиске решения, соответствующего его.
FẠ
дает 0, если вход содержит ложное значение на любой глубине, иначе 1. Это тоȦ
, что делает, за исключением пустых списков.Ṇ
дает 1, если вход является ложным значением, иначе 0. Единственный ложный список - пустой список.XOR-IN два дает ответ.
Это во многом в том же духе, что и у Денниса
F;LẠ
, но вместо того,L
чтобы ставить ноль в списке, когда список пуст, он используетW
для помещения пустого списка в себя (создания[[]]
), в результате чего он содержит ложный элемент.источник
Сетчатка , 10 байт
Попробуйте онлайн!
Сначала мы удаляем вход, если он содержит ноль. Мы пытаемся сопоставить не менее трех символов в начале строки (чтобы гарантировать, что ввод не был исключен на предыдущем этапе или был только
[]
для начала).источник
Рубин,
2524231816 байтТребуется
-n
флаг в командной строке (+1 байт,-e
->-ne
).Попробуйте онлайн!
Это полная программа, которая принимает входные данные в формате канонического массива Ruby на STDIN и выводит
true
илиfalse
на STDOUT.23-байтовая версия функции:
Это процесс, который принимает один аргумент, массив для тестирования.
Спасибо Мартину Эндеру за байт и Вентеро за два байта!
источник
p$_!~/\D0|^..$/
(илиp ! ~/\D0|^..$/
, возможно, значительный пробел) вместе с-n
флагом.Желе , 4 байта
Попробуйте онлайн!
Ȧ
возвращает,0
если вход пуст или содержит0
, в противном случае это1
.FẠ
Возвращает,0
если сглаженный вход содержит a0
, оставляя только крайний случай пустого массива (поскольку вход гарантированно будет массивом).Ṇ
это не векторизованная логическая не монада, и, следовательно, возвращает0
для любого непустого списка и1
для пустого списка. Таким образом, это может быть просто вычтено из результатаFẠ
использования_
.источник
FẠạṆ
?05AB1E ,
98 байт-1 байт благодаря Emigna
Объяснение:
Попробуйте онлайн!
источник
[[]]
.Mathematica, 17 байт
FreeQ
выполняет проверку0
для нас, но, конечно, он вернетсяTrue
для ввода{}
, поэтому мы должны проверить этот случай отдельно.источник
APL (Dyalog),
21127 байтовГольф 5 байтов благодаря Адаму с помощью вилок
Попробуйте онлайн!
Это моя первая попытка в Dyalog. Советы по гольфу приветствуются!
объяснение
источник
⍬∘≡
является левым тестом (пустой набор, привязанный к идентично-к), и0∊∊
является правым тестом (сам по себе форк; нулевой член зачисленной формы). Положите это вместе⍬∘≡⍱0∊∊
. Попробуйте онлайн!Язык сценариев работы Flashpoint ,
199188 байтЗвоните с:
или с:
Объяснение:
На языке сценариев игры может быть вызвана любая строка, содержащая код. Фигурные скобки
{}
обозначают начало и конец строки. (Кавычки работать тоже, но получает Messy , когда они вложены друг в друга.) Таким образом,A={...}
присваивает строку переменнойA
, а переменная может быть названа как функция с:<argument> call A
. По сути, любая строка может рассматриваться как блок кода.Затем внутри «функции»
A
мы определяем другую функциюf
.private
объявляет две переменные_i
и_r
локальные для функцииf
. Имя локальной переменной должно начинаться с подчеркивания.while {} do {}
является циклом, где первая строка (обозначенная{}
) содержит код для условия цикла, а вторая - для тела цикла._this
это аргумент, который был передан сcall
функцией._this
может быть любого типа, но здесь мы предполагаем, что это массив.В цикле
o=_this select _i
получает доступ к элементу _i: th массива и присваивает его переменнойo
.if (o in [o])
хитрость, чтобы определить,o
является ли другой массив или нет. Еслиo
это число (или что-либо, кроме массива),o in [o]
будет вычислено какtrue
, потому чтоin
функция находит значение, соответствующееo
из массива[o]
. Еслиo
это массив, выражение даетfalse
, потому чтоin
отказывается сравнивать массивы.Если
o
это не массив, мы проверяем, равен ли он нулю, и если это так, мы устанавливаем переменную_r
, которую мы будем использовать в качестве возвращаемого значения, равной нулю. В противном случае, еслиo
это массив, мы присваиваем_r
возвращаемое значение рекурсивного вызоваf
с новым массивомo
в качестве аргумента.После цикла, в конце функции
f
, мы оцениваем выражение_r
, которое выдает значение_r
, и, поскольку это последнее выражение для оценки, это то, чтоf
возвращает вызов функции .Теперь, когда мы определили
f
(f
не обязательно быть внутриA
, но таким образом мы могли бы объявить его локальной переменной / функцией (на самом деле без разницы),A
если бы мы не хотели сохранять несколько байтов), давайте вернемсяA
.if (count _this == 0)
проверяет, является лиA
входной массив пустым, и если он есть,A
возвращает 0. В противном случае функцияf
вызывается и ее возвращаемое значение будетA
возвращаемым значением.Можно заметить, что кажется, что точка с запятой будет отсутствовать в нескольких местах, но это не так, потому что точка с запятой необходима только после оператора, если другой оператор следует за ним внутри того же блока кода (то есть строки).
источник
Perl 5 , 15 байт
Сохранено 2 байта, используя ту же технику, что и в ответе Doorknob на Ruby .
14 байт кода +
-p
флагПопробуйте онлайн!
/.../
гарантирует, что массив не пустой (он будет совпадать с любым массивом, но[]
./\b0/
будет совпадать, только если0
в массиве есть a (\b
гарантирует, что0
не является частью другого числа, а является целым числом).источник
Haskell , 48 байтов
Попробуйте онлайн!
Спасибо Линн за тестовые случаи и
x<"[]"
трюк.Внешнее неравенство должно
(x<"[]")
быть Истинным (непустой список) иor[elem c"[,"|c:'0':_<-scanr(:)[]x]
Ложным (без нулей).Символы
0
обнаруживаются как следующие за,
или[
, в отличие от числа, подобного20
. Выражениеscanr(:)[]x
генерирует все достаточноl
иc:'0':_<-
захватывает тех, чей второй символ'0'
. Затемelem c"[,"
проверяет, является ли первый символ,
или[
.Здесь я предполагаю, что списки в стиле Haskell не имеют пробелов, но в таком случае их
','
можно просто заменить на' '
.Вот более прямой 48-байтовый метод, хотя он производит
0
's1
' и 's', которые не являются Истиной / Ложью в Хаскеле.источник
Желе , 4 байта
Попробуйте онлайн!
Как это работает
Обратите внимание, что атом Ạ ведет себя так же, как и Python,
all
и поэтому довольно сильно отличается от запрещенного Ȧ.источник
L;FẠ
. Кто может найти другой?JavaScript (ES6), 34 байта
Контрольные примеры
Показать фрагмент кода
источник
!!a[0]
вместоa.length
. (Вам не нужно беспокоиться оa[0]
том, чтобы быть нулем, так как результат в любом случае должен быть ложным в этом случае.)Юлия, 45 байт
Это создает функцию,
g
которая указывает, будет ли Ȧ иметь значение 1 или 0, вызывая рекурсивную функциюa
. Чтобы сделать подходящийa
, мы используем несколько отправок:Функция
all
принимает аргумент функции, поэтому мы вызываемa
каждый элемент ввода. Затем мы просто определяем функцию для представления какВ основном нам просто нужно,
a
но с проверкой, чтобы правильно обрабатывать[]
.Попробуйте онлайн!
источник
a(x)
илиg(x)
как!x
вместо?Грязь ,
161411 байтСпасибо Zgarb за сохранение 5 байтов.
Попробуйте онлайн!
e
Говорит копоти , чтобы попытаться соответствовать весь ввод и печать0
или в1
зависимости от того , что это возможно.|!
Фактически является «ни» оператор, потому чтоx|!y
это сокращение(x|y)!
. Таким образом, мы проверяем, что входные данные не содержат ноль, которому предшествует символ, и не являются строкой только из двух символов ([]
).Примечание о второй половине:
P#
соответствует прямоугольнику, который содержит хотя бы одно совпадениеP
. Тем не менее, в нашем случаеP
состоит из обоихs
и\0
так, что обычно требует скобок:(s\0)#
(потому что приоритет#
слишком высок). Но у Grime есть действительно удобная функция, в которой вы можете изменить приоритет операторов с помощью^
иv
. Таким образом,v#
мы используем более низкий#
приоритет, чтобы он был ниже, чем у любого другого оператора (включая конкатенацию), что позволяет нам сохранять байт в скобках.источник
Пип , 12 байт
Принимает массив в качестве аргумента командной строки в форме repr Pip, например
[1;[2;3]]
. Возвращается1
за правду,0
за фалси. Попробуйте онлайн или проверьте все контрольные примеры .объяснение
Бонусный ответ, 12 байт
Вот функция, которая принимает список вместо:
TIO
источник
Röda ,
5944 байтаПопробуйте онлайн!
f
принимает входные данные из своего потока в виде списка, который может содержать другие списки и целые числа. Возвращает,1
еслиa
правдива и ничего иного. Вспомогательная функцияg
проверяет,a
содержит ли нули.Объяснение:
Решение, использующее регулярные выражения, может быть короче.
Этот ответ мог бы быть короче, если бы ему было разрешено возвращать несколько значений. Это обсуждалось в одном из моих ответов ранее, и был сделан вывод, что в правилах по умолчанию разрешено возвращать разные значения «истина» и «ложь» для разных входных данных, но по какой-то причине OP запрещает это здесь и там. :(
источник
Чудо , 15 байт
Использование:
Сгладить ввод, получить все вхождения 0, логическое НЕ, логическое И с вводом.
источник
Haskell , 62 байта
Попробуйте онлайн!
Это функция
String -> Bool
. Списки на Haskell разнородны, поэтому нет встроенного способа представления таких списков, как[0, [0]]
.источник
,
``.Python 2 ,
45 3938 байтПопробуйте онлайн!
-6 благодаря @BenFrankel
предыдущая версия, без преобразования списка в строку repr, 68 байт:
источник
[]
. Следующее сохраняет 6 байтов и успешно[]
:lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)
MATLAB, 49 байтов
Так как MATLAB (как и Octave) не допускает такого рода вложенных массивов, мы интерпретируем его как строку.
Сначала мы заменяем все нецифровые символы пробелом. Затем мы используем его
str2num
для преобразования в (1D) массив, к которому мы можем применитьall
(что разрешено, так как это не полностью решает эту задачу самостоятельно).источник
egrep, 7 + 3 = 10 байт
+3 байта для требуемого
-v
флага, чтобы инвертировать результат.Grep не имеет никакого представления о массивах, поэтому здесь используется строковое представление, приведенное в вопросе. Принимает ввод в одну строку из stdin, возвращает через код выхода (игнорировать stdout).
(Теперь использую версию, которая не учитывает
01
и похожую, так как, по словам Бога, все в порядке)Оригинальная запись bash / grep:
Находит
0
s в любом месте (используя проверку границ слова\<
и\>
для исключения таких вещей, как10
илиa1
), или сопоставление всей строки[]
, затем инвертирует совпадение.Сломать:
источник
\<0\|^.]
плюс-v
считается как 11-байтовое решение.egrep
а неgrep
на сохранение дополнительного байта; имя языка не учитывается при подсчете байтов!)Javascript ES6, 24 символа
Работает с массивом, возвращает
1
или0
:Тест:
источник
!!
(хотя тогда вы должны изменить&
на&&
). Сохраняет один байт.&
. В случае&&
без!!
последовательного вывода будет нарушено:undefined
для[]
,0
для[0]
и[0,1,2]
иfalse
для других.&&
том, чтобы перейти к тому , что вам понадобится, если вы примете мое первое предложение, поскольку2 & 1 == 0
.√ å ı ¥ ® Ï Ø ¿ ,
124 байтаобъяснение
Если результат нужно вывести ...
Предыдущее решение
Я написал это до того, как понял, что основанные на стеке языки могут оставить значение в стеке как форму вывода
объяснение
источник
Хаскелл, 45
Как отмечали Линн и xnor , Haskell не имеет гетерогенно-вложенного типа списка. Но это легко добавить их в качестве типа пользовательских данных и функция работать на этом типе, и это гораздо preferrable к работе на (Urgh!) Строк .
Чтобы действительно иметь возможность выписывать такие списки как литералы с
[1, [2]]
синтаксисом, вам также нужен некоторый класс типов fu. Полный тестовый пример:Попробуйте онлайн!
источник
Vim, 23 байта
Попробуйте онлайн!
Выводит пустую строку для false или
1
для true. Это может быть короче, если я могу вывести пустую строку или[]
для false (оба из которых являются ложными значениями в vim).источник
С накоплением , 20 байтов
Попробуйте онлайн!
В качестве альтернативы, используя строку:
Попробуйте онлайн!
источник
Lithp , 74 байта
Попробуйте онлайн!
Ну, это оказалось дольше, чем я надеялся.
[]
Дело споткнулся меня и добавил несколько байт. Он просто выравнивает список и делает сгиб слева над ним, и если он находит 0, он устанавливает аккумулятор в 0.источник
Рубин ,
2422 байтаПопробуйте онлайн!
Да, я знаю, что в Ruby есть лучшее решение, но я хотел найти такое, которое будет использовать массив вместо ввода.
источник
тинилисп ,
7064 байтаПоследняя строка - это неназванная лямбда-функция, которая принимает список и возвращает
1
«правду-под-Ȧ» и «0
ложь». Попробуйте онлайн!Ungolfed
Рекурсивная вспомогательная функция
_Ȧ
выполняет большую часть работы. Если его аргумент является списком, мы обращаемсяmap
_Ȧ
к его элементам и возвращаемся,1
если ониall
правдивы,0
если они ложные. (Удобно, когдаall
возвращается1
пустой список.) В противном случае аргумент должен быть целым числом; мы возвращаем его как есть (0
это ложь, а все другие целые числа истинны в tinylisp).Основная функция
Ȧ
проверяет, является ли список непустым. Если это так, он звонит_Ȧ
; если нет, то возвращается0
.Гольф-версия использует некоторое неопределенное поведение: вместо
(e(type X)List)
проверкиX
используется целое число или список(c()X)
, в котором делается попыткаcons
(предварять) пустой списокX
. ЕслиX
это список, это приводит к непустому списку, который является правдивым. ЕслиX
это целое число, tinylisp выводит сообщение об ошибке и возвращает пустой список, который является ложным. Поскольку stderr игнорируется, этот подход является действительным.источник
PHP,
6354 байта9 байтов сохранено @ user63956
принимает массив в качестве входных данных; возвращает
true
илиfalse
: Если$a
не пусто,проверьте,
print_r
содержит ли выход0
значение.матричное решение, 83 байта
рекурсивная функция возвращает
1
или0
.сломать
источник
strpos(print_r($a,1)," 0")
вместоpreg_match(...)
.print_r
параметре. Большой!