Це функція?


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 Це не повинно бути сюжетним.
xnor

Чи можуть вхід бути двома списками однакової довжини, один для клавіш, другий для значень?
Захоплення Кальвіна

2
Чи гаразд, щоб (key,value)пари були обернені, як у (value,key)? Я можу поголити кілька байт своєї відповіді, якщо так.
ymbirtt

1
@ymbirtt Так, ви можете мати пари в будь-якому порядку.
xnor

Відповіді:


37

Python 2 , 34 байти

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

Спробуйте в Інтернеті!

Створює словник та набір із вхідних даних та порівнює їх довжину.
Словники не можуть мати дублюваних ключів, тому всі незаконні (і повторні) значення видаляються.


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

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

Брахілог , 5 4 байти

dhᵐ≠

Спробуйте в Інтернеті!

Повна програма. Наскільки я можу сказати, причиною того, що це побиття більшості інших мов для гри в гольф, є те, що це вбудований в Брахілог, тоді як для більшості інших мов для гольфу потрібно його синтезувати.

Пояснення

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для нефункцій. Я міг би зберегти два байти, використовуючи рядки каналів замість коми у форматі введення, але це зіпсовано.


Я вважаю, що це кваліфікується як "серйозне пробудження", принаймні з технічної точки зору.
FryAmTheEggman

8

Брахілог , 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 - headабо t - tailтут) до кожного елемента вводу (тут, Ċ). =і переконайтесь, що їх вхід містить усі рівні / всі різні елементи.
Фаталізувати

7

MATL , 8 байт

1Z?gs2<A

Вхідними даними є: масив з values, а потім масив з keys.

Вихід призначений 1для функцій, 0інакше.

Спробуйте в Інтернеті! . Або перевірити всі тестові випадки .

Пояснення

1Z?

Побудовує розріджену матрицю. Спочатку всі записи містять 0; і 1додаються до кожного запису (i, j)де jі iє вхідними key, valueпаром.

g

Матриця перетворюється на логічну; тобто записи, що перевищують 1(відповідають дублікатам key, valueпарам), встановлюються 1.

s

Обчислюється сума кожного стовпця. Це кількість різних values для кожного key.

2<A

Функція матиме всі такі суми менше, ніж 2.


6

R, 33 байти

Це моя версія для Р. Це використовує aveфункцію. Я дозволив ввести порожній введення, встановивши за замовчуванням параметри ключа та значення. aveвиробляє середнє значення для кожної з клавіш. На щастя, це повертає засоби в тому ж порядку, що і вхідні значення, тому порівняння з вхідним сигналом вказуватиме, чи є різні значення. Повертає, TRUEякщо це функція.

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

Спробуйте в Інтернеті!


6

05AB1E , 11 9 7 байт

Збережено 2 байти завдяки kalsowerus .

Ùø¬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 байти, замінивши `\)^на head ( ¬): TIO
kalsowerus

@kalsowerus: На жаль, це порушує особливий випадок []:(
Емінья

@Enigma О, це спрацювало, тому що під час тестування я все-таки мав залишок ,в кінці. Додайте це, а потім це якось працює[] .
kalsowerus

Оновлено TIO
kalsowerus

5

JavaScript (ES6), 45 38 байт

Збережено 6 байт завдяки @Neil

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, що falsy.
  • Якщо старе значення відрізняється від нового, то m[k]-vвиходить ненульове ціле число, яке є правдою.

Тому ми просто повинні переконатися, що m[k]-(m[k]=v)це ніколи не є правдою.


1
Занадто довго. Використовуйте a=>!a.some(([x,y])=>m[x]-(m[x]=y),m=[]).
Ніл

@Neil Данг це, я знав, що повинен бути якийсь спосіб використовувати m[k]не визначений ... Дякую!
ETHproductions

5

Математика, 24 байти

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

Пояснення: Unionвидаляє повторювані пари, потім#&@@@ отримує перший елемент від кожної пари (як, First/@але з меншою кількістю байтів). Якщо в цих перших елементах є якесь повторення, пари не роблять функції, яку ми перевіряємо UnsameQ.

(Це може мати найвищу щільність @символів у будь-якій програмі, про яку я писав…)


2
@щільність = 1/4
калькулятор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 Так, ха-ха: 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) є всім truthy ( )


4

R , 95 66 байт

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

Збережено 29 байт завдяки Ярко Дуббелдам.

Анонімна функція. Виходи, FALSEякщо функція, а TRUEякщо ні (вибачте). В якості аргументів приймає список ключів і список значень, як це.

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

Прокручує всі клавіші і схоплює довжину набору унікальних значень для цього ключа. Якщоany з них> 1, поверніться TRUE.

Це побито відповіддю Мікі , а також Джузеппе . підтримати одне з них.


Чому ви створюєте фрейм даних, щоб потім посилатися на вектори, які ви щойно ввели у цей фрейм? 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 байт

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

Я міг би зберегти 2 байти з новою версією, замінивши :uniqна~:|



3

Математика, 35 байт

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

Чистий функція приймає список упорядкованих пар в якості вхідних даних і повернення Trueабо False. Експлуатує той факт, що Union@#видаляє повторні впорядковані пари, але <|Rule@@@#|>(асоціація) видаляє всі, крім однієї впорядкованої пари, з певним першим елементом. Таким чином, ми можемо просто порівняти Lengths з двох виходів, щоб перевірити, чи є список входів функцією.


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 байт

Збережено 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правдиві


Ой, ти стаєш справді хорошим.
Адам


3

мозковий ебать , 71 байт

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

Спробуйте в Інтернеті!

Введення приймається як плоский рядок: наприклад, перший тестовий випадок був би 35356444 . Щоб представлення відображалось в оригінальному запитанні, просто додайте до програми шість коми в потрібних точках.

Вихід призначений 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); потім він порівнює довжину списку з довжиною словника, створеного зі списку (якщо одне і те ж значення трапляється більше одного разу, конструктор словника використовує лише останнє, в результаті чого словник коротший за список)


2

MATL , 12 байт

iFFvXu1Z)SdA

Вхід - матриця з двома стовпцями, де перший стовпець є ключовим, а другий - значенням.

Спробуйте в Інтернеті!

Пояснення

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?


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.