Apakah ini suatu fungsi?


47

Diberikan daftar (key, value)pasangan, tentukan apakah itu mewakili suatu fungsi, artinya setiap kunci memetakan ke nilai yang konsisten. Dengan kata lain, setiap kali dua entri memiliki kunci yang sama, mereka juga harus memiliki nilai yang sama. Entri yang diulang tidak apa-apa.

Sebagai contoh:

# 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)]

Input: Urutan urutan (key, value)pasangan menggunakan digit 1 hingga 9. Anda mungkin tidak memerlukan pemesanan tertentu. Anda dapat mengambil daftar kunci dan daftar nilai sebagai input terpisah.

Output: Nilai konsisten untuk fungsi, dan nilai konsisten berbeda untuk non-fungsi.

Kasus uji: 5 input pertama adalah fungsi, 5 input terakhir tidak.

[(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)]

Inilah mereka sebagai dua daftar input:

[[(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)]]

Papan peringkat:


fungsi surjektif?
Poke

@ Poke Itu tidak harus bersifat surjektif.
xnor

Bisakah input menjadi dua daftar dengan panjang yang sama, satu untuk kunci dan satu untuk nilai?
Calvin Hobbies

2
Apakah OK untuk (key,value)pasangan untuk dibalik, seperti pada (value,key)? Saya dapat mencukur beberapa byte dari jawaban saya jika demikian.
ymbirtt

1
@ymbirtt Ya, Anda dapat membuat pasangan berada dalam urutan mana pun.
xnor

Jawaban:


37

Python 2 , 34 byte

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

Cobalah online!

Membuat Kamus dan Set dari input dan membandingkan panjangnya.
Kamus tidak dapat memiliki kunci duplikat, sehingga semua nilai ilegal (dan berulang) dihapus.


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]

Cobalah online!

Lingkaran luar (-> (k,v)) dan dalam (-> (m,n)) melewati pasangan dan kapan pun k==m, kumpulkan nilai kebenaran dari v==n. Periksa apakah semuanya benar.


Kamu terlalu cepat! : /
flawr

18

Brachylog , 5 4 byte

dhᵐ≠

Cobalah online!

Program lengkap. Sejauh yang saya tahu, alasan bahwa ini mengalahkan sebagian besar bahasa golf lainnya adalah karena itu adalah bawaan di Brachylog, sedangkan sebagian besar bahasa golf lainnya perlu disintesis.

Penjelasan

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

Sebagai program penuh, kita dapatkan truejika pernyataan berhasil, atau falsejika gagal.


15

Pyth , 5 byte

Saya cukup senang dengan yang ini.

{IhM{
       implicit input
    {  removes duplicate pairs
  hM   first element of each pair
{I     checks invariance over deduplication (i.e. checks if no duplicates)

Cobalah online!


9

Retina , 25 byte

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

Cobalah online!

Format input adalah {k,v},{k,v},.... Mencetak 0untuk fungsi dan 1untuk non-fungsi. Saya bisa menyimpan dua byte dengan menggunakan umpan baris alih-alih koma dalam format input, tapi itu kacau.


Saya percaya itu memenuhi syarat sebagai "benar-benar gila," setidaknya dari sudut pandang teknis.
FryAmTheEggman

8

Brachylog , 13 byte

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

Cobalah online!

Penjelasan

¬{          }      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.

Bisakah Anda menjelaskan caranya Ċhᵐ=dan Ċtᵐ≠bekerja?
CalculatorFeline

@CalculatorFeline Huruf besar adalah nama variabel. Ċadalah variabel khusus yang disebut Pasangan yang selalu didahului untuk menjadi daftar dua elemen. adalah metapredicate yang menerapkan predikat sebelumnya yang segera ( h - headatau di t - tailsini) untuk setiap elemen input (di sini, Ċ). =dan sederhananya periksa bahwa input mereka mengandung semua elemen yang sama / semua berbeda.
Fatalkan tanggal

7

MATL , 8 byte

1Z?gs2<A

Input adalah: array dengan values, diikuti oleh array dengan keys.

Output 1untuk fungsi, 0selain itu.

Cobalah online! . Atau verifikasi semua kasus uji .

Penjelasan

1Z?

Membangun matriks yang jarang. Awalnya semua entri berisi 0; dan 1ditambahkan ke setiap entri di (i, j)mana jdan imerupakan input key, valuepasang.

g

Matriks dikonversi menjadi logis; yaitu, entri yang melebihi 1(sesuai dengan duplikat key, valuepasangan) diatur ke 1.

s

Jumlah setiap kolom dihitung. Ini adalah jumlah yang berbeda valueuntuk masing-masing key.

2<A

Suatu fungsi akan memiliki semua jumlah tersebut kurang dari 2.


6

R, 33 byte

Ini adalah versi saya untuk R. Ini mengambil keuntungan dari avefungsinya. Saya telah mengizinkan input kosong dengan menetapkan default pada parameter kunci dan nilai. avemenghasilkan nilai rata-rata untuk masing-masing kunci. Untungnya ini mengembalikan rata-rata dalam urutan yang sama dengan nilai input, jadi perbandingan dengan input akan menunjukkan jika ada nilai yang berbeda. Kembali TRUEjika itu adalah fungsi.

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

Cobalah online!


6

05AB1E , 11 9 7 byte

Disimpan 2 byte berkat kalsowerus .

Ùø¬DÙQ,

Cobalah online!

Penjelasan

Ù           # 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: Yap. Saya masih cukup senang bahwa kasus khusus hanya berakhir sepertiga dari program: P
Emigna

Saya pikir Anda bisa menghemat 3 byte dengan mengganti `\)^dengan head ( ¬): TIO
kalsowerus

@kalsowerus: Sayangnya itu rusak untuk kasus khusus []:(
Emigna

@ Enigma Oh itu berhasil karena saat pengujian saya masih memiliki sisa ,di akhir. Tambahkan itu dan kemudian entah bagaimana berhasil [].
kalsowerus

Diperbarui TIO
kalsowerus

5

JavaScript (ES6), 45 38 byte

Disimpan 6 byte berkat @Neil

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

Mengembalikan falseatau trueuntuk fungsi dan non-fungsi, masing-masing.

Ini bekerja dengan terus-menerus mengurangi nilai lama setiap fungsi ( m[k]) dan yang baru ( m[k]=v, yang juga menyimpan nilai baru). Setiap kali, ada tiga kasus:

  • Jika tidak ada nilai lama, m[k]kembalikan undefined. Mengurangkan apa pun dari undefinedhasil di NaN, yang palsu.
  • Jika nilai lama sama dengan yang baru, m[k]-vmenghasilkan 0, yang salah.
  • Jika nilai lama berbeda dari yang baru, m[k]-vmenghasilkan bilangan bulat bukan nol, yang benar.

Karena itu, kita hanya perlu memastikan bahwa m[k]-(m[k]=v)itu tidak pernah benar.


1
Terlalu lama. Gunakan a=>!a.some(([x,y])=>m[x]-(m[x]=y),m=[]).
Neil

@ Neil Dang itu, saya tahu harus ada beberapa cara untuk memanfaatkan m[k]menjadi terdefinisi ... Terima kasih!
ETHproduk

5

Mathematica, 24 byte

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

Penjelasan: Unionmenghapus pasangan yang terduplikasi, kemudian #&@@@mendapatkan elemen pertama dari setiap pasangan (seperti First/@tetapi dengan lebih sedikit byte). Jika ada pengulangan dalam elemen pertama ini, pasangan tidak membuat fungsi, yang kami periksa UnsameQ.

(Ini mungkin memiliki kepadatan @karakter tertinggi dalam setiap program yang saya tulis ...)


2
@density =
CalculatorFeline


4

Bash + coreutils, 17

sort -u|uniq -dw1

Input diberikan melalui STDIN. keydan valueyang Tabdipisahkan dan masing-masing pasangan adalah baris baru-delimited.

sortmenghapus pasangan nilai kunci duplikat. uniq -dhanya menghasilkan duplikat, dan dengan demikian menampilkan string kosong dalam kasus fungsi, dan string non-kosong sebaliknya - ketika ada kunci duplikat yang memetakan ke nilai yang berbeda.

Cobalah online .


4

05AB1E , 9 byte

Kode:

ãü-ʒ¬_}}Ë

Penjelasan:

ã            # 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

Menggunakan penyandian 05AB1E . Cobalah online!


Mendapatkan untuk memamerkan ʒsegera saya melihat :)
Emigna

@Emigna Ya haha: p, tapi saya sudah menemukan bug yang menyebabkan saya untuk menggunakan }}bukan }.
Adnan

4

Jelly , 6 byte

QḢ€µQ⁼

Cobalah online!

Penjelasan

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.

Berikut adalah metode alternatif, juga 6 byte:

QḢ€ṢIẠ

Cobalah online!

Alih-alih menguji dengan menghapus kunci duplikat, ini semacam ( ) dan memeriksa apakah perbedaan antara istilah ( I) semua benar ( )


4

R , 95 66 byte

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

Disimpan 29 byte berkat Jarko Dubbeldam.

Fungsi anonim. Keluaran FALSEjika suatu fungsi dan TRUEjika tidak (maaf). Membawa argumen sebagai kunci dan daftar nilai, seperti itu.

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

Putar melalui semua kunci dan ambil panjang himpunan nilai unik untuk kunci itu. Jika anydari mereka> 1, kembali TRUE.

Ini dikalahkan oleh jawaban MickyT , dan juga Giuseppe . salah satu dari mereka.


Mengapa Anda membuat kerangka data, hanya untuk kemudian referensi vektor yang baru saja Anda masukkan ke dalam kerangka data itu? function(k=0,v=0)any(sapply(k,function(x){length(unique(v[k==x]))-1}))harus mencapai hal yang sama.
JAD

Karena saya masih belajar! Setidaknya salah satu dari jawaban R lainnya melakukannya kurang lebih seperti yang Anda gambarkan.
BLT

maaf jika saya keluar agak kasar :) kiriman Anda sedikit berbeda dengan jawaban R lainnya, dan jika Anda memotong data.frame yang berlebihan, Anda mungkin dapat membandingkan dengan lebih baik.
JAD

4

J-uby , 48 33 25 21 byte

-3 byte terima kasih ke Jordan!

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

Penjelasan

: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 }

Pendekatan Pertama, 33 byte

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

Yang ini lebih panjang dari solusi Ruby yang setara, tapi itu menyenangkan untuk dibuat.

Mencoba penjelasan dengan mengubah ke 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 }                             

Saya dapat menyimpan 2 byte dengan versi yang lebih baru dengan mengganti :uniqdengan~:|



3

Mathematica, 35 byte

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

Fungsi murni mengambil daftar pasangan yang dipesan sebagai masukan dan pengembalian Trueatau False. Mengeksploitasi fakta bahwa Union@#menghapus pasangan berurutan berulang, tetapi <|Rule@@@#|>(sebuah asosiasi) menghapus semua kecuali satu pasangan berurutan dengan elemen pertama tertentu. Jadi kita bisa membandingkan Lengths dari dua output untuk memeriksa apakah daftar input adalah fungsi.


3

Jelly , 6 byte

nþ`ḄCȦ

Cobalah online!

Bagaimana itu bekerja

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

Disimpan 2 byte berkat Martin Ender

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

Output 0untuk fungsi dan 1untuk non-fungsi.

Cobalah online!

Penjelasan

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

(∪≡⊢)⊃¨∘∪

Cobalah online!

Penjelasan

             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

Cetakan 0untuk false dan 1true


Wah, kamu semakin bagus.
Adm

3

Sebenarnya , 4 byte

╔♂F═

Cobalah online!

Penjelasan:

╔♂F═
╔     uniquify (remove duplicate pairs)
 ♂F   take first items in each pair (keys)
   ═  are all of the keys unique?

3

brainfuck , 71 byte

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

Cobalah online!

Input diambil sebagai string datar: misalnya, kasus uji pertama adalah 35356444. Untuk mendapatkan representasi yang ditunjukkan dalam pertanyaan asli, cukup tambahkan total enam koma ke program pada titik yang tepat.

Output Uuntuk fungsi dan Vuntuk non-fungsi.

Penjelasan

Untuk setiap kode ASCII titik n, f (n) disimpan di sel 2n + 1. Sel 2n dan 2n + 2 adalah ruang kerja, dan 0, 2, 4, 6, ... 2n-2 adalah jejak remah roti untuk mengarah kembali ke sel 0. Ketika input terbukti tidak berfungsi, f ( 0) diatur ke 1 (di antara berbagai efek samping).

,                  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{

Cobalah

Ini bekerja dengan menghapus setiap pasangan yang diulang terlebih dahulu ({Q); kemudian membandingkan panjang daftar dengan panjang kamus yang dibuat dari daftar (jika nilai x yang sama terjadi lebih dari sekali, konstruktor kamus hanya menggunakan yang terakhir, sehingga kamus lebih pendek dari daftar)


2

MATL , 12 byte

iFFvXu1Z)SdA

Inputnya adalah matriks 2-kolom, di mana kolom pertama adalah kunci dan yang kedua adalah nilai.

Cobalah online!

Penjelasan

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);

Mencetak apa pun untuk fungsi dan nuntuk non-fungsi.


1

CJam , 14 11 9 byte

_&0f=__&=

Cobalah online!

Mengambil input sebagai array pasangan kunci / nilai pada stack, mengembalikan 1jika input adalah fungsi, dan 0jika bukan.

Solusi ini didasarkan pada snippet _&, yang menduplikat array dengan mengambil persimpangan set dengan itu sendiri. Saya melakukan ini dua kali, pertama pada input penuh (untuk menyingkirkan pasangan kunci / nilai yang persis sama) dan kemudian hanya pada kunci (untuk melihat apakah ada kunci duplikat yang tersisa setelah de-duplikasi pertama).

Berikut kode lengkap dengan komentar:

_&           "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";

Asal tahu saja, e#adalah sintaks komentar baris khusus di CJam.
Buah Esolanging

1

Ruby, 39 30 29 Bytes

Terima kasih kepada @ ValueInk karena telah menghemat 9 byte!

->x{Hash[x].size==(x|x).size}

Port of @ Rod's Python 2 menjawab .


Hash[x]berfungsi dengan baik tbh
Nilai Tinta

@ ValueInk terima kasih. Tidak yakin mengapa saya tidak memikirkan hal itu.
Cyoce
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.