Đây có phải là một chức năng?


47

Đưa ra một danh sách các (key, value)cặp, xác định xem nó có đại diện cho một hàm hay không, nghĩa là mỗi khóa sẽ ánh xạ tới một giá trị nhất quán. Nói cách khác, bất cứ khi nào hai mục nhập có khóa bằng nhau, chúng cũng phải có giá trị bằng nhau. Các mục lặp đi lặp lại là OK.

Ví dụ:

# Not a function: 3 maps to both 1 and 6
[(3,1), (2,5), (3,6)]

# Function: It's OK that (3,5) is listed twice, and that both 6 and 4 both map to 4
[(3,5), (3,5), (6,4), (4,4)]

Đầu vào: Một chuỗi các (key, value)cặp được sắp xếp sử dụng các chữ số từ 1 đến 9. Bạn có thể không yêu cầu một thứ tự cụ thể. Bạn có thể thay thế lấy danh sách khóa và danh sách giá trị làm đầu vào riêng biệt.

Đầu ra: Một giá trị nhất quán cho các hàm và một giá trị nhất quán khác cho các hàm không.

Các trường hợp kiểm tra: 5 đầu vào đầu tiên là các chức năng, 5 đầu vào cuối cùng thì không.

[(3, 5), (3, 5), (6, 4), (4, 4)]
[(9, 4), (1, 4), (2, 4)]
[]
[(1, 1)]
[(1, 2), (2, 1)]

[(3, 1), (2, 5), (3, 6)]
[(1, 2), (2, 1), (5, 2), (1, 2), (2, 5)]
[(8, 8), (8, 8), (8, 9), (8, 9)]
[(1, 2), (1, 3), (1, 4)]
[(1, 2), (1, 3), (2, 3), (2, 4)]

Đây là hai danh sách đầu vào:

[[(3, 5), (3, 5), (6, 4), (4, 4)], [(9, 4), (1, 4), (2, 4)], [], [(1, 1)], [(1, 2), (2, 1)]]
[[(3, 1), (2, 5), (3, 6)], [(1, 2), (2, 1), (5, 2), (1, 2), (2, 5)], [(8, 8), (8, 8), (8, 9), (8, 9)], [(1, 2), (1, 3), (1, 4)], [(1, 2), (1, 3), (2, 3), (2, 4)]]

Bảng xếp hạng:


chức năng phỏng đoán?
Chọc

@Poke Nó không phải là tính từ.
xnor

Đầu vào có thể là hai danh sách có độ dài bằng nhau, một cho các khóa một cho các giá trị?
Sở thích của Calvin

2
Các (key,value)cặp có thể đảo ngược được không, như trong (value,key)? Tôi có thể cạo một vài byte khỏi câu trả lời của tôi nếu vậy.
ymbirtt

1
@ymbirtt Có, bạn có thể có các cặp theo thứ tự.
xnor

Câu trả lời:


37

Python 2 , 34 byte

lambda x:len(dict(x))==len(set(x))

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

Tạo một từ điển và một bộ từ đầu vào và so sánh độ dài của chúng.
Từ điển không thể có các khóa trùng lặp, vì vậy tất cả các giá trị bất hợp pháp (và lặp lại) sẽ bị xóa.


5
Python 3, 30 byte:lambda x:not dict(x).items()^x
Veedrac

21

Haskell, 36 byte

f x=and[v==n|(k,v)<-x,(m,n)<-x,k==m]

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

Vòng lặp bên ngoài (-> (k,v)) và bên trong (-> (m,n)) qua các cặp và bất cứ khi nào k==m, thu thập giá trị thật của v==n. Kiểm tra xem tất cả có đúng không.


Bạn quá nhanh! : /
flawr

18

Brachylog , 5 4 byte

dhᵐ≠

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

Chương trình đầy đủ. Theo như tôi có thể nói, lý do mà điều này đánh bại hầu hết các ngôn ngữ chơi gôn khác là do tích hợp trong Brachylog, trong khi hầu hết các ngôn ngữ chơi gôn khác cần phải tổng hợp nó.

Giải trình

dhᵐ≠
d     On the list of all unique elements of {the input},
 h    take the first element
  ᵐ     of each of those elements
   ≠  and assert that all those elements are different

Là một chương trình đầy đủ, chúng tôi nhận được truenếu xác nhận thành công hoặc falsenếu thất bại.



9

Võng mạc , 25 byte

1`({\d+,)(\d+}).*\1(?!\2)

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

Định dạng đầu vào là {k,v},{k,v},.... In 0cho các chức năng và 1cho các chức năng không. Tôi có thể lưu hai byte bằng cách sử dụng nguồn cấp dữ liệu thay vì dấu phẩy ở định dạng đầu vào, nhưng điều đó đã gây rối.


Tôi tin rằng nó đủ điều kiện là "wack nghiêm túc", ít nhất là từ quan điểm kỹ thuật.
FryAmTheEggman

8

Brachylog , 13 byte

¬{⊇Ċhᵐ=∧Ċtᵐ≠}

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

Giải trình

¬{          }      It is impossible...
  ⊇Ċ               ...to find a subset of length 2 of the input...
   Ċhᵐ=            ...for which both elements have the same head...
       ∧           ...and...
        Ċtᵐ≠       ...have different tails.

Bạn có thể giải thích làm thế nào Ċhᵐ=Ċtᵐ≠làm việc?
Máy

@CalculatorFeline Chữ in hoa là tên biến. Ċlà một biến đặc biệt có tên là Cặp đôi luôn được xác định trước là một danh sách gồm hai phần tử. là một phép ẩn dụ áp dụng vị từ ngay lập tức trước đó ( h - headhoặc t - tailở đây) cho từng phần tử của đầu vào (ở đây, Ċ). =kiểm tra đơn giản rằng đầu vào của chúng chứa tất cả các phần tử bằng nhau / khác nhau.
Gây tử vong vào

7

MATL , 8 byte

1Z?gs2<A

Đầu vào là: một mảng với values, theo sau là một mảng với keys.

Đầu ra là 1cho chức năng, ngược lại 0.

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

1Z?

Xây dựng một ma trận thưa thớt. Ban đầu tất cả các mục chứa 0; và 1được thêm vào mỗi mục (i, j)trong đó jilà đầu vào key, valuecặp.

g

Ma trận được chuyển đổi thành logic; nghĩa là, các mục vượt quá 1(tương ứng với các cặp key, valuecặp) được đặt thành 1.

s

Tổng của mỗi cột được tính toán. Đây là số lượng values khác nhau cho mỗi key.

2<A

Một hàm sẽ có tất cả các khoản tiền như vậy ít hơn 2.


6

R, 33 byte

Đây là phiên bản của tôi cho R. Điều này tận dụng avechức năng. Tôi đã cho phép nhập dữ liệu trống bằng cách đặt mặc định cho các tham số khóa và giá trị. aveđang tạo ra một giá trị trung bình của các giá trị cho mỗi khóa. May mắn là điều này trả về các phương tiện theo cùng thứ tự với các giá trị đầu vào, do đó, so sánh với đầu vào sẽ cho biết nếu có các giá trị khác nhau. Trả về TRUEnếu nó là một hàm.

function(k=0,v=0)all(ave(v,k)==v)

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


6

05AB1E , 11 9 7 byte

Đã lưu 2 byte nhờ kalsowerus .

Ùø¬DÙQ,

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

Giải trình

Ù           # remove duplicates
 ø          # zip
  ¬         # get the first element of the list (keys)
   D        # duplicate list of keys
    Ù       # remove duplicates in the copy
     Q      # compare for equality
      ,     # explicitly print result

@Riley: Đúng. Tôi vẫn khá vui vì trường hợp đặc biệt chỉ kết thúc một phần ba chương trình: P
Emigna

Tôi nghĩ bạn có thể tiết kiệm 3 byte bằng cách thay thế `\)^bằng head ( ¬): TIO
kalsowerus

@kalsowerus: Thật không may khi nghỉ trong trường hợp đặc biệt []:(
Emigna

@Enigma Oh nó hoạt động vì khi kiểm tra tôi vẫn còn sót lại ,ở cuối. Thêm vào đó và sau đó nó bằng cách nào đó làm việc với [].
kalsowerus


5

JavaScript (ES6), 45 38 byte

Đã lưu 6 byte nhờ @Neil

a=>a.some(([k,v])=>m[k]-(m[k]=v),m={})

Trả về falsehoặc truecho các chức năng và không chức năng, tương ứng.

Điều này hoạt động bằng cách liên tục trừ giá trị cũ của từng hàm ( m[k]) và hàm mới ( m[k]=v, cũng lưu trữ giá trị mới). Mỗi lần, có ba trường hợp:

  • Nếu không có giá trị cũ, m[k]trả về undefined. Trừ đi bất cứ thứ gì từ undefinedkết quả NaN, đó là giả.
  • Nếu giá trị cũ giống với giá trị mới, m[k]-vkết quả 0là sai lệch.
  • Nếu giá trị cũ khác với giá trị mới, m[k]-vdẫn đến một số nguyên khác không, đó là sự thật.

Do đó, chúng ta chỉ cần đảm bảo rằng điều đó m[k]-(m[k]=v)không bao giờ là sự thật.


1
Xa quá lâu. Sử dụng a=>!a.some(([x,y])=>m[x]-(m[x]=y),m=[]).
Neil

@Neil Dang nó, tôi biết phải có một số cách để sử dụng m[k]không được xác định ... Cảm ơn!
Sản phẩm ETH

5

Toán học, 24 byte

UnsameQ@@(#&@@@Union@#)&

Giải thích: Unionxóa các cặp trùng lặp, sau đó #&@@@lấy phần tử đầu tiên từ mỗi cặp (giống First/@nhưng có ít byte hơn). Nếu có bất kỳ sự lặp lại trong các yếu tố đầu tiên này, các cặp không tạo ra một chức năng mà chúng tôi kiểm tra UnsameQ.

(Điều này có thể có mật độ @ký tự cao nhất trong bất kỳ chương trình nào tôi đã viết)


2
@mật độ = 1/4
Máy


4

Bash + coreutils, 17

sort -u|uniq -dw1

Đầu vào được đưa ra thông qua STDIN. keyvalueđược Tabphân tách và mỗi cặp được phân định dòng mới.

sortloại bỏ các cặp khóa-giá trị trùng lặp. uniq -dchỉ xuất ra các bản sao và do đó xuất ra chuỗi trống trong trường hợp hàm và một chuỗi không trống khác - khi có các khóa trùng lặp ánh xạ tới các giá trị khác nhau.

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


4

05AB1E , 9 byte

Mã số:

ãü-ʒ¬_}}Ë

Giải trình:

ã            # Cartesian product with itself
 ü-          # Pairwise subtraction
   ʒ  }}     # Filter out elements where the following is not true:
    ¬_       #   Check whether the first digit is 0
        Ë    # Check if all equal

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!


Bắt đầu thể hiện ʒngay lập tức tôi thấy :)
Emigna

@Emigna Yeah haha: p, nhưng tôi đã tìm thấy một lỗi khiến tôi sử dụng }}thay vì }.
Ad Nam

4

Thạch , 6 byte

QḢ€µQ⁼

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

Giải trình

QḢ€µQ⁼
Q      - Remove duplicate pairs
 Ḣ€    - Retrieve the first element of each pair
   µ   - On the output of what came before..
     ⁼ - Are the following two equal (bit returned)?
    Q  - The output with duplicates removed
       - (implicit) the output.

Đây là một phương thức thay thế, cũng là 6 byte:

QḢ€ṢIẠ

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

Thay vì kiểm tra bằng cách loại bỏ các khóa trùng lặp, loại này ( ) và kiểm tra xem sự khác biệt giữa các điều khoản ( I) có phải là sự thật ( )


4

R , 95 66 byte

function(k,v)any(sapply(k,function(x){length(unique(v[k==x]))-1}))

Đã lưu 29 byte nhờ Jarko Dubbeldam.

Chức năng ẩn danh. Đầu ra FALSEnếu một chức năng và TRUEnếu không (xin lỗi). Lấy làm đối số một danh sách các khóa và một danh sách các giá trị, như vậy.

> f(c(1,2,5,1,2),c(2,1,2,2,5))
[1] TRUE # not a function

Vòng lặp thông qua tất cả các khóa và lấy độ dài của tập hợp các giá trị duy nhất cho khóa đó. Nếu anytrong số họ> 1, trở lại TRUE.

Điều này đang bị đánh bại bởi câu trả lời của MickyT , và cả Giuseppe . nâng cấp một trong số đó.


Tại sao bạn tạo một khung dữ liệu, chỉ sau đó tham chiếu các vectơ bạn vừa đặt vào khung dữ liệu đó? function(k=0,v=0)any(sapply(k,function(x){length(unique(v[k==x]))-1}))nên hoàn thành điều tương tự
JAD

Bởi vì tôi vẫn đang học! Ít nhất một trong những câu trả lời R khác thực hiện ít nhiều như bạn mô tả.
BLT

xin lỗi nếu tôi gặp một chút khó khăn :) bài nộp của bạn hơi khác so với các câu trả lời R khác và nếu bạn muốn cắt bỏ dữ liệu dư thừa.frame, bạn có thể so sánh tốt hơn.
JAD

4

J-uby , 48 33 25 21 byte

-3 byte nhờ Jordan!

:size*:==%[:to_h,~:|]

Giải trình

:size*:==%[:to_h,~:|]

# "readable"
(:size * :==) % [:to_h, ~:|]

# transform :% to explicit lambda
->(x){ (:size * :==).(:to_h ^ x, ~:| ^ x)

# apply explicit x to functions
->(x){ (:size * :==).(x.to_h, x|x) }

# expand :* (map over arguments)
->(x){ :==.(:size.(x.to_h), :size.(x|x) }

# simplify symbol calls to method calls
->(x){ x.to_h.size == (x|x).size }

# :| is set union for arrays; x|x just removes duplicates, like :uniq but shorter
->(x){ x.to_h.size == x.uniq.size }

Cách tiếp cận đầu tiên, 33 byte

-[:[]&Hash,:uniq]|:*&:size|:/&:==

Cái này dài hơn giải pháp Ruby tương đương, nhưng thật vui khi thực hiện.

Cố gắng giải thích bằng cách chuyển đổi sang Ruby:

-[:[]&Hash,:uniq]|:*&:size|:/&:==

# "readable"
-[:[] & Hash, :uniq] | (:* & :size) | (:/ & :==)                  

# turn into explicit lambda
->(x){ (:/ & :==) ^ ((:* & :size) ^ (-[:[] & Hash, :uniq] ^ x)) } 

# simplify expressions now that we have an explicit x
->(x){ :== / (:size * [Hash[x], x.uniq]) }                          

# translate to equivalent Ruby code
->(x) { [Hash[x], x.uniq].map(&:size).reduce(:==) }               

# simplify reduce over explicit array
->(x) { Hash[x].size == x.uniq.size }                             

Tôi có thể lưu 2 byte bằng phiên bản mới hơn bằng cách thay thế :uniqbằng~:|



3

Toán học, 35 byte

(l=Length)@Union@#==l@<|Rule@@@#|>&

Hàm thuần túy lấy danh sách các cặp theo thứ tự làm đầu vào và trả về Truehoặc False. Khai thác thực tế là Union@#xóa các cặp theo thứ tự lặp đi lặp lại, nhưng <|Rule@@@#|>(một liên kết) xóa tất cả trừ một cặp theo thứ tự với một phần tử đầu tiên cụ thể. Vì vậy, chúng ta chỉ có thể so sánh Lengths của hai đầu ra để kiểm tra xem danh sách đầu vào có phải là hàm không.


3

Thạch , 6 byte

nþ`ḄCȦ

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

Làm thế nào nó hoạt động

nþ`ḄCȦ  Main link. Argument: M (n×2 matrix)

nþ`     Construct the table of (a != b, c != d) with (a, b) and (c, d) in M.
   Ḅ    Unbinary; map (0, 0), (0, 1), (1, 0), (1, 1) to 0, 1, 2, 3 (resp.).
    C   Complement; map each resulting integer x to 1 - x.
     Ȧ  All; test if all resulting integers are non-zero.

3

CJam , 19 17 byte

Đã lưu 2 byte nhờ Martin Ender

0l~$2ew{:.=~!&|}/

Đầu ra 0cho các chức năng và 1cho các chức năng không.

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

Giải trình

0                     e# Push a 0. We need it for later.
 l~                   e# Read and eval a line of input.
   $                  e# Sort it by the keys.
    2ew               e# Get all consecutive pairs of the sorted list.
       {              e# For each pair of pairs:
        :.=           e#  Check if the keys are equal and if the values are equal.
           ~!&        e#  Determine if the keys are equal AND the values are not equal.
              |       e#  OR with 0. If any pair indicates that the input is not a function,
                      e#  this will become 1 (and remain 1), otherwise it will be 0.
               }/     e# (end block)

3

APL (Dyalog) , 16 12 11 9 byte

(∪≡⊢)⊃¨∘∪

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

Giải trình

             Unique, remove duplicates; (3 5) (3 5) => (3 5)
¨∘            For each element
             Pick the first sub element (3 5) (2 3) => 3 

             Check whether the arguments (listed below) are the same
             The right argument
             And the right argument with duplicates removed

In 0sai và 1đúng


Whoa, bạn đang trở nên thực sự tốt.
Adám


3

Brainfuck , 71 byte

,[[-[->>+<<]+>>],>[[->+<<->]<[<<]>]>[-<+>]<<[->+<]+[-<<]>>,]-[--->+<]>.

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

Đầu vào được lấy dưới dạng một chuỗi phẳng: ví dụ, trường hợp thử nghiệm đầu tiên sẽ là 35356444. Để có được đại diện được hiển thị trong câu hỏi ban đầu, chỉ cần thêm tổng cộng sáu dấu phẩy vào chương trình vào đúng điểm.

Đầu ra là Ucho các chức năng và Vcho các chức năng không.

Giải trình

Đối với bất kỳ mã ASCII điểm n, f (n) được lưu trữ tại ô 2n + 1. Các ô 2n và 2n + 2 là không gian làm việc và 0, 2, 4, 6, ... 2n-2 là một vệt bánh mì để dẫn trở lại ô 0. Khi đầu vào được chứng minh không phải là hàm, f ( 0) được đặt thành 1 (trong số các tác dụng phụ khác nhau).

,                  input first key
[                  start main loop
 [-[->>+<<]+>>]    move to cell 2n, leaving a trail of breadcrumbs
 ,                 input value corresponding to current key
 >[                if key already has a value:
   [->+<<->]<      copy existing value, and compare to new value
   [<<]            if values are different, go to cell -2
   >               go back to cell 2n+1 (or -1 if mismatch)
 ]
 >[-<+>]           move existing value back to cell 2n+1 (NOP if no existing value, move the 1 from cell 0 to cell -1 if mismatch)
 <<[->+<]          copy new value to cell 2n+1 (NOP if there was already a value)
 +[-<<]>>          follow breadcrumbs back to cell 0 (NOP if mismatch)
 ,                 input next key
]                  (if mismatch, cell -2 becomes the next "cell 0", and the next key is also effectively changed by the breadcrumbs left lying around)
-[--->+<]>.        add 85 to cell 1 and output the result


2

Pyth - 9 8 byte

ql.d{Ql{

Thử nó

Nó hoạt động bằng cách loại bỏ bất kỳ cặp lặp lại đầu tiên ({Q); sau đó nó so sánh độ dài của danh sách với độ dài của từ điển được tạo từ danh sách (nếu cùng một giá trị x xảy ra nhiều lần, hàm tạo từ điển chỉ sử dụng từ cuối cùng, dẫn đến từ điển ngắn hơn danh sách)


2

MATL , 12 byte

iFFvXu1Z)SdA

Đầu vào là ma trận 2 cột, trong đó cột đầu tiên là khóa và cột thứ hai là giá trị.

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

Giải trình

i     % Input: 2-column matrix
FFv   % Postpend a row with two zeros. This handles the empty case
Xu    % Unique rows. This removes duplicate (key, value) pairs
1Z)   % Select first column, that is, key. We need to check if all
      % keys surviving at this point are different
S     % Sort
d     % Consecutive differences
A     % Are all values nonzero?

2

PHP, 49 byte

foreach($_GET as[$x,$y])($$x=$$x??$y)-$y&&die(n);

In không có gì cho các chức năng và ncho các chức năng không.


1

CJam , 14 11 9 byte

_&0f=__&=

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

Lấy đầu vào là một mảng các cặp khóa / giá trị trên ngăn xếp, trả về 1nếu đầu vào là một hàm và 0nếu không.

Giải pháp này dựa trên đoạn mã _&, sao chép lại một mảng bằng cách lấy giao điểm đã đặt của nó với chính nó. Tôi làm điều này hai lần, lần đầu tiên trên đầu vào đầy đủ (để loại bỏ bất kỳ cặp khóa / giá trị trùng lặp chính xác nào) và sau đó chỉ trên các khóa (để xem liệu còn bất kỳ khóa trùng lặp nào còn lại sau lần sao chép đầu tiên không).

Đây là mã đầy đủ với các bình luận:

_&           "remove duplicate key/value pairs from input";
  0f=        "remove the values, leaving only the keys";
     _       "make a copy of the array of keys";
      _&     "remove duplicate keys from the copy";
        =    "compare the de-duplicated key array with the original";

Chỉ để bạn biết, e#là cú pháp nhận xét dòng dành riêng trong CJam.
Quả Esolanging

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.