배열에 2 이외의 것이 포함되어 있는지 확인


20

숫자 또는 배열로 구성된 배열을 취하고 2s 만 포함 된 경우 출력합니다 .

결과는 진실 또는 거짓 값이어야합니다 (응답이 파괴되면 죄송합니다)

확실한 테스트 사례

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

팔시 테스트 사례

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

표준 허점 은 금지되어 있습니다.

기본 IO 규칙이 적용됩니다.

코드 골프, Fewest 바이트가 승리합니다!


배열을 나타내는 문자열을 가져올 수 있습니까?
밀 마법사

배열에 숫자 및 다른 배열 이외의 개체가
Wheat Wizard

배열과 숫자 만 있으며 배열을 나타내는 문자열은 정상입니다.
ATaco

2
어떤 종류의 숫자입니까? Compex int, compex float, float int, int, 음수가 아닙니까?
RosLuP

1
FTR과 적절한 수학적 사고의 이름으로 배열 에는 2 개가 포함 [[2]]되지 않습니다 .
반 시계 회전을 중지

답변:


8

MATL , 3 바이트

2=p

온라인으로 사용해보십시오!

기술적으로, 이것은 단지

2=

제로 요소를 포함하는 배열은 거짓이므로 저렴합니다.


0을 포함하는 목록이 거짓입니까? 오 이런
Outgolfer Erik

ATaco는 독특한 출력 쌍이 유효 하다고 의견을 말했기 때문에 2 바이트 버전이 유효하다고 생각하지 않습니다 .
Outgolfer Erik

2=빈 행렬에 실패 한다고 생각 합니까?
Stewie Griffin

@stewiegriffin 처리해야 할 이상한 경우처럼 보이지만 편리하게 작동합니다. 온라인으로 사용해보십시오!
DJMcMayhem

예, 2=p잘 작동합니다. 결국 짧은 버전은 2=그렇지 않습니다. 또한 "이상한 경우"는 두 가지 테스트 사례입니다. :-)
Stewie Griffin

15

파이썬 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
요소가 목록인지 확인하는 깔끔한 방법입니다.
Adnan

이것이 내가 그 합의를 좋아하지 않는 이유입니다. 정말 파이썬 골프를 망칩니다.
밀 마법사

그러나 종료 코드를 사용하기 all때문에을 필요로하지 않으므로 오류 이외의 것은 진실입니다.
밀 마법사

11

프롤로그 (SWI) , 43 33 바이트

나는 냄새가 ... 재귀 .

10 바이트를 절약 한 EmignaLeaky Nun 에게 감사드립니다 !

암호

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모든 요소에서 빼고 0이 아닌 요소가 있는지 확인합니다. true모든 값이 0 인 경우 출력을 무효화합니다 .

이것은 x-2빈 행렬을 포함하여 모든 크기의 행렬에서 작동하기 때문에 작동합니다 [].

x-2 입력에 빈 행렬이 없으면 충분합니다.





6

자바 스크립트 (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

감사합니다, @Arnauld; 여전히 개선 방법을 찾지 못했습니다.
Shaggy



4

Mathematica, 24 바이트

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

순수 함수 반환 True또는 False. 후 Flatten중첩 된 배열을 보내고 그것을 호출 t, Cases[t,2]은 "패턴"과 일치하는 요소의 목록을 반환 2하고, ==t그 전체 목록 여부를 확인합니다.

매스 매 티카, 29 바이트

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

짧지는 않지만 더 재미 있습니다. 입력에서 시작 #하여 결과 변경이 중지 될 때까지 두 개의 대체 규칙이 적용됩니다 ( //.) : 먼저 모든 2s가 s로 바뀝니다 {}. 그런 다음 항목이 모두 빈 세트 ( {{}..}) 인 목록은 빈 세트 로 (반복적으로) 바뀝니다. 나머지가 빈 세트 ( =={})이면 승리합니다.


Outgolfed 이지만 여전히 여기서 무엇을하고 있는지 알고 싶습니다.
Pavel

4

하스켈 , 36 바이트

익명 함수는 a를 가져와 a 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.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.