У пошуках душі


40

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

Приклади

truthy:
[1,1]
[1,2,1]
[1,6,3,4,4,7,9]

falsey:
[0]
[1,1,1]
[1,1,1,2]
[1,1,2,2]
[2,1,2,1,2]
[1,2,3,4,5]

Я думаю, ми не можемо припустити, що цілі числа завжди будуть меншими за 10?
Мартін Ендер

1
Так, за винятком випадків, коли ваша мова не підтримує великих цілих чисел.
flawr

1
Чи можете ви зрозуміти, що ви маєте на увазі під послідовністю ?
недолік

33
Побачила це на вершині HNQ, і подумала, що ми дійшли до останнього питання про міжособистісні
стосунки

3
@Walfrat Опублікуйте це як власний виклик. Також такі відгуки зазвичай оцінені в пісочниці.
flawr

Відповіді:


22

Python 3, 30 28 байт

lambda m:len({*m})+1==len(m)

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

{*m}кидає список setоб’єкту, не упорядкований список елементів без дублікатів. Це завжди зменшить довжину списку на кількість дублікатів у ньому. Обчисливши, наскільки змінилася довжина, ми можемо легко визначити, чи був у списку один дублікат і повернути результат тесту.

-2 байти завдяки ов.


Саме рішення у мене було, але забув про {*m}ярлик замість set, добре гольф!
FlipTack

27 байт для заперечення . (Фальсі, коли має бути Труті тощо)
mbomb007

3
Ось ще один дивний спосіб зробити це (теж заперечення):lambda m:~-len(m[len({*m}):])
mbomb007


7

MATL , 7 , 6 байт

&=sp4=

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

Один байт збережено завдяки @Guiseppe!

Пояснення:

&=  % Table of pair-wise equality comparisons
    %
    % [1 0 0 0 0 0 0
    %  0 1 0 0 0 0 0
    %  0 0 1 0 0 0 0
    %  0 0 0 1 1 0 0
    %  0 0 0 1 1 0 0
    %  0 0 0 0 0 1 0
    %  0 0 0 0 0 0 1]
    %
s   % Sum each Column. Stack:
    %
    % [1 1 1 2 2 1 1]
    %
p   % Product of the array. Stack:
    %
    % [4]
    %
4=  % Compare the stack to '4'

1
Оскільки sє sumі sumпідсумовує перший розмір (не стовпці), а матриця симетрична, чи не може це бути просто sзамість Xs?
Джузеппе

1
@Giuseppe Ах, TIL. Дякую!
DJMcMayhem


6

Желе , 8 5 байт

QL‘=L

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

Пояснення

QL‘=L  - Main link, argument L (a list)   e.g [1,6,3,4,4,7,9]
Q      - Deduplicated elements                [1,6,3,4,7,9]
 L     - Length                               6
  ‘    - Increment                            7
    L  - Length of the input                  7 ([1,6,3,4,4,7,9])
   =   - Are they equal?                      1

Якщо вихідні значення можуть бути будь-якими послідовними значеннями, тоді QL_Lпрацює, який виводить -1на триті та будь-яке інше непозитивне число для фальси (спасибі @JonathanAllan)


QL_Lбуде виводити -1для truthy та деякої кількості менше -1або 0для falsey (наприклад [1,6,3,4,4,7,9,9,9], повернеться -3, а [1,6,3,4,7,9]повернеться 0).
Джонатан Аллан

@JonathanAllan О так. Я здогадуюсь, що приклади, які я перевіряв, поверталися -2.
caird coinheringaahing


4

Пушистий , 8 байт

Проста реалізація перевірки, чи len(set(list)) == len(list)-1:

LtvuL^=#

Пояснення:

       \ Implicit: Put all input on stack
Ltv    \ Get the stack length - 1, save in auxiliary stack
u      \ Remove non-unique elements
L      \ Get the new length
^=     \ Compare with the previously saved length
#      \ Print result

Це працює, оскільки довжина зменшиться лише на 1, якщо в початковому списку було лише рівно 1 нерозрізне ціле число.

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


1
Нічого собі, не бачили наполегливої ​​відповіді віками! +1
caird coinheringaahing

1
@cairdcoinheringaahing Пуші ніколи не помре. Це лише повернеться сильніше.
FlipTack

4

Октава , 25 байт

Це не використання groupабо uniqueпідхід у більшості інших відповідей, а "декартовий продукт" усіх можливих порівнянь.

@(x)nnz(triu(x==x',1))==1

Пояснення

             x==x'        %create a matrix where the entry at (i,j) compares whether x(i) == x(ju)
        triu(x==x',1)     %only consider the strict upper triangular matrix
    nnz(triu(x==x',1))    %count the number of nonzero entries
@(x)nnz(triu(x==x',1))==1 %check whether this number is actually 1

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

А тому, що жодна програма не буде повною без згортки (дякую @LuisMendo за виправлення помилки):

Октава , 40 байт

@(x)nnz(~conv(sort(x),-1:2:1,'same'))==1

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


Ви надихнули мене на такий підхід :)
Стюі Гріффін

2
@StewieGriffin Я думаю, що відповідь MATL використовувала ваш точний підхід :)
flawr

4

J , 7 6 байт

=&#0,=

=перевірити кожен елемент на рівність з кожним унікальним елементом, створює матрицю з m рядків для  m  унікальних елементів.
0,додайте порожній рядок зверху.
=&#чи відповідає кількість рядків довжині введення?

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


Я думаю, ви можете замінити .~на=
H.PWiz

@ H.PWiz Nice, відредаговано.
FrownyFrog

4

Сітківка , 15 12 11 байт

Завдяки Нілу за збереження 1 байта.

D`
Mm2`^$
1

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

Введення розділено лінійкою подачі. (Тестовий набір для зручності використовує розділення комами.)

Пояснення

D`

Знову дублюйте рядки на вході, що видаляє будь-яке ціле число, що з’явилося раніше (але залишає навколишні (і) рядки).

Mm2`^$

Порахуйте кількість порожніх рядків, що дорівнює кількості дублікатів, які ми видалили, але врахуйте лише перші два збіги. Таким чином, вихід буде лише 0(без дублікатів), 1(один дублікат), 2(два або більше дублікатів).

1

Переконайтесь, що точно видалено один дублікат.


Збережіть байт, обмеживши збіг нового рядка до 2, щоб вхід у третій рядок завжди був 0, 1 або 2, спрощуючи тест. (Дратівливо не можна використовувати A`.підрахунок нових рядків, оскільки вона випадає з останньої.)
Ніл

@Neil Спасибі, межа є акуратною ідеєю. Я також спробував використовувати A`., але проблема полягає в тому, що ви не можете відрізнити один порожній рядок від відсутності рядків взагалі. Можливо, я повинен розглянути питання про припинення Aі Gвихід з виведенням рядків, якщо є якісь рядки. Хоча це, мабуть, має бути варіантом, оскільки я можу уявити, що ця стрічка дратує в інших сценаріях.
Мартін Ендер

Зіставити один порожній рядок легко - це просто ^$¶.
Ніл

@Neil Ні, я маю на увазі, що результат виходу Aідентичний незалежно від того, зберігає він єдиний порожній рядок або відкидає всі рядки.
Мартін Ендер

Вибачте, саме це я мав на увазі під «випаданням останнього» - він повертає ще менше порожнього рядка, але тоді ви не можете розрізняти 0 і 1.
Ніл

3

05AB1E , 4 байти

{¥_O

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

Виводиться 1як truthy, будь-яке інше негативне ціле число, як хибне. У 05AB1E 1- це єдине неправдоподібне число (спасибі @Emigna за розуміння!).

Пояснення

{       Implicit input. Sort
 ¥      Consecutive differences
  _     Boolean negate
   O    Sum. Implicit display

3

Рубін, 32 байти

->(s){s.uniq.length==s.length-1}

Ласкаво просимо до PPCG! Оскільки це код гольфу, вам потрібно включити кількість байтів у вашу програму. Цього разу я взяв на себе сміливість зробити це для вас.
Павло

Як щодо Array#size?
Тревіс

Ви можете опуститися до 26 байт, скориставшись->s{s.uniq.size==s.size-1}
Conor O'Brien


3

Excel, 42 байти

Версія датської мови

=TÆLV(A:A)=SUM(--(FREKVENS(A:A,A:A)>0))+1

Передбачає кожне ціле число зі списку в окремій комірці стовпця A.
Якби нам було дозволено невідповідні значення фальси , ми могли б зберегти 3 байти:

=TÆLV(A:A)+SUM(-(FREKVENS(A:A,A:A)>0))

Англійська мова версія (44 байти)

=COUNTA(A:A)=SUM(--(FREQUENCY(A:A,A:A)>0))+1

3

R , 32 31 байт

-1 байт завдяки @JarkoDubbeldam

cat(sum(duplicated(scan()))==1)

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

Читає зі stdin, пише в stdout.

duplicatedітерацію за списком, що замінюють значення lз , TRUEякщо це значення зустрічається раніше в списку, і в FALSEіншому випадку. Якщо є унікальна пара однодумців, має бути рівно одне TRUEзначення, тому сума повинна бути 1.



1
@JarkoDubbeldam ах, звичайно. Раді побачитись ще раз! Пройшло багато часу.
Джузеппе

Був зайнятий якимись іншими матеріалами, не впевнений, що ще повністю повернувся.
JAD

@Giuseppe, я просто прочитав це запитання і одразу подумав про твій оригінальний підхід .... Дуже приємно! Я б ніколи не думав про scan()підхід.
Джозеф Вуд

3

PowerShell , 40 37 байт

($args|sort -u).count-eq$args.count-1

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

Sort-ObjectКоманди (псевдонім sort) з -uNique прапором витягують тільки унікальні компоненти вхідного сигналу. Наприклад, для введення @(1,3,3,2)це призведе до @(1,2,3).

Таким чином, нам просто потрібно переконатися, що .countцей об'єкт (тобто, скільки елементів у нього є) не -eqвідповідає .countнашому вхідному масиву -1(тобто у нас є точно один дублікат).

Збережено 3 байти завдяки Sinusoid.
Виправлена ​​помилка завдяки TessellatingHeckler.


Чи можете ви використовувати унікальний псевдонім 'gu' замість групи для досягнення того ж результату?
Синусоїд

@Sinusoid Так, ми можемо. Дякую!
AdmBorkBork

У другому тестовому випадку це не працює 1,2,1- get-uniqueпрацює лише за попередньо відсортованим входом. Як щодо ($args|sort -u).count-eq$args.count-137, але чи працює він для всіх тестових випадків, якщо ви називаєте це як f 1 2 1замість f 1,2,1?
TessellatingHeckler

@TessellatingHeckler Ах, хороший улов. Все тестування, яке я робив, було заздалегідь відсортовано. Дякую!
AdmBorkBork



2

Octave / MATLAB (із пакетом статистики / інструментарієм), 21 байт

@(x)nnz(~pdist(x))==1

Анонімна функція. Вхід - вектор стовпця. Вихідні дані true(відображаються як 1) або false(відображаються як 0).

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

Пояснення

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

У нашому випадку xвектор стовпців, тому евклідова відстань між двома рядами - це просто абсолютна різниця між двома числами.

~є логічним (булевим) запереченням, nnzчислом ненулів і ==1порівнюється з 1. Таким чином, результат є trueтоді і тільки тоді, коли є лише одна пара, яка дає нульову відстань.



2

Джулія, 39 26 байт

!a=sum(a.==a')==endof(a)+2

Пояснення

Код формує двовимірну таблицю булевих, яка потім збирається за допомогою функції сума, підраховуючи кількість пар одноелементів на декартовому квадраті А. Тоді це порівнюється з довжиною рядка плюс два, і величини рівні лише тоді, коли рівно один символ повторення.

Цей код переосмислює оператор NOT.


!a=sum(a.==a')==endof(a)+2економить кілька байт. Спробуйте в Інтернеті!
Денніс


2

Октава , 23 26 байт

@(x)prod(sum(x==x'))==4

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

x==x'Частина була натхненна відповідь flawr в . Це довше, ніж відповідь Луїса, але він не використовує жодних наборів інструментів.

Пояснення:

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

Сума вздовж будь-якого стовпця показує, скільки є дублікатів цієї кількості. Ми хочемо, щоб два з чисел мали дублікат, тому у нас два значення рівні двом, а решта неоднакові двом.

Якщо ми візьмемо добуток цієї матриці, ми отримаємо, 4якщо є лише два рівні елементи ( 2*2*1*1*1*1*...), і щось інше, ніж 4якщо немає дублікатів, або більше двох.


2

PHP, 46 байт

<?=count(array_unique($argv))==count($argv)-1;

Підраховує кількість записів $argvі порівнює його з кількістю унікальних записів. Якщо перший вищий за останній на 1, то триут, інший фальси.

Спробуйте це на eval.in!


Чи потрібно використовувати ім’я змінної $ argv, чи не можете ви просто використати $ a?
dading84

3
@ dading84 $argv- це список параметрів командного рядка. Отже: ні, він не може просто використовувати $a.
Тит

2

05AB1E , 6 5 байт

{¥>ΘO

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

{¥>ΘO   # example input:               [1, 6, 3, 4, 4, 7, 9]
{       # sort                      -> [1, 3, 4, 4, 6, 7, 9]
 ¥      # get deltas                -> [  2, 1, 0, 2, 1, 2 ]
  >     # increment                 -> [  3, 2, 1, 3, 2, 3 ]
   Θ    # truthify (only 1 gives 1) -> [  0, 0, 1, 0, 0, 0 ]
    O   # sum                       -> 1

1будучи єдиною ціною, що є правдою в 05AB1E, ми можемо зупинитися тут. (Дякую @Emigna за те, що вказав на це.)

Щоб отримати лише два різних значення, ми можемо додатково додати:

     Θ  # equals 1?                 -> 1

1
Якщо нормально повернути будь-яке значення фальси для випадків фальси, ви можете пропустити значення Θ, як 1це єдине триєтне значення в 05AB1E.
Емінья

@Emigna Дякую! Я не був впевнений, чи це схвалено ОП, але, мабуть, так і є.
Арнольд

Боюся, вам потрібно повернутися до попереднього рішення, оскільки ¢це не вийде. Це вважатиметься [19,4,4,9]помилковим та [19,9]істинним, оскільки він знаходить 0в 10.
Емінья

@Emigna Дякую, що помітили це. Я думаю, що це виправлено.
Арнольд

{¥_Oтакож має бути гаразд.
Емінья



1

Japt, 7 байт

â ʶUÊÉ

Спробуй це


Пояснення

Видаліть дублікати ( â), отримайте довжину ( Ê) і порівняйте рівність ( ) з довжиною ( Ê) введення ( U) мінус 1 ( É).


Хіба це не 12 байт? Чи не âÊɶбагатобайтові символи?
RedClover


1

05AB1E , 5 байт

gIÙg-

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

g     # Get number of elements in input
 IÙg  # Get number of unique elements in input
    - # Subtract

У 05AB1E 1 - єдине значення truthy, тому для результату truthy повинен бути рівно 1 дублікат, видалений унікальним.

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