Tìm kiếm một người bạn tâm giao


40

Cho một danh sách hữu hạn khác rỗng của số nguyên, sản lượng một truthy giá trị nếu có chính xác hai mục bình đẳng và tất cả các mục khác là khác biệt, và một falsey giá trị khác.

Ví dụ

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]

Tôi cho rằng chúng ta không thể cho rằng các số nguyên sẽ luôn nhỏ hơn 10?
Martin Ender

1
Có ngoại trừ nếu ngôn ngữ của bạn không hỗ trợ bất kỳ số nguyên lớn hơn.
flawr

1
Bạn có thể giải thích những gì bạn có nghĩa là nhất quán ?
flawr

33
Nhìn thấy điều này trên đầu HNQ và nghĩ rằng chúng tôi đã đạt được câu hỏi giữa các cá nhân cuối cùng
gntskn

3
@Walfrat Đăng nó là thách thức của riêng bạn. Ngoài ra thông tin phản hồi như vậy thường được đánh giá cao trong hộp cát.
flawr

Câu trả lời:


22

Python 3, 30 28 byte

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

Hãy thử trực tuyến!

{*m}đưa danh sách vào một setđối tượng, một danh sách các mục không có thứ tự mà không trùng lặp. Làm điều này sẽ luôn giảm độ dài của danh sách theo số lượng trùng lặp trong đó. Bằng cách tính toán độ dài đã thay đổi, chúng ta có thể dễ dàng biết được danh sách có trùng lặp hay không và trả về kết quả của bài kiểm tra.

-2 byte nhờ vào các lò nướng.


Chính xác là giải pháp tôi có, nhưng quên mất {*m}lối tắt thay vì set, chơi golf tốt!
FlipTack

27 byte cho phủ định . (Falsey khi nó phải là Truthy, v.v.)
mbomb007

3
Đây là một cách kỳ lạ khác để làm điều đó (cũng phủ nhận):lambda m:~-len(m[len({*m}):])
mbomb007


7

MATL , 7 , 6 byte

&=sp4=

Hãy thử trực tuyến!

Một byte được lưu nhờ vào @Guiseppe!

Giải trình:

&=  % 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
Kể từ khi ssumsumtiền dọc theo chiều hướng không singleton đầu tiên (cột), và ma trận đối xứng, không thể này chỉ là sthay vì Xs?
Giuseppe

1
@Giuseppe À, TIL. Cảm ơn bạn!
DJMcMayhem


6

Thạch , 8 5 byte

QL‘=L

Hãy thử trực tuyến!

Giải trình

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

Nếu các giá trị đầu ra có thể là bất kỳ giá trị nhất quán nào, thì nó QL_Lhoạt động, đầu ra -1cho sự thật và bất kỳ số không tích cực nào khác cho falsey (cảm ơn @JonathanAllan)


QL_Lsẽ đầu ra -1cho sự thật và một số ít hơn -1hoặc 0cho falsey (ví dụ [1,6,3,4,4,7,9,9,9]sẽ trở lại -3, trong khi [1,6,3,4,7,9]sẽ trở lại 0).
Jonathan Allan

@Jonathan ALLan Oh yeah. Tôi đoán các ví dụ tôi đã thử nó trên tất cả đã xảy ra để trở lại -2.
caird coinheringaahing


4

Pushy , 8 byte

Thực hiện đơn giản kiểm tra xem len(set(list)) == len(list)-1:

LtvuL^=#

Giải trình:

       \ 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

Điều này hoạt động vì độ dài sẽ chỉ giảm 1 nếu chỉ có chính xác 1 số nguyên không phân biệt trong danh sách ban đầu.

Hãy thử trực tuyến!


1
Wow, chưa thấy một câu trả lời Pushy trong thời gian dài! +1
caird coinheringaahing

1
@cairdcoinheringaahing Pushy sẽ không bao giờ chết. Nó sẽ chỉ trở lại mạnh mẽ hơn.
FlipTack

4

Octave , 25 byte

Đây không phải là sử dụng một grouphoặc uniquetiếp cận như nhiều câu trả lời khác, mà là "sản phẩm cartesian" của tất cả các so sánh có thể.

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

Giải trình

             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

Hãy thử trực tuyến!

Và bởi vì sẽ không có chương trình nào hoàn thành nếu không có tích chập (cảm ơn @LuisMendo vì đã sửa lỗi):

Octave , 40 byte

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

Hãy thử trực tuyến!


Bạn đã truyền cảm hứng cho tôi để đưa ra phương pháp này :)
Stewie Griffin

2
@StewieGriffin Tôi nghĩ rằng câu trả lời MATL đã sử dụng cách tiếp cận chính xác của bạn :)
flawr

4

J , 7 6 byte

=&#0,=

=kiểm tra mọi phần tử cho sự bằng nhau với mọi phần tử duy nhất, tạo một ma trận với m hàng cho  m  phần tử duy nhất.
0,thêm một hàng trống trên đầu trang
=&#số lượng hàng bằng chiều dài của đầu vào?

Hãy thử trực tuyến!


Tôi nghĩ bạn có thể thay thế .~bằng=
H.PWiz

@ H.PWiz Đẹp, chỉnh sửa.
FrownyFrog

4

Võng mạc , 15 12 11 byte

Cảm ơn Neil vì đã tiết kiệm 1 byte.

D`
Mm2`^$
1

Hãy thử trực tuyến!

Đầu vào được phân tách theo dòng. (Bộ kiểm tra sử dụng phân tách dấu phẩy để thuận tiện.)

Giải trình

D`

Không lặp lại các dòng trong đầu vào, loại bỏ bất kỳ số nguyên nào đã xuất hiện trước đó (nhưng để lại các nguồn cấp dữ liệu xung quanh).

Mm2`^$

Đếm số lượng dòng trống, bằng với số lượng trùng lặp chúng tôi đã xóa, nhưng chỉ xem xét hai trận đấu đầu tiên. Vì vậy, đầu ra sẽ chỉ là 0(không trùng lặp), 1(một bản sao), 2(hai hoặc nhiều bản sao).

1

Hãy chắc chắn rằng chính xác một bản sao đã được gỡ bỏ.


Lưu một byte bằng cách giới hạn khớp dòng mới xuống 2, sao cho đầu vào của dòng thứ ba luôn là 0, 1 hoặc 2, đơn giản hóa việc kiểm tra. (Khó chịu là bạn không thể sử dụng A`.để đếm dòng mới, vì nó sẽ bỏ dòng cuối cùng.)
Neil

@Neil Cảm ơn, giới hạn là một ý tưởng gọn gàng. Tôi cũng đã thử sử dụng A`., nhưng vấn đề là bạn không thể phân biệt một dòng trống duy nhất với không có dòng nào cả. Có lẽ tôi nên xem xét việc chấm dứt AGđầu ra với một nguồn cấp dữ liệu nếu có bất kỳ dòng nào. Mặc dù đó có lẽ là một lựa chọn vì tôi có thể tưởng tượng rằng linefeed gây khó chịu trong các tình huống khác.
Martin Ender

Ghép một dòng trống đơn giản là dễ dàng - chỉ vậy thôi ^$¶.
Neil

@Neil Không, ý tôi là đầu ra của Anó giống hệt nhau bất kể nó giữ lại một dòng trống đơn hay loại bỏ tất cả các dòng.
Martin Ender

Xin lỗi, đó là ý của tôi khi "bỏ cái cuối cùng" - nó trả về một dòng trống ít hơn, nhưng sau đó bạn không thể phân biệt giữa 0 và 1.
Neil

3

05AB1E , 4 byte

{¥_O

Hãy thử trực tuyến!

Đầu ra 1là trung thực, bất kỳ số nguyên không âm nào khác là giả. Trong 05AB1E, 1là con số trung thực duy nhất (cảm ơn @Emigna vì cái nhìn sâu sắc!).

Giải trình

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

3

Ruby, 32 byte

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

Chào mừng đến với PPCG! Vì đây là mã golf, bạn cần bao gồm số byte của chương trình. Tôi đã tự do làm điều đó cho bạn lần này.
Pavel

Thế còn Array#size?
Travis

Bạn có thể nhận được tới 26 byte bằng cách sử dụng->s{s.uniq.size==s.size-1}
Conor O'Brien


3

Excel, 42 byte

Phiên bản tiếng Đan Mạch

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

Giả sử mỗi số nguyên từ danh sách trong ô riêng biệt trong cột A.
Nếu chúng tôi được phép cho các giá trị falsey không nhất quán , chúng tôi có thể lưu 3 byte:

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

Phiên bản tiếng Anh (44 byte)

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

3

R , 32 31 byte

-1 byte nhờ @JarkoDubbeldam

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

Hãy thử trực tuyến!

Đọc từ stdin, viết đến stdout.

duplicatedlặp qua danh sách, thay thế các giá trị lbằng TRUEnếu giá trị đó xảy ra sớm hơn trong danh sách và FALSEnếu không. Nếu có một cặp bạn tâm hồn duy nhất, cần có chính xác một TRUEgiá trị, vì vậy tổng số phải là 1.



1
@JarkoDubbeldam ah, tất nhiên rồi. Rất vui khi gặp bạn! Đã được một lúc rồi.
Giuseppe

Đã bận rộn với một số thứ khác, không chắc chắn tôi đã hoàn toàn trở lại.
JAD

@Giuseppe, tôi vừa đọc câu hỏi này và nghĩ ngay đến Cách tiếp cận ban đầu của bạn .... Rất hay! Tôi sẽ không bao giờ nghĩ về scan()cách tiếp cận.
Joseph Wood

3

PowerShell , 40 37 byte

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

Hãy thử trực tuyến!

Các Sort-Objectlệnh (bí danh sort) với -ucờ nique kéo ra chỉ những thành phần độc đáo của các đầu vào. Ví dụ, đối với đầu vào @(1,3,3,2), điều này sẽ dẫn đến @(1,2,3).

Vì vậy, chúng ta chỉ cần đảm bảo rằng .countđối tượng này (nghĩa là có bao nhiêu phần tử) có liên quan -eqđến .countmảng đầu vào của chúng ta -1(nghĩa là chúng ta có chính xác một mục nhập trùng lặp).

Đã lưu 3 byte nhờ Sinusoid.
Đã sửa lỗi nhờ TessellatingHeckler.


Bạn có thể sử dụng bí danh độc đáo 'gu' thay vì nhóm để đạt được kết quả tương tự không?
Sinusoid

@Sinusoid Có, chúng tôi có thể. Cảm ơn!
admBorkBork

Điều này không hoạt động trên trường hợp thử nghiệm thứ hai 1,2,1- get-uniquechỉ hoạt động trên đầu vào được sắp xếp trước. Làm thế nào về ($args|sort -u).count-eq$args.count-1cái đó cũng là 37 nhưng không hoạt động cho tất cả các trường hợp thử nghiệm, nếu bạn gọi nó như thế nào f 1 2 1thay vì f 1,2,1?
TessellatingHeckler

@TessellatingHeckler Ah, bắt tốt. Tất cả các thử nghiệm tôi đã làm là với đầu vào được sắp xếp trước. Cảm ơn!
admBorkBork



2

Octave / MATLAB (với gói / hộp công cụ Thống kê), 21 byte

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

Chức năng ẩn danh. Đầu vào là một vectơ cột. Đầu ra là true(hiển thị dưới dạng 1) hoặc false(hiển thị dưới dạng 0).

Hãy thử trực tuyến!

Giải trình

pdist(x)tính toán một vectơ khoảng cách Euclide giữa tất cả các cặp hàng từ x. Nó chỉ xem xét mỗi cặp một lần (thứ tự của hai hàng không quan trọng) và không xem xét các cặp được tạo bởi cùng một hàng hai lần.

Trong trường hợp của chúng tôi xlà một vectơ cột, vì vậy khoảng cách Euclide giữa hai hàng chỉ là sự khác biệt tuyệt đối giữa hai số.

~là phủ định logic (Boolean), nnzlà số lượng khác không và ==1so sánh với 1. Vì vậy, kết quả là truenếu và chỉ khi chỉ có một cặp cho khoảng cách bằng không.



2

Julia, 39 26 byte

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

Giải trình

Mã này tạo ra một bảng booleans 2 chiều, sau đó được thu thập bằng hàm sum, đếm số cặp phần tử giống nhau trong bình phương cartesian của A. Sau đó, giá trị này được so sánh với độ dài của chuỗi cộng với hai và số lượng chỉ bằng nhau khi có chính xác một ký tự lặp lại.

Mã này xác định lại toán tử KHÔNG.


!a=sum(a.==a')==endof(a)+2tiết kiệm một vài byte. Hãy thử trực tuyến!
Dennis


2

Octave , 23 26 byte

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

Hãy thử trực tuyến!

Phần x==x'được lấy cảm hứng từ câu trả lời của flawr . Câu này dài hơn câu trả lời của Luis, nhưng nó không sử dụng bất kỳ hộp công cụ nào.

Giải trình:

Đây là một hàm ẩn danh lấy một vectơ xlàm đầu vào và so sánh nó với chính nó được hoán vị. Điều này sẽ đưa ra một ma trận trong đó tất cả các phần tử đường chéo 1và bất kỳ phần tử đường chéo nào báo hiệu rằng có các phần tử trùng lặp.

Tổng dọc theo bất kỳ cột đã cho nào có bao nhiêu số trùng lặp của số đó. Chúng tôi muốn hai trong số các số có một bản sao, vì vậy chúng tôi có hai giá trị bằng hai và phần còn lại không bằng hai.

Nếu chúng ta lấy sản phẩm của ma trận này, chúng ta sẽ nhận được 4nếu chỉ có hai phần tử bằng nhau ( 2*2*1*1*1*1*...) và một cái gì đó khác hơn là 4nếu không có bản sao hoặc nhiều hơn hai.


2

PHP, 46 byte

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

Đếm số lượng mục nhập $argvvà so sánh nó với số lượng mục duy nhất. Nếu cái trước cao hơn cái sau 1 thì thật, khác falsey.

Hãy thử nó trên eval.in!


Bạn có phải sử dụng tên biến $ argv không, bạn có thể không chỉ sử dụng $ a thay thế không?
dading84

3
@ dading84 $argvlà danh sách các tham số dòng lệnh. Vì vậy: không, anh ta không thể sử dụng $a.
Tít

2

05AB1E , 6 5 byte

{¥>ΘO

Hãy thử trực tuyến!

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

1là giá trị trung thực duy nhất trong 05AB1E, chúng ta có thể dừng ở đây. (Cảm ơn @Emigna đã chỉ ra điều đó.)

Để chỉ nhận hai giá trị riêng biệt, chúng tôi có thể tùy chọn thêm:

     Θ  # equals 1?                 -> 1

1
Nếu bạn có thể trả lại bất kỳ giá trị falsey nào cho các trường hợp falsey, bạn có thể bỏ qua Θ, như 1là giá trị trung thực duy nhất trong 05AB1E.
Emigna

@Emigna Cảm ơn! Tôi không chắc liệu nó có được OP chấp thuận hay không, nhưng tôi đoán là vậy.
Arnauld

Tôi e rằng bạn cần quay lại giải pháp trước đó vì ¢nó sẽ không hoạt động. Nó sẽ được tính [19,4,4,9]là sai và [19,9]là đúng vì nó tìm thấy 0trong 10.
Emigna

@Emigna Cảm ơn vì đã phát hiện ra điều đó. Tôi nghĩ đó là cố định.
Arnauld

{¥_Ocũng sẽ ổn thôi
Emigna

2

APL (Dyalog Unicode) , 7 byte SBCS

1=≢-≢∘∪

Hãy thử trực tuyến!

Giải trình:

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 byte

â ʶUÊÉ

Thử nó


Giải trình

Loại bỏ trùng lặp ( â), lấy độ dài ( Ê) và so sánh đẳng thức ( ) với độ dài ( Ê) của đầu vào ( U) trừ đi 1 ( É).


Không phải là 12 byte sao? Không phải là âÊɶnhân vật đa nhân?
RedClover


1

05AB1E , 5 byte

gIÙg-

Hãy thử trực tuyến!

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

Trong 05AB1E 1 là giá trị trung thực duy nhất, vì vậy, để có kết quả trung thực, phải có chính xác 1 phần tử trùng lặp được xóa bởi uniquify.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.