Listy całkowite Noego

25

Wprowadzenie:

Myślę, że wszyscy o tym słyszeliśmy, ale tutaj jest bardzo krótkie streszczenie: Noe zebrał dwa z każdego gatunku zwierząt na planecie, samiec i samicę, aby uratować w swojej Arce podczas wielkiej powodzi. Rzeczywisty cytat z Biblii brzmi:

Rodzaju 7: 2-3
Musisz zabrać ze sobą siedem każdego rodzaju czystego zwierzęcia, samca i jego partnera, dwa każdego rodzaju nieczystego zwierzęcia, samca i jego partnera, a także siedem każdego ptaka na niebie , płci męskiej i żeńskiej, aby zachować swoje potomstwo na powierzchni ziemi.
źródło

Ale ze względu na to wyzwanie zignorujemy część czystą / nieczystą i część, w której wziął siedem z każdego zwierzęcia. To wyzwanie dotyczy tylko tej części:

dwa z każdego rodzaju nieczystego zwierzęcia, samiec i jego partner

Wyzwanie:

Wkład:

Otrzymujesz listę dodatnich liczb całkowitych (w losowej kolejności).

Wydajność:

Dwie odrębne wartości wskazujące, czy jest to „Lista Noego”, czy nie. Nie musi to być prawda / falsey , więc może to być 0/ 1w Javie / C # lub 'A'/ 'B'w dowolnym języku, aby podać kilka przykładów.

Kiedy lista jest „Listą Noego”? Gdy na liście są dokładnie dwie liczby całkowite.

Zasady konkursu:

  • I / O jest elastyczny. Dane wejściowe mogą być listą / tablicą / strumieniem liczb całkowitych / liczb zmiennoprzecinkowych / ciągów lub odczytywane jeden po drugim ze STDIN. Dane wyjściowe mogą być dowolnymi dwiema odrębnymi wartościami, zwracanymi z funkcji lub danych wyjściowych do pliku STDOUT / a.
  • Liczby całkowite na liście wejściowej są w kolejności losowej i są gwarantowane, że są dodatnie w zakresie 1n100000 .
  • Lista wejściowa jest na pewno niepusta.
  • Posiadanie liczby całkowitej wielokrotności dwa razy występującej powyżej 2 (tj. 4, 6, 8 itd.) Będzie falsey. Czyli [6,4,4,6,4,7,4,7]jest falsey, choć można jeszcze stworzyć równe par jak to: [[4,4],[4,4],[6,6],[7,7]].

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

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]
Kevin Cruijssen
źródło
12
A także w Koranie; Sura Al-Mumenoon, werset 27: Więc zainspirowaliśmy go (tym przesłaniem): „Zbuduj Arkę w zasięgu wzroku i pod naszym przewodnictwem: wtedy, gdy nadejdzie Nasze Przykazanie i fontanny ziemi tryskają, weź na pokład pary każdego gatunku, mężczyzny i kobiety, i twojej rodziny - z wyjątkiem tych, przeciwko którym Słowo już wyszło: i nie zwracajcie się do mnie na korzyść złoczyńców, bo zostaną utopieni (w potopie). (Yusuf Ali)
Ishaq Khan

Odpowiedzi:

19

Python 3 , 31 bajtów

lambda l:{*map(l.count,l)}=={2}

Wypróbuj online!


Python 2 , 33 bajty

lambda l:set(map(l.count,l))=={2}

Wypróbuj online!

TFeld
źródło
Fajnie, nie wiedziałem, że operator języka działał w ustawionych literałach, jeśli poprawnie to interpretuję.
ApproachingDarknessFish
13

05AB1E , 4 bajty

¢<PΘ

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

¢      # count all occurrences of each element in the input list
 <     # decrement each
  P    # product
   Θ   # is equal to 1
Emigna
źródło
Ach, przygotowałem się ¢2QP, ale używanie Θjest również dobrą alternatywą. :)
Kevin Cruijssen
Myślałem, że miałem 3 z {ιË, ale oczywiście to się nie udaje, gdy liczby całkowite występują 4 razy.
Grimmy,
9

Brachylog , 4 bajty

ọtᵛ2

Wypróbuj online!

Wyjaśnienie

ọ           Get the list of occurences of elements in the input: [[x,2], [y,2], …]
  ᵛ         Verify that for each of those pairs…
 t          …the tail (i.e. the number of occurences)
   2        …is 2
Fatalizować
źródło
8

R , 20 bajtów

-6 bajtów dzięki digEmAll poprzez zmianę metody wprowadzania

any(table(scan())-2)

Wypróbuj online!

Wyprowadza, FALSEjeśli jest to lista Noego i TRUEinaczej. Działa dla każdego typu danych wejściowych, nie tylko liczb całkowitych.

Oblicza liczbę każdej wartości na liście i sprawdza, czy którakolwiek z wartości jest inna niż 2.

Robin Ryder
źródło
Możesz wziąć wkład ze standardowego oszczędzania 6 bajtów: Wypróbuj online!
digEmAll
@digEmAll Thanks; Źle odczytałem zasady wyzwania i pomyślałem, że to niedozwolone.
Robin Ryder
6

Haskell , 33 bajty

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

Wypróbuj online!

Dla każdego elementu danych wejściowych upewniamy się, że pojawia się dwukrotnie na liście danych wejściowych.

sum[1|b<-x,b==a]jest po prostu bardziej golfową wersją length(filter(==a)x).

Kreator pszenicy
źródło
6

Perl 6 , 18 bajtów

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

Wypróbuj online!

  • .Bagkonwertuje listę wejściową na Bagzbiór - wielokrotność.
  • {*} wyodrębnia wszystkie krotności.
  • .all tworzy połączenie wielu krotności.
  • == 2 skutkuje innym połączeniem booleanów, z których każdy jest prawdziwy, jeśli krotność wynosi 2.
  • so zwija skrzyżowanie do pojedynczego logicznego.
Sean
źródło
5

J , 10 bajtów

[:*/2=#/.~

Wypróbuj online!

Galen Iwanow
źródło
3
także 10 bajtów: [:*/2=1#.=Naprawdę chcę usunąć tę czapkę, ale nie wiem, jak to zrobić.
cole
1
@cole, kiedy próbowałem, mam twoje rozwiązanie. Jeśli naprawdę chcesz zdjąć czapkę, możesz to zrobić 2*/@:=1#.=, również 10 bajtów
Conor O'Brien
@cole Ładna alternatywa!
Galen Iwanow
@ ConorO'Brien Tak, @:tutaj też się przydaje.
Galen Iwanow
1
@GalenIvanov musi kochać monadyczne =, tak dziwnie przydatne w niszowych scenariuszach golfowych
cole
4

MS SQL Server 2017 , 152 150 146 bajtów

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

Wersja do odczytu:

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

Wypróbuj na SQL Fiddle !

-2 bajty dzięki Kevin Cruijssen

Andrei Odegov
źródło
1
Ponieważ nie używasz aliasu, nie można cgo usunąć po COUNT(*)?
Kevin Cruijssen
@KevinCruijssen, masz rację, dziękuję.
Andrei Odegov
4

Haskell , 61 45 bajtów

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

Wypróbuj online!

Dzięki @KevinCruijssen za 12 bajtów i @nimi za kolejne 4.

Pierwsza odpowiedź Haskella, ale było to zaskakująco łatwe. Mogą prawdopodobnie być grałem dużo. Przykładem...

J. Sallé
źródło
3
Nie znam Haskella, ale jestem pewien, że all(True==).map(2==)może być all(2==). :)
Kevin Cruijssen
4
... i ruch lengthdo all: all((2==).length).group.sort. Nie trzeba nadawać funkcji nazwy, tzn. Upuszczać f=.
nimi
Rzeczywiście przeoczyłem czas, all(2==)gdy testowałem w GHCi. Dzięki Kevin i Nimi, zaktualizuję odpowiedź.
J. Sallé
4
... aha i do wykorzystania w przyszłości: all(True==)jest and.
nimi
4

JavaScript (ES6), 37 bajtów

Zwraca false dla Noego lub true dla nie-Noego.

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

Wypróbuj online!

Skomentował

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
źródło
3

APL (Dyalog Unicode) , 8 bajtów SBCS

Anonimowa ukryta funkcja prefiksu. Zwraca 0/ 1.

∧/2=⊢∘≢⌸

Wypróbuj online!

 Dla każdej wartości jako lewego argumentu i wskaźników występowania tej wartości jako prawego argumentu wywołaj:

 oblicz prawy argument (wystąpienia),
 a następnie
 zwróć go, ignorując lewy argument

2= Lista boolowska wskazująca, które wartości są 2

∧/ ORAZ redukcja (tj. Czy wszystkie są prawdziwe?)

Adám
źródło
3

PowerShell , 66 37 26 bajtów

-11 bajtów dzięki mazzy

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

Wypróbuj online!

Grupuje $li pobiera wszystkie liczby pasujących wartości. Następnie odfiltrowuje wszystkie liczby 2 z tej listy. Jeśli lista jest pusta, jest to liczba Noego; w przeciwnym razie zostanie wypełniona liczbą inną niż 2. Notowanie listy da wynik, Truejeśli będzie puste i Falsezapełnione

Veskah
źródło
1
Nie powiedzie się, jeśli wartości się równoważą .. tzn. [1,2,1,1], więc liczba wynosi 4, liczba unikalnych wynosi 2, a zatem zostanie rozwiązana jako noah, mimo że nie jest noem.
Data wygasła
@ExpiredData Heck
Veskah
Wypróbowałem to podejście w innym języku, zanim zdałem sobie sprawę, że to po prostu nie zadziała ...
Data wygasła
1
¯ \ _ (ツ) _ / ¯ 26
mazzy
1
@mazzy Thanks. Zapomniałem o groupbyciu rzeczą, która istnieje
Veskah
3

PHP , 60 bajtów

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

Wypróbuj online!

PHP ma do tego świetne wbudowane array_count_values()funkcje , chociaż przy 20 znakach nie jest zbyt golfistą.

640 KB
źródło
PHP zawsze ma świetne wbudowane, długie nazwy, westchnij!
Noc 2
3

Mathematica, 25 24 bajtów

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

Wypróbuj online!

TallyFunkcja zwraca listę postaci , które są następnie porównywane wzór, który sprawdza, czy wszystkie liczby są 2.{{element, count}, ...}

Klamka
źródło
3

Attache , 16 bajtów

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

Wypróbuj online!

Wyjaśnienie

${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

Alternatywy

17 bajtów: {All&_!`=&2@`~&_}

18 bajtów: {All[`=&2@`~&_,_]}

23 bajty: Same@2&`'@Sum@Table[`=]

25 bajtów: Same«2'Sum@Table[`=,_]»

25 bajtów: Same<~2'Sum@Table[`=,_]~>

25 bajtów: {Same[2'Sum@Table[`=,_]]}

35 bajtów: {Commonest@_==Unique@_and _[0]~_=2}

Conor O'Brien
źródło
3

TI-Basic, 47 bajtów

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

Jestem wielkim fanem TI-Basic. Nie jest to świetny język do naprawdę żadnego celu, ale lubię w nim programować (i grać w golfa).

Jak działa ten kod?

Najpierw sortuje listę.

Po drugie, używa funkcji △ Lista do wygenerowania kolejnej listy, która stanowi różnicę między elementami posortowanej listy. (Na przykład △ Lista ({1,3,7,8}) dałaby {2,4,1}). Nie dotyczy tej listy, która konwertuje każdy niezerowy element listy na zero i każde zero na jeden.

Następnie program sprawdza, czy wynikowa lista pasuje do wzorca {1, 0, 1, 0, ...}, co będzie prawdą tylko wtedy, gdy oryginalna lista jest listą Noego.

Istnieje również dodatkowa kontrola, czy długość listy jest równa, aby uchwycić niektóre przypadki krawędzi.

Oto kilka zrzutów ekranu przypadków testowych:

Niektóre przypadki testowe Więcej przypadków testowych

mprogrammer
źródło
3

Julia 1.0 , 32 bajty

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

Wypróbuj online!

Dzieli każdy element tablicy wejściowej lprzez transpozycję, l'dając macierz. Zsumowanie tej macierzy przy zastosowaniu isonedo każdego elementu daje dwukrotność długości, ljeśli każdy element pojawia się dokładnie dwa razy.

TimD
źródło
3

K (oK) , 9 bajtów

Rozwiązanie:

&/2=#:'.=

Wypróbuj online!

Wyjaśnienie:

&/2=#:'.= / the solution
        = / group
       .  / value
    #:'   / count (length of) each
  2=      / equal to 2?
&/        / take minimum
streetster
źródło
3

Julia , 30 znaków 26 bajtów

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

Dziękuję H.PWiz za tę sztuczkę!

Wypróbuj online!

użytkownik3263164
źródło
1
Możesz mieć !a=all(x->2==sum(a.==x),a)26 bajtów. NB. że zalecam liczenie w bajtach na tej stronie
H.PWiz
Dziękuję Ci bardzo! Nie wiedziałem, że możesz (ab) korzystać !z funkcji anonimowych
user3263164
2

Galaretka , 5 bajtów

ĠẈ=2Ạ

Wypróbuj online!

Monadyczny link, który pobiera listę liczb całkowitych i zwraca 1, jeśli lista Noego i 0, jeśli nie.

Nick Kennedy
źródło
2

VDM-SL , 64 bajty

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

Wyjaśnienie

VDM działa głównie jak instrukcje logiczne drugiego rzędu.

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

Ponieważ nie możesz TIO VDM, oto dane wyjściowe z sesji debugowania

Wygasły dane
źródło
Wiem, że prawdopodobnie nie ma dla niego żadnego kompilatora online, ale czy mógłbyś dodać kilka zrzutów ekranu (niektórych) przypadków testowych jako weryfikację? :)
Kevin Cruijssen
@KevinCruijssen zapisał kilka bajtów naprawiających błąd, co prawdopodobnie ułatwiło zrozumienie samego kodu. Dodam też wyjaśnienie :)
Data wygasła
2

Excel, 45 bajtów

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

Zakłada dane w kolumnie A, z tym wpisanym w dowolnej komórce innej niż jedna w kolumnie A. Zwraca wartość PRAWDA, jeśli istnieją pary, i FAŁSZ, jeśli nie pasują do nich pary

        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

Próbowałem usunąć / 2 i dodać .5 do sumowania, ale to nie zadziałało.
Próbowałem zliczyć częstotliwości, które wynoszą <> 2, ale to nie zwróciło właściwej ilości.

Keeta
źródło
2

Octave / MATLAB, 22 21 bajtów

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

Anonimowa funkcja, która wprowadza wektor numeryczny i wyprowadza, 0jeśli wektor spełnia warunek lub w 1inny sposób.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

@(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
Luis Mendo
źródło