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


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

Ах, я подготовился ¢2QP, но использование Θтакже является хорошей альтернативой. :)
Кевин Круйссен

Думал, у меня было 3 с {ιË, но, конечно, это не удается, когда целые числа встречаются 4 раза.
Grimmy


8

R , 20 байтов

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

any(table(scan())-2)

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

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

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


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

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




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

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заполнен


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()это не очень гольф.


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


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, ...}, что будет истинно, только если исходный список является списком Ноя.

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

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

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


3

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

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

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

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



3

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

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

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

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


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

Большое спасибо! Я не знал, что вы можете (ab) использовать !для анонимных функций
user3263164


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, и это не вернуло правильное количество.


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

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