Цілі списки Ноя


25

Вступ:

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

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

Але заради цього виклику ми будемо ігнорувати чисту / нечисту частину та ту частину, де він взяв по сім кожної тварини. Ця проблема стосується лише цієї частини:

два з усіх видів нечистої тварини, самець та його товариш

Виклик:

Вхід:

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

Вихід:

Два різних значення, що вказують на те, чи це "Список Ноя" чи ні. Це не обов'язково має бути значення truthy / 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 рази.
Гриммі


8

R , 20 байт

-6 байт завдяки digEmAll, змінивши метод введення

any(table(scan())-2)

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

Виходи, FALSEякщо це список Ноя, іTRUE інше. Працює для будь-якого типу введення, не тільки цілих чисел.

Обчислює підрахунок кожного значення у списку і перевіряє, чи будь-який з підрахунків відрізняється від 2.


Ви можете взяти вклад із stdin заощадження 6 байт: Спробуйте в Інтернеті!
digEmAll

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




6

Perl 6 , 18 байт

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

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

  • .Bagперетворює список вхідних даних у Bagнабір - множинність.
  • {*} витягує всі кратності
  • .all створює а-перехід множин.
  • == 2 приводить до іншого і - стику булевих, кожен правдивий, якщо кратність дорівнює 2.
  • so руйнує стик до єдиного булевого.

5

J , 10 байт

[:*/2=#/.~

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


3
також 10 байт: [:*/2=1#.=я дуже хочу зняти цю кришку, але не можу зрозуміти, як.
cole

1
@cole коли я спробував це, я отримав ваше рішення. Якщо ви дійсно хотіли зняти шапку, можете це зробити 2*/@:=1#.=, також 10 байт
Conor O'Brien

@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
Я не знаю Haskell, але я впевнений, що це 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 байт

Повертає помилкове значення для Ноя або істинне для Ноя.

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 (Діалог Unicode) , 8 байт SBCS

Функція анонімного негласного префікса. Повертається0 / 1.

∧/2=⊢∘≢⌸

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

 Для кожного значення як лівого аргументу та індексів виникнення цього значення як правого аргументу виклик:

 підрахуйте правильний аргумент (випадки),
 то
 поверніть це, ігноруючи лівий аргумент

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 і, отже, буде вирішено як ной, незважаючи на те, що не є ноєм.
Термін дії, минув

@ExpiredData Heck
Veskah

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

1
¯ \ _ (ツ) _ / ¯ 26
маззи

1
@mazzy Спасибі Забули все про groupте, що є річчю, яка існує
Веська


3

PHP , 60 байт

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

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

PHP має чудові вбудовані версії для цього, хоч і на 20 символів, array_count_values()але не дуже гофрований.


У PHP завжди є чудові вбудовані, з довгими іменами, зітхання!
Ніч2


3

Attache , 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. Це не чудова мова для будь-яких цілей, але мені подобається програмування (і гольф) в ньому.

Як працює цей код?

По-перше, вона сортує список.

По-друге, він використовує функцію △ Список для створення іншого списку, який є різницею між елементами відсортованого списку. (Наприклад, △ Список ({1,3,7,8}) дасть {2,4,1}). Застосовується не до цього списку, який перетворює кожен ненульовий елемент списку в нуль і кожен нуль в один.

Потім програма перевіряє відповідність результату списку шаблону {1, 0, 1, 0, ...} , що буде істинним лише у тому випадку, якщо оригінальний список - це список Ноя.

Також є додаткова перевірка того, що довжина списку є рівною, щоб зафіксувати деякі кращі випадки.

Ось кілька скріншотів тестових випадків:

Some test cases Some more test cases


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

Велике спасибі! Я не знав, що можна (аб) використовувати !для анонімних функцій
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, тут виводиться з налагодження сесії


Я знаю, що напевно немає жодного онлайн-компілятора для цього, але ви можете, можливо, додати деякі скріншоти (деяких) тестових випадків як перевірку? :)
Kevin Cruijssen

@KevinCruijssen врятував кілька байтів, виправляючи помилку, що, ймовірно, полегшило розуміння самого коду. Я теж додам пояснення :)
Термін дії даних закінчився




2

Excel, 45 байт

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

Припускає дані в стовпці A, при цьому ці дані вводяться в будь-яку клітинку, окрім однієї, у стовпці А. Повертає ІСТИНА, якщо є пари, і ЛІЖНЕ, якщо вони не відповідають парам

        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.