Ganzzahlige Listen von Noah


25

Einführung:

Ich denke, wir haben alle davon gehört, aber hier eine kurze Zusammenfassung: Noah sammelte zwei von jeder Tierart auf dem Planeten, männlich und weiblich, um während einer großen Flut in seiner Arche zu retten. Das eigentliche Zitat aus der Bibel lautet:

Genesis 7: 2-3
Du musst sieben von jeder Art von sauberem Tier mitnehmen, das Männchen und seinen Gefährten, zwei von jeder Art von unreinem Tier, das Männchen und seinen Gefährten und sieben von jeder Art von Vogel am Himmel , männlich und weiblich, um ihre Nachkommen auf der Erde zu bewahren.
Quelle

Aber um dieser Herausforderung willen werden wir den sauberen / unreinen Teil und den Teil, in dem er sieben von jedem Tier genommen hat, ignorieren. Bei dieser Herausforderung geht es nur um diesen Teil:

Zwei von jeder Art von unreinem Tier, das Männchen und sein Gefährte

Herausforderung:

Eingang:

Sie erhalten eine Liste mit positiven ganzen Zahlen (in zufälliger Reihenfolge).

Ausgabe:

Zwei unterschiedliche Werte, die anzeigen, ob es sich um eine 'Liste von Noah' handelt oder nicht. Dies muss nicht unbedingt ein wahrer / falsey- Wert sein, es könnte sich also auch um 0/ 1in Java / C # handeln oder 'A'/'B' in einer beliebigen Sprache handeln, um einige Beispiele zu nennen.

Wann ist eine Liste eine 'Liste von Noah'? Wenn genau zwei von jeder Ganzzahl in der Liste sind.

Herausforderungsregeln:

  • I / O ist flexibel. Die Eingabe kann eine Liste / ein Array / ein Datenstrom aus Ganzzahlen / Gleitkommazahlen / Zeichenfolgen sein oder einzeln aus STDIN gelesen werden. Die Ausgabe kann zwei verschiedene sein Werten bestehen, die von einer Funktion oder einer Ausgabe an STDOUT / a-Datei zurückgegeben werden.
  • Die Ganzzahlen in der Eingabeliste sind in zufälliger Reihenfolge und es wird garantiert, dass sie im Bereich 1 n 100000 positiv sind1n100000 .
  • Die Eingabeliste ist garantiert nicht leer.
  • Wenn über 2 ein ganzzahliges Vielfaches von 2 vorliegt (dh 4, 6, 8 usw.), ist dies falsch. Dh [6,4,4,6,4,7,4,7]ist Falsey, obwohl Sie noch gleiche Paare wie diese schaffen könnte: [[4,4],[4,4],[6,6],[7,7]].

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp, verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu (z. B. TIO ).
  • Außerdem wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.

Testfälle:

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
Und im Koran auch; Sure Al-Mumenoon, Vers 27: Also haben wir ihn (mit dieser Botschaft) inspiriert: "Baue die Arche in unseren Augen und unter unserer Führung. Wenn dann Unser Befehl kommt und die Brunnen der Erde sprudeln, nimmst du Paare an Bord von jeder Spezies, männlich und weiblich, und von deiner Familie - außer denen von denen, gegen die das Wort bereits vorgegangen ist: Und richte Mich nicht zugunsten der Übeltäter an, denn sie werden (in der Sintflut) ertrinken Ali)
Ishaq Khan

Antworten:



13

05AB1E , 4 Bytes

¢<PΘ

Probieren Sie es online! oder als Testsuite

Erläuterung

¢      # count all occurrences of each element in the input list
 <     # decrement each
  P    # product
   Θ   # is equal to 1

Ah, ich hatte vorbereitet ¢2QP , aber die Verwendung Θist auch eine schöne Alternative. :)
Kevin Cruijssen

Ich dachte, ich hätte eine 3 mit {ιË, aber das schlägt natürlich fehl, wenn ganze Zahlen viermal auftreten.
Grimmy

9

Brachylog , 4 Bytes

ọtᵛ2

Probieren Sie es online!

Erläuterung

ọ           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 Bytes

-6 Bytes dank digEmAll durch Änderung der Eingabemethode

any(table(scan())-2)

Probieren Sie es online!

Gibt aus, FALSEob es sich um eine Liste von Noah handelt, undTRUE andernfalls. Funktioniert für jeden Eingabetyp, nicht nur für ganze Zahlen.

Berechnet die Anzahl der einzelnen Werte in der Liste und prüft, ob sich die Anzahl von 2 unterscheidet.


Sie könnten die Eingabe von stdin nehmen, indem Sie 6 Bytes sparen: Probieren Sie es online aus!
digEmAll

@digEmAll Danke; Ich habe die Herausforderungsregeln falsch verstanden und dachte, das sei nicht erlaubt.
Robin Ryder



6

Haskell , 33 Bytes

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

Probieren Sie es online!

Für jedes Element der Eingabe stellen wir sicher, dass es zweimal in der Eingabeliste angezeigt wird.

sum[1|b<-x,b==a]ist nur eine Golfspielerversion von length(filter(==a)x).


6

Perl 6 , 18 Bytes

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

Probieren Sie es online!

  • .Bagwandelt die Eingabeliste in eine Bag--a Menge mit Multiplizität um.
  • {*} extrahiert alle Multiplizitäten.
  • .all schafft eine Verknüpfung der Multiplizitäten.
  • == 2 ergibt eine andere und-Verknüpfung von Booleschen Werten, die jeweils wahr sind, wenn die Multiplizität 2 ist.
  • so Reduziert die Junction auf einen einzelnen Booleschen Wert.

5

J , 10 Bytes

[:*/2=#/.~

Probieren Sie es online!


3
auch 10 Bytes: [:*/2=1#.=Ich möchte diese Kappe wirklich entfernen, kann aber nicht herausfinden, wie.
Cole

1
Als ich das ausprobierte, bekam ich deine Lösung. Wenn Sie wirklich die Kappe entfernen wollten, konnten Sie 2*/@:=1#.=auch 10 Bytes tun
Conor O'Brien

@cole Schöne Alternative!
Galen Ivanov

@ ConorO'Brien Ja, auch @:hier ist es praktisch.
Galen Ivanov

1
@GalenIvanov muss monadic lieben =, so seltsam nützlich in Nischen-Golf-Szenarien
Cole

4

MS SQL Server 2017 , 152 150 146 Bytes

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

Die lesbare Version:

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

Probieren Sie es auf SQL Fiddle !

-2 Bytes dank Kevin Cruijssen


1
Kann das nicht nach dem centfernt werden, da Sie den Alias ​​nicht verwenden COUNT(*)?
Kevin Cruijssen

@ KevinCruijssen, Sie haben Recht, danke.
Andrei Odegov

4

Haskell , 61 45 Bytes

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

Probieren Sie es online!

Vielen Dank an @KevinCruijssen für 12 Bytes und @nimi für weitere 4 Bytes.

Erste Antwort von Haskell, aber es war überraschend einfach. Kann wahrscheinlich viel golfen werden. Ein typisches Beispiel ...


3
Ich kenne Haskell nicht, aber ich bin mir ziemlich sicher, dass es so sein all(True==).map(2==)kann all(2==). :)
Kevin Cruijssen

4
... und bewegen sich lengthzu all: all((2==).length).group.sort. Es ist nicht erforderlich, der Funktion einen Namen zu geben f=.
nimi

Tatsächlich habe ich das all(2==)beim Testen in GHCi übersehen. Danke Kevin und Nimi, ich aktualisiere die Antwort.
J. Sallé

4
... oh und für die Zukunft: all(True==)ist and.
nimi

4

JavaScript (ES6), 37 Byte

Gibt für Noah false oder für Nicht-Noah true zurück .

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

Probieren Sie es online!

Kommentiert

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 Byte SBCS

Anonyme implizite Präfixfunktion. Rückgabe 0/ 1.

∧/2=⊢∘≢⌸

Probieren Sie es online!

 Rufen Sie für jeden Wert als linkes Argument und die Indizes des Vorkommens dieses Werts als rechtes Argument auf:

 Berechnen Sie das rechte Argument (die Vorkommen)
 und
 geben Sie es zurück. Ignorieren Sie das linke Argument

2= Boolesche Liste, die angibt, welche Zahlen 2 sind

∧/ UND-Verknüpfung (dh sind sie alle wahr?)


3

PowerShell , 66 37 26 Bytes

-11 bytes dank mazzy

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

Probieren Sie es online!

Gruppen bis $lund packt alle die Grafen von passenden Werten. Anschließend werden alle Zählungen von 2 aus dieser Liste herausgefiltert. Wenn die Liste leer ist, ist es eine Noah-Nummer. Andernfalls wird es immer noch mit Zählungen ungleich 2 gefüllt. TrueWird die Liste nicht angezeigt, ergibt sich, wenn sie leer und mit FalseDaten gefüllt ist


1
Schlägt fehl, wenn sich die Werte ausgleichen .. dh [1,2,1,1], so dass die Zählung 4 ist, die Zählung von Unique 2 ist und sich daher als Noah auflöst, obwohl es kein Noah ist.
Abgelaufene Daten

@ExpiredData Heck
Veskah

Ich habe diesen Ansatz in einer anderen Sprache ausprobiert, bevor mir klar wurde, dass er einfach nicht funktioniert ...
Abgelaufene Daten

1
¯ \ _ (ツ) _ / ¯ 26
mazzy

1
@mazzy Danke. group
Ich habe

3

PHP , 60 Bytes

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

Probieren Sie es online!

PHP hat großartige eingebaute Funktionen, obwohl es mit 20 Zeichen array_count_values()kein besonders Golfspiel ist.


PHP hat immer tolle eingebaute Funktionen, mit langen Namen, seufz!
Night2

3

Mathematica, 25 24 Bytes

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

Probieren Sie es online!

Die TallyFunktion gibt eine Liste des Formulars zurück , die dann mit einem Muster abgeglichen wird, das prüft, ob alle Zähler 2 sind.{{element, count}, ...}


3

Attache , 16 Bytes

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

Probieren Sie es online!

Erläuterung

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

Alternativen

17 Bytes: {All&_!`=&2@`~&_}

18 Bytes: {All[`=&2@`~&_,_]}

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

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

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

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

35 Bytes: {Commonest@_==Unique@_and _[0]~_=2}


3

TI-Basic, 47 Bytes

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

Ich bin ein großer Fan von TI-Basic. Es ist keine großartige Sprache für wirklich jeden Zweck, aber ich programmiere (und spiele) gerne darin.

Wie funktioniert dieser Code?

Zunächst wird die Liste sortiert.

Zweitens wird die Funktion function List verwendet, um eine weitere Liste zu erstellen, die den Unterschied zwischen den Elementen der sortierten Liste darstellt. (Zum Beispiel würde △ List ({1,3,7,8}) {2,4,1} ergeben). Gilt nicht für diese Liste, bei der jedes Nicht-Null-Element der Liste in Null und jede Null in Eins konvertiert wird.

Anschließend prüft das Programm, ob die resultierende Liste zum Muster passt {1, 0, 1, 0, ...} ist nur dann der Fall, wenn es sich bei der ursprünglichen Liste um eine Noah-Liste handelt.

Es gibt auch eine zusätzliche Überprüfung, ob die Länge der Liste gerade ist, um einige Randfälle zu erfassen.

Hier sind einige Screenshots von Testfällen:

Einige Testfälle Noch ein paar Testfälle


3

Julia 1.0 , 32 Bytes

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

Probieren Sie es online!

Dividiert jedes Element des Eingabearrays ldurch die Transponierte und l'ergibt eine Matrix. Das Summieren über diese Matrix beim Anwenden isoneauf jedes Element ergibt die doppelte Länge, als lwenn jedes Element genau zweimal erscheint.



3

Julia , 30 Zeichen 26 Bytes

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

Danke, H.PWiz für diesen Trick!

Probieren Sie es online!


1
Sie können !a=all(x->2==sum(a.==x),a)für 26 Bytes haben. NB. Ich empfehle, auf dieser Site in Bytes zu zählen
H.PWiz

Vielen Dank! Ich wusste nicht, dass Sie (ab) !für anonyme Funktionen verwenden können
user3263164


2

VDM-SL , 64 Bytes

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

Erläuterung

VDM funktioniert überwiegend wie logische Anweisungen zweiter Ordnung.

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

Da Sie TIO VDM nicht verwenden können, erfolgt hier die Ausgabe einer Debug-Sitzung


Ich weiß, dass es wahrscheinlich keinen Online-Compiler dafür gibt, aber könnten Sie vielleicht einige Screenshots (von einigen) der Testfälle als Verifikation hinzufügen? :)
Kevin Cruijssen

@KevinCruijssen sparte einige Bytes, um den Fehler zu beheben, wodurch der Code selbst wahrscheinlich verständlicher wurde. Ich werde auch eine Erklärung hinzufügen :)
Abgelaufene Daten





2

Excel, 45 Bytes

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

Nimmt Daten in Spalte A an, wobei diese in einer anderen Zelle als einer in Spalte A eingegeben werden. Gibt TRUE zurück, wenn Paare vorhanden sind, und FALSE, wenn sie nicht mit Paaren übereinstimmen

        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

Es wurde versucht, die / 2 zu entfernen und .5 für die Summierung hinzuzufügen, aber das hat nicht funktioniert.
Versucht, die Frequenzen zu zählen, die <> 2 sind, und dies ergab nicht den richtigen Betrag.


2

Oktave / MATLAB, 22 21 Bytes

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

Anonyme Funktion, die einen numerischen Vektor eingibt und ausgibt, 0ob der Vektor die Bedingung erfüllt oder 1nicht.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.