В поисках родственной души


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
Можете ли вы уточнить, что вы подразумеваете под последовательным ?
flawr

33
Увидел это на вершине HNQ и подумал, что мы добрались до финального межличностного вопроса
gntskn

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
@ Джузеппе Ах, ТИЛ. Спасибо!
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для truey и некоторого числа меньше -1или 0для falsey (например [1,6,3,4,4,7,9,9,9], вернется -3, а [1,6,3,4,7,9]вернется 0).
Джонатан Аллан

@JonathanAllan О да. Я думаю, что примеры, которые я проверял на всех, вернулись -2.
Caird Coneheringaahing


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 Coneheringaahing

1
@cairdcoinheringaahing Pushy никогда не умрет. Это вернется только сильнее.
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 Хороший, отредактированный.
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как правдивое, любое другое неотрицательное целое число как ложное. В 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}
Конор О'Брайен


3

Excel, 42 байта

Версия на датском языке

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

Принимает каждое целое число из списка в отдельной ячейке в столбце A.
Если бы нам разрешали несовместимые значения Falsey , мы могли бы сохранить 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)

Попробуйте онлайн!

Читает из стандартного ввода, пишет в стандартный вывод.

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) с -uфлагом nique извлекает только уникальные компоненты ввода. Например, для ввода @(1,3,3,2)это приведет к @(1,2,3).

Таким образом, нам просто нужно убедиться, что .countэтот объект (т. Е. Сколько у него элементов) имеет -eqзначение .countнашего входного массива.-1 (то есть, у нас есть ровно один дубликат записи).

Сохранено 3 байта благодаря Sinusoid.
Исправлена ​​ошибка благодаря TessellatingHeckler.


Можете ли вы использовать уникальный псевдоним get 'gu' вместо group для достижения того же результата?
Синусоида

@ Синусоида Да, мы можем. Благодарность!
AdmBorkBork

Это не работает на втором тестовом примере 1,2,1- get-uniqueработает только на предварительно отсортированном вводе. Как насчет того, ($args|sort -u).count-eq$args.count-1что также 37, но работает для всех тестовых случаев, если вы называете это как 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

объяснение

Код генерирует двумерную таблицу логических значений, которая затем собирается с использованием функции sum, считая количество пар одинаковых элементов в декартовом квадрате A. Затем это сравнивается с длиной строки плюс два, и количества равны только тогда, когда есть ровно один повторяющийся символ.

Этот код переопределяет оператор 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
Если для случаев фальши вполне допустимо возвращать какое-либо значение false, вы можете пропустить Θ, как 1единственное истинное значение в 05AB1E.
Emigna

@ Emigna Спасибо! Я не был уверен, было ли это одобрено ФП, но я предполагаю, что это так.
Arnauld

Боюсь, вам нужно вернуться к предыдущему решению, так как ¢не сработает. Это будет считаться [19,4,4,9]ложным и [19,9]истинным, так как он находит 0в 10.
Emigna

@Emigna Спасибо, что заметили это. Я думаю, что это исправлено.
Арно

{¥_Oдолжно быть в порядке.
Emigna



1

Japt, 7 байт

â ʶUÊÉ

Попытайся


объяснение

Удалите дубликаты ( â), получите length ( Ê) и сравните равенство ( ) с длиной ( Ê) ввода ( 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 - единственное истинное значение, поэтому для истинного результата должен быть ровно 1 повторяющийся элемент, удаленный uniquify.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.