Целые списки Ноя

25

Введение:

Я думаю, что мы все слышали об этом, но здесь очень краткое резюме: Ной собрал два из всех видов животных на планете, мужского и женского пола, чтобы спасти в своем Ковчеге во время большого наводнения. Фактическая цитата из Библии:

Бытие 7: 2-3
Вы должны взять с собой семь всевозможных чистых животных, самцов и их помощников, два всевозможных нечистых животных, самцов и их помощников, а также семь всевозможных птиц в небе мужчина и женщина, чтобы сохранить их потомство на лице земли.
источник

Но ради этого испытания мы будем игнорировать чистую / нечистую часть и часть, где он взял семь каждого животного. Эта проблема только об этой части:

два из каждого вида нечистого животного, мужчина и его помощник

Вызов:

Входные данные:

Вам дан список целых положительных чисел (в случайном порядке).

Выход:

Два разных значения, указывающие, является ли это «Список Ноя» или нет. Это необязательно должно быть значением true / falsey , поэтому также может быть 0/ 1в Java / C # или 'A'/ 'B'на любом языке, чтобы привести некоторые примеры.

Когда список - это «Список Ноя»? Когда в списке ровно два каждого целого числа.

Правила соревнований:

  • Ввод / вывод является гибким. Входные данные могут быть списком / массивом / потоком целых чисел / чисел с плавающей запятой / строк или считывать один за другим из STDIN. Выходными данными могут быть любые два различных значения, возвращаемые функцией или выводимые в STDOUT / файл.
  • Целые числа во входном списке расположены в случайном порядке и гарантированно будут положительными в диапазоне 1N100000 .
  • Входной список гарантированно не является пустым.
  • Наличие целого числа, кратного двум разам, представленным выше 2 (то есть 4, 6, 8 и т. Д.), Будет ошибочным. Т.е. [6,4,4,6,4,7,4,7]это falsey, хотя еще можно было создать равные пары , как это: [[4,4],[4,4],[6,6],[7,7]].

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.

Тестовые случаи:

Truthy:
[7,13,9,2,10,2,4,10,7,13,4,9]
[1,2,3,1,2,3]
[10,100,1000,1,100,10,1000,1]
[123,123]
[8,22,57189,492,22,57188,8,492,57188,57189,1,1]

Falsey:
[6,4,4,6,4,7,4,7]
[2,2,2,2,2,2]
[5,1,4,5,1,1,4]
[77,31,5,31,80,77,5,8,8]
[1,2,3,2,1]
[44,4,4]
[500,30,1]
[1,2,1,1]
[2,4,6,4,4,4]
[2,23,34,4]
[2,23,3,3,34,4]
Кевин Круйссен
источник
12
И в Коране тоже; Сура Аль-Муменун, стих 27: Итак, Мы вдохновили его (этим посланием): «Построй Ковчег в Наших глазах и под Нашим руководством: тогда, когда придет Наше Командование, и фонтаны земли устремятся, возьми себя в руки парами» каждого рода, мужского и женского пола, и семьи твоей, за исключением тех из них, против которых уже вышло Слово: и не обращайся ко Мне в пользу злодеев, ибо они утонут (во время потопа). (Юсуф) Али)
Исхак Хан

Ответы:

13

05AB1E , 4 байта

¢<PΘ

Попробуйте онлайн! или как тестовый набор

объяснение

¢      # count all occurrences of each element in the input list
 <     # decrement each
  P    # product
   Θ   # is equal to 1
Emigna
источник
Ах, я подготовился ¢2QP, но использование Θтакже является хорошей альтернативой. :)
Кевин Круйссен
Думал, у меня было 3 с {ιË, но, конечно, это не удается, когда целые числа встречаются 4 раза.
Grimmy
8

R , 20 байтов

-6 байт благодаря digEmAll путем изменения метода ввода

any(table(scan())-2)

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

Выводится, FALSEесли это список Ноя, а в TRUEпротивном случае. Работает для любого типа ввода, а не только целых чисел.

Вычисляет количество каждого значения в списке и проверяет, отличается ли какое-либо из значений от 2.

Робин Райдер
источник
Вы можете получить ввод из стандартного ввода, экономя 6 байтов: попробуйте онлайн!
digEmAll
@digEmAll Спасибо; Я неправильно понял правила вызова и подумал, что это запрещено.
Робин Райдер
6

Haskell , 33 байта

f x=and[sum[1|b<-x,b==a]==2|a<-x]

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

Для каждого элемента ввода мы гарантируем, что он появляется дважды в списке ввода.

sum[1|b<-x,b==a]это просто версия для игры в гольф length(filter(==a)x).

Мастер пшеницы
источник
6

Perl 6 , 18 байт

{so.Bag{*}.all==2}

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

  • .Bagпреобразует входной список в Bagнабор с множественностью.
  • {*} извлекает все кратности.
  • .all создает и-пересечение кратностей.
  • == 2 приводит к другому соединению логических значений, каждое из которых равно true, если кратность равна 2.
  • so сворачивает соединение к единственному логическому.
Шон
источник
5

J , 10 байт

[:*/2=#/.~

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

Гален Иванов
источник
3
также 10 байтов: [:*/2=1#.=я действительно хочу снять эту крышку, но не могу понять, как.
Коул
1
@ Кол, когда я попробовал это, я получил твое решение. Если вы действительно хотите снять колпачок, вы можете сделать 2*/@:=1#.=также 10 байтов
Конор О'Брайен
@cole Хорошая альтернатива!
Гален Иванов
@ ConorO'Brien Да, @:здесь тоже удобно.
Гален Иванов
1
@GalenIvanov должен любить монадику =, так странно полезную в нишевых сценариях игры в гольф
Коул
4

MS SQL Server 2017 , 152 150 146 байт

CREATE FUNCTION f(@ NVARCHAR(MAX))RETURNS
TABLE RETURN SELECT IIF(2=ALL(SELECT
COUNT(*)FROM STRING_SPLIT(@,',')GROUP BY
PARSE(value AS INT)),1,0)r

Читаемая версия:

CREATE FUNCTION f(@ NVARCHAR(MAX)) RETURNS TABLE RETURN
  SELECT IIF(2 = ALL(SELECT COUNT(*)
                     FROM STRING_SPLIT(@, ',')
                     GROUP BY PARSE(value AS INT)), 1, 0) AS r

Попробуйте это на SQL Fiddle !

-2 байта благодаря Кевину Круйссену

Андрей Одегов
источник
1
Поскольку вы не используете псевдоним, нельзя cудалить после COUNT(*)?
Кевин Круйссен
@KevinCruijssen, ты прав, спасибо.
Андрей Одегов
4

Haskell , 61 45 байт

import Data.List
all((2==).length).group.sort

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

Спасибо @KevinCruijssen за 12 байтов и @nimi за еще 4.

Сначала ответил Хаскелл, но это было удивительно легко сделать. Можно , вероятно , будет golfed много.Дело в точке...

Ж. Салле
источник
3
Я не знаю Хаскелла, но я уверен, что all(True==).map(2==)может быть all(2==). :)
Кевин Круйссен
4
... и двигаться lengthк all: all((2==).length).group.sort. Нет необходимости давать имя функции, т.е. отбрасывать f=.
Ним
Действительно, я упустил из виду, all(2==)когда я тестировал в GHCi. Спасибо Кевину и Ними, я обновлю ответ.
Ж. Салле
4
... о, и для будущего использования: all(True==)есть and.
Ним
4

JavaScript (ES6), 37 байт

Возвращает false для Noah или true для не-Noah.

a=>a.some(v=>a.map(x=>t-=v==x,t=2)|t)

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

комментарии

a =>               // a[] = input
  a.some(v =>      // for each value v in a[]:
    a.map(x =>     //   for each value x in a[]:
      t -= v == x, //     decrement t if v is equal to x
                   //     (i.e. if v appears exactly twice, t is decremented twice)
      t = 2        //     start with t = 2
    )              //   end of map()
    | t            //   yield t, which is supposed to be equal to 0
  )                // end of some()
Arnauld
источник
3

APL (Dyalog Unicode) , 8 байтов SBCS

Функция анонимного молчаливого префикса. Возвращает 0/ 1.

∧/2=⊢∘≢⌸

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

 Для каждого значения в качестве левого аргумента и индексов появления этого значения в качестве правого аргумента, вызовите:

 Tally правый аргумент (вхождения)
 затем
 вернуться , что, не обращая внимания на левый аргумент

2= Булевский список с указанием 2

∧/ И-сокращение (то есть они все правда?)

Адам
источник
3

PowerShell , 66 37 26 байт

-11 байт благодаря маззи

!(($args|group|% c*t)-ne2)

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

Группирует $lи захватывает все количества совпадающих значений. Затем он отфильтровывает все числа 2 из этого списка. Если список пуст, это номер Ноя; в противном случае он будет заполнен не числом 2. Отказ от списка даст, Trueесли он пустой и Falseзаполнен

Veskah
источник
1
Сбой, если значения уравновешивают друг друга .. т.е. [1,2,1,1], так что количество равно 4, число уникальных равно 2 и, следовательно, будет разрешено как noah, несмотря на то, что не noah.
Просроченные данные
@ExpiredData Heck
Веска
Я попробовал этот подход на другом языке, прежде чем понять, что он просто не будет работать ...
Истек срок действия данных
1
¯ \ _ (ツ) _ / ¯ 26
Маззи
1
@mazzy Спасибо. Забыл все о groupсуществовании существа
Веска
3

PHP , 60 байт

function($a){return!array_diff(array_count_values($a),[2]);}

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

PHP имеет отличные встроенные функции для этого, хотя в 20 символов, array_count_values()это не очень гольф.

640 КБ
источник
В PHP всегда есть отличные встроенные модули с длинными именами, вздох!
Night2
3

Mathematica, 25 24 байта

MatchQ[{{_,2}..}]@*Tally

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

TallyФункция возвращает список вида , который затем сопоставляется с шаблоном , который проверяет , все ли графа 2.{{element, count}, ...}

Дверная ручка
источник
3

Атташе , 16 байт

${All&x!{_~x=2}}

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

объяснение

${All&x!{_~x=2}}
${             }    lambda with input x
  All&x!{     }     over each element _ of x:
         _~x            check that the number of occurrences of _ in x
            =2          is 2

альтернативы

17 байтов: {All&_!`=&2@`~&_}

18 байт: {All[`=&2@`~&_,_]}

23 байта: Same@2&`'@Sum@Table[`=]

25 байт: Same«2'Sum@Table[`=,_]»

25 байт: Same<~2'Sum@Table[`=,_]~>

25 байт: {Same[2'Sum@Table[`=,_]]}

35 байт: {Commonest@_==Unique@_and _[0]~_=2}

Конор О'Брайен
источник
3

TI-Basic, 47 байт

Input(L1
SortA(L1
not(remainder(dim(L1,2)) and prod(not(△List(L1))=seq(remainder(I,2),I,1,-1+dim(L1

Я большой поклонник TI-Basic. Это не очень хороший язык для любых целей, но мне нравится программирование (и игра в гольф).

Как работает этот код?

Сначала сортирует список.

Во-вторых, он использует функцию △ List для создания другого списка, который является различием между элементами отсортированного списка. (Например, △ List ({1,3,7,8}) даст {2,4,1}). Не относится к этому списку, который преобразует каждый ненулевой элемент списка в ноль, а каждый ноль в один.

Затем программа проверяет, соответствует ли результирующий список шаблону {1, 0, 1, 0, ...}, что будет истинно, только если исходный список является списком Ноя.

Существует также дополнительная проверка, чтобы длина списка была четной, чтобы уловить некоторые крайние случаи.

Вот несколько скриншотов тестовых случаев:

Некоторые тестовые случаи Еще несколько тестов

mprogrammer
источник
3

Юлия 1,0 , 32 байта

l->sum(isone,l./l')/length(l)==2

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

Делит каждый элемент входного массива lна транспонирование, l'давая матрицу. Суммирование по этой матрице при применении isoneк каждому элементу дает удвоенную длину, lесли каждый элемент появляется ровно дважды.

TimD
источник
3

Юлия , 30 символов 26 байтов

!a=all(x->2==sum(a.==x),a)

Спасибо, H.PWiz за этот трюк!

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

user3263164
источник
1
Вы можете иметь !a=all(x->2==sum(a.==x),a)для 26 байтов. NB. что я рекомендую считать в байтах на этом сайте
H.PWiz
Большое спасибо! Я не знал, что вы можете (ab) использовать !для анонимных функций
user3263164
2

Желе , 5 байт

ĠẈ=2Ạ

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

Монадическая ссылка, которая принимает список целых чисел и возвращает 1, если список Ноя, и 0, если нет.

Ник Кеннеди
источник
2

VDM-SL , 64 байта

f(a)==forall y in set inds a&card{x|x in set inds a&a(x)=a(y)}=2

объяснение

VDM работает преимущественно как логические операторы второго порядка.

forall y in set inds a                //Bind y to each of the indices of a

{x|x in set inds a&a(x)=a(y)}         //build a set of the indices of a who have the same
                                      //value as the value at y

card {...} = 2                        //and check the cardinality of that set is 2

Поскольку вы не можете TIO VDM, вот вывод из сеанса отладки

Истекшие данные
источник
Я знаю, что, вероятно, нет никакого онлайн-компилятора для него, но не могли бы вы добавить несколько скриншотов (некоторых из) тестовых случаев для проверки? :)
Кевин Круйссен
@KevinCruijssen сохранил несколько байтов, исправляя ошибку, что, вероятно, облегчало понимание самого кода. Я тоже добавлю объяснение :)
Просроченные данные
2

Excel, 45 байт

=SUM(IF(FREQUENCY(A:A,A:A)=2,1))=COUNT(A:A)/2

Предполагает данные в столбце A, причем они вводятся в любую ячейку, отличную от одной в столбце A. Возвращает TRUE, если есть пары, и FALSE, если они не совпадают.

        FREQUENCY(A:A,A:A)                     Counts how many of each value there is
     IF(                  =2,1)                If this is 2, add value of 1 to array otherwise 0
=SUM(                          )               Sum the count in that array that have a exactly 2
                                 COUNT(A:A)/2  Count how many total values in column
                                =              If this is equal, return TRUE else FALSE

Попытался удалить / 2 и добавить .5 для суммирования, но это не сработало.
Попытался подсчитать частоты, которые <> 2, и это не вернуло правильное количество.

Keeta
источник
2

Октава / MATLAB, 22 21 байт

@(x)any(sum(x==x')-2)

Анонимная функция, которая вводит числовой вектор и выводит, 0если вектор удовлетворяет условию или 1иным образом.

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

@(x)                   % define anonymous function with input x
            x          % x
               x'      % x transposed and conjugated
             ==        % equality comparison, element-wise with broadcast. Gives a
                       % square matrix
        sum(     )     % sum of each column
                  -2   % subtract 2, element-wise
    any(            )  % true if and only if any value is not zero
Луис Мендо
источник