Ruh Eşini Aramak İçin


40

Çıkışı, tamsayılar bir boş olmayan sonlu liste Verilen truthy orada tam iki eşit girişleri ve diğer tüm girişleri ayrıdır, değer ve Falsey aksi değer.

Örnekler

truthy:
[1,1]
[1,2,1]
[1,6,3,4,4,7,9]

falsey:
[0]
[1,1,1]
[1,1,1,2]
[1,1,2,2]
[2,1,2,1,2]
[1,2,3,4,5]

Sanırım tamsayıların her zaman 10'un altında olacağını varsayamayız.
Martin Ender

1
Evet, dilinizin daha büyük bir tam sayıyı desteklememesi dışında.
kusur

1
Tutarlı olarak ne kastettiğinizi detaylandırabilir misiniz ?
kusur

33
Bunu HNQ'nun zirvesinde gördüm ve kişilerarası son soruya ulaştığımızı düşündüm
gntskn

3
@Walfrat Kendinize meydan okuyun. Ayrıca bu geri bildirim genellikle sanal alanda takdir edilir.
kusur

Yanıtlar:


22

Python 3, 30 28 bayt

lambda m:len({*m})+1==len(m)

Çevrimiçi deneyin!

{*m}setListeyi, kopyaları olmayan sıralanmamış bir eşya listesi olan bir nesneye gönderir. Bunu yapmak, listenin uzunluğunu daima içindeki kopyaların sayısını azaltacaktır. Uzunluğun ne kadar değiştiğini hesaplayarak, listenin tek bir kopyası olup olmadığını kolayca söyleyebiliriz ve testin sonucunu döndürürüz.

Ovs sayesinde -2 bayt.


Tam olarak çözdüm , ama {*m}kısayol hakkında unuttum çözüm setiyi golf!
FlipTack

Olumsuzluk için 27 bayt . (Falsey ne zaman Truthy, vs. olmalıdır)
mbomb007

3
İşte bunu yapmanın başka bir garip yolu (ayrıca olumsuzlama):lambda m:~-len(m[len({*m}):])
mbomb007

9

Kabuğu , 4 bayt

εṠ-u

Çevrimiçi deneyin!

açıklama

εṠ-u  Implicit input.
   u  Unique elements.
 Ṡ-   Delete them from input, counting multiplicities.
ε     Is the result a singleton list?

7

MATL , 7 , 6 bayt

&=sp4=

Çevrimiçi deneyin!

@Guiseppe sayesinde bir bayt kurtarıldı!

Açıklama:

&=  % Table of pair-wise equality comparisons
    %
    % [1 0 0 0 0 0 0
    %  0 1 0 0 0 0 0
    %  0 0 1 0 0 0 0
    %  0 0 0 1 1 0 0
    %  0 0 0 1 1 0 0
    %  0 0 0 0 0 1 0
    %  0 0 0 0 0 0 1]
    %
s   % Sum each Column. Stack:
    %
    % [1 1 1 2 2 1 1]
    %
p   % Product of the array. Stack:
    %
    % [4]
    %
4=  % Compare the stack to '4'

1
Yana solan sumve sumbu sadece olamazdı birinci tek sigara boyut boyunca toplamları (sütunlar) ve matris simetriktir syerine Xs?
Giuseppe

1
@Giuseppe Ah, TIL. Teşekkür ederim!
DJMcMayhem


6

Jöle , 8 5 bayt

QL‘=L

Çevrimiçi deneyin!

açıklama

QL‘=L  - Main link, argument L (a list)   e.g [1,6,3,4,4,7,9]
Q      - Deduplicated elements                [1,6,3,4,7,9]
 L     - Length                               6
  ‘    - Increment                            7
    L  - Length of the input                  7 ([1,6,3,4,4,7,9])
   =   - Are they equal?                      1

Eğer çıktı değerleri tutarlı bir değer olabilirse, o zaman QL_Lişe -1yarıyor ve falsey için pozitif olmayan herhangi bir sayı çıkarıyor (thanks @JonathanAllan)


QL_Lçıktılayacaktır -1truthy ve en az bir sayı için -1veya 0Falsey (örneğin [1,6,3,4,4,7,9,9,9]dönmek -3ise, [1,6,3,4,7,9]dönmek 0).
Jonathan Allan,

@JonathanAllan Oh evet. Sanırım hepsinde test ettiğim örnekler geri döndü -2.
caird coinheringaahing


4

Pushy , 8 bayt

Aşağıdakileri kontrol etmenin basit bir uygulaması len(set(list)) == len(list)-1:

LtvuL^=#

Açıklama:

       \ Implicit: Put all input on stack
Ltv    \ Get the stack length - 1, save in auxiliary stack
u      \ Remove non-unique elements
L      \ Get the new length
^=     \ Compare with the previously saved length
#      \ Print result

Bu, başlangıç ​​listesinde yalnızca tam olarak 1 farklı tam sayı olması durumunda uzunluk yalnızca 1 oranında azalacak şekilde çalışır.

Çevrimiçi deneyin!


1
Vay canına, bir Pushy cevabı görmedim! +1
caird coinheringaahing

1
@cairdcoinheringaahing Pushy asla ölmeyecek. Sadece daha güçlü geri gelecek.
FlipTack

4

Octave , 25 bayt

Bu, diğer cevapların çoğunda olduğu gibi bir yaklaşımı groupya da uniqueyaklaşımı değil, olası tüm karşılaştırmaların "kartezyen ürününü" kullanmaktır.

@(x)nnz(triu(x==x',1))==1

açıklama

             x==x'        %create a matrix where the entry at (i,j) compares whether x(i) == x(ju)
        triu(x==x',1)     %only consider the strict upper triangular matrix
    nnz(triu(x==x',1))    %count the number of nonzero entries
@(x)nnz(triu(x==x',1))==1 %check whether this number is actually 1

Çevrimiçi deneyin!

Ve hiçbir program bir evrişim olmadan tamamlanamaz (bir hatayı düzelttiği için @LuisMendo'ya teşekkürler):

Oktav , 40 bayt

@(x)nnz(~conv(sort(x),-1:2:1,'same'))==1

Çevrimiçi deneyin!


Bu yaklaşıma gelmem için bana ilham verdin :)
Stewie Griffin

2
@StewieGriffin MATL cevabının kesin yaklaşımını kullandığını düşünüyorum :)
kusur

4

J , 7 6 bayt

=&#0,=

=her eşsiz elemanı ile eşitlik için her eleman kontrol ile bir matris oluşturur m için satır  m  benzersiz unsurları.
0,üstüne boş bir satır ekleyin.
=&#satır sayısı girdi uzunluğuna eşit mi?

Çevrimiçi deneyin!


Ben değiştirmek düşünüyorum .~ile=
H.PWiz

@ H.PWiz Nice, düzenlendi.
FrownyFrog 11:17

4

Retina , 15 12 11 bayt

1 baytı kurtardığı için Neil'e teşekkürler.

D`
Mm2`^$
1

Çevrimiçi deneyin!

Giriş satır besleme ile ayrılmıştır. (Test paketi kolaylık sağlamak için virgülle ayırma kullanır.)

açıklama

D`

Girdideki satırları tekilleştirin; bu, daha önce görüntülenen tüm tamsayıları kaldırır (ancak çevredeki satır besleme (ler) i terk eder).

Mm2`^$

Kaldırdığımız kopya sayısına eşit olan boş satır sayısını sayın, ancak yalnızca ilk iki eşleşmeyi göz önünde bulundurun. Böylece çıktı yalnızca 0(kopya yok), 1(bir kopya), 2(iki veya daha fazla kopya) olacaktır.

1

Tam olarak bir kopyanın kaldırıldığından emin olun.


Yeni satır eşleşmesini 2 ile sınırlayarak bir bayt kaydedin; böylece üçüncü satıra giriş her zaman 0, 1 veya 2 olur ve testi basitleştirir. (Sinir bozucu bir A`.şekilde yeni hatları saymak için kullanamazsınız , çünkü sonuncusunu düşürür.)
Neil

@Neil Teşekkürler, limit temiz bir fikir. Ben de kullanmayı denedim A`., fakat sorun şu ki, tek bir boş satırı hiçbir çizgiden ayırmamaktasınız. Belki herhangi bir satır varsa, sonlandırmayı Ave Gsatır besleme ile çıkış vermeyi düşünmeliyim . Her ne kadar bu muhtemelen bir seçenek olmalı, çünkü bu durumun diğer senaryolarda sinir bozucu olduğunu hayal edebiliyorum.
Martin Ender

Tek bir boş çizgiyi eşleştirmek kolaydır - bu sadece ^$¶.
Neil

@Hayır Hayır, demek istediğim, çıktının, Atek bir boş satırı tutup tutmamasına veya tüm satırları atmasına bakılmaksızın aynıdır.
Martin Ender

Üzgünüm, demek istediğim "sonuncuyu düşürüyor" - daha az boş bir satır döndürüyor, ancak daha sonra 0 ile 1 arasında ayrım yapamıyorsunuz.
Neil

3

05AB1E , 4 bayt

{¥_O

Çevrimiçi deneyin!

Çıkışlar 1truthy olarak, falsy gibi herhangi bir başka negatif olmayan bir tam sayı. 05AB1E'de, 1tek gerçek sayıdır (içgörü için @Emigna!).

açıklama

{       Implicit input. Sort
 ¥      Consecutive differences
  _     Boolean negate
   O    Sum. Implicit display

3

Ruby, 32 bayt

->(s){s.uniq.length==s.length-1}

PPCG'ye Hoşgeldiniz! Bu kod golf olduğundan, programınızın bayt sayısını eklemeniz gerekir. Bu sefer senin için yapma özgürlüğünü aldım.
Pavel

Ne dersiniz Array#size?
Travis,

Kullanarak 26 byte'a kadar alabilirsiniz->s{s.uniq.size==s.size-1}
Conor O'Brien


3

Excel, 42 bayt

Danimarka dili versiyonu

=TÆLV(A:A)=SUM(--(FREKVENS(A:A,A:A)>0))+1

Listedeki her tamsayı, sütundaki ayrı bir hücrede varsayar A.
Tutarsız falsey değerleri için izin verilirse , 3 bayt kazanabiliriz:

=TÆLV(A:A)+SUM(-(FREKVENS(A:A,A:A)>0))

İngilizce versiyonu (44 bayt)

=COUNTA(A:A)=SUM(--(FREQUENCY(A:A,A:A)>0))+1

3

R , 32 31 bayt

@JarkoDubbeldam sayesinde -1 bayt

cat(sum(duplicated(scan()))==1)

Çevrimiçi deneyin!

Stdin'den okur, stdout'a yazar.

duplicateddeğerlerini yerine listesini yineler, lile TRUEbu değeri listede daha erken ve oluşursa FALSEaksi. Eşsiz bir ruh çifti çifti varsa, tam olarak bir TRUEdeğer olmalı, bu yüzden toplam olmalı 1.



1
Tabii ki @JarkoDubbeldam ah. Seni tekrar görmek güzel! Uzun zaman oldu.
Giuseppe

Başka şeylerle meşguldüm, henüz tamamen geri döndüğüme emin değilim.
JAD

@Giuseppe, Ben sadece bu soruyu okudum ve hemen Orijinal Yaklaşımınızı düşündüm .... Çok hoş! Bu scan()yaklaşımı asla düşünemezdim .
Joseph Wood

3

PowerShell , 40 37 bayt

($args|sort -u).count-eq$args.count-1

Çevrimiçi deneyin!

Sort-ObjectKomutu (diğer adı sortile birlikte) -unique bayrak girişinin sadece tek bileşenlerini çeker. Örneğin, giriş için @(1,3,3,2)bu sonuçlanacaktır @(1,2,3).

Bu nedenle, sadece .countbu nesnenin (yani kaç öğeye sahip olduğunu) giriş -eqdizimizinki için geçerli olduğundan emin olmamız gerekir (yani, tam olarak bir kopya girişimiz var)..count-1

Sinusoid sayesinde 3 byte kurtarıldı.
TessellatingHeckler sayesinde sabit hata.


Aynı sonuca ulaşmak için grup yerine benzersiz 'takma adı' gu 'kullanabilir misiniz?
Sinusoid

@ Sinusoid Evet, yapabiliriz. Teşekkürler!
AdmBorkBork

Bu, ikinci test durumunda çalışmaz 1,2,1- get-uniqueyalnızca önceden sıralanmış girdilerde çalışır. Peki ($args|sort -u).count-eq$args.count-1sen gibi ararsanız, hangi test durumları da 37 ama herkes için çalışır f 1 2 1yerine f 1,2,1?
TessellatingHeckler

@TessellatingHeckler Ah, iyi yakala. Yaptığım tüm testler önceden sıralanmış girdilerle yapıldı. Teşekkürler!
AdmBorkBork,



2

Octave / MATLAB (İstatistik paketi / araç kutusu ile), 21 bayt

@(x)nnz(~pdist(x))==1

Anonim işlev Giriş bir sütun vektörüdür. Çıkış true(olarak görüntülenir 1) veya false(olarak görüntülenir 0).

Çevrimiçi deneyin!

açıklama

pdist(x)Tüm satır çiftleri arasındaki Öklid mesafelerinin bir vektörünü hesaplar x. Her bir çifti yalnızca bir kez göz önünde bulundurur (iki sıranın sırası önemli değildir) ve aynı sırada iki kez oluşturulan çiftleri dikkate almaz.

Bizim durumumuzda xbir sütun vektörü olduğu için iki sıra arasındaki Öklid mesafesi iki sayı arasındaki mutlak farktır.

~mantıklı (Boolean) olumsuzlama, nnzsıfır olmayan sayıdır ve ==1karşılaştırır 1. Sonuç, trueeğer sıfır mesafe veren sadece bir çift varsa ve olur.



2

Julia, 39 26 bayt

!a=sum(a.==a')==endof(a)+2

açıklama

Kod, daha sonra toplam işlevi kullanılarak toplanan ve A'nın kartezyen karesindeki aynı eleman çiftlerinin sayısını sayan, 2 boyutlu bir booleans tablosu oluşturur. miktarlar yalnızca tam olarak bir yineleme karakteri olduğunda eşittir.

Bu kod NOT işlecini yeniden tanımlar.


!a=sum(a.==a')==endof(a)+2birkaç bayt kaydeder. Çevrimiçi deneyin!
Dennis,


2

Octave , 23 26 bayt

@(x)prod(sum(x==x'))==4

Çevrimiçi deneyin!

Bu x==x'bölüm kusurun cevabından ilham aldı . Bu Luis'in cevabından daha uzun, ama hiçbir araç kutusu kullanmıyor.

Açıklama:

Bu, bir vektörü xgirdi olarak alan ve onu kendisinin translasyonuyla karşılaştıran isimsiz bir fonksiyondur . Bu, tüm çapraz elemanların olduğu 1ve herhangi bir çapraz olmayan elemanın da yinelenen elemanlar olduğuna işaret ettiği bir matris verecektir .

Herhangi bir sütundaki toplam, bu sayının kaç tekrarı olduğunu gösterir. Sayıların ikisinin bir kopyasına sahip olmasını istiyoruz, bu yüzden iki değer ikiye eşit, gerisi de iki değere eşit değildir.

Bu matrisin ürününü alırsak 4, sadece iki eşit element ( 2*2*1*1*1*1*...) 4varsa ve yinelemeli olmayan veya ikiden fazla olmayan bir şey alırız .


2

PHP, 46 bayt

<?=count(array_unique($argv))==count($argv)-1;

Girişlerin sayısını sayar ve $argvbenzersiz girişlerin sayısını karşılaştırır. İlki 1'den daha yüksekse, o zaman hakikaten falsey.

Eval.in'de dene!


$ Argv değişken ismini kullanmak zorunda mısın? Bunun yerine sadece $ a kullanamaz mısın?
da8484,

3
@ dading84 $argvkomut satırı parametrelerinin listesidir. Yani: hayır, sadece kullanamaz $a.
Titus

2

05AB1E , 6 5 bayt

{¥>ΘO

Çevrimiçi deneyin!

{¥>ΘO   # example input:               [1, 6, 3, 4, 4, 7, 9]
{       # sort                      -> [1, 3, 4, 4, 6, 7, 9]
 ¥      # get deltas                -> [  2, 1, 0, 2, 1, 2 ]
  >     # increment                 -> [  3, 2, 1, 3, 2, 3 ]
   Θ    # truthify (only 1 gives 1) -> [  0, 0, 1, 0, 0, 0 ]
    O   # sum                       -> 1

105AB1E'deki tek acımasız değer olarak burada durabiliriz. (Buna dikkat çektiğiniz için teşekkürler @Emigna.)

Yalnızca iki farklı değer elde etmek için isteğe bağlı olarak şunları ekleyebiliriz:

     Θ  # equals 1?                 -> 1

1
Eğer falsey vakaları için herhangi bir falsey değerini döndürmek uygunsa, 05AB1E'deki tek truthy değeri olduğu Θgibi 1, atlayabilirsiniz .
Emigna

@Emigna Teşekkürler! OP tarafından onaylanıp onaylanmadığından emin değildim, ama sanırım öyle.
Arnauld

¢İşe yaramayacak bir önceki çözüme geri dönmeniz gerektiğinden korkuyorum . Bu saymak olacaktır [19,4,4,9]false ile ve [19,9]gerçek olarak bulduğu beri 0in 10.
Emigna

@Emigna Bunu gördüğünüz için teşekkürler. Bence bu sabit.
Arnauld

{¥_O iyi de olmalı.
Emigna

2

APL (Dyalog Unicode) , 7 bayt SBCS

1=≢-≢∘∪

Çevrimiçi deneyin!

Açıklama:

1=≢-≢∘∪   Monadic function train
    ≢∘∪   Generate a list of unique items in the input,
          and return the length of that list
  ≢-      Take the length of the input and subtract the above
1=        If the difference is 1, true, otherwise false


1

Japt, 7 bayt

â ʶUÊÉ

Dene


açıklama

Kopyaları ( â) çıkarın , uzunluk ( Ê) alın ve eşitliği ( ) Êgirişin ( U) eksi 1 ( É) uzunluğu ile karşılaştırın .


Bu 12 bayt değil mi? âÊɶÇok baytlı karakterler değil misiniz ?
RedClover


1

05AB1E , 5 bayt

gIÙg-

Çevrimiçi deneyin!

g     # Get number of elements in input
 IÙg  # Get number of unique elements in input
    - # Subtract

05AB1E'de 1, sadece truthy değeridir, bu nedenle, truthy sonucu için, uniquify tarafından kaldırılan tam olarak 1 yinelenen eleman bulunmalıdır.

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.