Xác định xem một mảng có chứa thứ gì đó không phải là 2


20

Lấy một mảng bao gồm các số hoặc mảng, đầu ra nếu nó chỉ chứa 2s.

Đầu ra phải là giá trị trung thực hoặc falsey (Xin lỗi nếu điều này phá hủy câu trả lời)

Các trường hợp thử nghiệm thật

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

Các trường hợp thử nghiệm Falsey

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

Lỗ hổng tiêu chuẩn bị cấm.

IO mặc địnhQuy tắc định được áp dụng.

Code-golf, Ít byte nhất sẽ thắng!


Chúng ta có thể lấy một chuỗi đại diện cho mảng?
Thuật sĩ lúa mì

Sẽ có các đối tượng khác ngoài số và các mảng khác trong mảng
Wheat Wizard

Sẽ chỉ có mảng và số, và một chuỗi đại diện cho mảng là tốt.
ATaco

2
Những loại số nào? Compex int, compex float, float int, int, không âm?
RosLuP

1
FTR và trong tên của tư duy toán học thích hợp: mảng [[2]]nào không chứa một hai.
đã ngừng quay ngược chiều

Câu trả lời:


8

MATL , 3 byte

2=p

Hãy thử trực tuyến!

Về mặt kỹ thuật, điều này có thể chỉ là

2=

Vì một mảng chứa bất kỳ phần tử zero nào là giả, nhưng điều này có vẻ rẻ.


Một danh sách chứa 0 là giả? Trời ơi.
Erik the Outgolfer

Tôi không nghĩ phiên bản 2 byte là hợp lệ, vì trong các bình luận ATaco nói rằng một cặp đầu ra duy nhất là hợp lệ.
Erik the Outgolfer

Tôi tin rằng 2=thất bại cho ma trận trống, hoặc?
Stewie Griffin

@stewiegriffin Điều đó có vẻ như là một trường hợp kỳ lạ cần phải xử lý, nhưng thuận tiện là nó hoạt động: Hãy thử trực tuyến!
DJMcMayhem

Vâng, 2=phoạt động tốt. Phiên bản ngắn hơn cuối cùng, 2=không. Ngoài ra, "các trường hợp cạnh lạ" là hai trong số các trường hợp thử nghiệm. :-)
Stewie Griffin

15

Python 2 , 43 40 byte

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

Hãy thử trực tuyến!


Tại thời điểm đăng câu trả lời này, nó vẫn được cho phép theo sự đồng thuận meta này để xuất ra thông qua việc ném lỗi / không ném lỗi. Do đó, câu trả lời ở 26 byte là hợp lệ:

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

Hãy thử trực tuyến!


1
Đó là một cách gọn gàng để kiểm tra xem một phần tử có phải là một danh sách hay không.
Ad Nam

Đây là lý do tại sao tôi không thích sự đồng thuận đó. Nó thực sự làm hỏng trăn golf.
Phù thủy lúa mì

Tuy nhiên, vì bạn đang đi bằng mã thoát, bạn không cần all, bất cứ điều gì khác ngoài lỗi là sự thật.
Phù thủy lúa mì

11

Prolog (SWI) , 43 33 byte

Tôi ngửi thấy ... đệ quy .

Cảm ơn EmignaLeaky Nun vì đã tiết kiệm 10 byte!

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

Hãy thử trực tuyến! hoặc là Xác minh tất cả các trường hợp thử nghiệm!

Giải trình:

Đối với người dùng không phải là Prolog, một danh sách được định dạng theo cách sau: [Head | Tail] .

Đây Headlà yếu tố đầu tiên của danh sách và đuôi là danh sách còn lại. Kiểm tra nó ở đây! . Một trường hợp quan trọng ở đây là phần đuôi của danh sách có 1 phần tử bằng []. Bạn có thể kiểm tra điều đó ở đây .

% 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

Octave, 13 byte

@(x)~any(x-2)

Xác nhận tất cả các trường hợp thử nghiệm.

Đây là một hàm ẩn danh lấy một đối số đầu vào , x. Nó trừ 2tất cả các phần tử, kiểm tra nếu có bất kỳ phần tử khác không. Nó phủ nhận đầu ra để có được truetrong trường hợp tất cả các giá trị bằng không.

Điều này hoạt động vì x-2hoạt động cho ma trận ở tất cả các kích cỡ, bao gồm cả ma trận trống , [].

x-2 sẽ là đủ nếu không thể có ma trận trống trong đầu vào.





6

JavaScript (ES6), 22 19 23 22 byte

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

Kiểm tra nó

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 bytes

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

Pure function returning True or False. After Flattening the nested array and calling it t, Cases[t,2] returns the list of elements that match the "pattern" 2, and ==t checks whether that's the whole list.

Mathematica, 29 bytes

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

Not as short, but more fun. Starting from the input #, two replacement rules are applied until the result stops changing (//.): first, all 2s are replaced by {}s; and then any list whose entries are all empty sets ({{}..}) are replaced (repeatedly) by empty sets. If the rest is an empty set (=={}), we win.


Outgolfed, but I still really want to know what is being done here.
Pavel

4

Haskell, 36 bytes

An anonymous function, takes a String and returns a Bool.

Use as (all((==2).fst).(reads=<<).scanr(:)[]) "[2,2,2,1]"

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

Try it online!

How it works

  • Haskell doesn't have builtin mixed-type lists, so we take a string as argument.
  • scanr(:)[] generates a list of all suffixes of the string.
  • (reads=<<) tries to parse a number at the beginning of each suffix, combining the successes into a list of tuples (n,restOfString).
  • all((==2).fst) checks if all the parsed numbers are 2.

How about just not.all(`elem`"2,[]")?
zbw

@zbw That fails because of numbers like 22.
Ørjan Johansen

4

Python 2, 38 bytes

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

Try it online!

Takes in a string without spaces, outputs a bool.

Checks if removing all the characters '[],2' of l gives the empty string. Also checks that 22 is not a substring -- if it is, the input l is used in place of the empty string to compare to the result of removal, and that always fails.


4

Ruby, 28 23 22 bytes - 5 bytes saved by G B

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

Despite "flatten" being really long, it's still shorter than regex based solutions or recursive stuff that has to rescue errors in the base case. Ruby's built-in conflation of sets and arrays, however, is amazingly useful sometimes.


1
x.flatten.uniq==[2]
Nick M

1
@NickM - that won't work on test cases like [] or [[],[]]. [2,*x].flatten.uniq==[2] is slightly longer
ymbirtt

1
x.flatten|[2]==[2] would be shorter.
G B

@GB and x.flatten-[2]==[] is shorter still. Thanks for the tip!
ymbirtt

1
G B

3

JavaScript (ES6), 26 bytes

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

Test cases


You need to count f= because you referred to it.
Leaky Nun

@LeakyNun Indeed. Fixed.
Arnauld

3

MATL, 4 bytes

2-a~

Try it online!

Breakdown:

           % 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.

Well, outgolfed. But I'm keeping this, since I'm quite happy I managed this all on my own (even though the task is super simple).


3

R, 28 bytes

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

unlist(x) turns a (nested) list into a vector. Then 2 is subtracted from that vector. any converts (with a warning) numeric to logical and checks if there are any TRUEs. This is inverted with ! and output.

This works with nested lists because unlist by default works recursively to unlist all list entries of the initial list.

This also works with empty lists, because unlist(list()) becomes numeric(), an empty numerical vector. Coercion by any makes it logical(), which is interpreted as FALSE by any, and then reversed to TRUE by !.


1
pryr::f(!any(unlist(x)-2)) saves a couple of bytes.
BLT

this is the same length as all(unlist(x)==2) as well.
Giuseppe

or you could also say any(unlist(x)-2) which returns a consistent TRUE if there is a non-2 value in the flattened array and a consistent FALSE if all the values are 2...
Giuseppe

1
@Giuseppe Not sure if TRUE counts as falsey though :/
JAD

1
well, there's still not a consensus on meta, but codegolf.meta.stackexchange.com/a/2192/67312
Giuseppe



2

Retina, 14 11 bytes

^(\W|2\b)+$

Try it online!


\W doesn't seem such a good criteria : 2.2 is a number that isn't 2, yet I suppose it would match
Aaron

@Aaron I have just asked the OP on whether the array can containing decimal numbers. If they state that floating-point numbers will be present in the array, I will change my submission.
Kritixi Lithos

Yeah, I see RosLup asked the same question yesterday and hasn't got an answer yet. I hope OP will come soon to clarify !
Aaron


2

JavaScript (ES6), 53 50 48 bytes

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

Saved 5 bytes, thanks to @Shaggy!

Test Cases :

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([]) and f([[],[]]) should be truthy
Arnauld

@Arnauld Is it correct now?
Arjun

I think so. :-)
Arnauld

Think you can save a couple of bytes with !c instead of c=="".
Shaggy

@Arnauld Thanks for pointing that out. This challenge was actually posted as a CMC in the Nineteenth byte. That CMC did not have anything to say regarding [[],[]] etc kind of test cases. When the challenge got posted on the main site, I quickly added my solution (It even asked me CAPTCHA!) without looking at rules! Thanks once again! :)
Arjun


2

Java 8, 126 55 27 bytes

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

Port of @KritixiLithos's amazing Retina answer, excluding the ^...$, since String#matches always matches the entire String and adds the ^...$ implicitly.

-2 bytes thanks to @Jakob for reminding me of ^...$ isn't necessary for String#matches.

Try it here.


I hate to nullify all your work on the list solution, but couldn't you coerce to a string and use the string solution?
Jakob

@Jakob You mean in the explanation? I am using a regex String solution at the moment. I've just kept my original List answer and it's explanation, because the String solution is a port. Are you asking to just remove the List solution? Or add an explanation for the String solution?
Kevin Cruijssen

I mean that as long as you have a list solution you might as well shorten it by using the string solution in it. Like boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");} would work, right? Just wanted to point that out in case you were planning to further golf the list solution.
Jakob

1
Oh and you can lose 2 bytes by removing ^ and $ in the regex, since String.matches only tests against the whole string.
Jakob

@Jakob Removed the List answer entirely, converted to Java 8, and removed the ^...$. Forgot about that, even though I've used it quite a lot of times in the past..
Kevin Cruijssen

1

Python 2, 44 43 42 bytes

Takes x as the string representation of the list. This also assumes like in the example the representations have no spaces.

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

Try it online!


Explanation

Both of these take the characters in the string representation of the input and determine if any characters other than [], 2 are in it. They do this by casting to a set and comparing to the set of just those characters. However this fails if we have a number other than 2 which has only digits of 2 (e.g. 22 or 222), in order to patch this case we multiply the string used to create the set by the negation of whether or not x contains "22". If it contains it this will be the empty set, otherwise it will be the same as before.



Fails for [22]
Leaky Nun

@LeakyNun Fixed
Wheat Wizard

@LeakyNun Your suggestion fails for []
Wheat Wizard

lambda x:set(x)<=set("[],2"*-~-("22"in x)) for -1
ovs

1

Ohm, 6 bytes

∙e]Å2N

Uses CP-437 encoding.

Explanation:

∙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 bytes

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

@JörgHülsermann Could you please give an example? All the test cases seem to work. If you test it not through a browser, do you pass scalar values of $_GET as strings?
user63956

<?=!preg_match('/:"(?!2")/',$argn); and input is a string representation of the serialized array - 11 Bytes
Jörg Hülsermann

1

PHP<7.0, 29 Bytes

Input as as string array JSON encoded

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

PHP<7.0, 42 Bytes

use the deprecated function ereg

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

PHP, 50 Bytes

prints 1 for true and nothing for false

-1 Byte for other wise remove !

or + 1 Byte for true 1, false 0 add + before !

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

Try it online!


2
You don't need the $r variable: <?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1.
user63956

1

Pyth, 6 bytes

!-.nQ2

Very similar to my CJam answer. I'm still new to Pyth, so please tell me if there's anything I can golf off.

Explanation:

    Q   Input:     [[[], [2]], [1]]
  .n    Flatten:   [2, 1]
 -   2  Remove 2s: [1]
!       Not:       False
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.