Визначте, чи містить масив щось інше, ніж 2


20

Візьміть масив, що складається з чисел або масивів, виведіть, якщо він містить лише 2s.

Вихід повинен мати значення "truthy" або "falsey" (Вибачте, якщо це знищує відповіді)

Випробування з правдивою справою

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

Випробування Фальсі

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

Стандартні лазівки заборонені.

Застосовуються правила IO за замовчуванням .

Код-гольф, Найменше байт виграє!


Чи можемо ми взяти рядок, що представляє масив?
Пшеничний майстер

Чи будуть в масивах інші об'єкти, крім чисел та інших масивів
Майстер пшениці

Будуть лише масиви та числа, а рядок, що представляє масив, є нормальним.
Атако

2
Які числа? Compex int, Complix float, float int, int, не є негативним?
RosLuP

1
FTR і в ім'я правильного математичного мислення: масив [[2]]зовсім НЕ містить два.
перестали повертати проти годинника,

Відповіді:


8

MATL , 3 байти

2=p

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

Технічно це могло бути просто

2=

Оскільки масив, що містить будь-які нульові елементи, є хибним, але це здається дешевим.


Список, що містить 0, є помилковим? О людино.
Ерік Аутгольфер

Я не думаю, що двобайтова версія є дійсною, оскільки в коментарях ATaco сказала, що унікальна пара вихідних даних є дійсною.
Ерік Аутгольфер

Я вважаю, 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

Prolog (SWI) , 43 33 байт

Я пахну ... рекурсією .

Дякуємо Еміньї та Лікій монахині за збереження 10 байт!

Код

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

Спробуйте в Інтернеті! або Перевірте всі тестові випадки!

Пояснення:

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

Це Headперший елемент списку, а хвіст - список, що залишився. Перевірте це тут! . Тут важливим випадком є ​​те, що хвіст списку з 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]))


Хороший! Цікаво, чи можна це ще трохи скоротити, але я сумніваюся.
Арнольд

Дякую, @Arnauld; досі не знайшли способу вдосконалення.
Кудлатий



4

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

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

Чиста функція повернення Trueабо False. Після FlattenІНГ вкладеного масиву і назвавши його t, Cases[t,2]повертає список елементів , які відповідають «зразком» 2, і ==tперевіряє , що є чи всім списком.

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

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

Не такий короткий, але веселіший. Починаючи з введення #, застосовуються два правила заміни, поки результат не перестане змінюватися ( //.): по-перше, всі 2s замінюються {}s; а потім будь-який список, записами якого є всі порожні множини ( {{}..}), замінюється (повторно) порожніми наборами. Якщо решта - це порожній набір ( =={}), ми виграємо.


Перевершив свою перевагу , але я все ще дуже хочу знати, що тут робиться.
Павло

4

Haskell , 36 байт

Анонімна функція, приймає a Stringі повертає a 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.
Ørjan Johansen

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]==[]}

Незважаючи на те, що "сплющування" є дійсно довгим, воно все ж коротше, ніж рішення, засновані на регулярних виразках, або рекурсивні речі, які повинні врятувати помилки в базовому випадку. Однак вбудований зв'язок наборів і масивів 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
І все-таки виграє регулярний вимір : codegolf.stackexchange.com/a/120781/18535 :-)
GB

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якщо в сплющеному масиві є значення не 2, а послідовне, FALSEякщо всі значення 2...
Джузеппе

1
@Giuseppe Не впевнений, чи TRUEвважається фальсієм: /
JAD

1
ну, досі не існує консенсусу щодо мета, але codegolf.meta.stackexchange.com/a/2192/67312
Джузеппе



2

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

@Aaron Я щойно запитав ОП про те, чи може масив містить десяткові числа. Якщо вони заявляють, що в масиві будуть присутні числа з плаваючою комою, я зміню своє подання.
Kritixi Lithos

Так, я бачу, що РосЛуп вчора задав те саме питання, і ще не отримав відповіді. Я сподіваюся, що ОП скоро приїде для уточнення!
Аарон


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=="".
Кудлатий

@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 Ви маєте на увазі в поясненні? На даний момент я використовую рішення Stge-рядок. Я щойно зберігав свою оригінальну відповідь списку, і це пояснення, тому що рішення String - це порт. Ви просите просто видалити рішення "Список"? Або додати пояснення для рішення String?
Kevin Cruijssen

Я маю на увазі, що доки у вас є рішення зі списком, ви можете також скоротити його, використовуючи в ньому рядкове рішення. Як 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як рядки?
користувач63956

<?=!preg_match('/:"(?!2")/',$argn);а введення - це рядкове зображення серіалізованого масиву - 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.