Auf der Suche nach einem Seelenverwandten

40

Bei einer nicht leeren endlichen Liste von ganzen Zahlen einen Wahrheitswert ausgeben , wenn es genau zwei gleiche Einträge gibt und alle anderen Einträge unterschiedlich sind, und andernfalls einen falschen Wert.

Beispiele

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]
fehlerhaft
quelle
Ich nehme an, wir können nicht davon ausgehen, dass die ganzen Zahlen immer kleiner als 10 sein werden.
Martin Ender
1
Ja, außer wenn Ihre Sprache keine größeren ganzen Zahlen unterstützt.
Fehler
1
Können Sie erläutern, was Sie unter konsequent verstehen ?
Fehler
33
Habe das oben im HNQ gesehen und dachte, wir hätten die letzte interpersonal.se-Frage erreicht
gntskn
3
@ Walfrat Poste es als deine eigene Herausforderung. Auch solche Rückmeldungen werden in der Regel in der Sandbox geschätzt.
Fehler

Antworten:

22

Python 3, 30 28 Bytes

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

Probieren Sie es online!

{*m}wandelt die Liste in ein setObjekt um, eine ungeordnete Liste von Elementen ohne Duplikate. Dadurch wird die Länge der Liste immer um die Anzahl der darin enthaltenen Duplikate verringert. Durch die Berechnung, wie stark sich die Länge geändert hat, können wir leicht feststellen, ob die Liste ein einzelnes Duplikat enthielt, und das Testergebnis zurückgeben.

-2 Bytes dank ovs.

Textlich
quelle
Genau die Lösung hatte ich, vergaß aber die {*m}Abkürzung anstatt set, gut zu golfen!
FlipTack
27 Bytes für die Negation . (Falsch, wenn es Wahrheit sein sollte, etc.)
mbomb007
3
Hier ist eine weitere seltsame Möglichkeit (auch Verneinung):lambda m:~-len(m[len({*m}):])
mbomb007
9

Schale , 4 Bytes

εṠ-u

Probieren Sie es online!

Erläuterung

εṠ-u  Implicit input.
   u  Unique elements.
 Ṡ-   Delete them from input, counting multiplicities.
ε     Is the result a singleton list?
Zgarb
quelle
7

MATL , 7 , 6 Bytes

&=sp4=

Probieren Sie es online!

Ein Byte gespart dank @Guiseppe!

Erläuterung:

&=  % 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
quelle
1
Da sist sumund sumsummiert sich entlang der ersten Nicht-Singleton-Dimension (Spalten) und die Matrix ist symmetrisch, könnte dies nicht einfach sstatt sein Xs?
Giuseppe
1
@ Giuseppe Ah, bis. Dankeschön!
DJMcMayhem
6

Gelee , 8 5 Bytes

QL‘=L

Probieren Sie es online!

Erläuterung

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

Wenn es sich bei den Ausgabewerten um konsistente Werte handeln kann, QL_Lfunktioniert dies, wobei -1für die Wahrheit und für Falsey jede andere nicht positive Zahl ausgegeben wird (danke @JonathanAllan).

Caird Coinheringaahing
quelle
QL_Lwürde ausgeben -1für wahr und eine Zahl kleiner als -1oder 0für falsch (zB [1,6,3,4,4,7,9,9,9]würde zurückkehren -3, während [1,6,3,4,7,9]würde zurückkehren 0).
Jonathan Allan
@ JonathanAllan Oh ja. Ich denke, die Beispiele, die ich getestet habe, sind alle zurückgekehrt -2.
Caird Coinheringaahing
4

Aufdringlich , 8 Bytes

Einfache Implementierung der Überprüfung, ob len(set(list)) == len(list)-1:

LtvuL^=#

Erläuterung:

       \ 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

Dies funktioniert, da sich die Länge nur um 1 verringert, wenn die ursprüngliche Liste nur genau 1 nicht eindeutige Ganzzahl enthält.

Probieren Sie es online!

FlipTack
quelle
1
Wow, seit Ewigkeiten keine aufdringliche Antwort mehr gesehen! +1
caird coinheringaahing
1
@cairdcoinheringaahing Pushy wird niemals sterben. Es wird nur stärker zurückkommen.
FlipTack
4

Oktave , 25 Bytes

Dabei wird nicht ein groupoder uniqueAnsatz wie bei vielen anderen Antworten verwendet, sondern das "kartesische Produkt" aller möglichen Vergleiche.

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

Erläuterung

             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

Probieren Sie es online!

Und weil kein Programm ohne Faltung komplett wäre (danke @LuisMendo für die Fehlerbehebung):

Oktave , 40 Bytes

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

Probieren Sie es online!

fehlerhaft
quelle
Sie haben mich zu diesem Ansatz inspiriert :)
Stewie Griffin
2
@ StewieGriffin Ich denke, die MATL- Antwort verwendet Ihren genauen Ansatz :)
Fehler
4

J , 7 6 Bytes

=&#0,=

=prüfe jedes Element auf Gleichheit mit jedem eindeutigen Element, erstelle eine Matrix mit m Zeilen für  m  eindeutige Elemente.
0,Fügen Sie oben eine leere Zeile hinzu.
=&#Entspricht die Anzahl der Zeilen der Länge der Eingabe?

Probieren Sie es online!

FrownyFrog
quelle
Ich glaube , Sie können ersetzen .~mit=
H.PWiz
@ H.PWiz Schön, bearbeitet.
FrownyFrog
4

Netzhaut , 15 12 11 Bytes

Vielen Dank an Neil für das Speichern von 1 Byte.

D`
Mm2`^$
1

Probieren Sie es online!

Der Eingang ist zeilenweise getrennt. (In der Testsuite wird der Einfachheit halber die Kommatrennung verwendet.)

Erläuterung

D`

Deduplizieren Sie die Zeilen in der Eingabe, wodurch alle zuvor aufgetretenen Ganzzahlen entfernt werden (die umgebenden Zeilenumbrüche bleiben jedoch erhalten).

Mm2`^$

Zählen Sie die Anzahl der leeren Zeilen, die der Anzahl der entfernten Duplikate entspricht, aber berücksichtigen Sie nur die ersten beiden Übereinstimmungen. Die Ausgabe ist also nur 0(keine Duplikate), 1(ein Duplikat), 2(zwei oder mehr Duplikate).

1

Stellen Sie sicher, dass genau ein Duplikat entfernt wurde.

Martin Ender
quelle
Speichern Sie ein Byte, indem Sie die Zeilenumbruchsübereinstimmung auf 2 begrenzen, sodass die Eingabe in die dritte Zeile immer 0, 1 oder 2 ist, was den Test vereinfacht. (Es ist ärgerlich, dass Sie keine A`.Zeilenumbrüche zählen können, da der letzte gelöscht wird.)
Neil,
@Neil Danke, das Limit ist eine nette Idee. Ich habe es auch mit versucht A`., aber das Problem ist eher, dass man eine einzelne Leerzeile nicht von einer Zeile ohne Zeilen unterscheiden kann. Vielleicht sollte ich darüber nachdenken, mit einem Zeilenvorschub zu terminieren Aund Gauszugeben, wenn es irgendwelche Zeilen gibt. Obwohl das wahrscheinlich eine Option sein sollte, da ich mir vorstellen kann, dass Zeilenvorschub in anderen Szenarien ärgerlich ist.
Martin Ender
Es ist einfach, eine einzelne leere Zeile zuzuordnen - das ist einfach ^$¶.
Neil
@Neil Nein, ich meine, die Ausgabe von Aist identisch, unabhängig davon, ob eine einzelne leere Zeile beibehalten oder alle Zeilen verworfen werden.
Martin Ender
Tut mir leid, das habe ich mit "löscht den letzten" gemeint - es wird eine Leerzeile weniger zurückgegeben, aber dann können Sie nicht zwischen 0 und 1 unterscheiden.
Neil
3

05AB1E , 4 Bytes

{¥_O

Probieren Sie es online!

Ausgänge 1als truthy, andere nicht-negative ganze Zahl als falsy. In 05AB1E 1ist die einzig wahre Zahl (danke @Emigna für die Einsicht!).

Erläuterung

{       Implicit input. Sort
 ¥      Consecutive differences
  _     Boolean negate
   O    Sum. Implicit display
Luis Mendo
quelle
3

Ruby, 32 Bytes

->(s){s.uniq.length==s.length-1}
parenparen
quelle
Willkommen bei PPCG! Da dies Codegolf ist, müssen Sie die Byteanzahl Ihres Programms angeben. Diesmal habe ich mir erlaubt, es für Sie zu tun.
Pavel
Wie wäre es Array#size?
Travis
Sie können mit->s{s.uniq.size==s.size-1}
Conor O'Brien
3

Excel, 42 Bytes

Dänische Sprachversion

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

Nimmt jede Ganzzahl aus der Liste in einer separaten Zelle in der Spalte an A.
Wenn wir inkonsistente Falsey- Werte hätten, könnten wir 3 Bytes sparen:

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

Englische Sprachversion (44 Bytes)

=COUNTA(A:A)=SUM(--(FREQUENCY(A:A,A:A)>0))+1
pajonk
quelle
3

R , 32 31 Bytes

-1 Byte dank @JarkoDubbeldam

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

Probieren Sie es online!

Liest von stdin, schreibt nach stdout.

duplicatedDurchläuft die Liste und ersetzt die Werte von ldurch, TRUEwenn dieser Wert früher in der Liste vorkommt, FALSEandernfalls. Wenn es ein einzigartiges Paar von Seelenverwandten gibt, sollte es genau einen TRUEWert geben, also sollte die Summe sein 1.

Giuseppe
quelle
1
31 Bytes
JAD
1
@ JarkoDubbeldam ah, natürlich. Schön dich wieder zu sehen! Es ist eine Weile her.
Giuseppe
Ich war mit ein paar anderen Dingen beschäftigt und bin mir noch nicht sicher, ob ich ganz zurück bin.
JAD
@ Giuseppe, ich habe gerade diese Frage gelesen und sofort an deinen ursprünglichen Ansatz gedacht .... Sehr schön! Ich hätte nie an den scan()Ansatz gedacht .
Joseph Wood
3

PowerShell , 40 37 Byte

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

Probieren Sie es online!

Der Sort-ObjectBefehl (Alias sort) mit dem -uNique-Flag ruft nur die eindeutigen Komponenten der Eingabe ab. Bei der Eingabe @(1,3,3,2)führt dies beispielsweise zu @(1,2,3).

Daher müssen wir nur sicherstellen, dass das .countvon diesem Objekt (dh wie viele Elemente es hat) -eqdem .countvon unserem Eingabearray -1(dh wir haben genau einen doppelten Eintrag) entspricht.

3 Bytes gespart dank Sinusoid.
Fehler behoben dank TessellatingHeckler.

AdmBorkBork
quelle
Können Sie den get-unique-Alias ​​"gu" anstelle von "group" verwenden, um dasselbe Ergebnis zu erzielen?
Sinusoid
@ Sinusoid Ja, wir können. Vielen Dank!
AdmBorkBork
Dies funktioniert nicht für den zweiten Testfall 1,2,1- get-uniquenur für vorsortierte Eingaben. Wie wäre es mit dem, ($args|sort -u).count-eq$args.count-1was auch 37 ist, aber für alle Testfälle funktioniert, wenn Sie es wie f 1 2 1anstatt aufrufen f 1,2,1?
TessellatingHeckler
@TessellatingHeckler Ah, guter Fang. Alle Tests, die ich durchgeführt habe, wurden mit vorsortierten Eingaben durchgeführt. Vielen Dank!
AdmBorkBork
2

Octave / MATLAB (mit Statistikpaket / Toolbox), 21 Byte

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

Anonyme Funktion. Die Eingabe ist ein Spaltenvektor. Die Ausgabe erfolgt true(angezeigt als 1) oder false(angezeigt als 0).

Probieren Sie es online!

Erläuterung

pdist(x)berechnet einen Vektor der euklidischen Abstände zwischen allen Zeilenpaaren von x. Dabei wird jedes Paar nur einmal berücksichtigt (die Reihenfolge der beiden Zeilen spielt keine Rolle). Paare, die durch dieselbe Zeile zweimal gebildet werden, werden nicht berücksichtigt.

In unserem Fall xhandelt es sich um einen Spaltenvektor. Der euklidische Abstand zwischen zwei Zeilen ist also nur die absolute Differenz zwischen den beiden Zahlen.

~ist eine logische (Boolesche) Negation, nnzist die Anzahl der Nichtzeros und ist ==1vergleichbar mit 1. Das Ergebnis ist also truegenau dann, wenn es nur ein Paar gibt, das den Abstand Null ergibt.

Luis Mendo
quelle
2

Julia, 39 26 Bytes

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

Erläuterung

Der Code generiert eine zweidimensionale Tabelle mit Booleschen Werten, die dann mithilfe der Summenfunktion gesammelt wird. Dabei wird die Anzahl der Paare gleicher Elemente im kartesischen Quadrat von A gezählt. Dann wird dies mit der Länge der Zeichenfolge plus zwei verglichen Mengen sind nur dann gleich, wenn es genau ein Wiederholungszeichen gibt.

Dieser Code definiert den Operator NOT neu.

eaglgenes101
quelle
!a=sum(a.==a')==endof(a)+2spart ein paar Bytes. Probieren Sie es online!
Dennis
2

Oktave , 23 26 Bytes

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

Probieren Sie es online!

Der x==x'Teil wurde von der Antwort von flawr inspiriert . Dies ist länger als Luis 'Antwort, aber es werden keine Toolboxes verwendet.

Erläuterung:

Dies ist eine anonyme Funktion, die einen Vektor xals Eingabe verwendet und ihn mit sich selbst transponiert vergleicht. Dies ergibt eine Matrix, in der alle diagonalen Elemente vorhanden sind 1, und alle nicht diagonalen Elemente signalisieren, dass es doppelte Elemente gibt.

Die Summe in einer Spalte gibt an, wie viele Duplikate dieser Zahl vorhanden sind. Wir wollen, dass zwei der Zahlen ein Duplikat haben, also sind wir zwei Werte gleich zwei und der Rest ungleich zwei.

Wenn wir das Produkt dieser Matrix nehmen, erhalten wir, 4wenn es nur zwei gleiche Elemente ( 2*2*1*1*1*1*...) und etwas anderes gibt, als 4wenn es keine Duplikate gibt, oder mehr als zwei.

Stewie Griffin
quelle
2

PHP, 46 Bytes

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

Zählt die Anzahl der Einträge in $argvund vergleicht sie mit der Anzahl der eindeutigen Einträge. Wenn das erstere um 1 höher ist als das letztere, dann ist es wahr, sonst ist es falsch.

Probiere es auf eval.in aus!

roberto06
quelle
Müssen Sie den Variablennamen $ argv verwenden, können Sie stattdessen nicht einfach $ a verwenden?
Dading84
3
@dading84 $argvist die Liste der Befehlszeilenparameter. Also: nein, er kann nicht einfach benutzen $a.
Titus
2

05AB1E , 6 5 Bytes

{¥>ΘO

Probieren Sie es 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

1Als einziger Wahrheitswert in 05AB1E können wir hier aufhören. (Danke @Emigna für den Hinweis.)

Um nur zwei unterschiedliche Werte zu erhalten, können wir optional hinzufügen:

     Θ  # equals 1?                 -> 1
Arnauld
quelle
1
Wenn es in Ordnung ist, einen Falsey-Wert für die Falsey-Fälle zurückzugeben, können Sie den überspringen Θ, da dies 1der einzige Wahrheitswert in 05AB1E ist.
Emigna
@Emigna Danke! Ich war nicht sicher, ob es vom OP genehmigt wurde, aber ich denke, es ist.
Arnauld
Ich fürchte, Sie müssen zur vorherigen Lösung zurückkehren, da dies ¢nicht funktioniert. Es wäre zählen [19,4,4,9]als falsch und [19,9]als wahr , da er findet den 0in 10.
Emigna
@Emigna Danke, dass du das gesehen hast. Ich denke das ist behoben.
Arnauld
{¥_Osollte auch okay sein.
Emigna
2

APL (Dyalog Unicode) , 7 Byte SBCS

1=≢-≢∘∪

Probieren Sie es online!

Erläuterung:

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
voidhawk
quelle
1

Japt, 7 Bytes

â ʶUÊÉ

Versuch es


Erläuterung

Entferne Duplikate ( â), erhalte Länge ( Ê) und vergleiche Gleichheit ( ) mit der Länge ( Ê) der Eingabe ( U) minus 1 ( É).

Zottelig
quelle
Sind das nicht 12 Bytes? Sind das keine âÊɶMultibyte-Zeichen?
RedClover
1

05AB1E , 5 Bytes

gIÙg-

Probieren Sie es online!

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

In 05AB1E ist 1 der einzige Wahrheitswert. Für ein wahres Ergebnis muss also genau 1 doppeltes Element durch die Eindeutigkeit entfernt werden.

Riley
quelle