Mencari Jodoh

40

Mengingat daftar yang terbatas tak kosong dari bilangan bulat, output truthy nilai jika ada tepat dua entri yang sama dan semua entri lainnya adalah berbeda, dan falsey nilai sebaliknya.

Contohnya

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]
cacat
sumber
Saya kira kita tidak bisa berasumsi bahwa bilangan bulat akan selalu kurang dari 10?
Martin Ender
1
Ya kecuali jika bahasa Anda tidak mendukung bilangan bulat yang lebih besar.
flawr
1
Bisakah Anda menguraikan apa yang Anda maksud dengan konsisten ?
flawr
33
Melihat ini di bagian atas HNQ & berpikir kami telah mencapai pertanyaan terakhir interpersonal.se
gntskn
3
@Walfrat Posting sebagai tantangan Anda sendiri. Umpan balik seperti itu biasanya dihargai di kotak pasir.
flawr

Jawaban:

22

Python 3, 30 28 byte

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

Cobalah online!

{*m}melemparkan daftar ke setobjek, daftar item yang tidak terurut tanpa duplikat. Melakukan hal ini akan selalu mengurangi panjang daftar dengan jumlah duplikat di dalamnya. Dengan menghitung berapa panjang telah berubah, kita dapat dengan mudah mengetahui apakah daftar memiliki duplikat tunggal dan mengembalikan hasil tes.

-2 bytes terima kasih kepada ovs.

Lirik
sumber
Solusi tepat yang saya miliki, tetapi lupa tentang jalan {*m}pintas, bukan setgolf dengan baik!
FlipTack
27 byte untuk negasi . (Falsey padahal seharusnya Kebenaran, dll)
mbomb007
3
Inilah cara aneh lain untuk melakukannya (juga negasi):lambda m:~-len(m[len({*m}):])
mbomb007
9

Sekam , 4 byte

εṠ-u

Cobalah online!

Penjelasan

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

MATL , 7 , 6 byte

&=sp4=

Cobalah online!

Satu byte disimpan berkat @Guiseppe!

Penjelasan:

&=  % 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'
DJMcMayhem
sumber
1
Karena sis sumdan summenjumlahkan sepanjang dimensi non-singleton (kolom) pertama, dan matriksnya simetris, bukankah ini bisa sterjadi Xs?
Giuseppe
1
@Giuseppe Ah, TIL. Terima kasih!
DJMcMayhem
6

Jelly , 8 5 byte

QL‘=L

Cobalah online!

Penjelasan

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

Jika nilai-nilai output dapat berupa nilai-nilai yang konsisten, maka QL_Lberfungsi, yang menampilkan -1kebenaran dan angka non-positif lainnya untuk falsey (terima kasih @JonathanAllan)

caird coinheringaahing
sumber
QL_Lakan menghasilkan -1untuk kebenaran dan beberapa angka kurang dari -1atau 0untuk falsey (misalnya [1,6,3,4,4,7,9,9,9]akan kembali -3, sementara [1,6,3,4,7,9]akan kembali 0).
Jonathan Allan
@ Jonathan Allan Oh yeah. Saya kira contoh saya mengujinya pada semua terjadi untuk kembali -2.
caird coinheringaahing
5

JavaScript (ES6), 30 byte

a=>new Set(a).size==a.length-1

Cobalah online

Shaggy
sumber
4

Pushy , 8 byte

Implementasi sederhana untuk memeriksa apakah len(set(list)) == len(list)-1:

LtvuL^=#

Penjelasan:

       \ 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

Ini berfungsi karena panjangnya hanya akan berkurang 1 jika hanya ada 1 integer yang tidak berbeda dalam daftar awal.

Cobalah online!

FlipTack
sumber
1
Wow, sudah lama tidak melihat jawaban yang memaksa! +1
caird coinheringaahing
1
@cairdcoinheringaahing Pushy tidak akan pernah mati. Itu hanya akan kembali lebih kuat.
FlipTack
4

Oktaf , 25 byte

Ini bukan menggunakan groupatau uniquemendekati sebanyak mungkin jawaban lain, melainkan "produk cartesian" dari semua perbandingan yang mungkin.

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

Penjelasan

             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

Cobalah online!

Dan karena tidak ada program yang akan lengkap tanpa konvolusi (terima kasih @LuisMendo untuk memperbaiki kesalahan):

Oktaf , 40 byte

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

Cobalah online!

cacat
sumber
Anda mengilhami saya untuk datang dengan pendekatan ini :)
Stewie Griffin
2
@StewieGriffin Saya pikir jawaban MATL menggunakan pendekatan tepat Anda :)
flawr
4

J , 7 6 byte

=&#0,=

=memeriksa setiap elemen untuk kesetaraan dengan setiap elemen yang unik, menciptakan sebuah matriks dengan m baris untuk  m  elemen yang unik.
0,tambahkan baris kosong di atas.
=&#apakah jumlah baris sama dengan panjang input?

Cobalah online!

FrownyFrog
sumber
Saya pikir Anda dapat menggantinya .~dengan=
H.PWiz
@ H.PWiz Bagus, diedit.
FrownyFrog
4

Retina , 15 12 11 byte

Terima kasih kepada Neil untuk menghemat 1 byte.

D`
Mm2`^$
1

Cobalah online!

Input dipisahkan oleh umpan baris. (Test suite menggunakan pemisahan koma untuk kenyamanan.)

Penjelasan

D`

Potong garis-garis dalam input, yang menghilangkan bilangan bulat apa pun yang telah muncul sebelumnya (tetapi meninggalkan umpan baris sekitarnya).

Mm2`^$

Hitung jumlah baris kosong, yang sama dengan jumlah duplikat yang kami hapus, tetapi hanya pertimbangkan dua kecocokan pertama. Jadi hasilnya hanya akan 0(tidak ada duplikat), 1(satu duplikat), 2(dua atau lebih duplikat).

1

Pastikan satu duplikat telah dihapus.

Martin Ender
sumber
Simpan byte dengan membatasi kecocokan baris baru ke 2, sehingga input ke baris ketiga selalu 0, 1, atau 2, menyederhanakan tes. (Mengganggu Anda tidak dapat menggunakan A`.untuk menghitung baris baru, karena itu menjatuhkan yang terakhir.)
Neil
@Neil Terima kasih, batasnya adalah ide yang rapi. Saya juga mencoba menggunakan A`., tetapi masalahnya adalah Anda tidak dapat membedakan satu baris kosong dari tidak memiliki garis sama sekali. Mungkin saya harus mempertimbangkan terminating Adan Goutput dengan linefeed jika ada baris. Meskipun itu mungkin harus menjadi pilihan karena saya bisa membayangkan bahwa linefeed menjengkelkan dalam skenario lain.
Martin Ender
Mencocokkan satu baris kosong itu mudah - itu saja ^$¶.
Neil
@ Neil Tidak, maksud saya bahwa output Aidentik terlepas dari apakah itu mempertahankan satu baris kosong atau membuang semua baris.
Martin Ender
Maaf, itulah yang saya maksud dengan "menjatuhkan yang terakhir" - ia mengembalikan satu baris kosong lebih sedikit, tetapi kemudian Anda tidak dapat membedakan antara 0 dan 1.
Neil
3

05AB1E , 4 byte

{¥_O

Cobalah online!

Keluaran 1sebagai kebenaran, bilangan bulat non-negatif lainnya falsy. Di 05AB1E, 1adalah satu-satunya nomor yang benar (terima kasih @Emigna untuk wawasannya!).

Penjelasan

{       Implicit input. Sort
 ¥      Consecutive differences
  _     Boolean negate
   O    Sum. Implicit display
Luis Mendo
sumber
3

Ruby, 32 byte

->(s){s.uniq.length==s.length-1}
Parenparen
sumber
Selamat datang di PPCG! Karena ini adalah kode golf, Anda perlu memasukkan jumlah byte program Anda. Saya telah mengambil kebebasan untuk melakukannya untuk Anda saat ini.
Pavel
Bagaimana dengan Array#size?
Travis
Anda bisa turun ke 26 byte dengan menggunakan->s{s.uniq.size==s.size-1}
Conor O'Brien
3

Excel, 42 byte

Versi bahasa Denmark

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

Asumsikan setiap bilangan bulat dari daftar di sel terpisah di kolom A.
Jika kami diizinkan untuk nilai falsey yang tidak konsisten , kami dapat menyimpan 3 byte:

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

Versi bahasa Inggris (44 byte)

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

R , 32 31 byte

-1 byte terima kasih kepada @JarkoDubbeldam

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

Cobalah online!

Membaca dari stdin, menulis ke stdout.

duplicatedberulang melalui daftar, mengganti nilai-nilai ldengan TRUEjika nilai itu terjadi sebelumnya dalam daftar, dan FALSEsebaliknya. Jika ada pasangan soulmates yang unik, harus ada tepat satu TRUEnilai, jadi jumlahnya harus 1.

Giuseppe
sumber
1
31 byte
JAD
1
@JarkoDubbeldam ah, tentu saja. Senang bertemu denganmu lagi! Sudah lama.
Giuseppe
Sudah sibuk dengan beberapa hal lain, tidak yakin aku benar-benar sudah kembali.
JAD
@ Giuseppe, saya baru saja membaca pertanyaan ini dan langsung memikirkan Pendekatan Asli Anda .... Bagus sekali! Saya tidak akan pernah memikirkan scan()pendekatan itu.
Joseph Wood
3

PowerShell , 40 37 byte

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

Cobalah online!

The Sort-Objectperintah (alias sort) dengan -ubendera nique menarik keluar hanya komponen unik input. Misalnya, untuk input @(1,3,3,2), ini akan menghasilkan @(1,2,3).

Jadi, kita hanya perlu memastikan bahwa .countobjek ini (yaitu, berapa banyak elemen yang dimilikinya) -eqsesuai dengan .countarray input kami -1(yaitu, kami memiliki satu entri duplikat).

Disimpan 3 byte berkat Sinusoid.
Memperbaiki bug berkat TessellatingHeckler.

AdmBorkBork
sumber
Bisakah Anda menggunakan alias 'unik' alih-alih grup untuk mencapai hasil yang sama?
Sinusoid
@ Sinusoid Ya, kami bisa. Terima kasih!
AdmBorkBork
Ini tidak berfungsi pada kasus uji kedua 1,2,1- get-uniquehanya bekerja pada input yang diurutkan sebelumnya. Bagaimana dengan ($args|sort -u).count-eq$args.count-1yang juga 37 tetapi apakah berfungsi untuk semua kasus uji, jika Anda menyebutnya suka f 1 2 1bukan f 1,2,1?
TessellatingHeckler
@ TessellatingHeckler Ah, tangkapan yang bagus. Semua pengujian yang saya lakukan adalah dengan input pra-sortir. Terima kasih!
AdmBorkBork
2

Perl 5 , 36 +1 ( -a) = 37 byte

map$k{$_}++,@F;@a=keys%k;say@a+1==@F

Cobalah online!

Xcali
sumber
1
boleh @k{@F}++;say@F==1+keys%k
main golf
2

Oktaf / MATLAB (dengan paket Statistik / kotak alat), 21 byte

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

Fungsi anonim. Input adalah vektor kolom. Output adalah true(ditampilkan sebagai 1) atau false(ditampilkan sebagai 0).

Cobalah online!

Penjelasan

pdist(x)menghitung vektor jarak Euclidean antara semua pasangan baris dari x. Ini menganggap setiap pasangan hanya sekali (urutan dua baris tidak masalah), dan tidak mempertimbangkan pasangan yang dibentuk oleh baris yang sama dua kali.

Dalam kasus kami xadalah vektor kolom, jadi jarak Euclidean antara dua baris hanyalah perbedaan mutlak antara dua angka.

~adalah negasi logis (Boolean), nnzadalah jumlah nonzeros, dan ==1dibandingkan dengan 1. Jadi hasilnya adalah truejika dan hanya jika hanya ada satu pasangan yang memberikan jarak nol.

Luis Mendo
sumber
2

Jq 1.5 , 53 25 byte

length-(unique|length)==1

Terinspirasi oleh jawaban Riley dan jauh lebih pendek daripada solusi asli saya.

Cobalah online!

jq170727
sumber
2

Julia, 39 26 byte

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

Penjelasan

Kode menghasilkan tabel 2-dimensi boolean, yang kemudian dikumpulkan menggunakan fungsi penjumlahan, menghitung jumlah pasangan elemen-sama dalam kuadrat kartesian A. Kemudian ini dibandingkan dengan panjang string ditambah dua, dan kuantitasnya sama hanya ketika hanya ada satu karakter berulang.

Kode ini mendefinisikan kembali operator NOT.

eaglgenes101
sumber
!a=sum(a.==a')==endof(a)+2menghemat beberapa byte. Cobalah online!
Dennis
2

Oktaf , 23 26 byte

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

Cobalah online!

Bagian x==x'itu terinspirasi oleh jawaban flawr . Ini lebih panjang dari jawaban Luis, tetapi tidak menggunakan kotak alat apa pun.

Penjelasan:

Ini adalah fungsi anonim yang mengambil vektor xsebagai input, dan membandingkannya dengan dirinya sendiri. Ini akan memberikan matriks di mana semua elemen diagonal berada 1, dan setiap elemen diagonal off menandakan bahwa ada elemen duplikat.

Jumlah di sepanjang kolom yang diberikan menunjukkan berapa banyak duplikat dari jumlah itu. Kami ingin dua angka memiliki duplikat, jadi kami dua nilai sama dengan dua, dan sisanya tidak sama dengan dua.

Jika kita mengambil produk dari matriks ini, kita akan mendapatkan 4jika hanya ada dua elemen yang sama ( 2*2*1*1*1*1*...), dan sesuatu selain 4jika tidak ada duplikat, atau lebih dari dua.

Stewie Griffin
sumber
2

PHP, 46 byte

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

Menghitung jumlah entri $argvdan membandingkannya dengan jumlah entri unik. Jika yang pertama lebih tinggi dari yang terakhir dengan 1 maka benar, selain itu falsey.

Cobalah di eval.in!

roberto06
sumber
Apakah Anda harus menggunakan nama variabel $ argv bisakah Anda tidak hanya menggunakan $ a saja?
dading84
3
@ dading84 $argvadalah daftar parameter baris perintah. Jadi: tidak, dia tidak bisa menggunakan begitu saja $a.
Titus
2

05AB1E , 6 5 byte

{¥>ΘO

Cobalah online!

{¥>Θ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

1menjadi satu-satunya nilai kebenaran di 05AB1E, kita bisa berhenti di sini. (Terima kasih @ Emigna telah menunjukkan hal itu.)

Untuk mendapatkan hanya dua nilai berbeda, kita dapat menambahkan:

     Θ  # equals 1?                 -> 1
Arnauld
sumber
1
Jika boleh mengembalikan nilai falsey apa pun untuk kasing falsey, Anda dapat melewatkannya Θ, seperti 1satu-satunya nilai jujur ​​di 05AB1E.
Emigna
@Emigna Terima kasih! Saya tidak yakin apakah itu disetujui oleh OP, tapi saya kira begitu.
Arnauld
Saya khawatir Anda harus kembali ke solusi sebelumnya karena ¢tidak akan berfungsi. Itu akan dihitung [19,4,4,9]sebagai salah dan [19,9]benar karena ia menemukan 0di 10.
Emigna
@Emigna Terima kasih telah melihatnya. Saya pikir itu sudah diperbaiki.
Arnauld
{¥_Oharus baik-baik saja juga.
Emigna
2

APL (Dyalog Unicode) , 7 byte SBCS

1=≢-≢∘∪

Cobalah online!

Penjelasan:

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
voidhawk
sumber
1

Japt, 7 byte

â ʶUÊÉ

Cobalah


Penjelasan

Hapus duplikat ( â), dapatkan panjang ( Ê) dan bandingkan kesetaraan ( ) dengan panjang ( Ê) dari input ( U) minus 1 ( É).

Shaggy
sumber
Bukankah itu 12 byte? Bukankah âÊɶkarakter multibyte?
RedClover
1

05AB1E , 5 byte

gIÙg-

Cobalah online!

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

Di 05AB1E 1 adalah satu-satunya nilai kebenaran, jadi untuk hasil yang benar harus ada persis 1 elemen rangkap yang dihapus oleh yang unik.

Riley
sumber