Czy to jest funkcja?

47

Biorąc pod uwagę listę (key, value)par, określ, czy reprezentuje ona funkcję, co oznacza, że ​​każdy klucz odwzorowuje na spójną wartość. Innymi słowy, ilekroć dwa wpisy mają takie same klucze, muszą również mieć takie same wartości. Powtarzające się wpisy są OK.

Na przykład:

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

Dane wejściowe: Uporządkowana sekwencja (key, value)par za pomocą cyfr od 1 do 9. Może nie być wymagane żadne konkretne zamówienie. Alternatywnie możesz wziąć listę kluczy i listę wartości jako osobne dane wejściowe.

Dane wyjściowe: spójna wartość dla funkcji i inna spójna wartość dla niefunkcjonalnych.

Przypadki testowe: Pierwsze 5 wejść to funkcje, ostatnie 5 nie.

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

Oto dwie listy danych wejściowych:

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

Tabela liderów:

xnor
źródło
funkcja zaskakująca?
Poke
@Poke To nie musi być zaskakujące.
xnor
Czy dane wejściowe mogą być dwiema listami o tej samej długości, jedną dla kluczy jedną dla wartości?
Calvin's Hobbies
2
Czy (key,value)można odwrócić pary, tak jak w przypadku (value,key)? Jeśli tak, mogę ogolić kilka bajtów z mojej odpowiedzi.
ymbirtt
1
@ymbirtt Tak, możesz mieć pary w dowolnej kolejności.
xnor

Odpowiedzi:

37

Python 2 , 34 bajty

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

Wypróbuj online!

Tworzy słownik i zestaw na podstawie danych wejściowych i porównuje ich długości.
Słowniki nie mogą mieć zduplikowanych kluczy, więc wszystkie niedozwolone (i powtarzane) wartości są usuwane.

Pręt
źródło
5
Python 3, 30 bajtów:lambda x:not dict(x).items()^x
Veedrac
21

Haskell, 36 bajtów

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

Wypróbuj online!

Zewnętrzna (-> (k,v)) i wewnętrzna (-> (m,n)) pętla nad parami i za każdym razem k==mzbierają wartość prawdy v==n. Sprawdź, czy wszystkie są prawdziwe.

nimi
źródło
Jesteś za szybki! : /
flawr
18

Brachylog , 5 4 bajtów

dhᵐ≠

Wypróbuj online!

Pełny program O ile mi wiadomo, powodem, dla którego pokonuje większość innych języków golfowych, jest wbudowane narzędzie Brachylog, podczas gdy większość innych języków golfowych musi je zsyntetyzować.

Wyjaśnienie

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

Jako pełny program otrzymujemy, truejeśli asercja się powiedzie, lub falsejeśli się nie powiedzie.


źródło
15

Pyth , 5 bajtów

Jestem z tego całkiem zadowolony.

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

Wypróbuj online!

notjagan
źródło
9

Siatkówka , 25 bajtów

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

Wypróbuj online!

Format wejściowy to {k,v},{k,v},.... Drukuje 0dla funkcji i 1dla niefunkcji. Mógłbym zaoszczędzić dwa bajty, używając kanałów wejściowych zamiast przecinków w formacie wejściowym, ale to popsute.

Martin Ender
źródło
Uważam, że kwalifikuje się to jako „poważny błąd”, przynajmniej z technicznego punktu widzenia.
FryAmTheEggman
8

Brachylog , 13 bajtów

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

Wypróbuj online!

Wyjaśnienie

¬{          }      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.
Fatalizować
źródło
Czy możesz wyjaśnić, jak Ċhᵐ=i jak Ċtᵐ≠działa?
CalculatorFeline
@CalculatorFeline Wielkie litery to nazwy zmiennych. Ċjest specjalną zmienną o nazwie Para, która zawsze jest wstępnie ograniczona do listy dwóch elementów. jest metapredykatem, który stosuje poprzedni predykat ( h - headlub t - tailtutaj) do każdego elementu danych wejściowych (tutaj, Ċ). =i po prostu sprawdź, czy ich dane wejściowe zawierają wszystkie równe / wszystkie różne elementy.
Fatalize
7

MATL , 8 bajtów

1Z?gs2<A

Dane wejściowe to: tablica z literą values, a następnie tablica z literą keys.

Dane wyjściowe dotyczą 1funkcji, w 0przeciwnym razie.

Wypróbuj online! . Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

1Z?

Tworzy rzadką macierz. Początkowo wszystkie wpisy zawierają 0; i 1jest dodawany do każdego wpisu, (i, j)gdzie ji isą danymi wejściowymi key, valueparami.

g

Macierz jest konwertowana na logiczną; czyli pozycje przekraczającej 1(odpowiadające powielić key, valuepar) są ustawione 1.

s

Obliczana jest suma każdej kolumny. Jest to liczba różnych values dla każdego key.

2<A

Funkcja będzie miała wszystkie takie sumy mniej niż 2.

Luis Mendo
źródło
6

R, 33 bajty

To jest moja wersja dla R. Korzysta z tej avefunkcji. Zezwoliłem na puste dane wejściowe, ustawiając wartości domyślne parametrów klucza i wartości. avetworzy średnią wartości dla każdego z kluczy. Na szczęście to zwraca średnie w tej samej kolejności co wartości wejściowe, więc porównanie z danymi wejściowymi pokaże, czy istnieją inne wartości. Zwraca, TRUEjeśli jest to funkcja.

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

Wypróbuj online!

MickyT
źródło
6

05AB1E , 11 9 7 bajtów

Zaoszczędzono 2 bajty dzięki kalsowerus .

Ùø¬DÙQ,

Wypróbuj online!

Wyjaśnienie

Ù           # 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
Emigna
źródło
@Riley: Tak. Nadal cieszę się, że szczególny przypadek zakończył się tylko jedną trzecią programu: P
Emigna
Myślę, że możesz zapisać 3 bajty, zastępując `\)^head ( ¬): TIO
kalsowerus
@kalsowerus: Niestety, przerwa w specjalnym przypadku []:(
Emigna
@Enigma Och, zadziałało, ponieważ podczas testów wciąż miałem resztki ,na końcu. Dodaj to, a potem jakoś będzie działać [].
kalsowerus
Zaktualizowano TIO
kalsowerus
5

JavaScript (ES6), 45 38 bajtów

Zaoszczędź 6 bajtów dzięki @Neil

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

Zwraca falselub truedla funkcji i spoza funkcji, odpowiednio.

Działa to poprzez ciągłe odejmowanie starej wartości każdej funkcji ( m[k]) i nowej ( m[k]=vktóra również przechowuje nową wartość). Za każdym razem są trzy przypadki:

  • Jeśli nie było starej wartości, m[k]zwraca undefined. Odejmowanie czegokolwiek od undefinedwyników NaN, co jest fałszem.
  • Jeśli stara wartość jest taka sama jak nowa, m[k]-vwynik 0jest fałszywy.
  • Jeśli stara wartość różni się od nowej, m[k]-vskutkuje niezerową liczbą całkowitą, co jest prawdą.

Dlatego musimy tylko upewnić się, że m[k]-(m[k]=v)nigdy nie jest to prawdą.

ETHprodukcje
źródło
1
Zbyt długo. Zastosowanie a=>!a.some(([x,y])=>m[x]-(m[x]=y),m=[]).
Neil
@Neil Dang, wiedziałem, że musi istnieć jakiś sposób, by wykorzystać m[k]niezdefiniowane ... Dzięki!
ETHprodukcje
5

Mathematica, 24 bajty

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

Objaśnienie: Unionusuwa zduplikowane pary, a następnie #&@@@pobiera pierwszy element z każdej pary (jak, First/@ale z mniejszą liczbą bajtów). Jeśli w tych pierwszych elementach jest jakieś powtórzenie, pary nie tworzą funkcji, którą sprawdzamy UnsameQ.

(To może mieć najwyższą gęstość @znaków w każdym programie, który napisałem…)

Nie drzewo
źródło
2
@gęstość =
CalculatorFeline
5

R, 36 33 bajtów

function(k,v)any(v[match(k,k)]-v)

Wypróbuj online!

funkcja anonimowa; zwraca FALSEdla funkcji, a TRUEnie dla.

To bicie jest ostatecznie powiązane z odpowiedzią MickyT! !

Giuseppe
źródło
4

Bash + coreutils, 17

sort -u|uniq -dw1

Dane wejściowe są podawane przez STDIN. keyi valueTabrozdzielone, a każda para jest rozdzielana znakiem nowej linii.

sortusuwa zduplikowane pary klucz-wartość. uniq -dwypisuje tylko duplikaty, a zatem wypisuje pusty ciąg w przypadku funkcji, a niepusty ciąg w przeciwnym razie - gdy są duplikaty kluczy, które są odwzorowane na różne wartości.

Wypróbuj online .

Cyfrowa trauma
źródło
4

05AB1E , 9 bajtów

Kod:

ãü-ʒ¬_}}Ë

Wyjaśnienie:

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

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Adnan
źródło
Pierwsze popisywać się ʒod razu widzę :)
Emigna
@Emigna Tak, haha: p, ale już znalazłem błąd, który powoduje, że używam go }}zamiast }.
Adnan
4

Galaretka , 6 bajtów

QḢ€µQ⁼

Wypróbuj online!

Wyjaśnienie

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.

Oto alternatywna metoda, również 6 bajtów:

QḢ€ṢIẠ

Wypróbuj online!

Zamiast testować z usuwaniem zduplikowanych kluczy, to sortuje ( ) i sprawdza, czy Icała różnica między terminami ( ) jest prawdziwa ( )

fireflame241
źródło
4

R , 95 66 bajtów

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

Zaoszczędź 29 bajtów dzięki Jarko Dubbeldam.

Funkcja anonimowa. Wyprowadzane, FALSEjeśli funkcja, a TRUEjeśli nie (przepraszam). Jako argumenty przyjmuje listę kluczy i listę wartości.

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

Pętla przechodzi przez wszystkie klucze i pobiera długość zestawu unikalnych wartości dla tego klucza. Jeśli anyz nich jest> 1, wróć TRUE.

Jest to pobijane przez odpowiedź MickyT , a także odpowiedź Giuseppe . przegłosuj jeden z nich.

BLT
źródło
Dlaczego tworzysz ramkę danych, aby odwoływać się do wektorów, które właśnie umieściłeś w tej ramce danych? function(k=0,v=0)any(sapply(k,function(x){length(unique(v[k==x]))-1}))powinien osiągnąć to samo.
JAD
Ponieważ wciąż się uczę! Co najmniej jedna z pozostałych odpowiedzi R odpowiada mniej więcej tak, jak to opisujesz.
BLT
przepraszam, jeśli wyszedłem trochę ostro :) twoje przesłanie różni się nieco od innych odpowiedzi R, a jeśli miałbyś wyciąć zbędne dane.frame, możesz być w stanie lepiej porównać.
JAD
4

J-uby , 48 33 25 21 bajtów

-3 bajty dzięki Jordanowi!

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

Wyjaśnienie

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

Pierwsze podejście, 33 bajty

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

Ten jest dłuższy niż równoważne rozwiązanie Ruby, ale jego tworzenie było fajne.

Próba wyjaśnienia, przechodząc na 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 }                             

Mógłbym zapisać 2 bajty w nowszej wersji, zastępując :uniqje~:|

Cyoce
źródło
3

V , 30 bajtów

Úç^¨.*©î±$/d
ÎwD
ç/HdG
Íî
Ò1lD

Wypróbuj online!

Wyjścia 1dla funkcji i nic dla niefunkcji.

DJMcMayhem
źródło
3

Mathematica, 35 bajtów

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

Czysta funkcja przyjmująca listę uporządkowanych par jako dane wejściowe i zwracające Truelub False. Wykorzystuje fakt, że Union@#usuwa powtarzające się uporządkowane pary, ale <|Rule@@@#|>(powiązanie) usuwa wszystkie oprócz jednej uporządkowanej pary z określonym pierwszym elementem. Możemy więc po prostu porównać Lengths dwóch wyjść, aby sprawdzić, czy lista wejść jest funkcją.

Greg Martin
źródło
3

Galaretka , 6 bajtów

nþ`ḄCȦ

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
3

CJam , 19 17 bajtów

Zaoszczędzono 2 bajty dzięki Martinowi Enderowi

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

Wyjścia 0dla funkcji i 1dla niefunkcji.

Wypróbuj online!

Wyjaśnienie

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)
Business Cat
źródło
3

APL (Dyalog) , 16 12 11 9 bajtów

(∪≡⊢)⊃¨∘∪

Wypróbuj online!

Wyjaśnienie

             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

Drukuje 0jako fałszywe i 1prawdziwe

Kritixi Lithos
źródło
Zaraz, stajesz się naprawdę dobry.
Adám,
3

Właściwie 4 bajty

╔♂F═

Wypróbuj online!

Wyjaśnienie:

╔♂F═
╔     uniquify (remove duplicate pairs)
 ♂F   take first items in each pair (keys)
   ═  are all of the keys unique?
Mego
źródło
3

pieprzenie mózgu , 71 bajtów

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

Wypróbuj online!

Dane wejściowe są traktowane jako ciągi płaskie: na przykład byłby to pierwszy przypadek testowy 35356444. Aby uzyskać reprezentację pokazaną w pierwotnym pytaniu, po prostu dodaj w sumie sześć przecinków do programu w odpowiednich punktach.

Dane wyjściowe dotyczą Ufunkcji i Vfunkcji niefunkcjonalnych.

Wyjaśnienie

Dla dowolnego kodu ASCII punkt n, f (n) jest przechowywany w komórce 2n + 1. Komórki 2n i 2n + 2 są przestrzenią roboczą, a 0, 2, 4, 6, ... 2n-2 są śladem bułki tartej prowadzącej z powrotem do komórki 0. Gdy okaże się, że dane wejściowe nie są funkcją, f ( 0) jest ustawiony na 1 (spośród różnych efektów ubocznych).

,                  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
Nitrodon
źródło
2

Pyth - 9 8 bajtów

ql.d{Ql{

Spróbuj

Działa poprzez usunięcie najpierw dowolnych powtarzających się par ({Q); następnie porównuje długość listy z długością słownika utworzonego z listy (jeśli ta sama wartość x występuje więcej niż jeden raz, konstruktor słownika używa tylko ostatniego, co powoduje, że słownik jest krótszy niż lista)

Maria
źródło
2

MATL , 12 bajtów

iFFvXu1Z)SdA

Dane wejściowe to macierz 2-kolumnowa, gdzie pierwsza kolumna jest kluczem, a druga wartością.

Wypróbuj online!

Wyjaśnienie

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?
Luis Mendo
źródło
2

PHP, 49 bajtów

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

Nie drukuje nic dla funkcji i nniefunkcji.

użytkownik63956
źródło
1

CJam , 14 11 9 bajtów

_&0f=__&=

Wypróbuj online!

Pobiera dane wejściowe jako tablicę par klucz / wartość na stosie, zwraca, 1jeśli dane wejściowe są funkcją, a 0jeśli nie są.

To rozwiązanie opiera się na fragmencie kodu _&, który duplikuje tablicę, biorąc zestaw jej przecięcia ze sobą. Robię to dwa razy, najpierw na pełnym wejściu (aby pozbyć się dokładnie zduplikowanych par klucz / wartość), a następnie tylko na kluczach (aby sprawdzić, czy po pierwszym usunięciu duplikatów pozostały jeszcze jakieś duplikaty).

Oto pełny kod z komentarzami:

_&           "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";
Ilmari Karonen
źródło
Tak więc wiesz, e#jest dedykowana składnia komentarza do linii w CJam.
Esolanging Fruit
1

Ruby, 39 30 29 bajtów

Dzięki @ValueInk za oszczędność 9 bajtów!

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

Odpowiedź na Python 2 dla portu @ Rod .

Cyoce
źródło
Hash[x]działa równie dobrze tbh
Value Ink
@ValueInk dzięki. Nie jestem pewien, dlaczego o tym nie pomyślałem.
Cyoce