Tentukan apakah Array berisi sesuatu selain 2

20

Ambil sebuah array yang terdiri dari angka atau array, output jika hanya berisi 2s.

Output harus berupa nilai truey atau falsey (Maaf jika ini menghancurkan jawaban)

Kasus Uji Kebenaran

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

Kasus Uji Falsey

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

Celah Standar Dilarang.

Aturan IO standar berlaku.

Kode-golf, byte Paling Sedikit menang!

ATaco
sumber
Bisakah kita mengambil string yang mewakili array?
Wheat Wizard
Apakah akan ada objek selain angka dan array lain dalam array
Wheat Wizard
Hanya akan ada array dan angka, dan string yang mewakili array baik-baik saja.
ATaco
2
Angka seperti apa? Compex int, compex float, float int, int, bukan negatif?
RosLuP
1
FTR dan atas nama pemikiran matematika yang tepat: array [[2]]tidak tidak mengandung dua.
Berhenti menghidupkan counterclock

Jawaban:

8

MATL , 3 byte

2=p

Cobalah online!

Secara teknis, ini bisa saja

2=

Karena array yang mengandung elemen nol adalah palsu, tetapi ini tampaknya murah.

DJMcMayhem
sumber
Daftar yang berisi 0 salah? Oh man.
Erik the Outgolfer
Saya tidak berpikir versi 2-byte valid, karena dalam komentar ATaco mengatakan bahwa pasangan output unik valid.
Erik the Outgolfer
Saya percaya 2=gagal untuk matriks kosong, atau?
Stewie Griffin
@stewiegriffin Kelihatannya seperti kasus tepi aneh yang perlu ditangani, tapi ternyata bisa digunakan: Coba online!
DJMcMayhem
Ya, 2=pberfungsi dengan baik. Versi yang lebih pendek pada akhirnya,, 2=tidak. Juga, "kasus tepi aneh" adalah dua dari kasus uji. :-)
Stewie Griffin
15

Python 2 , 43 40 byte

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

Cobalah online!


Pada saat memposting jawaban ini, masih diperbolehkan per konsensus meta ini untuk menghasilkan output melalui melempar kesalahan / tidak melempar kesalahan. Karenanya jawaban ini pada 26 byte adalah valid:

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

Cobalah online!

ovs
sumber
1
Itu cara yang rapi untuk memeriksa apakah suatu elemen adalah daftar.
Adnan
Inilah sebabnya saya tidak suka konsensus itu. Ini benar-benar merusak golf python.
Wheat Wizard
Namun karena Anda menggunakan kode keluar, Anda tidak memerlukannya all, apa pun selain kesalahan adalah benar.
Wheat Wizard
11

Prolog (SWI) , 43 33 byte

Saya mencium ... rekursi .

Terima kasih kepada Emigna dan Leaky Nun karena telah menghemat 10 byte!

Kode

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

Cobalah online! atau Verifikasi semua kasus uji!

Penjelasan:

Untuk pengguna non-Prolog, daftar diformat dengan cara sebagai berikut: [Head | Tail].

Ini Headadalah elemen pertama dari daftar, dan ekor adalah daftar yang tersisa. Uji di sini! . Kasus penting di sini adalah bahwa ekor daftar dengan 1 elemen sama dengan []. Anda dapat mengujinya di sini .

% 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).
Adnan
sumber
10

Jelly , 4 byte

F;2E

Cobalah online!

Bagaimana itu bekerja

F;2E
F    flatten
 ;2  append 2
   E all elements are equal
Biarawati Bocor
sumber
9

Oktaf, 13 byte

@(x)~any(x-2)

Verifikasi semua kasus uji.

Ini adalah fungsi anonim mengambil satu argumen input x,. Ini mengurangi 2dari semua elemen, memeriksa apakah ada elemen non-nol. Ini meniadakan output untuk mendapatkan trueuntuk kasus-kasus di mana semua nilai adalah nol.

Ini berfungsi karena x-2berfungsi untuk matriks dari semua ukuran, termasuk matriks kosong [],.

x-2 akan cukup jika tidak ada matriks kosong di input.

Stewie Griffin
sumber
7

Matematika , 28 byte

Select[Flatten@#,#!=2&]=={}&

Cobalah online!

Pavel
sumber
Saya pikir inputnya {0}diizinkan; itu akan menghasilkan false positive.
Greg Martin
6

05AB1E , 4 byte

˜YQP

Cobalah online!

Penjelasan

˜      # flatten list
 YQ    # check each element for equality to 2
   P   # product of list
Emigna
sumber
Kenapa tidak 2bekerja Y?
Erik the Outgolfer
@EriktheOutgolfer: 2berfungsi juga. Saya hanya suka fakta bahwa tidak ada angka di dalamnya :)
Emigna
6

JavaScript (ES6), 22 19 23 22 byte

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

Menguji

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]))

Shaggy
sumber
Yang bagus! Aku ingin tahu apakah itu bisa dipersingkat lagi, tapi aku ragu.
Arnauld
Terima kasih, @Arnauld; masih belum menemukan cara untuk memperbaikinya.
Shaggy
5

Mathematica, 15 byte

FreeQ[x_/;x!=2]

Ini juga berfungsi dalam Matematika. Cobalah online!

alephalpha
sumber
4

APL (Dyalog) , 5 byte

∧/2=∊

Cobalah online!

Penjelasan

∧/                         Only
  2=                       2s are equal to
                          any of the elements in the enlisted form of the right argument
Kritixi Lithos
sumber
4

Mathematica, 24 byte

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

Fungsi murni kembali Trueatau False. Setelah Flattenmemasukkan array bersarang dan memanggilnya t,Cases[t,2] mengembalikan daftar elemen yang cocok dengan "pola" 2, dan ==tmemeriksa apakah itu seluruh daftar.

Mathematica, 29 byte

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

Tidak sesingkat, tetapi lebih menyenangkan. Mulai dari input #, dua aturan penggantian diterapkan hingga hasilnya berhenti berubah ( //.): pertama, semua 2diganti oleh {}s; dan kemudian daftar mana pun yang entri semua set kosong ( {{}..}) diganti (berulang kali) dengan set kosong. Jika sisanya adalah set kosong ( =={}), kami menang.

Greg Martin
sumber
Berkalahkan , tetapi saya masih benar-benar ingin tahu apa yang sedang dilakukan di sini.
Pavel
4

Haskell , 36 byte

Fungsi anonim, mengambil a String dan mengembalikan a Bool.

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

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

Cobalah online!

Bagaimana itu bekerja

  • Haskell tidak memiliki built-in daftar tipe campuran, jadi kami mengambil string sebagai argumen.
  • scanr(:)[] menghasilkan daftar semua sufiks string.
  • (reads=<<) mencoba mengurai angka di awal setiap sufiks, menggabungkan keberhasilan menjadi daftar tupel (n,restOfString) .
  • all((==2).fst)memeriksa apakah semua angka yang diuraikan adalah 2.
Ørjan Johansen
sumber
Bagaimana dengan adil not.all(`elem`"2,[]")?
zbw
@ zbw Itu gagal karena angka seperti 22.
Ørjan Johansen
4

Python 2 , 38 byte

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

Cobalah online!

Dibawa dalam string tanpa spasi, menghasilkan bool.

Cek apakah menghapus semua karakter '[],2'dari lmemberikan string kosong. Juga periksa bahwa 22itu bukan substring - jika ya, input ldigunakan sebagai pengganti string kosong untuk membandingkan dengan hasil penghapusan, dan yang selalu gagal.

Tidak
sumber
4

Ruby, 28 23 22 byte - 5 byte disimpan oleh GB

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

Meskipun "rata" sangat panjang, masih lebih pendek daripada solusi berbasis regex atau hal-hal rekursif yang harus menyelamatkan kesalahan dalam kasus dasar. Namun, gabungan set dan array bawaan Ruby, terkadang sangat berguna.

ymbirtt
sumber
1
x.flatten.uniq == [2]
Nick M
1
@NickM - itu tidak akan berfungsi pada kasus uji suka []atau [[],[]]. [2,*x].flatten.uniq==[2]sedikit lebih panjang
ymbirtt
1
x.flatten | [2] == [2] akan lebih pendek.
GB
@ GB dan x.flatten-[2]==[]masih lebih pendek. Terima kasih atas tipnya!
ymbirtt
1
Namun regex menang: codegolf.stackexchange.com/a/120781/18535 :-)
GB
3

JavaScript (ES6), 26 byte

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

Uji kasus

Arnauld
sumber
Anda perlu menghitung f=karena Anda menyebutnya.
Leaky Nun
@LeakyNun Memang. Tetap.
Arnauld
3

MATL , 4 byte

2-a~

Cobalah online!

Kerusakan:

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

Yah, kalah besar . Tapi saya menjaga ini, karena saya cukup senang saya mengatur ini sendiri (walaupun tugasnya sangat sederhana).

Stewie Griffin
sumber
3

R, 28 byte

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

unlist(x)mengubah daftar (bersarang) menjadi vektor. Kemudian 2dikurangi dari vektor itu. anymengkonversi (dengan peringatan) numerik menjadi logis dan memeriksa jika ada TRUE. Ini terbalik dengan! dan keluaran.

Ini berfungsi dengan daftar bersarang karena unlist secara default bekerja secara rekursif untuk membatalkan daftar semua entri daftar dari daftar awal.

Ini juga berfungsi dengan daftar kosong, karena unlist(list())menjadi numeric(), vektor numerik kosong. Paksaan dengan anymembuatnya logical(), yang diartikan sebagai FALSEoleh any, dan kemudian dibalik TRUEoleh !.

JAD
sumber
1
pryr::f(!any(unlist(x)-2))menghemat beberapa byte.
BLT
ini memiliki panjang yang sama all(unlist(x)==2)juga.
Giuseppe
atau Anda juga bisa mengatakan any(unlist(x)-2)yang mengembalikan konsisten TRUEjika ada nilai non-2 dalam susunan rata dan konsisten FALSEjika semua nilainya 2...
Giuseppe
1
@Giuseppe Tidak yakin apakah TRUEdianggap sebagai falsey: /
JAD
1
yah, masih belum ada konsensus tentang meta, tapi codegolf.meta.stackexchange.com/a/2192/67312
Giuseppe
2

Python 3 , 55 byte

Tidak selingkuh Menggunakan daftar bersarang sebagai input.

f=lambda a:all(type(x)!=int and f(x)for x in a if x!=2)

Cobalah online!

Biarawati Bocor
sumber
-1 byte:int!=type(x)and
Mego
2

Jelly , 4 byte

F=2Ạ

Cobalah online!

Sedikit berbeda dari algoritma Leaky.

Penjelasan:

F=2Ạ
F    Flatten
 =2  Check if equal to 2 (vectorizes)
   Ạ Check if there isn't any falsey value
Erik the Outgolfer
sumber
2

Retina , 14 11 byte

^(\W|2\b)+$

Cobalah online!

Kritixi Lithos
sumber
\Wtampaknya bukan kriteria yang baik: 2.2adalah angka yang tidak cocok 2, namun saya kira itu akan cocok
Aaron
@ Harun Saya baru saja bertanya OP tentang apakah array dapat berisi angka desimal. Jika mereka menyatakan bahwa angka floating-point akan ada dalam array, saya akan mengubah kiriman saya.
Kritixi Lithos
Ya, saya melihat RosLup mengajukan pertanyaan yang sama kemarin dan belum mendapat jawaban. Saya harap OP akan segera datang untuk klarifikasi!
Aaron
2

JavaScript (ES6), 53 50 48 byte

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

Disimpan 5 byte, terima kasih kepada @Shaggy!

Kasus uji:

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]))

Arjun
sumber
f([])dan f([[],[]])harus jujur
Arnauld
@Arnauld Apakah benar sekarang?
Arjun
Aku pikir begitu. :-)
Arnauld
Pikir Anda dapat menyimpan beberapa byte dengan !cbukan c=="".
Shaggy
@Arnauld Terima kasih telah menunjukkannya. Tantangan ini sebenarnya diposting sebagai CMC di byte kesembilan belas. CMC itu tidak memiliki sesuatu untuk dikatakan tentang [[], []] dll jenis kasus uji. Ketika tantangan diposting di situs utama, saya segera menambahkan solusi saya (Itu bahkan meminta saya CAPTCHA!) Tanpa melihat aturan! Sekali lagi terima kasih! :)
Arjun
2

Java 8, 126 55 27 byte

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

Port dari jawaban Retina @KritixiLithos yang menakjubkan , tidak termasuk ^...$, karena String#matchesselalu cocok dengan seluruh String dan menambahkan^...$ secara implisit.

-2 byte terima kasih kepada Jakob untuk mengingatkan saya tentang ^...$tidak perlu untukString#matches .

Coba di sini.

Kevin Cruijssen
sumber
Saya benci untuk membatalkan semua pekerjaan Anda pada solusi daftar, tetapi tidak bisakah Anda memaksa ke suatu string dan menggunakan solusi string?
Jakob
@ Jakob Maksud Anda dalam penjelasannya? Saya menggunakan solusi String regex saat ini. Saya baru saja menyimpan jawaban Daftar asli saya dan penjelasannya, karena solusi String adalah port. Apakah Anda meminta untuk hanya menghapus solusi Daftar? Atau tambahkan penjelasan untuk solusi String?
Kevin Cruijssen
Maksud saya, selama Anda memiliki daftar solusi, Anda bisa mempersingkatnya dengan menggunakan solusi string di dalamnya. Seperti boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");}akan berhasil, bukan? Hanya ingin menunjukkan hal itu jika Anda berencana untuk golf lebih jauh daftar solusi.
Jakob
1
Oh dan Anda bisa kehilangan 2 byte dengan menghapus ^dan $di regex, karena String.matcheshanya menguji terhadap seluruh string.
Jakob
@ Jakob Menghapus jawaban Daftar seluruhnya, dikonversi ke Java 8, dan menghapus ^...$. Lupa tentang itu, meskipun saya sudah sering menggunakannya di masa lalu ..
Kevin Cruijssen
1

Python 2 , 44 43 42 byte

Dibawa xsebagai representasi string dari daftar. Ini juga mengasumsikan seperti pada contoh representasi tidak memiliki spasi.

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

Cobalah online!


Penjelasan

Keduanya mengambil karakter dalam representasi string dari input dan menentukan apakah ada karakter selain [], 2di dalamnya. Mereka melakukan ini dengan melakukan casting ke set dan membandingkan dengan set hanya karakter tersebut. Namun ini gagal jika kita memiliki angka selain 2 yang hanya memiliki angka 2 (misalnya 22 atau 222), untuk menambal kasus ini kita mengalikan string yang digunakan untuk membuat set dengan negasi apakah xmengandung atau tidak "22". Jika berisi itu ini akan menjadi set kosong, jika tidak maka akan sama seperti sebelumnya.

Wisaya Gandum
sumber
Gagal untuk[22]
Leaky Nun
@LeakyNun Fixed
Wheat Wizard
@ LeakyNun Saran Anda gagal[]
Wheat Wizard
lambda x:set(x)<=set("[],2"*-~-("22"in x))untuk -1
ovs
1

Ohm, 6 byte

∙e]Å2N

Penggunaan CP-437 penyandian.

Penjelasan:

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

PHP, 46 byte

<?=!preg_match('/:"(?!2")/',serialize($_GET));
pengguna63956
sumber
@ JörgHülsermann Bisakah Anda memberi contoh? Semua kasus uji tampaknya berhasil. Jika Anda mengujinya tidak melalui browser, apakah Anda memberikan nilai skalar $_GETsebagai string?
user63956
<?=!preg_match('/:"(?!2")/',$argn);dan input adalah representasi string dari array serial - 11 Bytes
Jörg Hülsermann
1

PHP <7.0, 29 Bytes

Input sebagai array string yang disandikan JSON

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

PHP <7.0, 42 Bytes

gunakan fungsi ereg yang sudah tidak digunakan lagi

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

PHP, 50 Bytes

mencetak 1 untuk true dan nothing for false

-1 Byte untuk penghapusan bijaksana lainnya !

atau + 1 Byte untuk true 1, false 0 tambahkan +sebelumnya!

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

Cobalah online!

Jörg Hülsermann
sumber
2
Anda tidak perlu $rvariabel: <?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1.
user63956
1

Pyth, 6 byte

!-.nQ2

Sangat mirip dengan jawaban CJam saya. Saya masih baru di Pyth, jadi tolong beri tahu saya jika ada yang bisa saya mainkan.

Penjelasan:

    Q   Input:     [[[], [2]], [1]]
  .n    Flatten:   [2, 1]
 -   2  Remove 2s: [1]
!       Not:       False
Buah Esolanging
sumber