ตรวจสอบว่าอาร์เรย์มีสิ่งอื่นที่ไม่ใช่ 2 หรือไม่


20

ใช้อาร์เรย์ซึ่งประกอบด้วยตัวเลขหรืออาร์เรย์ผลลัพธ์ถ้ามันประกอบด้วย2s เท่านั้น

ผลลัพธ์ควรเป็นค่าจริงหรือเท็จ (ขออภัยหากนี่ขัดคำตอบ)

กรณีทดสอบความจริง

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

กรณีทดสอบ Falsey

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

ห้ามมีช่องโหว่มาตรฐาน

ใช้กฎIO เริ่มต้น

Code-golf, Fewest bytes ชนะ!


เราสามารถรับสตริงที่แทนอาร์เรย์ได้หรือไม่?
ข้าวสาลีตัวช่วยสร้าง

จะมีวัตถุอื่นนอกเหนือจากตัวเลขและอาร์เรย์อื่น ๆ ในอาร์เรย์หรือไม่
Wheat Wizard

จะมีเพียงอาร์เรย์และตัวเลขและสตริงที่แทนอาร์เรย์นั้นใช้ได้
ATaco

2
ตัวเลขประเภทใด Compex int, Compex float, float int, int, ไม่ใช่ลบ?
RosLuP

1
FTR และในนามของความคิดทางคณิตศาสตร์ที่เหมาะสม: อาร์เรย์[[2]]ไม่ได้มีสอง
หยุดที่จะเปิดตัวใน

คำตอบ:


8

MATL , 3 ไบต์

2=p

ลองออนไลน์!

ในทางเทคนิคนี่อาจเป็นเพียง

2=

เนื่องจากอาร์เรย์ที่มีองค์ประกอบศูนย์ใด ๆ เป็นเท็จ แต่ดูเหมือนว่าจะถูก


รายการที่มี 0 เป็นเท็จ? โอ้ผู้ชาย
Erik the Outgolfer

ฉันไม่คิดว่ารุ่น 2 ไบต์นั้นถูกต้องเนื่องจากในความคิดเห็น ATaco กล่าวว่าคู่ผลลัพธ์เฉพาะนั้นถูกต้อง
Erik the Outgolfer

ฉันเชื่อว่า2=ล้มเหลวในการฝึกอบรมที่ว่างเปล่าหรือ?
Stewie Griffin

@stewiegriffin ดูเหมือนว่าจะเป็นกรณีที่แปลก ๆ ที่ต้องจัดการ แต่สะดวกสบายในการทำงาน: ลองออนไลน์!
DJMcMayhem

ใช่2=pทำงานได้ดี รุ่นที่สั้นกว่าในท้ายที่สุด2=ไม่ได้ นอกจากนี้ "กรณีขอบแปลก" เป็นสองกรณีทดสอบ :-)
Stewie Griffin

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
นั่นเป็นวิธีที่เรียบร้อยในการตรวจสอบว่าองค์ประกอบเป็นรายการหรือไม่
Adnan

นี่คือเหตุผลที่ฉันไม่ชอบฉันทามตินั้น มันทำลายสนามกอล์ฟหลามจริงๆ
ข้าวสาลีตัวช่วยสร้าง

อย่างไรก็ตามเนื่องจากคุณกำลังออกจากรหัสทางออกที่คุณไม่ต้องการallสิ่งอื่นนอกจากข้อผิดพลาดคือความจริง
ข้าวสาลีตัวช่วยสร้าง

11

Prolog (SWI) , 43 33 ไบต์

ฉันได้กลิ่น ... เรียกซ้ำ

ขอบคุณEmignaและLeaky Nunสำหรับการบันทึก 10 ไบต์!

รหัส

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

ลองออนไลน์!หรือตรวจสอบกรณีทดสอบทั้งหมด!

คำอธิบาย:

สำหรับผู้ใช้ที่ไม่ใช้ Prolog รายการจะถูกจัดรูปแบบด้วยวิธีต่อไปนี้: [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

ขอบคุณ @Arnauld; ยังไม่ได้หาวิธีในการปรับปรุง
Shaggy



4

Mathematica ขนาด 24 ไบต์

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

ฟังก์ชั่นเพียวกลับมาหรือTrue Falseหลังจากที่Flattenไอเอ็นจีอาร์เรย์ที่ซ้อนกันและเรียกมันว่าt, Cases[t,2]ส่งกลับรายการขององค์ประกอบที่ตรงกับ "รูปแบบที่" 2และ==tการตรวจสอบไม่ว่าจะเป็นรายชื่อทั้งหมด

Mathematica, 29 ไบต์

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

ไม่สั้น แต่สนุกกว่า เริ่มจากอินพุต#มีการใช้กฎการแทนที่สองกฎจนกว่าผลลัพธ์จะหยุดการเปลี่ยนแปลง ( //.): อันดับแรก2s ทั้งหมดจะถูกแทนที่ด้วย{}s; จากนั้นรายการใด ๆ ที่มีรายการเป็นชุดว่างทั้งหมด ( {{}..}) จะถูกแทนที่ (ซ้ำ) โดยชุดว่าง หากส่วนที่เหลือเป็นเซตว่าง ( =={}) เราจะชนะ


Outgolfedแต่ฉันก็ยังอยากรู้ว่าสิ่งที่ทำอยู่ที่นี่
Pavel

4

Haskell , 36 ไบต์

ฟังก์ชั่นที่ไม่ระบุชื่อจะใช้เวลาและผลตอบแทนStringBool

ใช้เป็น (all((==2).fst).(reads=<<).scanr(:)[]) "[2,2,2,1]"

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

ลองออนไลน์!

มันทำงานอย่างไร

  • Haskell ไม่มีรายการประเภทผสมอยู่ภายในดังนั้นเราจึงใช้สตริงเป็นอาร์กิวเมนต์
  • scanr(:)[] สร้างรายการส่วนต่อท้ายทั้งหมดของสตริง
  • (reads=<<)พยายามที่จะแยกจำนวนที่จุดเริ่มต้นของแต่ละคำต่อท้ายรวมประสบความสำเร็จในรายการของ (n,restOfString)tuples
  • 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)

ลองออนไลน์!

ใช้เวลาในสตริงโดยไม่มีช่องว่างส่งออกบูล

ตรวจสอบว่าลบตัวละครทั้งหมด'[],2'ของlให้สตริงที่ว่างเปล่า ตรวจสอบด้วยว่า22ไม่ใช่สตริงย่อย - ถ้าเป็นจะใช้อินพุตlแทนสตริงว่างเพื่อเปรียบเทียบกับผลลัพธ์ของการลบและจะล้มเหลวเสมอ


4

Ruby, 28 23 22 ไบต์ - บันทึก 5 ไบต์โดย GB

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