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]

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:



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

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

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.


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


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.

5

J , 10 bajtów

[:*/2=#/.~

Wypróbuj online!


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


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...


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

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


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


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ą.


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}, ...}


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}


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


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.



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!


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

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


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.