これは機能ですか?


47

(key, value)ペアのリストが与えられたら、それが関数を表すかどうか、つまり各キーが一貫した値にマップされるかどうかを判断します。つまり、2つのエントリのキーが等しい場合は、値も同じである必要があります。繰り返し入力しても問題ありません。

例えば:

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

入力:(key, value) 1〜9の数字を使用したペアの順序付きシーケンス。特定の順序付けは不要です。または、キーリストと値リストを別々の入力として使用することもできます。

出力:機能の一貫した値、および機能以外の一貫した値。

テストケース:最初の5つの入力は関数であり、最後の5つの入力は関数ではありません。

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

ここでは、入力の2つのリストとして示します。

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

リーダーボード:


全射関数?
ポケ

@Poke形容詞である必要はありません。
-xnor

入力は同じ長さの2つのリストで、1つはキー、もう1つは値です。
カルバンの趣味

2
(key,value)ようにペアを逆にしても構い(value,key)ませんか?その場合、回答から数バイト削り取ることができます。
-ymbirtt

1
@ymbirttはい、ペアはどちらの順序でも構いません。
xnor

回答:


37

Python 2、34バイト

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

オンラインでお試しください!

入力から辞書とセットを作成し、それらの長さを比較します。
辞書には重複したキーを含めることができないため、すべての不正な(および繰り返される)値は削除されます。


5
Python lambda x:not dict(x).items()^x
3、30

21

Haskell、36バイト

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

オンラインでお試しください!

外側(-> (k,v))と内側(-> (m,n))はペアをループし、いつでもk==mの真理値を収集しますv==n。すべてが正しいかどうかを確認します。


速すぎる!:/
flawr

18

Brachylog5 4バイト

dhᵐ≠

オンラインでお試しください!

完全なプログラム。私の知る限り、これが他のほとんどのゴルフ言語を打ち負かしている理由は、Brachylogに組み込まれているからです。他のゴルフ言語のほとんどはそれを合成する必要があります。

説明

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

完全なプログラムとして、trueアサーションが成功したfalse場合、または失敗した場合に取得します。



9

網膜、25バイト

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

オンラインでお試しください!

入力形式は{k,v},{k,v},...です。0機能用および1非機能用に印刷します。入力形式でコンマの代わりに改行を使用することで2バイトを節約できましたが、それは台無しです。


少なくとも技術的な見地からすれば、それは「真面目なワック」とみなされると思います。
FryAmTheEggman

8

Brachylog、13バイト

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

オンラインでお試しください!

説明

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

方法Ċhᵐ=Ċtᵐ≠作業を説明できますか?
電卓

@CalculatorFeline大文字は変数名です。Ċは、2つの要素のリストになるように常に事前に制限されているカップルと呼ばれる特別な変数です。は、直前の述語(h - headまたはt - tailここ)を入力の各要素(ここ)に適用するメタ述語Ċです。=また、入力にすべて等しい/すべて異なる要素が含まれていることを単純にチェックします。
致命的

7

MATL、8バイト

1Z?gs2<A

入力は、valuesの配列と、keysの配列です。

それ以外の1場合、出力は機能用0です。

オンラインでお試しください!。または、すべてのテストケースを確認します

説明

1Z?

スパース行列を作成します。最初はすべてのエントリに0; そして1、各エントリに追加される(i, j)場合ji入力されkeyvalueペア。

g

マトリックスは論理に変換されます。つまり、1(重複keyvalueペアに対応する)を超えるエントリはに設定され1ます。

s

各列の合計が計算されます。これは、valueそれぞれの異なるの数ですkey

2<A

関数は、そのようなすべての合計が未満になり2ます。


6

R、33バイト

これはRの私のバージョンです。これはave関数を利用します。キーと値のパラメーターにデフォルトを設定することにより、空の入力を許可しました。 ave各キーの値の平均を生成しています。幸いなことに、これは入力値と同じ順序で平均を返します。そのため、入力との比較は、異なる値があるかどうかを示します。TRUE関数かどうかを返します。

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

オンラインでお試しください!


6

05AB1E11 9 7バイト

kalsowerusのおかげで2バイト節約されました

Ùø¬DÙQ,

オンラインでお試しください!

説明

Ù           # 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:はい。P:私はまだ特別な場合にのみプログラムの3分の1を終わったことを、非常に満足している
Emigna

`\)^ヘッド(¬)に置き換えることで3バイト節約できると思います:TIO
kalsowerus

@kalsowerus:残念ながら、これは: [](
Emigna

@Enigmaああ、それはうまくいきました。なぜなら、テスト中,に最後に残り物が残っていたからです。それを追加し、それが何らかの形で動作し[]ます。
カルソウェラス


5

JavaScript(ES6)、45 38バイト

@Neilのおかげで6バイト節約

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

関数を返すfalsetrue、関数以外を返します。

これは、各関数の古い値(m[k])と新しい関数(m[k]=v、新しい値も保存する)を常に減算することで機能します。毎回、3つのケースがあります。

  • 古い値がなかった場合、をm[k]返しますundefined。からundefined結果を減算NaNすると、偽りになります。
  • 古い値が新しい値と同じ場合、m[k]-v結果0は偽になります。
  • 古い値が新しい値と異なる場合、m[k]-vゼロ以外の整数になりますが、これは真実です。

したがって、それm[k]-(m[k]=v)が決して真実ではないことを確認する必要があります。


1
長すぎます。を使用しa=>!a.some(([x,y])=>m[x]-(m[x]=y),m=[])ます。
ニール

@Neil Dangそれ、未定義であることを利用する何らかの方法がなければならないと知っていましたm[k]...ありがとう!
-ETHproductions

5

Mathematica、24バイト

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

説明:Union複製されたペアを削除して#&@@@から、各ペアから最初の要素を取得しFirst/@ます(ただし、バイト数が少なくなります)。これらの最初の要素に繰り返しがある場合、ペアは関数を作成しませんUnsameQ

(これは、@私が書いたどのプログラムでも文字の密度が最も高いかもしれません…)


2
@density =
電卓Feline


4

Bash + coreutils、17

sort -u|uniq -dw1

入力はSTDINを介して与えられます。 keyそして、valueされているTab分離され、各対は、改行で区切られています。

sort重複するキーと値のペアを削除します。 uniq -d重複のみを出力するため、関数の場合は空の文字列を出力し、そうでない場合-異なる値にマップする重複キーがある場合は空でない文字列を出力します。

オンラインでお試しください


4

05AB1E、9バイト

コード:

ãü-ʒ¬_}}Ë

説明:

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

05AB1Eエンコードを使用します。オンラインでお試しください!


誇示するために取得ʒ:)すぐに私が見る
Emigna

@Emigna Yeah haha​​:p、しかし、私はすでに、の}}代わりに使用するバグを見つけました}
アドナン

4

ゼリー、6バイト

QḢ€µQ⁼

オンラインでお試しください!

説明

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.

以下に、6バイトの代替方法を示します。

QḢ€ṢIẠ

オンラインでお試しください!

重複キーを削除してテストする代わりに、これはソート()し、用語の違い(I)がすべて真実かどうかをチェックします(


4

R95 66バイト

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

Jarko Dubbeldamのおかげで29バイト節約されました。

匿名関数。FALSE関数のTRUE場合とそうでない場合に出力します(申し訳ありません)。そのように、引数としてキーのリストと値のリストを取ります。

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

すべてのキーをループし、そのキーの一意の値のセットの長さを取得します。anyそれらが1 より大きい場合、を返しTRUEます。

これは、MickyTの回答、およびGiuseppeの回答によってbeatられています。それらのいずれかに賛成票を投じてください。


なぜデータフレームを作成し、そのデータフレームに入れたばかりのベクターを参照するだけですか?function(k=0,v=0)any(sapply(k,function(x){length(unique(v[k==x]))-1}))同じことを達成する必要があります。
-JAD

まだ学んでいるからです!他のR回答の少なくとも1つが、あなたが説明したように多かれ少なかれそれを行います。
BLT

ごめんなさい、少し厳しいです:)あなたの提出は他のRの回答とは少し異なります。冗長なdata.frameを削除する場合は、より良い比較ができるかもしれません。
JAD

4

J-uby48 33 25 21バイト

ヨルダンのおかげで-3バイト!

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

説明

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

最初のアプローチ、33バイト

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

これは同等のRubyソリューションよりも長いですが、作るのは楽しかったです。

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 }                             

を置き換える:uniqと、新しいバージョンで2バイト節約できます~:|



3

Mathematica、35バイト

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

順序付きペアのリストを入力として受け取り、Trueまたはを返す純粋な関数FalseUnion@#繰り返された順序付きペアを<|Rule@@@#|>削除しますが、(関連付け)特定の最初の要素を持つ1つの順序付きペアを除くすべてを削除するという事実を利用します。したがってLength、2つの出力のsを比較して、入力リストが関数かどうかを確認できます。


3

ゼリー、6バイト

nþ`ḄCȦ

オンラインでお試しください!

使い方

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

CJam19 17バイト

Martin Enderのおかげで2バイト節約

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

0関数および1非関数の出力。

オンラインでお試しください!

説明

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バイト

(∪≡⊢)⊃¨∘∪

オンラインでお試しください!

説明

             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

0falseおよび1trueの場合に印刷します


おっと、あなたは本当に良くなっています。
アダム


3

brainfuck、71バイト

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

オンラインでお試しください!

入力はフラットな文字列として取得されます。たとえば、最初のテストケースはになります35356444。元の質問に示されている表現を取得するには、プログラムの適切な箇所に合計6つのコンマを追加するだけです。

出力はU、関数V用と非関数用です。

説明

ASCIIコードポイントnの場合、f(n)はセル2n + 1に格納されます。セル2nと2n + 2は作業スペースであり、0、2、4、6、... 2n-2はパンくずの軌跡であり、セル0に戻ります。入力が関数ではないことが証明されると、f( 0)は(さまざまな副作用の中で)1に設定されます。

,                  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バイト

ql.d{Ql{

それを試してみてください

最初に繰り返しペアを削除することで機能します({Q)。次に、リストの長さとリストから作成されたディクショナリの長さを比較します(同じx値が複数回出現する場合、ディクショナリコンストラクタは最後のディクショナリのみを使用するため、ディクショナリはリストより短くなります)


2

MATL、12バイト

iFFvXu1Z)SdA

入力は2列の行列で、最初の列はキーで、2番目の列は値です。

オンラインでお試しください!

説明

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バイト

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

関数およびn非関数については何も出力しません。


1

CJam14 11 9バイト

_&0f=__&=

オンラインでお試しください!

スタック上のキー/値ペアの配列として入力を受け取り1、入力が関数である0場合とそうでない場合を返します。

このソリューションは、スニペット_&に基づいています。このスニペットは、配列とそれ自体の設定された共通部分を取得することにより、配列を重複排除します。これを2回行います。最初は完全な入力で(正確に複製されたキー/値のペアを取り除くため)、次にキーだけで(最初の重複排除後にまだ複製キーが残っているかどうかを確認します)。

コメント付きの完全なコードを次に示します。

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

ご存知のようにe#、CJamには専用の行コメント構文があります。
エソランジングフルーツ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.