W poszukiwaniu bratniej duszy

40

Biorąc pod uwagę niepustą skończoną listę liczb całkowitych, wypisz prawdziwą wartość, jeśli istnieją dokładnie dwa równe wpisy, a wszystkie inne wpisy są różne, aw przeciwnym razie wartość falsey .

Przykłady

truthy:
[1,1]
[1,2,1]
[1,6,3,4,4,7,9]

falsey:
[0]
[1,1,1]
[1,1,1,2]
[1,1,2,2]
[2,1,2,1,2]
[1,2,3,4,5]
wada
źródło
Przypuszczam, że nie możemy zakładać, że liczby całkowite zawsze będą mniejsze niż 10?
Martin Ender
1
Tak, chyba że twój język nie obsługuje większych liczb całkowitych.
flawr
1
Czy potrafisz wyjaśnić, co rozumiesz przez „ konsekwentny” ?
flawr
33
Widziałem to na szczycie HNQ i myślałem, że dotarliśmy do ostatniego pytania interpersonalnego.
Se
3
@Walfrat Opublikuj jako własne wyzwanie. Takie opinie są zwykle doceniane w piaskownicy.
flawr

Odpowiedzi:

22

Python 3, 30 28 bajtów

lambda m:len({*m})+1==len(m)

Wypróbuj online!

{*m}rzutuje listę na setobiekt, nieuporządkowaną listę elementów bez duplikatów. Spowoduje to zawsze zmniejszenie długości listy o liczbę duplikatów. Obliczając, jak bardzo zmieniła się długość, możemy łatwo stwierdzić, czy lista miała jeden duplikat, i zwrócić wynik testu.

-2 bajty dzięki ovs.

LyricLy
źródło
Dokładnie takie rozwiązanie miałem, ale zapomniałem o {*m}skrócie zamiast set, dobrze grałem!
FlipTack,
27 bajtów dla negacji . (Falsey, kiedy powinna być Prawda itp.)
mbomb007 11.10.17
3
Oto kolejny dziwny sposób na zrobienie tego (także negacja):lambda m:~-len(m[len({*m}):])
mbomb007,
9

Łuska , 4 bajty

εṠ-u

Wypróbuj online!

Wyjaśnienie

εṠ-u  Implicit input.
   u  Unique elements.
 Ṡ-   Delete them from input, counting multiplicities.
ε     Is the result a singleton list?
Zgarb
źródło
7

MATL , 7 , 6 bajtów

&=sp4=

Wypróbuj online!

Jeden bajt zapisany dzięki @Guiseppe!

Wyjaśnienie:

&=  % Table of pair-wise equality comparisons
    %
    % [1 0 0 0 0 0 0
    %  0 1 0 0 0 0 0
    %  0 0 1 0 0 0 0
    %  0 0 0 1 1 0 0
    %  0 0 0 1 1 0 0
    %  0 0 0 0 0 1 0
    %  0 0 0 0 0 0 1]
    %
s   % Sum each Column. Stack:
    %
    % [1 1 1 2 2 1 1]
    %
p   % Product of the array. Stack:
    %
    % [4]
    %
4=  % Compare the stack to '4'
DJMcMayhem
źródło
1
Ponieważ sjest sumi sumsumuje się wzdłuż pierwszego wymiaru nie singletonowego (kolumny), a macierz jest symetryczna, czy to nie może być szamiast tego Xs?
Giuseppe,
1
@Giuseppe Ah, TIL. Dziękuję Ci!
DJMcMayhem
6

Galaretka , 8 5 bajtów

QL‘=L

Wypróbuj online!

Wyjaśnienie

QL‘=L  - Main link, argument L (a list)   e.g [1,6,3,4,4,7,9]
Q      - Deduplicated elements                [1,6,3,4,7,9]
 L     - Length                               6
  ‘    - Increment                            7
    L  - Length of the input                  7 ([1,6,3,4,4,7,9])
   =   - Are they equal?                      1

Jeśli wartości wyjściowe mogą być dowolnymi spójnymi wartościami, to QL_Ldziała, co -1daje wyniki dla prawdy i dla każdej innej nie dodatniej liczby dla falsey (dzięki @JonathanAllan)

Cairney Coheringaahing
źródło
QL_Lwyprowadziłoby -1dla prawdy i pewnej liczby mniejszej niż -1lub 0dla falsey (np. [1,6,3,4,4,7,9,9,9]powróciłoby -3, podczas gdy [1,6,3,4,7,9]powróciłoby 0).
Jonathan Allan,
@JathanathanAllan O tak. Sądzę, że przykłady, na których testowałem to wszystko, wróciły -2.
caird coinheringaahing 11.10.17
5

JavaScript (ES6), 30 bajtów

a=>new Set(a).size==a.length-1

Wypróbuj online

Kudłaty
źródło
4

Pushy , 8 bajtów

Prosta implementacja sprawdzania, czy len(set(list)) == len(list)-1:

LtvuL^=#

Wyjaśnienie:

       \ Implicit: Put all input on stack
Ltv    \ Get the stack length - 1, save in auxiliary stack
u      \ Remove non-unique elements
L      \ Get the new length
^=     \ Compare with the previously saved length
#      \ Print result

Działa to, ponieważ długość zmniejszy się tylko o 1, jeśli na liście początkowej była tylko dokładnie 1 nieróżna liczba całkowita.

Wypróbuj online!

FlipTack
źródło
1
Wow, nie widziałem nachalnej odpowiedzi od wieków! +1
caird coinheringaahing 11.10.17
1
@cairdcoinheringaahing Pushy nigdy nie umrze. Wróci tylko silniejszy.
FlipTack
4

Oktawa , 25 bajtów

To nie stosuje grouplub uniquepodejście jak wiele innych odpowiedzi, ale raczej „iloczyn” wszystkich możliwych Porównania.

@(x)nnz(triu(x==x',1))==1

Wyjaśnienie

             x==x'        %create a matrix where the entry at (i,j) compares whether x(i) == x(ju)
        triu(x==x',1)     %only consider the strict upper triangular matrix
    nnz(triu(x==x',1))    %count the number of nonzero entries
@(x)nnz(triu(x==x',1))==1 %check whether this number is actually 1

Wypróbuj online!

A ponieważ żaden program nie byłby kompletny bez splotu (dzięki @LuisMendo za naprawienie błędu):

Oktawa , 40 bajtów

@(x)nnz(~conv(sort(x),-1:2:1,'same'))==1

Wypróbuj online!

wada
źródło
Zainspirowałeś mnie do takiego podejścia :)
Stewie Griffin
2
@StewieGriffin Myślę, że odpowiedź MATL wykorzystała twoje dokładne podejście :)
flawr
4

J , 7 6 bajtów

=&#0,=

=sprawdzaj równość każdego elementu z każdym unikalnym elementem, tworzy macierz z m rzędami dla  m  unikalnych elementów.
0,dodaj pusty wiersz na górze.
=&#czy liczba wierszy jest równa długości danych wejściowych?

Wypróbuj online!

FrownyFrog
źródło
Myślę, że można zastąpić .~z=
H.PWiz
@ H.PWiz Nice, edytowane.
FrownyFrog,
4

Siatkówka , 15 12 11 bajtów

Podziękowania dla Neila za zaoszczędzenie 1 bajtu.

D`
Mm2`^$
1

Wypróbuj online!

Wejście jest oddzielone od linii. (Dla wygody zestaw testów używa rozdzielania przecinków).

Wyjaśnienie

D`

Deduplikuj linie na wejściu, co usuwa wszelkie liczby całkowite, które pojawiły się wcześniej (ale pozostawiają otaczające kanały).

Mm2`^$

Policz liczbę pustych linii, która jest równa liczbie duplikatów, które usunęliśmy, ale rozważ tylko dwa pierwsze dopasowania. Tak więc wynik będzie tylko 0(bez duplikatów), 1(jeden duplikat), 2(dwa lub więcej duplikatów).

1

Upewnij się, że dokładnie jeden duplikat został usunięty.

Martin Ender
źródło
Zapisz bajt, ograniczając dopasowanie nowej linii do 2, tak aby wejście do trzeciego wiersza było zawsze 0, 1 lub 2, co upraszcza test. (Irytujące, że nie można używać A`.do liczenia nowych linii, ponieważ spada ostatnia.)
Neil,
@Neil Dzięki, limit to fajny pomysł. Próbowałem także użyć A`., ale problem polega raczej na tym, że nie można odróżnić pojedynczej pustej linii od jej braku. Może powinienem rozważyć zakończenie Ai Gwyjście z linefeedem, jeśli są jakieś linie. Chociaż prawdopodobnie powinna to być opcja, ponieważ mogę sobie wyobrazić, że to podawanie linii jest denerwujące w innych scenariuszach.
Martin Ender
Dopasowywanie pojedynczej pustej linii jest łatwe - to po prostu ^$¶.
Neil,
@Neil Nie, mam na myśli, że wyjście Ajest identyczne niezależnie od tego, czy zachowuje pojedynczą pustą linię, czy odrzuca wszystkie linie.
Martin Ender
Przepraszam, właśnie to miałem na myśli mówiąc „upuszcza ostatni” - zwraca jedną mniej pustej linii, ale wtedy nie można rozróżnić od 0 do 1.
Neil
3

05AB1E , 4 bajty

{¥_O

Wypróbuj online!

Wyprowadza 1jako prawda, każda inna nieujemna liczba całkowita jako fałsz. W 05AB1E 1jest jedyną prawdziwą liczbą (dzięki @Emigna za wgląd!).

Wyjaśnienie

{       Implicit input. Sort
 ¥      Consecutive differences
  _     Boolean negate
   O    Sum. Implicit display
Luis Mendo
źródło
3

Rubinowy, 32 bajty

->(s){s.uniq.length==s.length-1}
parenparen
źródło
Witamy w PPCG! Ponieważ jest to kod golfowy, musisz dołączyć liczbę bajtów swojego programu. Tym razem zrobiłem to za ciebie.
Pavel
Jak o Array#size?
Travis,
Możesz zejść do 26 bajtów, używając->s{s.uniq.size==s.size-1}
Conor O'Brien
3

Excel, 42 bajty

Duńska wersja językowa

=TÆLV(A:A)=SUM(--(FREKVENS(A:A,A:A)>0))+1

Zakłada każdą liczbę całkowitą z listy w osobnej komórce w kolumnie A.
Gdybyśmy mieli niespójne wartości falsey , moglibyśmy zaoszczędzić 3 bajty:

=TÆLV(A:A)+SUM(-(FREKVENS(A:A,A:A)>0))

Wersja angielska (44 bajty)

=COUNTA(A:A)=SUM(--(FREQUENCY(A:A,A:A)>0))+1
pajonk
źródło
3

R , 32 31 bajtów

-1 bajt dzięki @JarkoDubbeldam

cat(sum(duplicated(scan()))==1)

Wypróbuj online!

Odczytuje ze standardowego, zapisuje na standardowe.

duplicatediteracji listy, zastępując wartości lze TRUEjeśli wartość nastąpi wcześniej na liście, a FALSEinaczej. Jeśli istnieje unikalna para bratnich dusz, powinna istnieć dokładnie jedna TRUEwartość, więc suma powinna wynosić 1.

Giuseppe
źródło
1
31 bajtów
JAD
1
@JarkoDubbeldam ah, oczywiście. Dobrze cię znowu widzieć! Minęło trochę czasu.
Giuseppe,
Byłem zajęty innymi rzeczami, nie jestem pewien, czy jeszcze wróciłem.
JAD
@Giuseppe, właśnie przeczytałem to pytanie i od razu pomyślałem o Twoim oryginalnym podejściu .... Bardzo miło! Nigdy bym nie pomyślał o takim scan()podejściu.
Joseph Wood,
3

PowerShell , 40 37 bajtów

($args|sort -u).count-eq$args.count-1

Wypróbuj online!

Sort-ObjectPoleceń (pseudonim sort) z -unique flagą wyciąga tylko unikalne składniki wejścia. Na przykład dla danych wejściowych @(1,3,3,2)spowoduje to @(1,2,3).

Dlatego musimy tylko upewnić się, że .countten obiekt (tj. Ile ma elementów) jest -eqzgodny .countz naszą tablicą wejściową -1(tj. Mamy dokładnie jeden zduplikowany wpis).

Zaoszczędzono 3 bajty dzięki Sinusoid.
Naprawiono błąd dzięki TessellatingHeckler.

AdmBorkBork
źródło
Czy możesz użyć unikalnego aliasu „gu” zamiast grupy, aby osiągnąć ten sam wynik?
Sinusoid
@ Sinusoid Tak, możemy. Dzięki!
AdmBorkBork
To nie działa w drugim przypadku testowym 1,2,1- get-uniquedziała tylko na wstępnie posortowanych danych wejściowych. Co powiesz na ($args|sort -u).count-eq$args.count-1który jest również 37, ale działa dla wszystkich przypadków testowych, jeśli nazwiesz go tak jak f 1 2 1zamiast f 1,2,1?
TessellatingHeckler
@TessellatingHeckler Ah, dobry połów. Wszystkie testy, które przeprowadziłem, miały wstępnie posortowane dane wejściowe. Dzięki!
AdmBorkBork
2

Octave / MATLAB (z pakietem statystyk / zestawem narzędzi), 21 bajtów

@(x)nnz(~pdist(x))==1

Funkcja anonimowa. Dane wejściowe to wektor kolumny. Wyjście to true(wyświetlane jako 1) lub false(wyświetlane jako 0).

Wypróbuj online!

Wyjaśnienie

pdist(x)oblicza wektor odległości euklidesowych między wszystkimi parami rzędów od x. Bierze każdą parę tylko raz (kolejność dwóch rzędów nie ma znaczenia) i nie bierze pod uwagę par utworzonych przez ten sam rząd dwa razy.

W naszym przypadku xjest to wektor kolumnowy, więc odległość euklidesowa między dwoma rzędami jest absolutną różnicą między dwiema liczbami.

~jest logiczną (logiczną) negacją, nnzjest liczbą nonzerów i ==1porównuje się z 1. Wynik jest truewtedy i tylko wtedy, gdy jest tylko jedna para, która daje zerową odległość.

Luis Mendo
źródło
2

Jq 1,5 , 53 25 bajtów

length-(unique|length)==1

Zainspirowany odpowiedzią Riley i znacznie krótszą niż moje oryginalne rozwiązanie.

Wypróbuj online!

jq170727
źródło
2

Julia, 39 26 bajtów

!a=sum(a.==a')==endof(a)+2

Wyjaśnienie

Kod generuje dwuwymiarową tabelę wartości logicznych, która jest następnie gromadzona za pomocą funkcji sumowania, zliczając liczbę par tego samego elementu w kartezjańskim kwadracie A. Następnie porównuje się to z długością ciągu plus dwa, a Ilości są równe tylko wtedy, gdy jest dokładnie jeden znak powtarzalny.

Ten kod przedefiniowuje operator NOT.

eaglgenes101
źródło
!a=sum(a.==a')==endof(a)+2oszczędza kilka bajtów. Wypróbuj online!
Dennis
2

Oktawa , 23 26 bajtów

@(x)prod(sum(x==x'))==4

Wypróbuj online!

Ta x==x'część została zainspirowana odpowiedzią flawr . To jest dłuższe niż odpowiedź Luisa, ale nie używa żadnych skrzynek z narzędziami.

Wyjaśnienie:

Jest to anonimowa funkcja, która przyjmuje wektor xjako dane wejściowe i porównuje go z samą transpozycją. To da macierz, w której znajdują się wszystkie elementy ukośne 1, a wszelkie elementy nie przekątne sygnalizują, że istnieją elementy zduplikowane.

Suma wzdłuż dowolnej kolumny pokazuje, ile jest duplikatów tej liczby. Chcemy, aby dwie liczby miały duplikaty, więc mamy dwie wartości równe dwóm, a reszta nierówna dwóm.

Jeśli weźmiemy iloczyn tej macierzy, otrzymamy, 4jeśli będą tylko dwa równe elementy ( 2*2*1*1*1*1*...) i coś innego niż, 4jeśli nie będzie duplikatów lub więcej niż dwa.

Stewie Griffin
źródło
2

PHP, 46 bajtów

<?=count(array_unique($argv))==count($argv)-1;

Liczy liczbę wpisów $argvi porównuje ją z liczbą unikalnych wpisów. Jeśli ten pierwszy jest wyższy od drugiego o 1, to prawda, w przeciwnym razie falsey.

Wypróbuj na eval.in!

roberto06
źródło
Czy musisz użyć nazwy zmiennej $ argv. Czy zamiast tego możesz użyć po prostu $ a?
dading84
3
@ dading84 $argvto lista parametrów wiersza poleceń. Więc: nie, nie może po prostu użyć $a.
Tytus
2

05AB1E , 6 5 bajtów

{¥>ΘO

Wypróbuj online!

{¥>ΘO   # example input:               [1, 6, 3, 4, 4, 7, 9]
{       # sort                      -> [1, 3, 4, 4, 6, 7, 9]
 ¥      # get deltas                -> [  2, 1, 0, 2, 1, 2 ]
  >     # increment                 -> [  3, 2, 1, 3, 2, 3 ]
   Θ    # truthify (only 1 gives 1) -> [  0, 0, 1, 0, 0, 0 ]
    O   # sum                       -> 1

1będąc jedyną prawdziwą wartością w 05AB1E, możemy się tutaj zatrzymać. (Dzięki @Emigna za zwrócenie na to uwagi.)

Aby uzyskać tylko dwie różne wartości, możemy opcjonalnie dodać:

     Θ  # equals 1?                 -> 1
Arnauld
źródło
1
Jeśli zwrócenie dowolnej wartości falsey dla przypadków falsey jest w porządku, możesz pominąć Θ, ponieważ 1jest to jedyna prawdziwa wartość w 05AB1E.
Emigna,
@Emigna Thanks! Nie byłem pewien, czy zostało to zatwierdzone przez PO, ale chyba tak.
Arnauld,
Obawiam się, że musisz wrócić do poprzedniego rozwiązania, ponieważ ¢nie będzie działać. Byłoby to liczone [19,4,4,9]jako fałszywe i [19,9]prawdziwe, ponieważ znajduje się 0w 10.
Emigna,
@Emigna Dzięki za wykrycie tego. Myślę, że to naprawione.
Arnauld,
{¥_Opowinno być również w porządku.
Emigna,
2

APL (Dyalog Unicode) , 7 bajtów SBCS

1=≢-≢∘∪

Wypróbuj online!

Wyjaśnienie:

1=≢-≢∘∪   Monadic function train
    ≢∘∪   Generate a list of unique items in the input,
          and return the length of that list
  ≢-      Take the length of the input and subtract the above
1=        If the difference is 1, true, otherwise false
jastrząb
źródło
1

Japt, 7 bajtów

â ʶUÊÉ

Spróbuj


Wyjaśnienie

Usuń duplikaty ( â), uzyskaj length ( Ê) i porównaj równość ( ) z długością ( Ê) wejścia ( U) minus 1 ( É).

Kudłaty
źródło
Czy to nie 12 bajtów? Czy âÊɶznaki wielobajtowe nie są ?
RedClover,
1

05AB1E , 5 bajtów

gIÙg-

Wypróbuj online!

g     # Get number of elements in input
 IÙg  # Get number of unique elements in input
    - # Subtract

W 05AB1E 1 jest jedyną prawdziwą wartością, więc dla prawdziwego wyniku musi być dokładnie 1 zduplikowany element usunięty przez uniquify.

Riley
źródło