Bu bir fonksiyon mu?


47

Bir (key, value)çift listesi göz önüne alındığında , bunun bir işlevi temsil edip etmediğini belirleyin, yani her bir tuşun tutarlı bir değere eşlendiğini gösterir. Başka bir deyişle, her iki giriş de eşit tuşa sahipse, eşit değerlere de sahip olmalıdır. Tekrarlanan girişler tamam.

Örneğin:

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

Giriş:(key, value) 1 - 9 arasındaki rakamları kullanarak sipariş edilen bir çiftler sırası. Belirli bir sipariş gerektirmeyebilir. Alternatif olarak, anahtar listesini ve değer listesini ayrı girişler olarak alabilirsiniz.

Çıktı: İşlevler için tutarlı bir değer ve işlevsizler için farklı bir tutarlı değer.

Test durumları: İlk 5 giriş fonksiyon, son 5 fonksiyon değil.

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

Burada iki girdi listesi var:

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

Liderler Sıralaması:


sıfat işlevi?
Poke

@Poke Bu sıfat olmak zorunda değildir.
xnor

Girdi, biri anahtarlar için diğeri değerler için iki eşit uzunluktaki liste olabilir mi?
Calvin'in Hobileri

2
(key,value)Çiftlerin olduğu gibi tersine çevrilmesi tamam mı (value,key)? Cevabımdan birkaç byte'ı tıraş edebilirim.
ymbirtt

1
@ymbirtt Evet, çiftlerin ikisini birden sırayla alabilirsiniz.
xnor

Yanıtlar:


37

Python 2,34 bayt

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

Çevrimiçi deneyin!

Girişten bir Sözlük ve Küme oluşturur ve uzunluklarını karşılaştırır.
Sözlükler çoğaltılmış anahtarlara sahip olamadığından, tüm geçersiz (ve tekrarlanan) değerler kaldırılır.


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

21

Haskell, 36 bayt

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

Çevrimiçi deneyin!

Dış (-> (k,v)) ve iç (-> (m,n)) çiftler üzerinde döngü ve ne zaman k==mgerçek değerini topla v==n. Hepsinin doğru olup olmadığını kontrol edin.


Çok hızlısın! : /
kusur

18

Brachylog , 5 4 bayt

dhᵐ≠

Çevrimiçi deneyin!

Tam program Söyleyebileceğim kadarıyla, bunun diğer golf dillerinin çoğunu atmasının sebebi, Brachylog'da yerleşik bir oyundur, oysa diğer golf dillerinin çoğunun sentezlemesi gerekir.

açıklama

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

Tam bir program olarak, trueiddianın başarılı veya falsebaşarısız olduğunu anlarız .


15

Pyth , 5 bayt

Bununla çok mutluyum.

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

Çevrimiçi deneyin!


9

Retina , 25 bayt

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

Çevrimiçi deneyin!

Giriş formatı {k,v},{k,v},.... 0İşlevler ve işlevler 1için yazdırır . Girdi biçimindeki virgüllerin yerine satır besleyicileri kullanarak iki bayt tasarruf edebilirim, ancak bu karışık.


En azından teknik açıdan "ciddiyetsiz" olarak nitelendirildiğini düşünüyorum.
FryAmTheEggman

8

Brachylog , 13 bayt

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

Çevrimiçi deneyin!

açıklama

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

Nasıl Ċhᵐ=ve nasıl Ċtᵐ≠çalıştığını açıklayabilir misin ?
Hesap MakinesiFeline

@CalculatorFeline Büyük harfler değişken isimlerdir. Her zaman iki öğenin bir listesi olmak üzere önceden kısıtlanmış olan CoupleĊ adlı özel bir değişkendir . Bu, hemen önceki yüklemi ( veya burada) girişin her bir öğesine (burada) uygulayan bir metapendittir . ve basit girdilerinin tüm eşit / tüm farklı öğeleri içerdiğini kontrol edin. h - headt - tailĊ=
17'de ölüm

7

MATL , 8 bayt

1Z?gs2<A

Girişler: values ile bir dizi, sonra keys ile bir dizi .

Çıktı, başka bir şekilde 1işlev 0içindir.

Çevrimiçi deneyin! . Veya tüm test durumlarını doğrulayın .

açıklama

1Z?

Seyrek bir matris oluşturur. Başlangıçta tüm girişler 0; ve 1her bir giriş eklenir (i, j)burada jve igirilir key, valueçiftleri.

g

Matris mantıksal olarak dönüştürülür; yani, aşan girişler 1(kopyalara karşılık gelir key, valueçiftler) 1.

s

Her sütunun toplamı hesaplanır. Bu, valueher biri için farklı s sayısıdır key.

2<A

Bir fonksiyon, bu toplamların hepsinden daha azına sahip olacaktır 2.


6

R, 33 bayt

Bu benim R sürümüm. Bu aveişlevden yararlanıyor . Anahtar ve değer parametrelerinde varsayılan ayarları ayarlayarak boş girişe izin verdim. aveher bir tuş için değerlerin bir ortalamasını üretiyor. Neyse ki bu, araçları girdi değerleriyle aynı sırada döndürür, bu nedenle girdiyle yapılan bir karşılaştırma, farklı değerler olup olmadığını gösterir. TRUEBir işlev olup olmadığını döndürür .

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

Çevrimiçi deneyin!


6

05AB1E , 11 9 7 bayt

Kalsowerus sayesinde 2 bayt kurtarıldı .

Ùø¬DÙQ,

Çevrimiçi deneyin!

açıklama

Ù           # 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: Yep. Özel durumun programın sadece üçte birine
ulaştığı

Sanırım `\)^head ( ¬) ile değiştirerek 3 bayt tasarruf edebileceğinizi düşünüyorum : TIO
kalsowerus

@kalsowerus: Maalesef ki şu özel durum için şu durum ortaya çıkıyor []:(
Emigna

@Enigma Oh işe yaradı çünkü test ,ederken sonunda artık bir artık kaldı. Bunu ekle ve sonra bir şekilde ile çalışır [].
kalsowerus

Güncelleme TIO
kalsowerus 12:17

5

JavaScript (ES6), 45 38 bayt

@Neil sayesinde 6 bayt kaydedildi

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

İade false veya truesırasıyla fonksiyonları ve non-fonksiyonlar için.

Bu, her bir işlevin eski değerini sürekli olarak çıkartarak çalışır (m[k] ) ve ( m[k]=v, aynı zamanda yeni değeri depolayan ) . Her seferinde üç durum vardır:

  • Eski bir değer yoksa m[k]geri döner undefined. Şeyden çıkarmaundefinedNaNSahte olan sonuçlardan bir çıkarmak.
  • Eski değer yenisiyle aynıysa, m[k]-v sonuçları 0falsy olduğunu.
  • Eski değer yeniden farklıysa, m[k]-v yenisinden sıfır olmayan bir tamsayı ile sonuçlanır, ki bu truthy'dir.

Bu nedenle, bunun m[k]-(m[k]=v)asla kaba olmadığından emin olmalıyız.


1
Çok uzun. Kullanın a=>!a.some(([x,y])=>m[x]-(m[x]=y),m=[]).
Neil,

Dang @Neil o, ben orada olduğunu biliyordu bazı yararlanmak için bir yol m[k]olmaktan tanımsız ... teşekkürler!
ETHproductions

5

Mathematica, 24 bayt

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

Açıklama: Unionçoğaltılmış çiftleri siler, sonra #&@@@her bir çiftten ilk elemanı alır ( First/@ancak daha az byte ile). Bu ilk elementlerde herhangi bir tekrar varsa, çiftler kontrol ettiğimiz bir fonksiyon yapmazlar UnsameQ.

(Bu @yazdığım herhangi bir programda en yüksek karakter yoğunluğuna sahip olabilir …)


2
@yoğunluk =
Hesap MakinesiFeline


4

Bash + coreutils, 17

sort -u|uniq -dw1

Giriş STDIN ile verilir. keyve valueedilmektedir Tabayrıldı ve her bir çift yeni satır ayrılmış olan.

sortyinelenen anahtar / değer çiftlerini kaldırır. uniq -dsadece kopyaları çıkarır ve bu nedenle bir işlev durumunda boş dizeyi ve boş olmayan bir dizeyi çıkarır - farklı değerlerle eşlenen çift anahtarlar olduğunda.

Çevrimiçi deneyin .


4

05AB1E , 9 bayt

Kod:

ãü-ʒ¬_}}Ë

Açıklama:

ã            # 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 kodlamasını kullanır . Çevrimiçi deneyin!


Hemen gösterişe başlıyorum ʒ:)
Emigna

Haha Evet @Emigna: p, ama ben zaten beni kullanmaya neden olan bir hata buldum }}yerine }.
Adnan

4

Jöle , 6 bayt

QḢ€µQ⁼

Çevrimiçi deneyin!

açıklama

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.

İşte 6 bayt alternatif bir yöntem:

QḢ€ṢIẠ

Çevrimiçi deneyin!

Yinelenen anahtarların kaldırılmasıyla test etmek yerine, bu tür ( ), terimler ( I) arasındaki farkın tamamen gerçek olup olmadığını denetler ( )


4

R , 95 66 bayt

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

Jarko Dubbeldam sayesinde 29 bayt kaydedildi.

Anonim işlev FALSEBir işlev ve TRUEeğer değilse (üzgünüm) çıktılar . Argüman olarak bir anahtar listesini ve bunun gibi bir değer listesini alır.

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

Tüm tuşlar arasında dolaşır ve bu tuş için benzersiz değer kümesinin uzunluğunu alır. Eğer anybunlardan, 1> dönüş vardır TRUE.

Bu MickyT 'in cevabı ve ayrıca Giuseppe ' nin dediği gibi . bunlardan birini oyla.


Neden sadece bir veri çerçevesi oluşturuyorsunuz, o zaman sadece o veri çerçevesine koyduğunuz vektörlere referans vermek için? function(k=0,v=0)any(sapply(k,function(x){length(unique(v[k==x]))-1}))aynı şeyi yapmalı.
JAY

Çünkü hala öğreniyorum! Diğer R cevaplarından en az biri, tanımladığınız şekilde aşağı yukarı yapar.
BLT

üzgünüm biraz sert çıktıysam :) gönderiminiz diğer R cevaplarından biraz farklı, ve gereksiz data.frame dosyasını kesecekseniz, daha iyi bir karşılaştırma yapabilirsiniz.
JAD

4

J uby , 48 33 25 21 bayt

Jordan sayesinde -3 bayt!

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

açıklama

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

İlk Yaklaşım, 33 bayt

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

Bu, eşdeğeri Ruby çözümünden daha uzun, ancak yapımı eğlenceli oldu.

Ruby'ye dönüştürerek açıklama girişimi:

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

Ben değiştirerek daha yeni bir sürümü ile 2 bayt kurtarabilecek :uniqile~:|



3

Mathematica, 35 bayt

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

Girdi ve dönen olarak sıralı çiftlerin bir listesini alarak saf işlevi Trueveya False. Union@#Tekrarlanan sıralı çiftleri silmesinin gerçeğini açıklar , ancak <|Rule@@@#|>(bir ilişkilendirme) belirli bir ilk eleman ile bir sıralı çifti siler. Böylece Lengthgiriş listesinin bir fonksiyon olup olmadığını kontrol etmek için iki çıkışın s'lerini karşılaştırabiliriz .


3

Jöle , 6 bayt

nþ`ḄCȦ

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

Martin Ender sayesinde 2 bayt kaydedildi

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

çıktılar 0Fonksiyonlar ve fonksiyonlar 1için .

Çevrimiçi deneyin!

açıklama

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 bayt

(∪≡⊢)⊃¨∘∪

Çevrimiçi deneyin!

açıklama

             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 ve 1true için yazdırır


Whoa, gerçekten iyiye gidiyorsun.
Adám


3

brainfuck , 71 bayt

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

Çevrimiçi deneyin!

Giriş düz bir dize olarak alınır: örneğin, ilk test durumu olur 35356444. Orijinal soruda gösterilen gösterimi elde etmek için, programa doğru noktalara toplam altı virgül ekleyin.

Çıkış, Ufonksiyonlar ve Vfonksiyonlar için değil.

açıklama

Herhangi bir ASCII kod noktası n için, f (n), 2n + 1 hücresinde depolanır. Hücreler 2n ve 2n + 2 çalışma alanıdır ve 0, 2, 4, 6, ... 2n-2, hücre 0'a geri dönmek için bir ekmek kırıntıları izidir. 0) 1 olarak ayarlanmıştır (çeşitli yan etkiler arasında).

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

ql.d{Ql{

Dene

İlk önce tekrarlanan çiftleri kaldırarak çalışır ({Q); sonra listenin uzunluğunu listeden oluşturulan bir sözlüğün uzunluğuyla karşılaştırır (aynı x değeri bir kereden fazla olursa, sözlük yapıcısı yalnızca sonuncuyu kullanır, bu da sözlüğün listeden daha kısa olmasına neden olur)


2

MATL , 12 bayt

iFFvXu1Z)SdA

Giriş, ilk sütunun anahtar, ikincisinin değer olduğu 2 sütunlu matristir.

Çevrimiçi deneyin!

açıklama

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 bayt

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

İşlevler ve işlevler niçin hiçbir şey yazdırmaz .


1

CJam , 14 11 9 bayt

_&0f=__&=

Çevrimiçi deneyin!

Girdiyi yığında bir anahtar / değer çifti dizisi olarak alır, giriş bir işlevse döner 1ve0 .

Bu çözüm snippet'e dayanıyor _& kümenin kesişimini kendisiyle alarak bir diziyi kopyalayan . Bunu iki kez yaptım, önce tam girişte (tamamen kopyalanmış anahtar / değer çiftlerinden kurtulmak için) ve sonra sadece tuşlarda (ilk kopyadan çıkardıktan sonra hala kalan herhangi bir kopya anahtar olup olmadığını görmek için).

İşte yorumların tam kodu:

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

Sadece bildiğiniz gibi, e#CJam'daki özel çizgi yorum sözdizimidir.
Esolanging Fruit

1

Ruby, 39 30 29 Bayt

9 byte tasarruf için @ValueInk teşekkürler !

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

@ Rod'un Python Limanı 2 cevabı .


Hash[x]sadece tbh kadar çalışıyor
Value Ink

@ DeğerInk teşekkürler. Neden böyle düşünmedim bilmiyorum.
Cyoce
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.