Це правда? Спитайте желе!


32

Фон

Надихнувшись дуже зручною інтерпретацією матриць "фальшиві / фальсифіковані" матриці Октава (і, на розширення, MATL), Джеллі отримав атом Ȧ ( все в стилі Октави ).

Ȧ приймає масив як вхідний і повертає 1, якщо масив не порожній і не містить числа 0 (ціле число, плаваючий чи складний) де-небудь в структурі дерева ; в іншому випадку він повертає 0 .

Наприклад, масив [[]] є правдоподібним, тому що він не порожній і не містить нулів, але [[0]] є хибним, тому що містить 0 на найглибшому рівні.

Завдання

На обраній вами мові програмування напишіть повну програму або функцію, яка приймає, можливо, порожній, можливо зазубрований масив цілих чисел у якості вхідних даних і друкує або повертає значення truthy або хибного значення, яке вказує, чи return поверне 1 або 0 відповідно.

Ваше подання повинне дотримуватися наступних правил.

  • Значення truthy та Falsy повинні бути узгодженими для всіх вхідних даних , тобто всі масиви, для яких Ȧ повертає 1, повинні відображати одне і те ж значення truthy, а всі масиви, для яких Ȧ повертає 0, повинні відображати однакове хибне значення.

  • Оскільки повні програми можуть приймати як вхідні дані лише рядкові представлення масивів, це дозволено. Однак ви повинні використовувати канонічну репрезентацію своєї мови, повернуту reprчи подібною.

    Зокрема, ви не можете припустити, що першому елементу масиву буде передувати пробіл.

  • Якщо (і лише якщо) ваша мова не може вручну представляти зазубровані масиви, ви можете взяти рядкове введення даних, використовуючи канонічний синтаксис будь-якої раніше існуючої мови програмування.

  • Якщо у вашій мові є кілька способів представлення нерівних масивів (наприклад, списки та кортежі), вам потрібно підтримувати лише один із них.

  • Якщо у вашій мові є вбудований, який сам по собі є дійсним поданням на цей виклик, ви можете не використовувати його у своїй відповіді . Усі інші вбудовані дозволені.

  • Вам рекомендується розміщувати відповіді, використовуючи як маніпулювання, так і рядкові маніпуляції, навіть якщо один значно коротший за інший.

  • Діють усі стандартні правила .

Нехай виграє найкоротший код у байтах!

Пробні кейси Truthy

[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
Це не зазубровані масиви - нерівні масиви мали б усі числа на однаковій глибині, оскільки змінюються лише розміри, а не типи елементів.
Ørjan Johansen

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

Відповіді:


38

Желе, 3 байти

ṭFẠ

F вирівнює список вводу.

вказує на початковий список введення як елемент, який є помилковим, якщо і лише якщо він порожній.

потім перевіряє, чи будь-який елемент у сплющеному списку чи сам початковий список є хибним.


(Оригінальна відповідь)

FẠ^Ṇ

Дякуємо Деннісу за те, що він заохочував знайти рішення, яке відповідає його.

FẠдає 0, якщо вхід містить помилкове значення на будь-якій глибині, інакше 1. Це те, що Ȧробить, крім порожніх списків.

дає 1, якщо вхід - помилкове значення, інше 0. Єдиний список хибних файлів - це порожній список.

XOR-ing обидва дає відповідь.


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|^..$/}

Це Proc, який бере один аргумент, масив, який підлягає тестуванню.

Дякую Мартіну Ендеру за байт та Вентеро за два байти!


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

8

Желе , 4 байти

FẠ_Ṇ

Спробуйте в Інтернеті!

Ȧвиходить, 0якщо вхід порожній або містить a 0, інакше він є 1.

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

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


Один вниз, хоча б ще один.
Денніс

@Dennis Це не так FẠạṆ, правда?
Ерік Аутгольфер

@EriktheOutgolfer Ні, це не так. Я маю на увазі відповідь, яка стосується кращого випадку порожнього масиву, і це дасть інший результат для не масивів.
Денніс

@Dennis Як повернути A для True, B для false, C для порожнього та D для non-масиву? Це було б неконкурентоспроможним. Що я зробив, це використовувати абсолютну різницю, а не різницю, оскільки немає негативних булів.
Ерік Аутгольфер

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

8

05AB1E , 9 8 байт

-1 байт завдяки Еміньї

)Q¹˜0å~_

Пояснення:

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

Спробуйте в Інтернеті!


Здається, не вдається [[]].
Денніс

Чи дійсно 0 правдивий у 05AB1E?
Денніс

всі масиви , для яких Ȧ повертає 1 , повинен відображатися в одній і той же truthy значення, і все масиви , для яких Ȧ повертає 0 повинні відображатися в одній і той же falsy значення (курсив мій)
Dennis

1
@Денніс Гаразд, зафіксував там байт логічного заперечення.
Окс

1
Ах, тільки для мене. : P
Денніс

7

Математика, 17 байт

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

FreeQробить чек проти 0нас, але, звичайно, він повернеться Trueдля введення {}, тому нам потрібно перевірити цю справу окремо.


7

APL (Діалог), 21 12 7 байт

Полював 5 байт завдяки Adám, використовуючи вилки

⍬∘≡⍱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∊∊. Спробуйте в Інтернеті!
Adám

Також ви можете скористатися назвою "APL (Dyalog)", щоб люди могли знайти те, що ви використовуєте.
Adám

@ 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 байти, використовуючи ту саму техніку, що і відповідь Рубіна Дорноба .

14 байт коду + -pпрапор

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

Спробуйте в Інтернеті!

/.../гарантує, що масив не порожній (він буде відповідати будь-якому масиву, але []. він
/\b0/буде відповідати лише за наявності 0в масиві. ( \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і такі 1, які не є Truthy / Falsey в Haskell.

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]нуль, оскільки результат у цьому випадку повинен бути помилковим.)
Ніл

Неважливо, я бачив, що Кверті вже потрапив туди.
Ніл

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замість неї?
Кіос

4

Grime , 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)

ТІО


3

Рода , 59 44 байти

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

Спробуйте в Інтернеті!

fприймає вхід зі свого потоку як список, який може містити інші списки та цілі числа. Він повертається, 1якщо aє truthy і нічого іншого. Функція помічника 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) */

Рішення, яке використовує регулярні виразки, може, швидше за все, бути коротшим.

Ця відповідь могла бути коротшою, якби дозволено повернути кілька значень. Це було обговорено в одній з моїх відповідей раніше, і було зроблено висновок про те, що в правилах за замовчуванням дозволяється повертати різні значення "хитрість" і "хибність" для різних входів, але ОП чомусь забороняє це тут і там. :(


3

Диво , 15 байт

@&#0! iO0flat#0

Використання:

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

Згладьте вхід, отримайте всі входи 0, логічно НЕ, логічно І з введенням.


3

Хаскелл , 62 байти

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

Спробуйте в Інтернеті!

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


Виходячи з перероблених правил, на входах не повинно бути пробілів, оскільки масиви Haskell за замовчуванням не мають. Принаймні, я думаю, що це інтерпретація, хоча Haskell не дозволяє зазубрувати масиви. Але схоже, що ваш код працюватиме так само, як і ,для ``.
xnor

2
Як я зачіпка в коментарях питання, Haskell дійсно мають нерівні масиви (і списки) - це просто , що це не зовсім достатньо для того, що вимагає це питання.
Ørjan Johansen

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+\>|^.]'

Знаходиться 0з будь-якого місця (використовуючи слово "кордони" \<та \>знижуючи такі речі)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 '[]')

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

1
@Dennis круто, дякую! (Я перейшов, 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]]синтаксисом, вам також потрібен певний тип фу. Повний тестовий випадок:

{-# 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

Вім, 23 байти

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

Спробуйте в Інтернеті!

Виводить порожній рядок для помилкового або 1для істинного. Це може бути коротше, якщо я можу вивести порожній рядок або [] помилковий (обидва з них є фальшивими значеннями vim).



1

Літп , 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для "truthy-under-Ȧ" та 0для falsey.Спробуйте в Інтернеті!

Безумовно

(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є фальси, а всі інші цілі числа є тритумними в тиніліспі).

Основна функція Ȧперевіряє, чи список не порожній. Якщо так, то він дзвонить ; якщо ні, то повертається 0.

Версія для гольфу використовує деяку не визначену поведінку: замість того, (e(type X)List)щоб перевірити, чи Xє ціле число чи список, це робить (c()X), що намагається cons(додати) порожній список на X. Якщо Xце список, це призводить до непустого списку, який є правдою. Якщо Xце ціле число, тинілісп виводить повідомлення про помилку та повертає порожній список, який є фальсією. Оскільки stderr ігнорується, такий підхід є дійсним.


0

PHP, 63 54 байти

9 байт, збережених користувачем @ user63956

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

приймає масив як вхідний; повертає trueабо false: Якщо $aце не порожньо,
перевірте, чи print_rмістить вихід a0 значення.

рішення масиву, 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.