Ist das eine Funktion?


47

(key, value)Bestimmen Sie anhand einer Liste von Paaren, ob es sich um eine Funktion handelt. Dies bedeutet, dass jeder Schlüssel einem konsistenten Wert zugeordnet ist. Mit anderen Worten, wenn zwei Einträge gleiche Schlüssel haben, müssen sie auch gleiche Werte haben. Wiederholte Eingaben sind OK.

Zum Beispiel:

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

Eingabe: Eine geordnete Folge von (key, value)Paaren mit den Ziffern 1 bis 9. Möglicherweise ist keine bestimmte Reihenfolge erforderlich. Alternativ können Sie die Tastenliste und die Werteliste als separate Eingänge verwenden.

Ausgabe: Ein konsistenter Wert für Funktionen und ein anderer konsistenter Wert für Nichtfunktionen.

Testfälle: Die ersten 5 Eingänge sind Funktionen, die letzten 5 nicht.

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

Hier sind sie als zwei Listen von Eingaben:

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

Bestenliste:


surjektive Funktion?
Poke

@Poke Es muss nicht surjektiv sein.
4.

Könnte es sich bei der Eingabe um zwei Listen gleicher Länge handeln, eine für Schlüssel und eine für Werte?
Calvins Hobbys

2
Ist es in Ordnung, dass die (key,value)Paare umgekehrt werden, wie in (value,key)? Ich kann ein paar Bytes von meiner Antwort entfernen, wenn dies der Fall ist.
ymbirtt

1
@ymbirtt Ja, Sie können die Paare in beliebiger Reihenfolge haben.
6.

Antworten:


37

Python 2 , 34 Bytes

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

Probieren Sie es online!

Erstellt aus der Eingabe ein Wörterbuch und ein Set und vergleicht deren Längen.
Wörterbücher dürfen keine doppelten Schlüssel haben, daher werden alle ungültigen (und wiederholten) Werte entfernt.


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

21

Haskell, 36 Bytes

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

Probieren Sie es online!

Äußere (-> (k,v)) und innere (-> (m,n)) Schleife über die Paare und wann immer k==m, sammeln Sie den Wahrheitswert von v==n. Überprüfen Sie, ob alle zutreffen.


Du bist zu schnell! : /
Fehler

18

Brachylog , 5 4 Bytes

dhᵐ≠

Probieren Sie es online!

Volles Programm. Soweit ich das beurteilen kann, liegt der Grund dafür, dass dies die meisten anderen Golfsprachen schlägt, darin, dass es in Brachylog eingebaut ist, während die meisten anderen Golfsprachen dies synthetisieren müssen.

Erläuterung

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

Als vollständiges Programm erhalten wir, trueob die Assertion erfolgreich ist oder falsefehlschlägt.


15

Pyth , 5 Bytes

Ich bin ziemlich glücklich mit diesem.

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

Probieren Sie es online!


9

Retina , 25 Bytes

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

Probieren Sie es online!

Eingabeformat ist {k,v},{k,v},.... Druckt 0für Funktionen und 1für Nichtfunktionen. Ich könnte zwei Bytes sparen, indem ich Zeilenvorschübe anstelle der Kommas im Eingabeformat verwende, aber das ist durcheinander.


Ich glaube, es ist zumindest vom technischen Standpunkt aus "ernsthaft verrückt".
FryAmTheEggman

8

Brachylog , 13 Bytes

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

Probieren Sie es online!

Erläuterung

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

Können Sie erklären, wie Ċhᵐ=und wie Ċtᵐ≠?
CalculatorFeline

@CalculatorFeline Großbuchstaben sind Variablennamen. Ċist eine spezielle Variable mit dem Namen Couple, die immer als Liste von zwei Elementen vorgespannt ist. ist ein Metapredikat, das das unmittelbar vorhergehende Prädikat ( h - headoder t - tailhier) auf jedes Element der Eingabe (hier, Ċ) anwendet . =und einfach überprüfen, ob ihre Eingabe alle gleichen / alle verschiedenen Elemente enthält.
Fatalize

7

MATL , 8 Bytes

1Z?gs2<A

Eingaben sind: ein Array mit dem values, gefolgt von einem Array mit dem keys.

Der Ausgang ist 1für die Funktion, 0ansonsten.

Probieren Sie es online! . Oder überprüfen Sie alle Testfälle .

Erläuterung

1Z?

Erstellt eine dünne Matrix. Anfangs enthalten alle Einträge 0; und 1wird zu jedem Eintrag hinzugefügt, (i, j)wo jund isind die Eingabe key, valuePaare.

g

Die Matrix wird in logisch konvertiert. Das heißt, Einträge, die höher sind 1(entsprechend Duplikaten key, valuePaaren), werden auf gesetzt 1.

s

Die Summe jeder Spalte wird berechnet. Dies ist die Anzahl der verschiedenen values für jeden key.

2<A

Eine Funktion hat alle diese Summen kleiner als 2.


6

R, 33 Bytes

Dies ist meine Version für R. Dies nutzt die aveFunktion. Ich habe die Leereingabe zugelassen, indem ich die Standardeinstellungen für die Schlüssel- und Wertparameter festgelegt habe. aveerzeugt einen Mittelwert der Werte für jeden der Schlüssel. Glücklicherweise gibt dies das Mittel in der gleichen Reihenfolge wie die Eingabewerte zurück, sodass ein Vergleich mit der Eingabe anzeigt, ob es unterschiedliche Werte gibt. Gibt zurück, TRUEob es sich um eine Funktion handelt.

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

Probieren Sie es online!


6

05AB1E , 11 9 7 Bytes

2 Bytes dank kalsowerus gespart .

Ùø¬DÙQ,

Probieren Sie es online!

Erläuterung

Ù           # 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: Ja. Ich bin immer noch sehr froh, dass der Sonderfall nur ein Drittel des Programms
ausmachte

Ich denke, Sie könnten 3 Bytes einsparen, indem Sie `\)^head ( ¬) ersetzen : TIO
kalsowerus

@ kalsowerus: Leider bricht das für den Sonderfall von []:(
Emigna

@Enigma Oh, es hat funktioniert, weil ich beim Testen ,am Ende noch einen Rest hatte . Füge das hinzu und dann funktioniert es irgendwie mit [].
Kalsowerus

Aktualisiert TIO
kalsowerus

5

JavaScript (ES6), 45 38 Bytes

6 Bytes dank @Neil gespart

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

Gibt falsebzw. truefür Funktionen und Nichtfunktionen zurück.

Dies funktioniert, indem ständig der alte Wert jeder Funktion ( m[k]) und m[k]=vder neue Wert ( der auch den neuen Wert speichert ) subtrahiert werden . Jedes Mal gibt es drei Fälle:

  • Wenn es keinen alten Wert gab, wird m[k]zurückgegeben undefined. Subtrahieren Sie alles von den undefinedErgebnissen NaN, was falsch ist.
  • Wenn der alte Wert der gleiche wie der neue ist, m[k]-vergibt sich 0, was falsch ist.
  • Wenn der alte vom neuen Wert m[k]-vabweicht , wird eine ganze Zahl ungleich Null ausgegeben, was der Wahrheit entspricht.

Deshalb müssen wir nur sicherstellen, dass m[k]-(m[k]=v)das niemals wahr ist.


1
Viel zu lang. Verwenden Sie a=>!a.some(([x,y])=>m[x]-(m[x]=y),m=[]).
Neil

@Neil Dang es, wusste , dass ich da sein , einige Art und Weise zu nutzen , m[k]ist nicht definiert ... Danke!
ETHproductions

5

Mathematica, 24 Bytes

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

Erläuterung: UnionLöscht doppelte Paare und ruft dann #&@@@das erste Element von jedem Paar ab (wie, First/@aber mit weniger Bytes). Wenn sich diese ersten Elemente wiederholen, bilden die Paare keine Funktion, die wir überprüfen UnsameQ.

(Dies könnte die höchste Dichte an @Zeichen in jedem Programm haben, das ich geschrieben habe ...)


2
@Dichte =
CalculatorFeline


4

Bash + Coreutils, 17

sort -u|uniq -dw1

Die Eingabe erfolgt über STDIN. keyund valuesind Tabgetrennt und jedes Paar ist durch Zeilenumbrüche getrennt.

sortEntfernt die doppelten Schlüssel-Wert-Paare. uniq -dGibt nur Duplikate aus und gibt daher im Fall einer Funktion die leere Zeichenfolge und andernfalls eine nicht leere Zeichenfolge aus, wenn es doppelte Schlüssel gibt, die unterschiedlichen Werten zugeordnet sind.

Probieren Sie es online aus .


4

05AB1E , 9 Bytes

Code:

ãü-ʒ¬_}}Ë

Erläuterung:

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

Verwendet die 05AB1E- Codierung. Probieren Sie es online!


Erste zu zeigen , ʒsofort Ich sehe :)
Emigna

@Emigna Yeah haha: p, aber ich habe bereits einen Fehler gefunden, der mich veranlasst, }}statt zu verwenden }.
Adnan

4

Gelee , 6 Bytes

QḢ€µQ⁼

Probieren Sie es online!

Erläuterung

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.

Hier ist eine alternative Methode, ebenfalls 6 Bytes:

QḢ€ṢIẠ

Probieren Sie es online!

Anstatt zu testen , ob doppelte Schlüssel entfernt wurden, Iwird hiermit sortiert ( ) und geprüft, ob der Unterschied zwischen den Begriffen ( ) wahr ist ( ).


4

R , 95 66 Bytes

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

29 Bytes dank Jarko Dubbeldam gespeichert.

Anonyme Funktion. Gibt aus, FALSEob eine Funktion und TRUEwenn nicht (sorry). Nimmt als Argumente eine Liste von Schlüsseln und eine Liste von Werten wie folgt.

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

Durchläuft alle Schlüssel und ermittelt die Länge des Satzes eindeutiger Werte für diesen Schlüssel. Wenn einer anyvon ihnen> 1 ist, kehre zurück TRUE.

Dies wird von MickyTs Antwort und auch von Giuseppe 's geschlagen. stimme einem von denen zu.


Warum erstellen Sie einen Datenrahmen, um dann auf die Vektoren zu verweisen, die Sie gerade in diesen Datenrahmen eingefügt haben? function(k=0,v=0)any(sapply(k,function(x){length(unique(v[k==x]))-1}))sollte das gleiche erreichen.
JAD

Weil ich noch lerne! Mindestens eine der anderen R-Antworten entspricht mehr oder weniger Ihrer Beschreibung.
BLT

Es tut mir leid, wenn ich etwas hart abschneide :) Ihr Beitrag unterscheidet sich ein wenig von den anderen R-Antworten, und wenn Sie den redundanten data.frame herausschneiden, können Sie ihn möglicherweise besser vergleichen.
JAD

4

J-uby , 48 33 25 21 Bytes

-3 Bytes dank Jordanien!

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

Erläuterung

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

Erster Ansatz, 33 Bytes

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

Diese ist länger als die entsprechende Ruby-Lösung, aber es hat Spaß gemacht, sie zu erstellen.

Erklärungsversuch durch Umwandlung in 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 }                             

Ich kann 2 Bytes mit einer neueren Version speichert durch Ersetzen :uniqmit~:|



3

Mathematica, 35 Bytes

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

Reine Funktion, die eine Liste geordneter Paare als Eingabe und Rückgabe von Trueoder verwendet False. Nutzt die Tatsache aus, dass Union@#wiederholte geordnete Paare gelöscht werden, aber <|Rule@@@#|>(eine Assoziation) alle bis auf ein geordnetes Paar mit einem bestimmten ersten Element löscht. Wir können also einfach die Lengths der beiden Ausgänge vergleichen, um zu überprüfen, ob die Eingangsliste eine Funktion ist.


3

Gelee , 6 Bytes

nþ`ḄCȦ

Probieren Sie es online!

Wie es funktioniert

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 Bytes

2 Bytes gespart dank Martin Ender

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

Ausgänge 0für Funktionen und 1für Nichtfunktionen.

Probieren Sie es online!

Erläuterung

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 Bytes

(∪≡⊢)⊃¨∘∪

Probieren Sie es online!

Erläuterung

             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

Druckt 0für falsch und 1für wahr


Oh, du wirst richtig gut.
Adám


3

Brainfuck , 71 Bytes

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

Probieren Sie es online!

Die Eingabe erfolgt als flache Zeichenfolge. Dies ist beispielsweise der erste Testfall 35356444. Um die in der ursprünglichen Frage gezeigte Darstellung zu erhalten, fügen Sie dem Programm an den richtigen Stellen einfach insgesamt sechs Kommas hinzu.

Die Ausgabe erfolgt Ufür Funktionen und Vfür Nichtfunktionen.

Erläuterung

Für jeden ASCII-Codepunkt n wird f (n) in Zelle 2n + 1 gespeichert. Die Zellen 2n und 2n + 2 sind der Arbeitsbereich, und 0, 2, 4, 6, ... 2n-2 sind eine Spur von Semmelbröseln, die zur Zelle 0 zurückführen. Wenn sich herausstellt, dass die Eingabe keine Funktion ist, wird f ( 0) wird auf 1 gesetzt (unter verschiedenen Nebenwirkungen).

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

ql.d{Ql{

Versuch es

Es funktioniert, indem alle wiederholten Paare zuerst entfernt werden ({Q); dann vergleicht es die Länge der Liste mit der Länge eines aus der Liste erstellten Wörterbuchs (wenn der gleiche x-Wert mehrmals vorkommt, verwendet der Wörterbuchkonstruktor nur den letzten, was dazu führt, dass das Wörterbuch kürzer als die Liste ist)


2

MATL , 12 Bytes

iFFvXu1Z)SdA

Die Eingabe ist eine Matrix mit zwei Spalten, wobei die erste Spalte der Schlüssel und die zweite der Wert ist.

Probieren Sie es online!

Erläuterung

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 Bytes

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

Druckt nichts für Funktionen und nfür Nichtfunktionen.


1

CJam , 14 11 9 Bytes

_&0f=__&=

Probieren Sie es online!

Übernimmt die Eingabe als Array von Schlüssel / Wert-Paaren auf dem Stapel, gibt zurück, 1ob die Eingabe eine Funktion ist, und 0wenn dies nicht der Fall ist .

Diese Lösung basiert auf dem Snippet _&, das ein Array desupliziert, indem es den festgelegten Schnittpunkt mit sich selbst nimmt. Ich mache das zweimal, zuerst bei der vollständigen Eingabe (um alle genau duplizierten Schlüssel / Wert-Paare zu entfernen) und dann nur bei den Schlüsseln (um zu sehen, ob nach der ersten Deduplizierung noch doppelte Schlüssel übrig sind).

Hier ist der vollständige Code mit Kommentaren:

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

Nur damit Sie wissen, e#ist die Syntax für dedizierte Zeilenkommentare in CJam.
Esolanging Fruit

1

Ruby, 39 30 29 Bytes

Vielen Dank an @ValueInk für die Einsparung von 9 Bytes!

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

Port von @ Rods Python 2 Antwort .


Hash[x]funktioniert genauso gut tbh
Value Ink

@ ValueInk danke. Ich bin mir nicht sicher, warum ich nicht darüber nachgedacht habe.
Cyoce
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.