Danh sách số nguyên của Nô-ê


25

Giới thiệu:

Tôi nghĩ rằng tất cả chúng ta đã nghe về nó, nhưng ở đây một bản tóm tắt rất ngắn gọn: Nô-ê đã tập hợp hai trong số tất cả các loài động vật trên hành tinh, nam và nữ, để cứu trong Ark của mình trong trận lụt lớn. Trích dẫn thực tế từ Kinh Thánh là:

Sáng thế ký 7: 2-3
Bạn phải mang theo bên mình bảy loại động vật sạch, con đực và bạn tình của nó, hai trong số các loại động vật ô uế, con đực và bạn tình của nó, và bảy loại chim trên bầu trời , nam và nữ, để bảo vệ con cháu của họ trên mặt đất.
nguồn

Nhưng vì lợi ích của thử thách này, chúng tôi sẽ bỏ qua phần sạch / ô uế và phần mà anh ta đã lấy bảy của mỗi con vật. Thử thách này chỉ là về phần này:

hai trong số các loại động vật ô uế , con đực và bạn tình của nó

Thử thách:

Đầu vào:

Bạn được cung cấp một danh sách các số nguyên dương (theo thứ tự ngẫu nhiên).

Đầu ra:

Hai giá trị riêng biệt cho biết đó có phải là 'Danh sách của Nô-ê' hay không. Điều này không cần thiết phải là một giá trị trung thực / falsey , do đó, cũng có thể là 0/ 1trong Java / C #, hoặc 'A'/ 'B'trong bất kỳ ngôn ngữ nào, để đưa ra một số ví dụ.

Khi nào một danh sách là 'Danh sách của Nô-ê'? Khi có chính xác hai trong số mỗi số nguyên trong danh sách.

Quy tắc thử thách:

  • I / O là linh hoạt. Đầu vào có thể là một danh sách / mảng / luồng số nguyên / float / chuỗi hoặc đọc từng cái một từ STDIN. Đầu ra có thể là bất kỳ hai giá trị riêng biệt nào , được trả về từ một hàm hoặc đầu ra thành STDOUT / một tệp.
  • Các số nguyên trong đầu vào danh sách theo thứ tự ngẫu nhiên, và chắc chắn sẽ rất tích cực trong phạm vi 1n100000 .
  • Danh sách đầu vào được đảm bảo không trống.
  • Có một số nguyên bội của hai lần có mặt trên 2 (tức là 4, 6, 8, v.v.) sẽ là chim ưng. Tức [6,4,4,6,4,7,4,7]là chim ưng, mặc dù bạn vẫn có thể tạo các cặp bằng nhau như thế này : [[4,4],[4,4],[6,6],[7,7]].

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Quy tắc chuẩn áp dụng cho câu trả lời của bạn với quy tắc I / O mặc định , vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn (ví dụ TIO ).
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.

Các trường hợp thử nghiệm:

Truthy:
[7,13,9,2,10,2,4,10,7,13,4,9]
[1,2,3,1,2,3]
[10,100,1000,1,100,10,1000,1]
[123,123]
[8,22,57189,492,22,57188,8,492,57188,57189,1,1]

Falsey:
[6,4,4,6,4,7,4,7]
[2,2,2,2,2,2]
[5,1,4,5,1,1,4]
[77,31,5,31,80,77,5,8,8]
[1,2,3,2,1]
[44,4,4]
[500,30,1]
[1,2,1,1]
[2,4,6,4,4,4]
[2,23,34,4]
[2,23,3,3,34,4]

12
Và trong Kinh Qur'an cũng vậy; Surah Al-Mumenoon, Câu 27: Vì vậy, chúng tôi đã truyền cảm hứng cho anh ấy (với thông điệp này): "Xây dựng Hòm trong tầm nhìn của chúng tôi và dưới sự hướng dẫn của chúng tôi: sau đó khi đến Lệnh của chúng tôi, và các đài phun nước của trái đất tuôn ra, hãy đưa bạn lên tàu của mọi loài, nam và nữ, và gia đình của bạn - ngoại trừ những người trong số họ đã chống lại Lời Chúa: Và giải quyết tôi không ủng hộ những người làm sai, vì họ sẽ bị chết đuối (trong Lũ lụt). (Yusuf Ali)
Ishaq Khan

Câu trả lời:



13

05AB1E , 4 byte

¢<PΘ

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

¢      # count all occurrences of each element in the input list
 <     # decrement each
  P    # product
   Θ   # is equal to 1

Ah, tôi đã chuẩn bị ¢2QP, nhưng sử dụng Θcũng là một lựa chọn tốt. :)
Kevin Cruijssen

Nghĩ rằng tôi đã có 3 với {ιË, nhưng tất nhiên là thất bại khi số nguyên xảy ra 4 lần.
Grimmy


8

R , 20 byte

-6 byte nhờ digEmAll bằng cách thay đổi phương thức nhập

any(table(scan())-2)

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

Đầu ra FALSEnếu nó là một danh sách của Nô-ê, và TRUEnếu không. Hoạt động cho bất kỳ loại đầu vào, không chỉ số nguyên.

Tính tổng số của từng giá trị trong danh sách và kiểm tra xem có bất kỳ số nào khác với 2 không.


Bạn có thể lấy đầu vào từ stdin tiết kiệm 6 byte: Hãy thử trực tuyến!
digEmAll

@digEmAll Cảm ơn; Tôi đã đọc sai các quy tắc thách thức và nghĩ rằng điều này không được phép.
Robin Ryder



6

Haskell , 33 byte

f x=and[sum[1|b<-x,b==a]==2|a<-x]

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

Đối với mỗi yếu tố của đầu vào, chúng tôi đảm bảo nó xuất hiện hai lần trong danh sách đầu vào.

sum[1|b<-x,b==a]chỉ là một phiên bản golfier của length(filter(==a)x).


6

Perl 6 , 18 byte

{so.Bag{*}.all==2}

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

  • .Bagchuyển đổi danh sách đầu vào thành một Bag--a với bội số.
  • {*} trích xuất tất cả các bội số.
  • .all tạo ra một điểm nối của bội số.
  • == 2 dẫn đến kết quả khác của Booleans, mỗi giá trị đúng nếu bội số là 2.
  • so thu gọn ngã ba vào một Boolean duy nhất.

5

J , 10 byte

[:*/2=#/.~

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


3
còn 10 byte: [:*/2=1#.=Tôi thực sự muốn loại bỏ giới hạn đó nhưng không thể tìm ra cách.
cole

1
@cole khi tôi thử cái này, tôi đã có giải pháp của bạn. Nếu bạn thực sự muốn xóa giới hạn bạn có thể làm 2*/@:=1#.=, cũng 10 byte
Conor O'Brien

@cole Đẹp thay thế!
Galen Ivanov

@ ConorO'Brien Vâng, cũng @:có ích ở đây.
Galen Ivanov

1
@GalenIvanov phải yêu thích sự đơn điệu =, rất hữu ích trong các tình huống chơi gôn thích hợp
cole

4

MS SQL Server 2017 , 152 150 146 byte

CREATE FUNCTION f(@ NVARCHAR(MAX))RETURNS
TABLE RETURN SELECT IIF(2=ALL(SELECT
COUNT(*)FROM STRING_SPLIT(@,',')GROUP BY
PARSE(value AS INT)),1,0)r

Phiên bản có thể đọc được:

CREATE FUNCTION f(@ NVARCHAR(MAX)) RETURNS TABLE RETURN
  SELECT IIF(2 = ALL(SELECT COUNT(*)
                     FROM STRING_SPLIT(@, ',')
                     GROUP BY PARSE(value AS INT)), 1, 0) AS r

Hãy thử nó trên SQL Fiddle !

-2 byte nhờ Kevin Cruijssen


1
Vì bạn không sử dụng bí danh, nên không cthể xóa sau COUNT(*)?
Kevin Cruijssen

@KevinCruijssen, bạn nói đúng, cảm ơn bạn.
Andrei Odegov

4

Haskell , 61 45 byte

import Data.List
all((2==).length).group.sort

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

Cảm ơn @KevinCruijssen cho 12 byte và @nimi cho 4 khác.

Câu trả lời đầu tiên của Haskell, nhưng thật dễ dàng để làm. Có lẽ có thể được chơi golf rất nhiều. Trường hợp tại điểm...


3
Tôi không biết Haskell, nhưng tôi khá chắc chắn all(True==).map(2==)có thể all(2==). :)
Kevin Cruijssen

4
... Và chuyển lengthđến all: all((2==).length).group.sort. Không cần phải đặt tên hàm, tức là thả f=.
nimi

Thật vậy, tôi đã bỏ qua all(2==)khi tôi đang thử nghiệm trong GHCi. Cảm ơn Kevin và Nimi, tôi sẽ cập nhật câu trả lời.
J. Sallé

4
... oh và để sử dụng trong tương lai: all(True==)and.
nimi

4

JavaScript (ES6), 37 byte

Trả về false cho Nô-ê hoặc đúng cho Nô-ê.

a=>a.some(v=>a.map(x=>t-=v==x,t=2)|t)

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

Đã bình luận

a =>               // a[] = input
  a.some(v =>      // for each value v in a[]:
    a.map(x =>     //   for each value x in a[]:
      t -= v == x, //     decrement t if v is equal to x
                   //     (i.e. if v appears exactly twice, t is decremented twice)
      t = 2        //     start with t = 2
    )              //   end of map()
    | t            //   yield t, which is supposed to be equal to 0
  )                // end of some()

3

APL (Dyalog Unicode) , 8 byte SBCS

Chức năng tiền tố ẩn danh. Trả về 0/ 1.

∧/2=⊢∘≢⌸

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

...  đối với từng giá trị như là đối số bên trái và chỉ số lần xuất hiện của giá trị đó như là đối số đúng, gọi:

 kiểm tra đối số bên phải (các lần xuất hiện)
 sau đó
 trả về điều đó, bỏ qua đối số bên trái

2= Danh sách Boolean cho biết số đo là 2

∧/ AND-giảm (tức là tất cả đều đúng?)


3

PowerShell , 66 37 26 byte

-11 byte nhờ mazzy

!(($args|group|% c*t)-ne2)

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

Nhóm lên $lvà lấy tất cả các giá trị khớp. Sau đó, nó lọc ra tất cả số lượng 2 từ danh sách này. Nếu danh sách trống, đó là số Nô-ê; mặt khác, nó sẽ được điền vào với số lượng không phải là 2. Không nhập danh sách sẽ mang lại Truenếu nó trống và Falsenếu nó được điền


1
Thất bại nếu các giá trị cân bằng nhau .. tức là [1,2,1,1] vì vậy số đếm là 4, số lượng duy nhất là 2 và do đó sẽ giải quyết là noah mặc dù không phải là noah.
Dữ liệu hết hạn

@ExpiredData Heck
Veskah

Tôi đã thử cách tiếp cận này bằng ngôn ngữ khác trước khi nhận ra rằng nó sẽ không hoạt động ...
Dữ liệu hết hạn

1
¯ \ _ (ツ) _ / 26
mazzy

1
@mazzy Cảm ơn. Quên tất cả về việc grouplà một thứ tồn tại
Veskah

3

PHP , 60 byte

function($a){return!array_diff(array_count_values($a),[2]);}

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

PHP có các phần mềm tích hợp tuyệt vời cho điều này, mặc dù ở mức 20 ký tự, array_count_values()không phải là một phần mềm.


PHP luôn có những bản dựng tuyệt vời, với những cái tên dài, thở dài!
Đêm 2

3

Toán học, 25 24 byte

MatchQ[{{_,2}..}]@*Tally

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

Các Tallyhàm trả về một danh sách các hình thức , sau đó được ghép nối với từng mô hình mà kiểm tra xem tất cả các số là 2.{{element, count}, ...}


3

Tùy viên , 16 byte

${All&x!{_~x=2}}

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

Giải trình

${All&x!{_~x=2}}
${             }    lambda with input x
  All&x!{     }     over each element _ of x:
         _~x            check that the number of occurrences of _ in x
            =2          is 2

Lựa chọn thay thế

17 byte: {All&_!`=&2@`~&_}

18 byte: {All[`=&2@`~&_,_]}

23 byte: Same@2&`'@Sum@Table[`=]

25 byte: Same«2'Sum@Table[`=,_]»

25 byte: Same<~2'Sum@Table[`=,_]~>

25 byte: {Same[2'Sum@Table[`=,_]]}

35 byte: {Commonest@_==Unique@_and _[0]~_=2}


3

TI-Basic, 47 byte

Input(L1
SortA(L1
not(remainder(dim(L1,2)) and prod(not(△List(L1))=seq(remainder(I,2),I,1,-1+dim(L1

Tôi là một fan hâm mộ lớn của TI-Basic. Nó không phải là một ngôn ngữ tuyệt vời cho bất kỳ mục đích nào, nhưng tôi thích lập trình (và chơi gôn) trong đó.

Làm thế nào để mã này hoạt động?

Đầu tiên, nó sắp xếp danh sách.

Thứ hai, nó sử dụng chức năng △ List để tạo một danh sách khác, đó là sự khác biệt giữa các thành phần của danh sách được sắp xếp. (Ví dụ: △ Danh sách ({1,3,7,8}) sẽ mang lại {2,4,1}). Không áp dụng cho danh sách này, nó chuyển đổi mọi phần tử khác không của danh sách thành 0 và mọi số 0 thành một.

Sau đó, chương trình kiểm tra xem danh sách kết quả có khớp với mẫu không {1, 0, 1, 0, ...}, điều này sẽ chỉ đúng nếu danh sách ban đầu là danh sách của Nô-ê.

Ngoài ra còn có một kiểm tra bổ sung rằng độ dài của danh sách là chẵn, để bắt một số trường hợp cạnh.

Dưới đây là một số ảnh chụp màn hình của các trường hợp thử nghiệm:

Một số trường hợp thử nghiệm Một số trường hợp kiểm tra thêm


3

Julia 1.0 , 32 byte

l->sum(isone,l./l')/length(l)==2

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

Chia từng phần tử của mảng đầu vào lbằng cách hoán vị l'cho một ma trận. Tóm tắt ma trận này trong khi áp dụng isonecho mỗi phần tử sẽ cho độ dài gấp đôi lnếu mỗi phần tử xuất hiện chính xác hai lần.



3

Julia , 30 ký tự 26 byte

!a=all(x->2==sum(a.==x),a)

Cảm ơn bạn, H.PWiz cho thủ thuật này!

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


1
Bạn có thể có !a=all(x->2==sum(a.==x),a)26 byte. Lưu ý mà tôi khuyên bạn nên đếm theo byte trên trang web này
H.PWiz

Cảm ơn nhiều! Tôi không biết bạn có thể (ab) sử dụng !cho các chức năng ẩn danh
user3263164


2

VDM-SL , 64 byte

f(a)==forall y in set inds a&card{x|x in set inds a&a(x)=a(y)}=2

Giải trình

VDM hoạt động chủ yếu như các câu lệnh logic thứ hai.

forall y in set inds a                //Bind y to each of the indices of a

{x|x in set inds a&a(x)=a(y)}         //build a set of the indices of a who have the same
                                      //value as the value at y

card {...} = 2                        //and check the cardinality of that set is 2

Vì bạn không thể TIO VDM ở đây xuất ra từ phiên gỡ lỗi


Tôi biết có lẽ không có trình biên dịch trực tuyến nào cho nó, nhưng có lẽ bạn có thể thêm một số ảnh chụp màn hình của (một số) các trường hợp thử nghiệm để xác minh? :)
Kevin Cruijssen

@KevinCruijssen đã lưu một số byte sửa lỗi, điều này có thể làm cho bản thân mã dễ hiểu hơn. Tôi cũng sẽ thêm một lời giải thích :)
Dữ liệu hết hạn





2

Excel, 45 byte

=SUM(IF(FREQUENCY(A:A,A:A)=2,1))=COUNT(A:A)/2

Giả sử dữ liệu trong cột A, với dữ liệu này được nhập vào bất kỳ ô nào ngoài một ô trong cột A. Trả về TRUE nếu có các cặp và FALSE nếu chúng không khớp với các cặp

        FREQUENCY(A:A,A:A)                     Counts how many of each value there is
     IF(                  =2,1)                If this is 2, add value of 1 to array otherwise 0
=SUM(                          )               Sum the count in that array that have a exactly 2
                                 COUNT(A:A)/2  Count how many total values in column
                                =              If this is equal, return TRUE else FALSE

Đã thử xóa / 2 và thêm 0,5 cho tổng, nhưng điều này không hiệu quả.
Đã thử đếm tần số <> 2 và điều này không trả về đúng số lượng.


2

Octave / MATLAB, 22 21 byte

@(x)any(sum(x==x')-2)

Hàm ẩn danh nhập vào một vectơ số và xuất ra 0nếu vectơ thỏa mãn điều kiện này hay 1cách khác.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

@(x)                   % define anonymous function with input x
            x          % x
               x'      % x transposed and conjugated
             ==        % equality comparison, element-wise with broadcast. Gives a
                       % square matrix
        sum(     )     % sum of each column
                  -2   % subtract 2, element-wise
    any(            )  % true if and only if any value is not zero

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.