Beachten Sie, dass dies eine Frage ist, die sich hauptsächlich auf Datenstrukturen konzentriert
Einführung
Bacefook möchte, dass die Leute freundlicher sind! Als solche implementieren sie ein neues System, um Freunde vorzuschlagen! Ihre Aufgabe ist es, Bacefook bei der Implementierung des neuen Vorschlagsystems zu helfen.
Spezifikationen:
Ihr Programm muss ein REPL (read-eval-print Schleife) unterstützt 3 Arten von Befehl sein: FRIEND
, SUGGEST
und KNOW
.
FRIEND X Y
- Gibt an, dass X
und Y
Freunde im sozialen Netzwerk sind.
Wenn X mit Y befreundet ist, dann ist Y mit X befreundet
Kann, muss aber keine Ausgabe haben
X ist immer mit X befreundet
KNOW X Y
- Geben Sie einen Wahrheitswert aus, wenn X und Y befreundet sind, andernfalls ist dies falsch
KNOW X X
Gibt immer einen Wahrheitswert aus
SUGGEST X Y
- Geben Sie einen Wahrheitswert aus, wenn X und Y befreundet sein sollen, andernfalls ist dies falsch. X und Y sollten Freunde sein, wenn:
X und Y sind keine Freunde
X und Y haben mindestens 1 Freund gemeinsam
Sie sind zu ersetzen , erlaubt FRIEND
, SUGGEST
und KNOW
mit Ihren eigenen Saiten, aber man muss erwähnen , welche Zeichenfolge Sie jeden Befehl mit ersetzt haben.
Ihr Programm kann auf jede gewünschte Weise Eingaben / Ausgaben erzeugen, solange es einigermaßen einfach zu erkennen ist, wie es funktioniert.
Die Anzahl der Personen im sozialen Netzwerk N
liegt zwischen 1 und 100.000, es kann jedoch eine beliebige Anzahl von "Friend-Links" (Kanten) geben.
Wenn Sie es noch nicht bemerkt haben, handelt es sich um ein Problem bei der Suche nach Diagrammen. Die (wahrscheinlich) einfachste (und möglicherweise schnellste) Datenstruktur, um dies zu implementieren, wäre eine Adjazenzmatrix.
Testfälle
FRIEND A B
FRIEND A C
FRIEND B D
SUGGEST A B -> Falsy, as they are friends
SUGGEST A D -> Truthy, as they share B as a common friend
SUGGEST C D -> Falsy, they do not share a common friend
KNOW D B -> Truthy, they are friends
KNOW B C -> Falsy, not friends
=============
FRIEND Tom Tim
KNOW Tom Tim -> Truthy
KNOW Tim Tom -> Truthy
KNOW Tom Kit -> Falsy
=============
KNOW Tim Kit -> Falsy
FRIEND Tim Tom
KNOW Tim Kit -> Falsy
FRIEND Tom Kit
SUGGEST Tim Kit -> Truthy
=============
FRIEND X Y
SUGGEST X Y -> Falsy since X is friends with X
Hier noch ein paar Testfälle in Bildform
Gewinnbedingung
Das ist Code-Golf , der kürzeste Code gewinnt!
{A, B, C, D}
?SUGGEST UK EU
.Antworten:
SWI-Prolog,
624741 BytesProlog ist nicht allzu oft nützlich, aber wenn es ist, ist es einfach wunderschön. Wir werden verwenden
a+b
, um zu notieren, dassa
mit befreundet istb
,a*b
dasa
weißb
unda?b
das vorgeschlagen werdenb
solltea
oder nicht. Die erste Zeile sagt einfach, dassX*Y
entweder wahrX+Y
istY+X
oderX == Y
wahr ist. Dies setzt die Symmetrie des gegenseitigen Erkennens um. Es ist unglaublich einfach zu fragen, ob es einen Vorschlag geben sollte. Wir bitten nur , wenn es eine ist ,Z
so dassX*Y
falsch ist undX*Z
undY*Z
ist wahr. Genau wie in der Challenge beschrieben.Wenn Sie dies als Datei speichern (zB
friends.pl
) und SWI-Prolog mit dieser Datei öffnen (prolog -l friends.pl
), werden Sie in eine REPL abgelegt.Sie können Freundschaften wie diese behaupten:
Sie können überprüfen, ob die Leute sich kennen oder ob Vorschläge gemacht werden sollten:
quelle
k(X,Y)
mitX*Y
und das gleiche mitf
unds
verschiedenen Operanden verwenden. 21 Bytes, wenn ich richtig gezählt habe.f
.PHP,
138 133129 BytesPHP schlägt Mathematica - ein seltenes Ereignis.
druckt
1
für wahrheitsgemäße, leere Zeichenfolge für falsch. Laufen Sie mit-nr
oder testen Sie es online .benötigt PHP 7.1 für die Listenzuordnung; Benutzernamen Groß- und Kleinschreibung und sollte ausschließen
a
,b
,s
.Nervenzusammenbruch
$s
muss gekürzt werden, da es das Newline-Zeichen enthält.array_intersect_key
muss stumm geschaltet werden oder es würde Warnungen für leer$$a
oder ergeben$$b
.+18+15 Bytes für alle Benutzernamen: Ersetzen Sie$$a
mit$f[$a]
und$$b
mit$f[$b]
.quelle
CMD (Batch), 50 + 20 + 135 = 205 Bytes
FRIEND.CMD
KNOW.CMD
Drucke
1
für Freunde, eine leere Zeile für Fremde.SUGGEST.CMD
Druckt
1
oder eine leere Zeile. Ich denke, sechs aufeinanderfolgende%
s könnten eine neue persönliche Bestzeit sein.quelle
Python 3,
122118 + 2 = 120 BytesDie Verwendung entspricht genau der Antwort von ovs.
quelle
Python 3,
163149143 + 2 = 145 Bytes-6 Bytes dank @FelipeNardiBatista
Speichern Sie es in einer Datei und führen Sie es als
python3 -i file.py
Verwenden
-
f("a", "b")
anstelleFRIENDS a b
-
k("a", "b")
anstelleKNOW a b
-
s("a", "b")
anstelle von ausSUGGEST a b
Falsche Ausgabe: 0, set (), Falsche
Wahrheitsausgabe: nicht leere Menge, True
Probieren Sie es online aus
164 Bytes, wenn kein Python-Interpreter als REPL verwendet wird:
Verwendet
-
f
fürFRIEND
-
s
fürSUGGEST
- alles andere für
KNOW
Probieren Sie es online aus
quelle
l.extend([(a,b),(b,a)])
können Sie es nicht einfach tunl+=[(a,b),(b,a)]
? (Ich habe dies noch nicht getestet)UnboundLocalError
. Schöne Antwort übrigens!bool()
aus ders
Funktion entfernen und verwenden0
,{}
undFalse
als Falsey undTrue
undset
als Truthy nicht leer , können Sie 6 Bytes sparenMathematica, 164 Bytes
Definiert drei Hauptfunktionen
F
,S
undK
mit dem gewünschten Verhalten. Zum Beispiel die Befehlsfolgeist der letzte Testfall aus dem im OP verknüpften Bild; Die
F
Befehle liefern keine Ausgabe (das einzelne Semikolon scheint dafür einen geringen Preis zu zahlen), während die Befehle 6S
und 4 eine AusgabeK
liefernwie gewünscht.
Zu jeder Zeit
f
ist die Liste von geordneten Paaren der Form ,{A, B}
woA
weißB
, währendp
die Liste von Personen in einem Elemente zu erscheinenf
. Der AufrufF@{A, B}
fügt die vier geordneten Paare{A, B}
,{B, A}
,{A, A}
, und{B, B}
zuf
.Zu jedem Zeitpunkt
m
befindet sich auch die Adjazenzmatrix des zugrunde liegenden Graphen (eine Person grenzt an sich selbst und an alle ihreF
Freunde). Die Zeilen und Spalten werden durch indiziertp
undi
konvertieren eine Person in die entsprechende Zeilen- / Spaltennummer. Die Hilfsfunktiona
nimmt eine Matrix und zwei Personen als Eingaben und sucht nach dem Eintrag der Matrix, deren "Koordinaten" die beiden Personen sind, und gibt zurück,True
wenn die Zahl positiv ist undFalse
wenn sie Null ist. (Sie können auch anrufen,a
wenn eine der eingegebenen Personen noch nicht erkannt wurde, z. B. vor einer FREUND-Deklaration eine KNOW- oder SUGGEST-Abfrage durchführen oder nach einer armen Person fragen, die keine Freunde hat. Dies führt zu Fehlern, aber der Regel/._@__->0
erzwingt die AusgabeFalse
trotzdem.)Der Aufruf
K[A, B]
prüft daher, obm[A, B]
positiv ist, was dasK
Jetzt-Verb umsetzt . Das Matrixproduktm.m
ist die Länge-2-Pfad-Matrix, die die Anzahl der Wege enthält, die auf einem Pfad der Länge 2 von einer Person zur anderen gehen. Dies ermöglichtS[A, B]
die Implementierung desS
uggest-Verbs, sofern zusätzlich von Hand (&&!K@##
) geprüft wird, ob sich die eingegebenen Personen noch nicht kennen.Spaßtatsache: kostenlos, diese Implementierung ermöglicht es uns , Cliquen zu erklären Freunde-der Befehl
F@{A, B, C, D}
entspricht allenF@{A, B}
,F@{A, C}
,F@{A, D}
,F@{B, C}
,F@{B, D}
, undF@{C, D}
kombiniert.quelle
Python 2 , 118 Bytes
Probieren Sie es online!
Da ich kein Repl-Online-Tool für Python 2 finden konnte, habe ich das TIO Nexus (im REPL-Format) hinzugefügt.
Abfrage nach Option und möglicher Ausgabe
0 für Bekannt - Keine
1 für Freunde - Richtig oder falsch
2 für Suggest - True oder False
Anwendungsbeispiel und Beispielausgabe in einem Repl-Python-Interpreter.
quelle
GNU sed , 158 + 2 (rn Flags) = 160 Bytes
Da sed eine auf Regex basierende Sprache ist, gibt es keine primitiven Typen, ganz zu schweigen von abstrakten Datenstrukturen. Die Netzwerkdaten werden als Freiformat-Text gespeichert, in diesem Fall als redundante Friend-Links
A-B;B-A;
usw., die dann mit verschiedenen Regex-Mustern abgeglichen werden.Probieren Sie es online!
Sed führt standardmäßig das gesamte Skript für jede Eingabezeile aus. Ich empfehle, im interaktiven Modus zu testen, um die Ausgabe eines Befehls unmittelbar nach der Eingabe zu sehen.
Verwendung: In sed gibt es keine Wahrheits- / Falsch-Werte. Die von mir verwendete Ausgabekonvention stammt aus bash, wobei eine nicht leere Zeichenfolge als wahr und eine leere Zeichenfolge als falsch betrachtet wird.
F X Y
fürFRIEND X Y
. Es hat keine Ausgabe.K X Y
fürKNOW X Y
. Gibt 'K' als wahr und nichts als falsch aus.S X Y
fürSUGGEST X Y
. Gibt "S" als wahr und nichts als falsch aus.Erläuterung:
quelle