Это правда? Спроси желе!


32

Задний план

Вдохновленный очень удобной интерпретацией 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]

Основываясь на контрольных примерах, вы подразумеваете «содержать число 0», чтобы обозначать где-либо в древовидной структуре? Это не то, что я догадался, что это значит.
xnor

Да где угодно Я постараюсь уточнить это.
Деннис

Что именно вы имеете в виду «вы не можете предполагать, что строковое представление будет иметь определенный формат»?
Дада

2
Это не неровные массивы - неровные массивы будут иметь все числа на одной глубине, потому что меняются только размеры, а не типы элементов.
Орджан Йохансен

2
@Qwertiy Правильно, "большинство" языков, где "все" - это Object... мой любимый язык - это Haskell, где это не так. Ни в C, по крайней мере, не так, чтобы вы могли безопасно смешивать массивы и целые. Оба этих языка вполне способны использовать зубчатые массивы, но все еще не могут использовать их для этой проблемы.
Орджан Йохансен

Ответы:


38

Желе, 3 байта

ṭFẠ

F выравнивает список ввода.

привязывает исходный список ввода как элемент, который ложен тогда и только тогда, когда он пуст.

затем проверяет, является ли какой-либо элемент в плоском списке или сам исходный список ложным.


(Оригинальный ответ)

FẠ^Ṇ

Спасибо Деннису за поддержку в поиске решения, соответствующего его.

FẠдает 0, если вход содержит ложное значение на любой глубине, иначе 1. Это то Ȧ, что делает, за исключением пустых списков.

дает 1, если вход является ложным значением, иначе 0. Единственный ложный список - пустой список.

XOR-IN два дает ответ.


F;WẠ

Это во многом в том же духе, что и у Денниса F;LẠ, но вместо того, Lчтобы ставить ноль в списке, когда список пуст, он использует Wдля помещения пустого списка в себя (создания [[]]), в результате чего он содержит ложный элемент.


30
Превзойденный в моих собственных вызовах и моем собственном языке ... Молодец!
Деннис

15

Сетчатка , 10 байт

A`\b0
^...

Попробуйте онлайн!

Сначала мы удаляем вход, если он содержит ноль. Мы пытаемся сопоставить не менее трех символов в начале строки (чтобы гарантировать, что ввод не был исключен на предыдущем этапе или был только []для начала).


12

Рубин, 25 24 23 18 16 байт

p$_!~/\D0|^..$/

Требуется -nфлаг в командной строке (+1 байт, -e-> -ne).

Попробуйте онлайн!

Это полная программа, которая принимает входные данные в формате канонического массива Ruby на STDIN и выводит trueили falseна STDOUT.

 $_              # line of input that was read automatically (-n)
   !~/        /  # does not match the regex...
      \D0        #   a non-digit followed by a 0
         |       #   or...
          ^..$   #   a 2-length string (which must be [], the empty array)
p                # output the result

23-байтовая версия функции:

->a{"#{a}"!~/\D0|^..$/}

Это процесс, который принимает один аргумент, массив для тестирования.

Спасибо Мартину Эндеру за байт и Вентеро за два байта!


Вы можете сохранить еще два байта, используя p$_!~/\D0|^..$/(или p ! ~/\D0|^..$/, возможно, значительный пробел) вместе с -nфлагом.
Вентеро

8

Желе , 4 байта

FẠ_Ṇ

Попробуйте онлайн!

Ȧвозвращает, 0если вход пуст или содержит 0, в противном случае это 1.

FẠВозвращает, 0если сглаженный вход содержит a 0, оставляя только крайний случай пустого массива (поскольку вход гарантированно будет массивом).

это не векторизованная логическая не монада, и, следовательно, возвращает 0для любого непустого списка и 1для пустого списка. Таким образом, это может быть просто вычтено из результата FẠиспользования _.


Один вниз, по крайней мере, еще один, чтобы уйти.
Деннис

@ Денис Это не так FẠạṆ?
Эрик Outgolfer

@EriktheOutgolfer Нет, это не так. Ответ, который я имею в виду, имеет дело с краевым случаем пустого массива и даст другой результат для не-массивов.
Деннис

@Dennis Как вернуть A для True, B для false, C для пустого и D для не-массива? Это было бы неконкурирующим. Я использовал абсолютную разницу вместо разницы, потому что нет отрицательных логических значений.
Эрик Outgolfer

@EriktheOutgolfer B должен соответствовать C, чтобы соответствовать спецификации вызова, но D может быть любым, поскольку входные данные гарантированно будут массивом.
Деннис

8

05AB1E , 9 8 байт

-1 байт благодаря Emigna

)Q¹˜0å~_

Объяснение:

)Q        Is the length of the input 0?
  ~    _  ... NOR ... (just for you, Dennis) 
   ¹˜     Input deep flattened
     0å   Contains 0

Попробуйте онлайн!


Кажется, не удалось [[]].
Деннис

Действительно ли 0 действительно правдив в 05AB1E?
Деннис

все массивы, для которых Ȧ возвращает 1, должны отображаться на одно и то же истинное значение, а все массивы, для которых Ȧ возвращает 0, должны отображаться на одно и то же ложное значение (выделено мое)
Деннис

1
@ Денис Хорошо, забил логический отрицательный байт там.
Okx

1
Ой, только для меня. : P
Деннис

7

Mathematica, 17 байт

#!={}&&#~FreeQ~0&

FreeQвыполняет проверку 0для нас, но, конечно, он вернется Trueдля ввода {}, поэтому мы должны проверить этот случай отдельно.


7

APL (Dyalog), 21 12 7 байтов

Гольф 5 байтов благодаря Адаму с помощью вилок

⍬∘≡⍱0∊∊

Попробуйте онлайн!

Это моя первая попытка в Dyalog. Советы по гольфу приветствуются!

объяснение

⍬∘≡                   Fork; Is the argument a null set
   ⍱                  Nor
    0∊∊               0 belongs to the enlisted form of the argument
                      For example, (1 (2 (3 (0)))) would become
                      1 2 3 0 using the ∊ monad
                      Then we check if zero belongs to this vector

+1 Обратите внимание, что вы объединяете результаты двух тестов. Это идеально подходит для вилки. ⍬∘≡является левым тестом (пустой набор, привязанный к идентично-к), и 0∊∊является правым тестом (сам по себе форк; нулевой член зачисленной формы). Положите это вместе ⍬∘≡⍱0∊∊. Попробуйте онлайн!
Адам

Также вы можете использовать имя «APL (Dyalog)», чтобы люди могли найти то, что вы используете.
Адам

@ Adám Спасибо за советы!
Kritixi Lithos

6

Язык сценариев работы Flashpoint , 199 188 байт

A={f={private["_i","_r"];_r=1;_i=0;while{_i<count _this}do{o=_this select _i;if(o in [o])then{if(o==0)then{_r=0}}else{_r=o call f};_i=_i+1};_r};if(count _this==0)then{0}else{_this call f}}

Звоните с:

[3,6,4,[4,6],[3,6,[],[2,4,[0],3]]] call A

или с:

hint format["%1", [3,6,4,[4,6],[3,6,[],[2,4,[0],3]]] call A]

Объяснение:

На языке сценариев игры может быть вызвана любая строка, содержащая код. Фигурные скобки {}обозначают начало и конец строки. (Кавычки работать тоже, но получает 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возвращаемым значением.

Можно заметить, что кажется, что точка с запятой будет отсутствовать в нескольких местах, но это не так, потому что точка с запятой необходима только после оператора, если другой оператор следует за ним внутри того же блока кода (то есть строки).


Чего ждать?! Операция Flashpoint?
Brain Guider

Ват как? что??? смутил
Кристофер

@DownChristopher Добавлено объяснение.
Steadybox

1
@AnderBiguri Да, а почему бы и нет? Язык сценариев игры соответствует определению языка программирования, приведенному в мета-посте, связанном в вопросе.
Steadybox

1
@Steadybox Я смущен существованием вещи, а не ее действительностью!
Brain Guider

5

Perl 5 , 15 байт

Сохранено 2 байта, используя ту же технику, что и в ответе Doorknob на Ruby .

14 байт кода + -pфлаг

$_=!/\b0|^..$/

Попробуйте онлайн!

/.../гарантирует, что массив не пустой (он будет совпадать с любым массивом, но [].
/\b0/будет совпадать, только если 0в массиве есть a ( \bгарантирует, что 0не является частью другого числа, а является целым числом).


5

Haskell , 48 байтов

f x=or[elem c"[,"|c:'0':_<-scanr(:)[]x]<(x<"[]")

Попробуйте онлайн!

Спасибо Линн за тестовые случаи и x<"[]"трюк.

Внешнее неравенство должно (x<"[]")быть Истинным (непустой список) и or[elem c"[,"|c:'0':_<-scanr(:)[]x]Ложным (без нулей).

Символы 0обнаруживаются как следующие за ,или [, в отличие от числа, подобного 20. Выражение scanr(:)[]xгенерирует все достаточно lи c:'0':_<-захватывает тех, чей второй символ '0'. Затем elem c"[,"проверяет, является ли первый символ ,или [.

Здесь я предполагаю, что списки в стиле Haskell не имеют пробелов, но в таком случае их ','можно просто заменить на ' '.

Вот более прямой 48-байтовый метод, хотя он производит 0's 1' и 's', которые не являются Истиной / Ложью в Хаскеле.

f"[]"=0
f(c:'0':_)|elem c"[,"=0
f(_:t)=f t
f _=1

5

Желе , 4 байта

F;LẠ

Попробуйте онлайн!

Как это работает

F;LẠ  Main link. Argument: A (array)

F     Flatten A.
  L   Yield A's length.
 ;    Concatenate.
   Ạ  All; Tell if all elements of the resulting 1D array are truthy.

Обратите внимание, что атом Ạ ведет себя так же, как и Python, allи поэтому довольно сильно отличается от запрещенного Ȧ.


8
Heads-up: это не единственное 4-байтовое решение Jelly, кроме очевидного L;FẠ. Кто может найти другой?
Деннис

4

JavaScript (ES6), 34 байта

a=>a.length&&+!~`,${a}`.search`,0`

Контрольные примеры


Вы, вероятно, можете использовать !!a[0]вместо a.length. (Вам не нужно беспокоиться о a[0]том, чтобы быть нулем, так как результат в любом случае должен быть ложным в этом случае.)
Нейл

Неважно, я видел Qwerty уже там.
Нил

4

Юлия, 45 байт

a(x)=all(a,x);a(x::Int)=x!=0;g(x)=x!=[]&&a(x)

Это создает функцию, gкоторая указывает, будет ли Ȧ иметь значение 1 или 0, вызывая рекурсивную функцию a. Чтобы сделать подходящий a, мы используем несколько отправок:

# A method for scalar values
a(x::Int) = x != 0

# A recursive fallback for arrays
a(x) = all(a, x)

Функция allпринимает аргумент функции, поэтому мы вызываем aкаждый элемент ввода. Затем мы просто определяем функцию для представления как

g(x) = x != [] && a(x)

В основном нам просто нужно, aно с проверкой, чтобы правильно обрабатывать [].

Попробуйте онлайн!


Вы можете определить функцию a(x)или g(x)как !xвместо?
Cyoce

4

Грязь , 16 14 11 байт

Спасибо Zgarb за сохранение 5 байтов.

e`s\0v#|!..

Попробуйте онлайн!

eГоворит копоти , чтобы попытаться соответствовать весь ввод и печать 0или в 1зависимости от того , что это возможно.

|!Фактически является «ни» оператор, потому что x|!yэто сокращение (x|y)!. Таким образом, мы проверяем, что входные данные не содержат ноль, которому предшествует символ, и не являются строкой только из двух символов ( []).

Примечание о второй половине: P#соответствует прямоугольнику, который содержит хотя бы одно совпадение P. Тем не менее, в нашем случае Pсостоит из обоих sи \0так, что обычно требует скобок: (s\0)#(потому что приоритет #слишком высок). Но у Grime есть действительно удобная функция, в которой вы можете изменить приоритет операторов с помощью ^и v. Таким образом, v#мы используем более низкий #приоритет, чтобы он был ниже, чем у любого другого оператора (включая конкатенацию), что позволяет нам сохранять байт в скобках.


3

Пип , 12 байт

#Va&`\b0`NIa

Принимает массив в качестве аргумента командной строки в форме repr Pip, например [1;[2;3]]. Возвращается 1за правду, 0за фалси. Попробуйте онлайн или проверьте все контрольные примеры .

объяснение

              a is 1st cmdline arg (implicit)
 Va            Eval a (converting from a string to a list)
#              Take the length (0 if empty, nonzero if nonempty)
   &          Logical AND
    `\b0`      Regex pattern: word boundary followed by 0 (avoids things like 10)
         NIa   Not in a (0 if `\b0` matches in a, 1 if it doesn't)
              Autoprint

Бонусный ответ, 12 байт

Вот функция, которая принимает список вместо:

#_>0=0N_Js^s

#_            Len(arg)
  >0          is greater than 0
    =         which also equals the following (comparison operators chain like Python's):
     0N       Count of 0's in
       _Js^s  arg, joined on space and then split on space (a hacky way to flatten)

TIO


3

Röda , 59 44 байта

f a{[1]if{g(a)[[]!=a]}}g a{[a!=0];try a|g _}

Попробуйте онлайн!

fпринимает входные данные из своего потока в виде списка, который может содержать другие списки и целые числа. Возвращает, 1если aправдива и ничего иного. Вспомогательная функция gпроверяет, aсодержит ли нули.

Объяснение:

f a{[1]if{g(a)[[]!=a]}}
f a{                  } /* Function declaration */
          g(a)          /* Call g -> pushes some booleans to the stream */
              [[]!=a]   /* Push value []!=a to the stream */
       if{           }  /* If all booleans in the stream are true: */
    [1]                 /*   Push 1 to the stream */
                        /* Otherwise return nothing */

g a{[a!=0];try a|g _}   /* Helper function */
g a{                }   /* Function declaration */
    [a!=0];             /* Push value a!=0 to the output stream */
           try          /* Ignore errors in the following if a is not a list */
               a        /* Push values in a to the stream */
                |g _    /* Pull values from the stream and */
                        /*   call g for each of them */
                        /*   (pushes boolean values to the output stream) */

Решение, использующее регулярные выражения, может быть короче.

Этот ответ мог бы быть короче, если бы ему было разрешено возвращать несколько значений. Это обсуждалось в одном из моих ответов ранее, и был сделан вывод, что в правилах по умолчанию разрешено возвращать разные значения «истина» и «ложь» для разных входных данных, но по какой-то причине OP запрещает это здесь и там. :(


3

Чудо , 15 байт

@&#0! iO0flat#0

Использование:

(@&#0! iO0flat#0)[1;2;3;[8;9;0]]

Сгладить ввод, получить все вхождения 0, логическое НЕ, логическое И с вводом.


3

Haskell , 62 байта

import Data.List
(%)=isInfixOf
f x=not(",0"%x||"[0"%x)&&x<"[]"

Попробуйте онлайн!

Это функция String -> Bool. Списки на Haskell разнородны, поэтому нет встроенного способа представления таких списков, как [0, [0]].


Исходя из переформулированных правил, входные данные не должны иметь пробелов, потому что массивы Haskell по умолчанию не имеют. По крайней мере, я думаю, что это интерпретация, хотя Haskell не допускает зубчатые массивы. Но похоже, что ваш код будет работать так же с ,``.
xnor

2
Как я придирка в комментариях вопрос, Haskell действительно имеют неровные массивы (и списки) - это просто , что это не совсем достаточно для того, что требует этот вопрос.
Орджан Йохансен

3

Python 2 , 45 39 38 байт

lambda a:(a>[])^(' 0'in`a`or'[0'in`a`)

Попробуйте онлайн!

-6 благодаря @BenFrankel


предыдущая версия, без преобразования списка в строку repr, 68 байт:

lambda a:(len(a)and g(a))*1
g=lambda b:all(map(g,b))if b>[]else b!=0

Это дает ложное срабатывание []. Следующее сохраняет 6 байтов и успешно []:lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)
Бен Франкель

2

MATLAB, 49 байтов

Так как MATLAB (как и Octave) не допускает такого рода вложенных массивов, мы интерпретируем его как строку.

Сначала мы заменяем все нецифровые символы пробелом. Затем мы используем его str2numдля преобразования в (1D) массив, к которому мы можем применить all(что разрешено, так как это не полностью решает эту задачу самостоятельно).

s=input('');s(s<45|s>57)=32;disp(all(str2num(s)))

2

egrep, 7 + 3 = 10 байт

\<0|^.]

+3 байта для требуемого -vфлага, чтобы инвертировать результат.

Grep не имеет никакого представления о массивах, поэтому здесь используется строковое представление, приведенное в вопросе. Принимает ввод в одну строку из stdin, возвращает через код выхода (игнорировать stdout).

(Теперь использую версию, которая не учитывает 01и похожую, так как, по словам Бога, все в порядке)

Оригинальная запись bash / grep:

grep -Ev '\<0+\>|^.]'

Находит 0s в любом месте (используя проверку границ слова \<и \>для исключения таких вещей, как 10или a1), или сопоставление всей строки [], затем инвертирует совпадение.

Сломать:

grep
     -E \    # extended regular expression syntax
     -v \    # invert match
     \<0+\>  # a number of 0s with alphanumeric boundaries on both sides
     |^.\]   # or ']' as the second character (implies '[]')

Не измена, просто хороший гольф. :) Кстати, grep способен тестировать на простоту, поэтому для PPCG это язык программирования. \<0\|^.]плюс -vсчитается как 11-байтовое решение.
Денис

1
@ Денис круто, спасибо! (Я переключился на сохранение, egrepа не grepна сохранение дополнительного байта; имя языка не учитывается при подсчете байтов!)
Дейв

2

Javascript ES6, 24 символа

Работает с массивом, возвращает 1или 0:

a=>!!a[0]&!/\b0/.test(a)

Тест:

f=a=>!!a[0]&!/\b0/.test(a)

console.log([
  [1],
  [10],
  [[]],
  [[[[1]]]],
  [[], [1], [1, 2]],
  [[1], [1, [2]], [1, [2, [3]]]],
  [[8], [8, [9]], [8, [9, [10]]]],
].every(x => f(x)===1))

console.log([
  [],
  [0],
  [0, -1],
  [-1, 0],
  [[[[0]]]],
  [[0], [1, 2], [3, 4, 5]],
  [[8], [8, [9]], [8, [9, [1, 0]]]],
].every(x => f(x)===0))


Поскольку возвращаемое значение может быть истинным / ложным, вы можете отбросить !!(хотя тогда вы должны изменить &на &&). Сохраняет один байт.
Брайан Маккатон

@BrianMcCutchon, нет, поскольку есть двоичный файл &. В случае &&без !!последовательного вывода будет нарушено: undefinedдля [], 0для [0]и [0,1,2]и falseдля других.
Qwertiy

Я не понимаю, как нарушить последовательный вывод плохо в этом вызове. Суть в &&том, чтобы перейти к тому , что вам понадобится, если вы примете мое первое предложение, поскольку 2 & 1 == 0.
Брайан МакКатчон

@BrianMcCutchon, первая точка вопроса: «Истинные и ложные значения должны быть согласованы для всех входных данных, т. Е. Все массивы, для которых Ȧ возвращает 1, должны отображаться на одно и то же истинное значение, а все массивы, для которых Ȧ возвращает 0, должны отображаться к тому же ложному значению. "
Qwertiy

Ах, я снял это слишком быстро. Не берите в голову.
Брайан МакКатчон

2

√ å ı ¥ ® Ï Ø ¿ , 12 4 байта

i0Bu

объяснение

i            › Take input as a list and automatically flatten it. If empty, push 0.
 0           › Push 0 to the stack
  B          › Pop 0 and push the number of times it appears
   u         › convert top value to its boolean 

Если результат нужно вывести ...

i0Buo        › same as above; o outputs the top value on the stack

Предыдущее решение

Я написал это до того, как понял, что основанные на стеке языки могут оставить значение в стеке как форму вывода

i0B¿0oP?!¿o?

объяснение

i            › Take input as a list and automatically flatten it. If empty, push 0.
 0           › Push 0 to the stack
  B          › Pop 0 and push the number of times it appears
   ¿         › If the top value is true ...
    0        › Push 0
     o       › Output the top value on the stack
      P      › Pop the top value from the stack
       ?     › End if statement
        !    › Boolean opposite of top value
         ¿   › If the top value is true ...
          o  › Output the top value
           ? › End if statement

2

Хаскелл, 45

Как отмечали Линн и xnor , Haskell не имеет гетерогенно-вложенного типа списка. Но это легко добавить их в качестве типа пользовательских данных и функция работать на этом типе, и это гораздо preferrable к работе на (Urgh!) Строк .

data L=L Int|T[L]
f(L n)=n/=0
f(T l)=all f l

Чтобы действительно иметь возможность выписывать такие списки как литералы с [1, [2]]синтаксисом, вам также нужен некоторый класс типов fu. Полный тестовый пример:

{-# LANGUAGE OverloadedLists, TypeFamilies #-}
import GHC.Exts (IsList(..))

instance Num L where
  fromInteger = L . fromInteger
  negate (L n) = L $ negate n
instance IsList L where
  type Item L = L
  fromList = T
main = mapM_ (print . f) (
                    [ [1]
                    , [[[[0]]]]
                    , [[8], [8, [9]], [8, [9, [1, 0]]]]
                    ] :: [L])

Попробуйте онлайн!


2

Vim, 23 байта

:g/0\|^..$/d
:s/.\+/1/<CR>

Попробуйте онлайн!

Выводит пустую строку для false или 1для true. Это может быть короче, если я могу вывести пустую строку или [] для false (оба из которых являются ложными значениями в vim).



1

Lithp , 74 байта

(def f #L::((foldl(flatten L)(?(>(length L)0)1 0)#N,A::((?(== N 0)0 A)))))

Попробуйте онлайн!

Ну, это оказалось дольше, чем я надеялся. []Дело споткнулся меня и добавил несколько байт. Он просто выравнивает список и делает сгиб слева над ним, и если он находит 0, он устанавливает аккумулятор в 0.



1

тинилисп , 70 64 байта

(load library
(d _(q((X)(i(c()X)(all(map _ X))X
(q((L)(i L(_ L)0

Последняя строка - это неназванная лямбда-функция, которая принимает список и возвращает 1«правду-под-Ȧ» и « 0ложь». Попробуйте онлайн!

Ungolfed

(load library)

(def _Ȧ
 (lambda (val)
  (if (equal? (type val) List)
   (all (map _Ȧ val))
   val)))

(def Ȧ
 (lambda (ls)
  (if ls
   (_Ȧ ls)
   0)))

Рекурсивная вспомогательная функция выполняет большую часть работы. Если его аргумент является списком, мы обращаемся map к его элементам и возвращаемся, 1если они allправдивы, 0если они ложные. (Удобно, когда allвозвращается 1пустой список.) В противном случае аргумент должен быть целым числом; мы возвращаем его как есть ( 0это ложь, а все другие целые числа истинны в tinylisp).

Основная функция Ȧпроверяет, является ли список непустым. Если это так, он звонит ; если нет, то возвращается 0.

Гольф-версия использует некоторое неопределенное поведение: вместо (e(type X)List)проверки Xиспользуется целое число или список (c()X), в котором делается попытка cons(предварять) пустой список X. Если Xэто список, это приводит к непустому списку, который является правдивым. Если Xэто целое число, tinylisp выводит сообщение об ошибке и возвращает пустой список, который является ложным. Поскольку stderr игнорируется, этот подход является действительным.


0

PHP, 63 54 байта

9 байтов сохранено @ user63956

function a($a){return$a&&!strpos(print_r($a,1)," 0");}

принимает массив в качестве входных данных; возвращает trueили false: Если $aне пусто,
проверьте, print_rсодержит ли выход 0значение.

матричное решение, 83 байта

function b($a,$r=0){$r|=$a;foreach($a as$v)$r|=is_array($v)?b($v,1):!!$v;return$r;}

рекурсивная функция возвращает 1или 0.

сломать

function b($a,$r=0)
{
    $r|=$a;         # if $a is not empty, set $r (no effect in recursion)
    foreach($a as$v)    # loop through elements:    
        $r&=is_array($v)    # 2. if test failed, clear $r
            ?b($v,1)        # 1. if array, recurse
            :!!$v;          #    else test element <>0
    return$r;           # return $r
}

1
Вы можете сохранить несколько байтов strpos(print_r($a,1)," 0")вместо preg_match(...).
user63956

@ user63956 ... и это также решает проблему 0-индекса. Я не знал о втором print_rпараметре. Большой!
Титус
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.