Определите, содержит ли Массив что-то отличное от 2


20

Возьмите массив, который состоит из чисел или массивов, выводите, если он содержит только 2s.

Вывод должен быть истинным или ложным значением (извините, если это уничтожает ответы)

Истинные тестовые случаи

[2]
[2,2]
[[2],[2,2],2]
[]
[[],[]]

Falsey Test Cases

[1]
[22]
[2,2,2,1]
[[1,2],2]

Стандартные лазейки запрещены.

IO по умолчаниюПрименяются правила .

Код-гольф, побеждает несколько байтов!


Можем ли мы взять строку, представляющую массив?
Пшеничный волшебник

Будут ли в массивах другие объекты, кроме чисел и других массивов
Wheat Wizard

Будут только массивы и числа, и строка, представляющая массив, подойдет.
ATaco

2
Что за цифры? Compex int, intex float, float int, int, не отрицательный?
РосЛюП

1
FTR и во имя правильного математического мышления: массив [[2]]вовсе не содержит два.
перестал поворачиваться против часовой стрелки

Ответы:


8

MATL , 3 байта

2=p

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

Технически это может быть просто

2=

Поскольку массив, содержащий любые нулевые элементы, является ложным, но это кажется дешевым.


Список, содержащий 0, является ложным? О чувак.
Эрик Outgolfer

Я не думаю, что 2-байтовая версия является действительной, поскольку в комментариях ATaco говорится, что действительна уникальная выходная пара .
Эрик Outgolfer

Я полагаю, 2=не для пустых матриц, или?
Стьюи Гриффин

@stewiegriffin Это кажется странным крайним случаем, с которым нужно разобраться, но удобно, что оно работает: попробуйте онлайн!
DJMcMayhem

Да, 2=pотлично работает. Более короткая версия, в конце концов 2=, не делает. Кроме того, "странные крайние случаи" - два из тестовых случаев. :-)
Стьюи Гриффин

15

Python 2 , 43 40 байт

f=lambda l:l>=[]and all(map(f,l))or l==2

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


На момент публикации этого ответа, он по - прежнему разрешен в этом мете консенсуса для вывода с помощью метания ошибки / не бросает ошибку. Поэтому этот ответ в 26 байтов был действительным:

f=lambda l:l==2or map(f,l)

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


1
Это отличный способ проверить, является ли элемент списком.
Аднан

Вот почему мне не нравится этот консенсус. Это действительно разрушает игру в гольф на питоне.
Пшеничный волшебник

Однако, поскольку вы используете код выхода, вам не нужно allничего, кроме ошибки, это правда.
Пшеничный волшебник

11

Пролог (SWI) , 43 33 байта

Я чувствую запах ... рекурсии .

Спасибо Emigna и Leaky Nun за сохранение 10 байтов!

Код

a([]).
a([X|T]):-(X=2;a(X)),a(T).

Попробуйте онлайн! или проверьте все контрольные примеры!

Объяснение:

Для не-Пролога пользователей, список отформатирован следующим образом: [Head | Tail].

Это Headпервый элемент списка, а tail - оставшийся список. Проверьте это здесь! , Важным случаем здесь является то, что хвост списка с 1 элементом равен []. Вы можете проверить это здесь .

% State that an empty array is truthy.
a([]).

% If the list is not empty (covered by the previous line), we need to check
% whether the Head is equal to 2 or whether the head is truthy.
% After that, we only need to check if the remaining list is truthy.
a([Head | Tail]) :- (Head = 2; a(Head)), a(Tail).


9

Октава, 13 байт

@(x)~any(x-2)

Проверьте все контрольные примеры.

Это анонимная функция, принимающая один входной аргумент x. Вычитает 2из всех элементов, проверяет, есть ли ненулевые элементы. Он отменяет вывод trueдля случаев, когда все значения равны нулю.

Это работает, потому что x-2работает для матриц всех размеров, включая пустую матрицу [].

x-2 было бы достаточно, если бы не было пустых матриц на входе.





6

JavaScript (ES6), 22 19 23 22 байта

a=>!/[^2,]|22/.test(a)

Проверь это

f=
a=>!/[^2,]|22/.test(a)
console.log(" "+f([2])+": "+JSON.stringify([2]))
console.log(" "+f([2,2])+": "+JSON.stringify([2,2]))
console.log(" "+f([[2],[2,2],2])+": "+JSON.stringify([[2],[2,2],2]))
console.log(" "+f([])+": "+JSON.stringify([]))
console.log(" "+f([[],[]])+": "+JSON.stringify([[],[]]))
console.log(f([1])+": "+JSON.stringify([1]))
console.log(f([22])+": "+JSON.stringify([22]))
console.log(f([2,2,2,1])+": "+JSON.stringify([2,2,2,1]))
console.log(f([[1,2],2])+": "+JSON.stringify([[1,2],2]))


Nice one! I wonder if it could be shortened some more, but I doubt it.
Arnauld

Thanks, @Arnauld; still haven't figured out a way to improve on it.
Shaggy



4

Mathematica, 24 байта

Cases[t=Flatten@#,2]==t&

Чистая функция возврата Trueили False. После FlattenИНГ вложенного массива и назвав его t, Cases[t,2]возвращает список элементов , которые соответствуют «образцу» 2, и ==tпроверяет , что является ли всем списком.

Mathematica, 29 байт

(#//.{2->{},{{}..}->{}})=={}&

Не так коротко, но веселее. Начиная с ввода #, применяются два правила замены, пока результат не перестанет изменяться ( //.): во-первых, все 2s заменяются на {}s; и затем любой список, все записи которого являются пустыми множествами ( {{}..}), заменяется (многократно) пустыми наборами. Если остальное пустое множество ( =={}), мы победим.


Превосходил , но я все еще очень хочу знать, что здесь делается.
Павел

4

Haskell , 36 байт

Анонимная функция, принимает Stringи возвращает Bool.

Использовать как (all((==2).fst).(reads=<<).scanr(:)[]) "[2,2,2,1]"

all((==2).fst).(reads=<<).scanr(:)[]

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

Как это устроено

  • Haskell не имеет встроенных списков смешанного типа, поэтому мы принимаем строку в качестве аргумента.
  • scanr(:)[] генерирует список всех суффиксов строки.
  • (reads=<<)пытается проанализировать число в начале каждого суффикса, объединяя успехи в список кортежей (n,restOfString).
  • all((==2).fst)проверяет весь разобранный номер 2.

Как насчет просто not.all(`elem`"2,[]")?
zbw

@zbw Это не из-за чисел, как 22.
Орджан Йохансен

4

Python 2 , 38 байт

lambda l:l.strip('[],2')==l*('22'in l)

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

Берет в строку без пробелов, выводит bool.

Проверяет , является ли удаление всех символов '[],2'из lдает пустую строку. Также проверяет, что 22не является подстрокой - если это так, lвместо пустой строки используется входные данные для сравнения с результатом удаления, и это всегда дает сбой.


4

Ruby, 28 23 22 байта - 5 байтов, сохраненных ГБ

->x{x.flatten-[2]==[]}

Несмотря на то, что «flatten» очень длинный, он все же короче, чем решения на основе регулярных выражений или рекурсивные вещи, которые должны спасать ошибки в базовом случае. Однако встроенная в Ruby комбинация множеств и массивов иногда бывает удивительно полезна.


1
x.flatten.uniq == [2]
Ник М

1
@NickM - это не сработает в тестовых случаях, таких как []или [[],[]]. [2,*x].flatten.uniq==[2]немного длиннее
ymbirtt

1
x.flatten | [2] == [2] будет короче.
ГБ

@GB и x.flatten-[2]==[]еще короче. Спасибо за чаевые!
ymbirtt

1
И все же regex выигрывает: codegolf.stackexchange.com/a/120781/18535 :-)
ГБ

3

JavaScript (ES6), 26 байт

f=a=>a.map?a.every(f):a==2

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


Вы должны считать, f=потому что вы сослались на это.
Утренняя монахиня

@ LeakyNun Действительно. Исправлена.
Арно

3

MATL , 4 байта

2-a~

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

Сломать:

           % Implicit input
2-         % Push 2 to the stack, and subtract from input
  a        % Any non-zero elements?
    ~      % Negate to get true for cases where all elements are zero.

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


3

R, 28 байт

function(x)!any(unlist(x)-2)

unlist(x)превращает (вложенный) список в вектор. Затем 2вычитается из этого вектора. anyпреобразует (с предупреждением) числовой в логический и проверяет, есть ли TRUEs. Это инвертируется !и выводится.

Это работает с вложенными списками, потому что unlistпо умолчанию работает рекурсивно, чтобы удалить все записи из списка начального списка.

Это также работает с пустыми списками, потому что unlist(list())становится numeric()пустым числовым вектором. Принуждение с помощью anyделает его logical(), который интерпретируется как FALSEпуть any, а затем отмененный к TRUEпути !.


1
pryr::f(!any(unlist(x)-2))сохраняет пару байтов.
BLT

это тоже длина all(unlist(x)==2).
Джузеппе

или вы могли бы также сказать, any(unlist(x)-2)что возвращает непротиворечивое, TRUEесли в сглаженном массиве есть FALSEзначение, 2
Giuseppe

1
@Giuseppe Не уверен, если TRUEсчитается фальси: /
JAD

1
ну, по-прежнему нет консенсуса по поводу
Джузеппе



2

\Wне кажется таким хорошим критерием: 2.2это число, которого нет 2, но я полагаю, что оно будет соответствовать
Аарон

@ Аарон Я только что спросил ОП, может ли массив содержать десятичные числа. Если они заявят, что числа с плавающей точкой будут присутствовать в массиве, я изменю свое представление.
Критиси Литос

Да, я вижу, что РосЛуп задал тот же вопрос вчера и еще не получил ответа. Я надеюсь, что ОП скоро придет, чтобы уточнить!
Аарон


2

JavaScript (ES6), 53 50 48 байт

_=>(_+"").split`,`.map(c=>!c?2:c).every(c=>c==2)

Сохранено 5 байт, благодаря @Shaggy!

Тестовые случаи:

let f =

_=>(_+"").split`,`.map(c=>!c?2:c).every(c=>c==2)

console.log(f([2]))
console.log(f([2,2]))
console.log(f([[2],[2,2],2]))
console.log(f([]))
console.log(f([[],[]]))

console.log(f([1]))
console.log(f([22]))
console.log(f([2,2,2,1]))
console.log(f([[1,2],2]))


f([])и f([[],[]])должен быть правдивым
Арно

@Arnauld Это правильно сейчас?
Арджун

Я думаю так. :-)
Арно

Думаю, вы можете сэкономить пару байтов !cвместо c=="".
Shaggy

@Arnauld Спасибо за указание на это. Этот вызов был фактически опубликован как CMC в девятнадцатом байте. У этого CMC не было ничего, что можно сказать о тестовых случаях [[], []] и т. Д. Когда задача была размещена на главном сайте, я быстро добавил свое решение (оно даже спрашивало меня CAPTCHA!), Не глядя на правила! Еще раз спасибо! :)
Арджун


2

Java 8, 126 55 27 байт

s->s.matches("(\\W|2\\b)+")

Изумительный ответ Retina от @KritixiLithos , исключая ^...$, потому что String#matchesвсегда соответствует всей строке и ^...$неявно добавляет .

-2 байта спасибо @Jakob за напоминание о ^...$том, что не нужно String#matches.

Попробуй это здесь.


Я ненавижу аннулировать всю вашу работу над решением для списка, но не могли бы вы привести к строке и использовать решение для строки?
Якоб

@Jakob Вы имеете в виду в объяснении? В настоящее время я использую решение для регулярных выражений String. Я только что сохранил свой оригинальный ответ List и его объяснение, потому что решение String - это порт. Вы просите просто удалить решение List? Или добавить объяснение для решения String?
Кевин Круйссен

Я имею в виду, что пока у вас есть решение со списком, вы можете сократить его, используя в нем строковое решение. Вроде boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");}бы сработает, да? Просто хотел указать на это на случай, если вы планируете продолжить игру в список.
Якоб

1
Да, и вы можете потерять 2 байта, удалив ^и $в регулярном выражении, так как String.matchesпроверяет только всю строку.
Якоб

@Jakob полностью удалил ответ из списка, преобразовал в Java 8 и удалил ^...$. Забыл об этом, хотя я использовал его довольно много раз в прошлом ..
Кевин Круйссен

1

Python 2 , 44 43 42 байта

Принимает xв качестве строкового представления списка. Это также предполагает, что, как в примере, представления не имеют пробелов.

lambda x:set(x)<=set("[],2"*0**("22"in x))

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


объяснение

Оба они берут символы в строковом представлении ввода и определяют, есть ли в нем какие-либо другие символы [], 2. Они делают это путем приведения к набору и сравнения с набором только этих символов. Однако это не удастся, если у нас есть число, отличное от 2, которое имеет только цифры 2 (например, 22 или 222), чтобы исправить этот случай, мы умножаем строку, используемую для создания набора, на отрицание того, xсодержит или нет "22". Если он содержит его, это будет пустой набор, в противном случае он будет таким же, как и раньше.



Не подходит для[22]
Leaky Nun

@LeakyNun Исправлено
Волшебник Пшеницы

@LeakyNun Ваше предложение не подходит для[]
Мастер Пшеницы

lambda x:set(x)<=set("[],2"*-~-("22"in x))для -1
овс

1

Ом, 6 байт

∙e]Å2N

Использует CP-437кодирование.

Объяснение:

∙e]Å2E
∙e           ■Evaluate the input to form an array
   Å         ■any(              ,             )
  ]          ■    flatten(input)
    2N       ■                   lambda x:x!=2
             ■implict end of any and print

1

PHP, 46 байт

<?=!preg_match('/:"(?!2")/',serialize($_GET));

@ JörgHülsermann Не могли бы вы привести пример? Все контрольные примеры, кажется, работают. Если вы тестируете его не через браузер, передаете ли вы скалярные значения в $_GETвиде строк?
user63956

<?=!preg_match('/:"(?!2")/',$argn);и input является строковым представлением сериализованного массива - 11 байт
Йорг Хюльсерманн

1

PHP <7,0, 29 байт

Ввод как строковый массив в кодировке JSON

<?=!ereg("22|[013-9]",$argn);

PHP <7,0, 42 байта

используйте устаревшую функцию ereg

<?=!ereg("22|[013-9]",json_encode($_GET));

PHP, 50 байт

печатает 1 за правду и ничего за ложь

-1 байт для другого мудрого удаления !

или + 1 байт для истинного 1, ложного 0 добавить +до!

<?=!preg_match('#22|[013-9]#',json_encode($_GET));

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


2
Вам не нужно $rпеременный: <?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1.
user63956

1

Pyth, 6 байт

!-.nQ2

Очень похоже на мой ответ CJam. Я все еще новичок в Pyth, поэтому, пожалуйста, скажите мне, есть ли что-нибудь, что я могу сыграть в гольф.

Объяснение:

    Q   Input:     [[[], [2]], [1]]
  .n    Flatten:   [2, 1]
 -   2  Remove 2s: [1]
!       Not:       False
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.