이것이 기능입니까?


47

(key, value)쌍 목록이 주어지면 함수가 함수를 나타내는 지 여부를 판별하십시오. 이는 각 키가 일관된 값에 맵핑됨을 의미합니다. 즉, 두 항목이 동일한 키를 가질 때마다 동일한 값을 가져야합니다. 반복 입력이 정상입니다.

예를 들면 다음과 같습니다.

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

다음은 두 가지 입력 목록입니다.

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

@Poke 그것은 의심 할 필요가 없습니다.
xnor

입력이 같은 길이의 두 목록, 하나는 키, 하나는 값을 가질 수 있습니까?
Calvin 's Hobbies

2
?에서와 같이 (key,value)쌍을 반대로 해도 괜찮 (value,key)습니까? 그렇다면 대답에서 몇 바이트를 줄일 수 있습니다.
ymbirtt

1
@ymbirtt 예, 쌍을 어느 순서로나 가질 수 있습니다.
xnor

답변:


37

파이썬 2 , 34 바이트

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

온라인으로 사용해보십시오!

입력에서 사전과 세트를 작성하고 길이를 비교하십시오.
사전은 중복 키를 가질 수 없으므로 모든 불법 (및 반복) 값이 제거됩니다.


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

21

하스켈, 36 바이트

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

온라인으로 사용해보십시오!

바깥 쪽 (-> (k,v))과 안쪽 (-> (m,n))은 쌍을 반복하며 언제든 k==m의 진실 값을 수집합니다 v==n. 모두 사실인지 확인하십시오.


당신은 너무 빠릅니다! : /
flawr

18

Brachylog , 5 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

@CalculatorFeline 대문자는 변수 이름입니다. 항상 두 요소의 목록으로 미리 제한되어있는 CoupleĊ 이라는 특수 변수 입니다. 는 바로 이전 술어 ( 또는 여기)를 입력의 각 요소 ( 여기서는)에 적용하는 메타 술어 입니다. 그리고 입력에 모두 같은 / 모든 다른 요소가 포함되어 있는지 확인하십시오. h - headt - tailĊ=
15:24에

7

MATL , 8 바이트

1Z?gs2<A

입력은 다음과 같습니다. values가 포함 된 배열 다음에 s가 포함 된 배열이 key있습니다.

그렇지 않으면 출력은 1기능 0입니다.

온라인으로 사용해보십시오! . 또는 모든 테스트 사례를 확인하십시오 .

설명

1Z?

희소 행렬을 만듭니다. 처음에는 모든 항목에 0; 그리고 1각 항목에 추가되는 (i, j)ji입력되어 key, value쌍.

g

매트릭스는 논리로 변환됩니다. 즉, 1(복제 key, value쌍에 해당)을 초과 하는 항목 은로 설정됩니다 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

05AB1E , 11 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 : 예. 나는이 특별한 사건이 프로그램의 3 분의 1 만 끝났다는 것에 여전히 기쁘다. : P
Emigna

`\)^head ( ¬) 로 바꾸면 3 바이트를 절약 할 수 있다고 생각합니다 . TIO
kalsowerus

@kalsowerus : 유감스럽게도 다음과 같은 특별한 경우에 해당합니다 []:(
Emigna

@ Enigma 오 테스트 할 때 여전히 남은 ,부분 이 있었기 때문에 작동했습니다 . 그것을 추가하면 어떻게 든 작동합니다 [].
kalsowerus

업데이트 된 TIO
kalsowerus

5

자바 스크립트 (ES6), 45 38 바이트

@Neil 덕분에 6 바이트 절약

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

함수와 함수가 아닌 함수를 각각 반환 false하거나 반환 true합니다.

이는 각 함수의 이전 값 ( m[k])과 m[k]=v새 값 (새 값을 저장하는 ) 을 지속적으로 빼서 작동합니다 . 매번 세 가지 경우가 있습니다.

  • 이전 값이 m[k]없으면를 반환합니다 undefined. 에서 undefined결과를 빼면 결과 NaN가 허위입니다.
  • 이전 값이 새 값과 동일하면 m[k]-v결과 0가 잘못됩니다.
  • 이전 값이 새 값과 다르면 m[k]-v0이 아닌 정수가됩니다.

그러므로 우리는 그것이 m[k]-(m[k]=v)결코 진실되지 않도록해야합니다 .


1
너무 오래 사용하십시오 a=>!a.some(([x,y])=>m[x]-(m[x]=y),m=[]).
Neil

@ Neil Dang, 나는 정의되지 않은 것을 활용할 수 있는 방법 이 있어야한다는 것을 알았습니다 m[k]... 감사합니다!
ETHproductions

5

Mathematica, 24 바이트

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

설명 : Union중복 된 쌍을 삭제 한 다음 #&@@@각 쌍에서 첫 번째 요소 를 가져옵니다 (예 : First/@적은 바이트). 이 첫 번째 요소에 반복이 있으면 쌍이 기능을 수행하지 않으므로 확인하십시오 UnsameQ.

(이것은 @내가 작성한 모든 프로그램에서 문자 밀도가 가장 높을 수 있습니다 ...)


2
@density = 1 / 4
계산기


4

배쉬 + 코어 유틸리티, 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 Yeah haha ​​: p, 그러나 나는 }}대신 대신 사용하게 만드는 버그를 발견했습니다 }.
Adnan

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

R , 95 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 의 답변 으로 구타되었습니다 . 그 중 하나를 찬성하십시오.


왜 데이터 프레임을 생성하고 방금 데이터 프레임에 넣은 벡터를 참조해야합니까? function(k=0,v=0)any(sapply(k,function(x){length(unique(v[k==x]))-1}))같은 것을 달성해야합니다.
JAD

나는 아직도 배우고 있기 때문에! 다른 R 답변 중 적어도 하나는 설명과 거의 비슷합니다.
BLT

조금 가혹한 경우 죄송합니다 :) 제출이 다른 R 답변과 약간 다르며 중복 data.frame을 잘라 내면 더 잘 비교할 수 있습니다.
JAD

4

J-uby , 48 33 25 21 바이트

Jordan 덕분에 -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로 변환하여 설명을 시도하십시오.

-[:[]&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 }                             

새로운 버전으로 2 바이트를 절약 할 수 :uniq있습니다.~:|



3

Mathematica, 35 바이트

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

입력 및 반환 등의 순서쌍의리스트 복용 순수 기능 True또는 False. Union@#반복 된 순서 쌍 을 삭제하지만 <|Rule@@@#|>(연관) 하나의 순서 쌍을 제외하고 특정 첫 번째 요소를 모두 삭제 한다는 사실을 악용합니다 . 따라서 Length두 출력 의 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

CJam , 19 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

0거짓과 1참으로 인쇄


우와, 정말 좋아지고있어
Adám


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 열 행렬이며, 첫 번째 열은 키이고 두 번째 열은 값입니다.

온라인으로 사용해보십시오!

설명

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

CJam , 14 11 9 바이트

_&0f=__&=

온라인으로 사용해보십시오!

입력을 스택에서 키 / 값 쌍의 배열로 가져오고 1입력이 함수인지 아닌지 여부를 반환 합니다 0.

이 솔루션은 스 니펫을 기반으로하며, 스 니펫 _&은 배열과 설정된 교차점을 가져 와서 배열을 중복 제거합니다. 먼저 전체 입력 (정확히 복제 된 키 / 값 쌍을 제거하기 위해)과 키 (첫 번째 중복 제거 후에 남아있는 중복 키가 있는지 확인)에서 두 번이 작업을 수행합니다.

주석이 포함 된 전체 코드는 다음과 같습니다.

_&           "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의 전용 회선 주석 구문이다.
Esolanging Fruit

1

루비, 39 30 29 바이트

9 바이트를 절약 한 @ValueInk 에게 감사 합니다!

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

@Rod의 Python 2 답변 포트 .


Hash[x]뿐만 아니라 작동 tbh
Value Ink

@ValueInk 감사합니다. 내가 왜 그런 생각을하지 않았는지 모르겠습니다.
Cyoce
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.