Bir Dizinin 2 dışında bir şey içerip içermediğini belirleme


20

Sayılardan veya dizilerden oluşan bir dizi alın, yalnızca 2s içeriyorsa çıktı alın .

Çıktı gerçek veya falsey bir değer olmalıdır (Bu cevapları yok ederse özür dilerim)

Gerçek Test Durumları

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

Falsey Test Kutuları

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

Standart Loopholes yasaktır.

Varsayılan IO kuralları geçerlidir.

Kod-golf, Birkaç bayt kazanır!


Diziyi temsil eden bir dize alabilir miyiz?
Buğday Büyücüsü

Dizilerde sayılar ve diğer diziler dışında nesneler olacak mı?
Wheat Wizard

Yalnızca diziler ve sayılar olur ve diziyi temsil eden bir dize iyi olur.
ATaco

2
Ne tür rakamlar? Compex int, compex float, float int, int, negatif değil mi?
RosLuP

1
FTR ve uygun matematiksel düşünme adına: dizi [[2]]yok değil bir ikisini içermektedir.
saat yönünün tersine dönmeyi bıraktı

Yanıtlar:


8

MATL , 3 bayt

2=p

Çevrimiçi deneyin!

Teknik olarak, bu sadece

2=

Herhangi bir sıfır eleman içeren bir dizi yanlıştır, ancak bu ucuz görünüyor.


0 içeren bir liste sahtedir? Ah adamım.
Outgolfer Erik

ATaco'nun yorumlarda benzersiz bir çıkış çiftinin geçerli olduğunu söylediğinden, 2 baytlık sürümün geçerli olduğunu düşünmüyorum .
Outgolfer Erik

2=Boş matrisler için başarısız olduğuna inanıyorum , ya da?
Stewie Griffin

@stewiegriffin Bu, ele alınması gereken garip bir kenar kasası gibi görünüyor, ancak uygun şekilde çalışıyor: Çevrimiçi deneyin!
DJMcMayhem

Evet, 2=p çalışıyor. Sonunda daha kısa versiyon 2=, değil. Ayrıca, "garip kenar vakaları" test durumlarından ikisidir. :-)
Stewie Griffin

15

Python 2 , 43 40 bayt

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

Çevrimiçi deneyin!


Bu cevabın gönderilmesi sırasında, bu meta konsensüs başına bir hata atarak / bir hata atmamak yoluyla çıktı alınmasına izin verildi . Bu nedenle 26 bayttaki bu cevap geçerlidir:

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

Çevrimiçi deneyin!


1
Bu, bir öğenin liste olup olmadığını kontrol etmenin düzgün bir yoludur.
Adnan

Bu yüzden bu fikir birliğini sevmiyorum. Gerçekten python golf mahveder.
Buğday Büyücüsü

Ancak çıkış kodu ile gittiğiniz için allbir hata dışında herhangi bir şey doğrudur.
Buğday Büyücüsü

11

Prolog (SWI) , 43 33 bayt

Kokuyorum ... özyineleme .

Emigna ve Leaky Nun'e 10 bayt kazandıkları için teşekkürler !

kod

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

Çevrimiçi deneyin!veya Tüm test senaryolarını doğrulayın!

Açıklama:

Prolog olmayan kullanıcılar için bir liste şu şekilde biçimlendirilir: [Head | Tail] .

HeadListenin birinci eleman, ve kuyruk kalan listesidir. Burada test edin! . Burada önemli bir durum , 1 elemanlı bir listenin kuyruğunun eşit olmasıdır []. Bunu burada test edebilirsiniz .

% 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

Oktav, 13 bayt

@(x)~any(x-2)

Tüm test senaryolarını doğrulayın.

Bu, bir giriş argümanı alan anonim bir fonksiyondur x. 2Tüm elemanlardan çıkarılır , sıfır olmayan eleman olup olmadığını kontrol eder. trueTüm değerlerin sıfır olduğu durumlar için çıktıyı olumsuz etkiler .

Bu x-2, boş matris dahil tüm boyutlardaki matrisler için çalıştığı için çalışır [].

x-2 girişte boş matrisler olmasaydı yeterli olurdu.





6

JavaScript (ES6), 22 19 23 22 bayt

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

Dene

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


Güzel! Acaba biraz daha kısaltılabilir mi, ama şüpheliyim.
Arnauld

Teşekkürler, @Arnauld; hala bunu geliştirmenin bir yolunu bulamadık.
Shaggy



4

Mathematica, 24 bayt

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

Saf işlev döndürme Trueveya False. Flattenİç içe diziyi girdikten ve çağırdıktan sonra t, Cases[t,2]"desen" ile eşleşen öğelerin listesini döndürür 2ve==t bu bütün liste olsun çeklerin.

Mathematica, 29 bayt

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

Kısa değil, ama daha eğlenceli. Girişten başlayarak #, sonuç değişmeyi durdurana kadar iki değiştirme kuralı uygulanır ( //.): ilk önce tüm 2s'ler s ile değiştirilir {}; ve sonra tüm girişleri boş kümeler ( {{}..}) olan her liste boş kümelerle değiştirilir (tekrar tekrar). Gerisi boş bir set ( =={}) ise kazanırız.


Geçti , ama hala burada ne yapıldığını bilmek istiyorum.
Pavel

4

Haskell , 36 bayt

Anonim bir işlev, a alır Stringve a döndürür Bool.

Farklı kullan (all((==2).fst).(reads=<<).scanr(:)[]) "[2,2,2,1]"

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

Çevrimiçi deneyin!

Nasıl çalışır

  • Haskell'de karma tipte listeler bulunmadığından, bir dizeyi argüman olarak alıyoruz.
  • scanr(:)[] dizenin tüm soneklerinin bir listesini oluşturur.
  • (reads=<<)her son ekin başlangıcında bir sayıyı ayrıştırmaya çalışır ve başarıları bir grup listesi halinde birleştirir (n,restOfString).
  • all((==2).fst)Ayrıştırılan tüm numaraların olup olmadığını kontrol eder 2.

Sadece nasıl not.all(`elem`"2,[]")?
zbw

@zbw Bu gibi sayılar nedeniyle başarısız olur 22.
Ørjan Johansen

4

Python 2 , 38 bayt

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

Çevrimiçi deneyin!

Boşluksuz bir dize alır, bir bool çıkarır.

Tüm karakterlerin kaldırılıp kaldırılmadığını kontrol eder '[],2' bir lboş bir dize verir. Ayrıca 22bir alt dize olmadığını kontrol eder - öyleyse, giriş l, kaldırma sonucuyla karşılaştırmak için boş dize yerine kullanılır ve bu her zaman başarısız olur.


4

Yakut, 28 23 22 bayt - GB tarafından kaydedilen 5 bayt

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

"Düzleştirmek" gerçekten uzun olmasına rağmen, hala normal vaka tabanlı çözümler veya temel durumda hataları kurtarmak zorunda özyinelemeli şeyler daha kısadır. Ruby'nin yerleşik kümeler ve dizilerle birleşmesi bazen inanılmaz derecede faydalıdır.


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

1
@NickM - []veya gibi test senaryolarında çalışmaz [[],[]]. [2,*x].flatten.uniq==[2]biraz daha uzundur
ymbirtt

1
x.flatten | [2] == [2] daha kısa olur.
GB

@GB ve x.flatten-[2]==[]daha kısa. Bahşiş için teşekkürler!
ymbirtt

1
Yine de normal ifade kazanır: codegolf.stackexchange.com/a/120781/18535 :-)
GB

3

JavaScript (ES6), 26 bayt

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

Test senaryoları


Saymanız gerekiyor f=çünkü referans verdiniz.
Sızdıran Rahibe

@LeakyNun Gerçekten. Sabit.
Arnauld

3

MATL , 4 bayt

2-a~

Çevrimiçi deneyin!

Yıkmak:

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

Peki, modası geçmiş . Ama bunu saklıyorum, çünkü oldukça mutlu olduğum için hepsini tek başıma yönettim (görev çok basit olmasına rağmen).


3

R, 28 bayt

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

unlist(x)(iç içe) bir listeyi bir vektöre dönüştürür. Sonra 2bu vektörden çıkarılır. any(bir uyarı ile) sayısal değeri mantığa dönüştürür ve TRUEs olup olmadığını kontrol eder . Bu ters çevrilir !ve çıktı verilir.

unlistVarsayılan olarak, ilk listenin tüm liste girişlerini listelemek için özyinelemeli olarak çalıştığından, bu iç içe listelerle çalışır.

Bu aynı zamanda boş listelerle de çalışır, çünkü boş bir sayısal vektör unlist(list())haline gelir numeric(). Tarafından Baskılar anyyapar logical()olarak yorumlanır, FALSEile any, ve daha sonra ters TRUEtarafından !.


1
pryr::f(!any(unlist(x)-2))birkaç bayt kaydeder.
BLT

bu da aynı uzunluktadır all(unlist(x)==2).
Giuseppe

ya da düzleştirilmiş dizide 2 olmayan bir değer varsa any(unlist(x)-2)hangisinin tutarlı TRUEolduğunu ve FALSEtüm değerlerin tutarlı olması durumunda tutarlı olduğunu söyleyebilirsiniz 2...
Giuseppe

1
@Giuseppe Falsey olarak sayıldığından emin değilim TRUE: /
JAD

1
Eh, hala meta üzerinde bir fikir birliği yok, ancak codegolf.meta.stackexchange.com/a/2192/67312
Giuseppe



2

Retina , 14 11 bayt

^(\W|2\b)+$

Çevrimiçi deneyin!


\Wbu kadar iyi bir kriter gibi görünmüyor: 2.2Eşleşmeyen bir sayı 2ama sanırım eşleşecek
Aaron

@Aaron az önce OP onda dizi sayıları içerip içermeyeceğini sordum. Dizide kayan nokta sayılarının mevcut olacağını belirtirlerse, sunumumu değiştireceğim.
Kritixi Lithos

Evet, dün RosLup'un aynı soruyu sorduğunu ve henüz bir cevabı olmadığını görüyorum. Umarım OP yakında açıklığa kavuşacaktır!
Aaron


2

JavaScript (ES6), 53 50 48 bayt

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

@Shaggy sayesinde 5 bayt kaydedildi!

Test Durumları:

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([])ve f([[],[]])gerçeğe uygun olmalı
Arnauld

@Arnauld Şimdi doğru mu?
Arjun

Bence de. :-)
Arnauld

Bunun !cyerine birkaç bayt kaydedebileceğinizi düşünün c=="".
Shaggy

@Arnauld Bunu işaret ettiğiniz için teşekkürler. Bu meydan okuma aslında On dokuzuncu baytta bir CMC olarak gönderildi. CMC'nin [[], []] vb. Tür test vakaları hakkında söyleyecek bir şeyi yoktu. Meydan okuma ana sitede yayınlandığında, kurallara bakmadan hızlı bir şekilde çözümümü ekledim (Hatta bana CAPTCHA'yı sordu!)! Tekrar teşekkürler! :)
Arjun


2

Java 8, 126 55 27 bayt

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

Port of @KritixiLithos 'un şaşırtıcı Retina yanıtı , hariç ^...$, çünkü String#matchesher zaman tüm Dize ile eşleşir ve^...$ örtük olarak .

@Jakob'a -2 bayt sayesinde hatırlattığı ^...$için gerekli değil String#matches.

Burada deneyin.


Liste çözümündeki tüm çalışmalarınızı iptal etmekten nefret ediyorum, ancak bir dizeye zorlama ve dizgi çözümünü kullanamaz mısınız?
Jakob

@Jakob Açıklamada ne demek istiyorsun? Şu anda bir regex dize çözümü kullanıyorum. Ben sadece orijinal Liste cevabımı sakladım ve bu açıklama, çünkü String çözümü bir porttur. Sadece Liste çözümünü kaldırmak mı istiyorsunuz? Veya String çözümü için bir açıklama eklemek ister misiniz?
Kevin Cruijssen

Bir liste çözümünüz olduğu sürece, içinde dize çözümünü kullanarak da kısaltabileceğiniz anlamına gelir. Gibi boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");}sağa, çalışacak? Sadece liste çözümü daha golf planlıyorsanız işaret etmek istedim.
Jakob

1
Oh ve kaldırarak 2 bayt kaybedebilir ^ve $beri regex String.matchestüm dizeyi karşı tek testler.
Jakob

@ Jakob Liste yanıtını tümüyle kaldırdı, Java 8'e dönüştürdü ve ^...$. Geçmişte oldukça fazla kullanmış
olmama

1

Python 2 , 44 43 42 bayt

Alır xlistenin dize temsili olarak. Bu aynı zamanda örnekte olduğu gibi temsillerin boşluk içermediğini varsayar.

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

Çevrimiçi deneyin!


açıklama

Her ikisi de girdinin dize gösterimindeki karakterleri alır ve içinde başka karakterlerin olup olmadığını belirler [], 2. Bunu bir kümeye yayınlayarak ve sadece bu karakter kümesiyle karşılaştırarak yaparlar. Biz çarpma dize olsun veya olmasın yadsınması ile kümesi oluşturmak için kullanılan bu davayı yama için, 2 (örn 22 veya 222) ait parmaklara sadece gelmiştir 2'den başka bir numara varsa, ancak bu başarısız xiçerir "22". İçerirse, bu boş küme olacaktır, aksi takdirde öncekiyle aynı olacaktır.



Başarısız[22]
Leaky Nun

@LeakyNun Çözüldü
Buğday Sihirbazı

@LeakyNun Öneri için başarısız[]
Buğday Sihirbazı

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

1

Ohm, 6 bayt

∙e]Å2N

CP-437Kodlamayı kullanır .

Açıklama:

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

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

@ JörgHülsermann Lütfen bir örnek verebilir misiniz? Tüm test vakaları işe yarıyor gibi görünüyor. Bir tarayıcı aracılığıyla test etmezseniz, skaler değerlerini $_GETdize olarak geçirir misiniz ?
user63956

<?=!preg_match('/:"(?!2")/',$argn);ve girdi serileştirilmiş dizinin dize temsilidir - 11 Bayt
Jörg Hülsermann 14:17

1

PHP <7.0, 29 Bayt

JSON kodlamalı dize dizisi olarak giriş

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

PHP <7.0, 42 Bayt

kullanımdan kaldırılmış işlevi kullan ereg

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

PHP, 50 Bayt

doğru için 1, yanlış için hiçbir şey yazdırmaz

Diğer akıllıca kaldırmak için -1 bayt !

veya true 1 için + 1 Byte, false 0 +önce ekle!

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

Çevrimiçi deneyin!


2
Buna gerek yok $rdeğişkeni: <?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1.
user63956

1

Pyth, 6 bayt

!-.nQ2

CJam cevabımla çok benzer. Pyth için hala yeniyim, bu yüzden lütfen golf oynayabileceğim bir şey olup olmadığını söyle.

Açıklama:

    Q   Input:     [[[], [2]], [1]]
  .n    Flatten:   [2, 1]
 -   2  Remove 2s: [1]
!       Not:       False
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.