Schreiben Sie ein Programm, das für die Eingabe von 2 ganzzahligen Arrays verwendet und einen wahrheitsgemäßen Wert zurückgibt, wenn ein Element vorhanden ist, das in beiden Arrays vorhanden ist, oder ein falsches Element auf andere Weise. Die offensichtliche Lösung für dieses Problem wäre, jedes Element im ersten Array zu durchlaufen und es mit jedem Element im zweiten zu vergleichen. Hier ist jedoch der Haken: Ihr Programm muss eine algorithmische Komplexität von höchstens O (im schlimmsten Fall) aufweisen. NlogN), wobei N die Länge des längeren Arrays ist,
Testfälle:
{1,2,3,4,-5},{5,7,6,8} -> false
{},{0} -> false
{},{} -> false
{1,2},{3,3} -> false
{3,2,1},{-4,3,5,6} -> true
{2,3},{2,2} -> true
Dies ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
O(n log n)
ist im Allgemeinen machbar, aber die Klarstellung, nur native Ganzzahlen zu behandeln, bedeutet, dass in einigen Sprachen mit begrenzten Ganzzahlbereichen eine lineare Lösung möglich ist (z. B. durch eine Nachschlagetabelle mit einer Größe von 2 ^ 64)Antworten:
Eigentlich 1 Byte
Probieren Sie es online aus!
Dies ist lediglich die eingebaute festgelegte Kreuzung. Der resultierende Wert ist der Schnittpunkt der beiden Mengen - eine nicht leere Liste (die ein wahrheitsgemäßer Wert ist), wenn es einen Schnittpunkt gibt, und eine leere Liste (die ein falscher Wert ist), andernfalls.
Komplexität
Laut dem Python-Wiki hat die Mengenschnittstelle eine Zeitkomplexität im ungünstigsten Fall von
O(N*M)
(wobeiN
undM
sind die Längen der beiden Mengen). Die zeitliche Komplexität ist jedoch nur dann so schlecht, wenn die beiden Sätze unterschiedliche Objekte enthalten, die alle denselben Hashwert haben (z. B.{"some string"} & {hash("some string")}
). Da die Mengenelemente in diesem Fall nur Ganzzahlen sind (und keine zwei Ganzzahlen den gleichen Wert haben, es sei denn, sie sind gleich), ist die tatsächliche Komplexität im ungünstigsten FallO(min(N, M))
(linear in der Länge der kleineren der beiden Mengen). Die Konstruktion jeder Menge istO(N)
(linear in der Anzahl der Elemente), also ist die GesamtkomplexitätO(max(N, M))
(die Komplexität wird durch die Konstruktion der größeren Menge dominiert).quelle
TSQL,
403736 BytesSQL hat keine Arrays, sondern verwendet stattdessen Tabellen
Gibt -1 für wahr oder 0 für falsch zurück
Versuch es
quelle
Ruby, 37 Bytes:
Wie in der Definition: "Programm, das für die Eingabe 2 ganzzahlige Arrays verwendet und einen wahrheitsgemäßen Wert zurückgibt, wenn ...", ist dies ein Programm, das 2 Arrays als Zeichenfolgen in der Eingabe akzeptiert, true oder false zurückgibt.
als Funktion - 14 Bytes:
Komplexität:
In der Ruby-Dokumentation des Operators itnersection (&) heißt es: "Es vergleicht Elemente mit ihren Hash- und EQL-Methoden, um die Effizienz zu steigern." Ich nehme an, genau das ist, wonach wir suchen.
Empirisch:
Welches scheint es zu bestätigen.
quelle
Perl, 25 + 1 = 26 Bytes in Zusammenarbeit mit Dada
Führen Sie mit
-a
(1 Byte Strafe).Eine verbesserte Version des folgenden Programms (die aufbewahrt wird, um den Verlauf der Lösung anzuzeigen und die Lösung zu zeigen, die ich selbst gefunden habe; sie enthält auch weitere Erklärungen). Die
-a
Option liest durch Leerzeichen getrennte Arrays als Eingabe und speichert sie in@F
. Wir verwenden das%a
Wörterbuch (Zugriff als$a{$_}
), um eine Bitmaske zu speichern, in der sich die Eingabearrays befinden, und drucken1
jedes Mal, wenn in beiden Arrays ein Element angezeigt wird, dh ein Wert über 2 in der resultierenden Bitmaske (glücklicherweise wird ein fehlgeschlagener Vergleich zurückgegeben die Nullzeichenfolge, alsoprint
macht die nichts). Wir können nicht verwenden,say
weil eine Newline in Perl wahr ist. Die Leistung ist asymptotisch dieselbe wie bei der älteren Version des Programms (jedoch schneller in Bezug auf konstante Faktoren).Perl, 44 + 1 = 45 Bytes
Führen Sie mit
-p
(1 Byte Strafe). Geben Sie ein Array pro Zeile ein und trennen Sie die Elemente durch Leerzeichen.Dies funktioniert durch Erstellen einer Hash-Tabelle
%a
, in der eine Bitmaske der Eingabearrays gespeichert wird, in denen ein Wert angezeigt wurde. Wenn dies sowohl im Array in Zeile 1 als auch in Zeile 2 angezeigt wird, speichert die Bitmaske daher den Wert 3. Umkehren der Wenn Sie sehen, ob 3 einen entsprechenden Schlüssel hat, wissen Sie, ob es gemeinsame Werte gibt.Die Komplexität dieses Algorithmus ist O (n), wenn Sie die Hash-Erstellung als konstante Zeit betrachten (wenn Sie ganze Zahlen begrenzt haben, wie es Perl tut). Bei Verwendung von Bignum-Ganzzahlen (die in dieses Programm eingegeben werden könnten, da die Eingabe als Zeichenfolge belassen wird) wäre die Komplexität des Algorithmus selbst nominell O (n log n) für jede Hash-Erstellung und O (n) für die Hash-Umkehrung, die sich zu O (n log n) addiert. Der Hashing-Algorithmus von Perl leidet jedoch unter der potenziellen O (n²) -Leistung bei böswillig ausgewählten Eingaben. Der Algorithmus ist jedoch randomisiert, um es unmöglich zu machen, zu bestimmen, was diese Eingabe ist (und es ist möglich, dass sie nicht einfach mit ganzen Zahlen ausgelöst werden kann). Daher ist es fraglich, mit welcher Komplexitätsklasse sie "moralisch" zählt. Zum Glück spielt dies keine Rolle, wenn es dort ist. '
Dieser Code funktioniert für andere Eingaben als Ganzzahlen, aber nicht für mehr als zwei Arrays (weil der fest
3
codiert ist und weil die Eingabe in der dritten Zeile die Bitmaske nicht korrekt ist, da es sich nicht um eine Zweierpotenz handelt). Eher ärgerlich ist, dass der Code natürlich eines der doppelten Elemente zurückgibt, was in fast allen Fällen"0"
wahr ist, in Perl jedoch falsch ist und ein gültiges doppeltes Element im Array darstellt. Als solches musste ich drei Bytes vor+
der Ausgabe verschwenden , was der billigste Weg ist, eine wahrheitsgemäße Ausgabe im Randfall der Arrays zu liefern, die sich bei überlappen0
. Wenn ich darf Vorstellungen von truthy und Falsey aus einer anderen Sprache als Perl (in dem jede nicht leere Zeichenkette ist truthy) verwenden, können Sie ändern ,"+$_"
um$_
drei Byte zu speichern.quelle
perl -apE '$\|=($a{$_}|=$.)==3for@F}{'
sollte das gleiche Verhalten für 17 weniger Bytes haben ;-)-a
Flagge nicht bewusst . Das scheint hier zu helfen, nicht wahr? Ich denke, Sie können jedoch zwei weitere Bytes speichern ($\|=}{
undprint
sind gleich lang, und letzteres ermöglicht es Ihnen, das-p
Flag und damit ein Byte von Strafen zu vermeiden ; und==3
kann durch ein>2
anderes Byte ersetzt werden). Schade, dass$1
usw. bereits Variablen sind, oder wir könnten weitere drei Bytes sparen, indem wir den gesamten Bereich der Variablennamen als Hash-Tabelle verwenden.-a
(und-F
) sind sehr praktisch bei PPCG (mehr als bei Anagolf, da es dort mehr kostet)! Da Sie nach dem ein Leerzeichen benötigenprint
, ist es genauso lang wie-p ... $\=}{
, aber warum nicht. (Ja, es ist traurig, dass wir nicht ändern können$1
usw.)p$\|=}{
(sieben Zeichen, wobei dasp
eine Strafe ist); Ich habeprint
(sechs Zeichen, einschließlich eines Leerzeichens). Ich denke, Sie haben das|
in Ihrer Berechnung gerade dort verpasst .Python2 -
4130 BytesMengenschnittpunkt: O (min (N, M)) wobei N und M die Länge der Mengen sind.
Konvertierung von einer Liste in eine Menge: O (max (N, M))
set(a).intersection(b)
->set(a)&set(b)
f=
quelle
set(a)&set(b)
die Schnittstellenmethode verwenden, anstatt sie aufzurufen.{0}
dann können Sie ihn auf 28 Bytes reduzieren :lambda a,b:set(a)&set(b)>{0}
{1}&{1}
ist wahr, während{1}&{2}
ist falsch. Du kannst es einfach tunlambda a,b:a&b
.f=
funktioniert jedoch.Axiom, 439 Bytes
Dies konvertiert die erste Liste in einer Liste als [[i, 1], [i, 2] ...] die zweite Liste in einer Liste als [[1, i], [0, i] ...] wobei i ist die imaginäre Variable, die die Liste 2 zusammenführt und eine Sortierung vornimmt, die ermittelt, ob ein Element der Liste 1 in der Liste 2 vorhanden ist, sodass es endlich O (N log N) ist, wobei N = Länge Liste 1 + Länge Liste 2 ist
ungolfed
Ergebnisse
Ich verstehe nicht, warum es Code für r und s "löscht" ...
quelle
PowerShell,
88787723 ByteDank @briantist für Abschaben eines satten 54 Bytes von meinem ursprünglichen, ausführlichere Antwort durch Verkürzung
-IncludeEqual
,-ExcludeDifferent
und-Not
!Ich kann die Quelle für nicht finden
Compare-Object
(diff
ist ein Alias fürCompare-Object
), daher bin ich mir der zeitlichen Komplexität nicht sicher.quelle
!!(diff -inc -ex $A $B)
-i
anstelle von verwenden-inc
. In 5+ sind die-Information*
allgemeinen Parameter jedoch nicht-i
eindeutig.if
Aussage aufgenommen werden; du brauchst es überhaupt nicht! Außerdem wird v5 mit Windows 10 und v5.1 mit Server 2016 geliefert. Sie können WMF5 auch herunterladen und installieren, soweit ich glaube, Windows 7 / 2008R2. Es ist seit einiger Zeit veröffentlicht!Compare-Object
bin ich skeptisch, dass dies O (NlogN) ist. Zweitens ist die Eingabe über vordefinierte Variablen ein Nein-Nein. Sie benötigen also ein Vorwortparam($a,$b)
oder ähnliches.param($A,$B)!!(diff -Inc -Ex $A $B)
- Dann speichern Sie es als .ps1-Datei und rufen Sie es von der Befehlszeile mit den Arrays als Argumente auf, wiePS C:\Scripts>.\same-element.ps1 @(1,2) @(2,3)
PHP , 15 Bytes
Probieren Sie es online aus!
Ein integriertes PHP als aufrufbare / Lambda-Funktion. Return ist ein PHP
truthy
/falsey
testbarer Wert. Gemäß der anderen PHP-Übermittlung sollte diese Implementierung auch die Anforderungen an die Komplexität der Herausforderung ( StackExchange ) erfüllen .quelle
R, 23 Bytes
Wenn wir davon ausgehen, dass immer nur ein Element übereinstimmt und dies
1
ein wahrer Wert ist (der in R angegeben ist ), können wir schreiben:Das sind 21 Bytes.
quelle
PHP,
5551 BytesVerwendung: In einer Datei speichern und vom Browser aus aufrufen:
intersect.php?a[]=1&a[]=2&a[]=3&b[]=0&b[]=4&b[]=5
Ausgänge0
fürfalse
.intersect.php?a[]=1&a[]=2&a[]=3&b[]=0&b[]=4&b[]=1
Ausgänge1
fürtrue
.In Bezug auf die Komplexität konnte ich keine Referenzen finden, aber laut diesem Beitrag von StackOverflow sollte das Skript in Ordnung sein
quelle
GolfScript, 1 Byte
Wenn die Eingabe direkt als Arrays auf dem Stapel zulässig ist, sollte diese Ein-Byte-GolfScript-Lösung die folgenden Spezifikationen erfüllen:
Wenn textbasierte E / A erforderlich ist, muss die Eingabe zuerst ausgewertet werden, wobei die Länge auf zwei Bytes erhöht wird:
Beide Lösungen verwenden den GolfScript-Array-Schnittpunktoperator, der mit dem entsprechenden Operator in Ruby implementiert wird . Sie geben ein leeres Array (das falsch ist) zurück, wenn die Arrays keine übereinstimmenden Elemente enthalten, oder ein nicht leeres Array (das wahr ist), das ansonsten alle übereinstimmenden Elemente enthält.
Ich konnte bisher keine Dokumentation über die interne Implementierung oder die asymptotische Komplexität des Ruby-Array-Schnittpunktoperators finden, abgesehen von der kurzen Aussage, dass "Elemente mit ihren Hash- und EQL-Methoden auf Effizienz verglichen werden". Eine vernünftige Implementierung unter Verwendung von Hash-Tabellen würde jedoch in O ( n ) -Zeit ausgeführt (vorausgesetzt, Hashing und Vergleiche sind O (1)), und einige schnelle Leistungstests legen nahe, dass dies tatsächlich der Fall ist:
Diese Tests wurden mit dem GolfScript-Programm durchgeführt
~2?.2*,/&
, das eine ganze Zahl k verwendet , eine arithmetische Folge von 2 × 2 k Elementen erzeugt, diese in zwei Arrays von 2 k Elementen aufteilt und ihren (offensichtlich leeren) Schnittpunkt berechnet. Die roten Sterne zeigen die gemessene Ausführungszeit t in Sekunden (auf einer logarithmischen Skala) für verschiedene Werte von k , während die grüne Linie die Funktion t = c × 2 k darstellt , wobei die Skalierungskonstante c ≈ 2 −17.075 am besten gewählt wurde Passen Sie die gemessenen Daten an.(Beachten Sie, dass in einem Log-Log-Diagramm wie diesem jede Polynomfunktion der Form t = c × (2 k ) a eine gerade Linie ergeben würde. Die Steigung der Linie hängt jedoch vom Exponenten a und den Daten ab ist mit Sicherheit bei gleichbleibenden einem = 1 wie oben. FWIW durch die grüne Linie dargestellt ist , die numerischen best-fit - Exponenten für diesen Datensatz war ein ≈ 1,00789) .
quelle
JavaScript (ES6), 39 Byte
Wird schlechter als O (n + m) sein, aber hoffentlich nicht so schlecht wie O (n * m).
quelle
Rost, 103 Bytes
Nimmt zwei Array-Slices (oder Verweise auf vollständige Arrays, sie werden automatisch auf Slices dereferenziert), bündelt sie zu Sets und prüft, ob sie nicht disjunkt sind. Ich bin nicht ganz sicher, wie Set Union in der Rust-Standardbibliothek implementiert ist, aber es sollte im schlimmsten Fall O (n + m) sein.
Ohne Sammlungen zu verwenden, besteht die einfachste Alternative darin, beide Arrays zu sortieren und sie dann sorgfältig zu durchsuchen, um nach Duplikaten zu suchen. Etwas wie das
Aber das erfordert zu viel Mutation, um Spaß beim Golfen in Rust IMO zu haben :)
quelle
Python, 11 Bytes
Eingebaut, das 2 Sätze nimmt und eine Kreuzung auf ihnen macht
quelle
Axiom,
50221 Bytesungolfed
g (a, b) erhält das größere Array zwischen a und b; Angenommen, es hat N Elemente: Sortieren Sie das Array, führen Sie eine binäre Suche mit Elementen des anderen Arrays durch. Dies wäre O (Nlog (N)). Es gibt 0 für kein Element von a in b, andernfalls 1 zurück.
Ergebnisse
quelle
Gelee , 2 Bytes
Probieren Sie es online aus!
Erläuterung
quelle