Notez que cette question se concentre principalement sur les structures de données
introduction
Bacefook veut que les gens soient plus amicaux! À ce titre, ils mettent en place un nouveau système pour proposer des amis! Votre tâche consiste à aider Bacefook à mettre en œuvre son nouveau système de suggestions.
Caractéristiques:
Votre programme doit être un REPL (boucle en lecture eval-print) supportant 3 types de commande: FRIEND
, SUGGEST
et KNOW
.
FRIEND X Y
- Spécifie cela X
et Y
sont amis sur le réseau social.
Si X est ami avec Y, alors Y est ami avec X
Peut, mais ne doit pas avoir de sortie
X est toujours ami avec X
KNOW X Y
- Produire une valeur véridique si X et Y sont amis, faux sinon
KNOW X X
produira toujours une valeur véridique
SUGGEST X Y
- Produire une valeur véridique si X et Y doivent être amis, faux sinon. X et Y devraient être amis si:
X et Y ne sont pas amis
X et Y ont au moins 1 ami en commun
Vous êtes autorisé à remplacer FRIEND
, SUGGEST
et KNOW
avec vos propres chaînes, mais vous devez mentionner avec quelle chaîne vous avez remplacé chaque commande.
Votre programme peut accepter des entrées / produire des sorties de n'importe quelle manière, tant qu'il est raisonnablement facile de reconnaître son fonctionnement.
Le nombre de personnes dans le réseau social N
est compris entre 1 et 100 000, mais il peut exister un nombre illimité de «liens amis» (bords).
Si vous ne l'avez pas encore remarqué, il s'agit d'un problème de recherche de graphique. La structure de données (probablement) la plus simple (et peut-être la plus rapide) pour implémenter cela serait une matrice d'adjacence.
Cas de test
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
Voici quelques cas de test supplémentaires sous forme d'image
Condition de victoire
C'est le code-golf , le code le plus court gagne!
{A, B, C, D}
?SUGGEST UK EU
.Réponses:
SWI-Prolog,
624741 octetsProlog n'est pas trop souvent utile, mais quand c'est le cas, c'est tout simplement magnifique. Nous utiliserons
a+b
pour noter quia
est ami avecb
,a*b
quia
saitb
eta?b
quib
devrait être suggéréa
ou non. La première ligne indique simplement queX*Y
est vrai si soitX+Y
,Y+X
ouX == Y
est vrai. Cela met en œuvre la symétrie de se connaître. Demander s'il doit y avoir une suggestion est incroyablement simple. Nous demandons simplement s'il y en a unZ
quiX*Y
est fauxX*Z
et quiY*Z
est vrai. Exactement comme décrit dans le défi.Si vous l'enregistrez en tant que fichier (par exemple
friends.pl
) et ouvrez SWI-Prolog avec ce fichier (prolog -l friends.pl
), vous obtenez déposé dans un REPL.Vous pouvez affirmer des amitiés comme ceci:
Vous pouvez vérifier si les gens se connaissent ou une suggestion doit être faite:
la source
k(X,Y)
avecX*Y
et même avecf
et ens
utilisant différents opérandes. 21 octets si j'ai compté correctement.f
.PHP,
138 133129 octetsPHP bat Mathematica - une occurrence rare.
imprime
1
pour chaîne véridique et vide pour fausse. Exécutez-le-nr
ou testez-le en ligne .nécessite PHP 7.1 pour l'affectation de liste; les noms d'utilisateur sont sensibles à la casse et exclure
a
,b
,s
.panne
$s
doit être rogné car il inclut le caractère de nouvelle ligne.array_intersect_key
doit être mis en sourdine ou il donnerait des avertissements pour vide$$a
ou$$b
.+18+15 octets pour tous les noms d'utilisateur: remplacez$$a
par$f[$a]
et$$b
par$f[$b]
.la source
CMD (lot), 50 + 20 + 135 = 205 octets
FRIEND.CMD
KNOW.CMD
Impressions
1
pour les amis, une ligne vierge pour les étrangers.SUGGEST.CMD
Imprime
1
ou une ligne vierge. Je pense que six%
s consécutifs pourraient être un nouveau record personnel.la source
Python 3,
122118 + 2 = 120 octetsL'utilisation est exactement la même que la réponse d'Ovs.
la source
Python 3,
163149143 + 2 = 145 octets-6 octets grâce à @FelipeNardiBatista
Enregistrez-le dans un fichier et exécutez-le sous
python3 -i file.py
Utiliser
-
f("a", "b")
au lieu deFRIENDS a b
-
k("a", "b")
au lieu deKNOW a b
-
s("a", "b")
au lieu deSUGGEST a b
Sortie Falsey: 0, set (),
sortie False Truthy: ensemble non vide, True
Essayez-le en ligne
164 octets lorsque vous n'utilisez pas l'interpréteur python comme REPL:
Utilise
-
f
pourFRIEND
-
s
pourSUGGEST
- autre chose pour
KNOW
Essayez-le en ligne
la source
l.extend([(a,b),(b,a)])
, ne pouvez-vous pas simplement le fairel+=[(a,b),(b,a)]
? (Je n'ai pas encore testé cela)UnboundLocalError
. Belle réponse d'ailleurs!bool()
de las
fonction, et utilisez0
,{}
etFalse
comme Falsey etTrue
et non videset
comme Truthy, vous pourriez économiser 6 octetsMathematica, 164 octets
Définit trois fonctions principales
F
,S
etK
avec le comportement souhaité. Par exemple, la séquence de commandesest le dernier cas de test de l'image liée dans l'OP; les
F
commandes ne produisent aucune sortie (le point-virgule unique semble un petit prix à payer pour cela), tandis que les six commandesS
etK
comme voulu.
A tout moment,
f
la liste des couples de la forme{A, B}
oùA
saitB
, alors quep
la liste des personnes apparaissant dans un élément def
. L' appelF@{A, B}
ajoute les quatre couples{A, B}
,{B, A}
,{A, A}
et{B, B}
àf
.Aussi, à tout moment,
m
est la matrice d'adjacence du graphe sous-jacent (une personne est adjacente à elle-même et à tous sesF
amis); les lignes et les colonnes sont indexées parp
eti
convertit une personne en numéro de ligne / colonne correspondant. La fonction d'assistancea
prend une matrice et deux personnes comme entrées et recherche l'entrée de la matrice dont les «coordonnées» sont les deux personnes, renvoyantTrue
si le nombre est positif etFalse
s'il est nul. (Il est également possible d'appelera
lorsque l'une des personnes saisies n'est pas encore reconnue - par exemple, faire une requête KNOW ou SUGGEST avant toute déclaration FRIEND, ou poser des questions sur une pauvre personne qui n'a pas d'amis; cela génère des erreurs, mais la règle/._@__->0
force la sortie à être deFalse
toute façon.)L'appel
K[A, B]
recherche donc s'ilm[A, B]
est positif, ce qui implémente leK
verbe now. Le produit matricielm.m
est la matrice de longueur à 2 voies, contenant le nombre de façons de passer d'une personne à une autre le long d'une voie de longueur 2; cela permetS[A, B]
d'implémenter leS
verbe uggest, tant que nous vérifions en outre à la main (&&!K@##
) que les personnes saisies ne se connaissent pas déjà.Fait d'amusement: gratuit, cette mise en œuvre nous permet de déclarer les cliques d'amis-la commande
F@{A, B, C, D}
est équivalente à tousF@{A, B}
,F@{A, C}
,F@{A, D}
,F@{B, C}
,F@{B, D}
etF@{C, D}
combiné.la source
Python 2 , 118 octets
Essayez-le en ligne!
Comme je ne pouvais pas trouver d'outil de repl en ligne pour python 2, j'ai ajouté le TIO Nexus (au format REPL).
Requête pour option et sa sortie possible
0 pour Connu - Aucun
1 pour les amis - Vrai ou faux
2 pour Suggérer - Vrai ou Faux
Exemple d'utilisation et exemple de sortie dans un interpréteur python repl.
la source
GNU sed , 158 + 2 (drapeaux rn) = 160 octets
Puisque sed est un langage basé sur des expressions rationnelles, il n'y a pas de types primitifs, sans parler des structures de données abstraites. Les données du réseau sont stockées sous forme de texte au format libre, dans ce cas sous forme de liens amis redondants comme
A-B;B-A;
etc., qui sont ensuite comparés à divers modèles d'expression régulière.Essayez-le en ligne!
De par sa conception, sed exécute l'intégralité du script pour chaque ligne d'entrée. Je recommande de tester en mode interactif, pour voir la sortie d'une commande immédiatement après avoir tapé.
Utilisation: il n'y a pas de valeurs true / falsy dans sed, donc la convention de sortie que j'utilise est empruntée à bash, où une chaîne non vide est considérée comme véridique et une chaîne vide comme falsy.
F X Y
pourFRIEND X Y
. Il n'a pas de sortie.K X Y
pourKNOW X Y
. Sorties «K» comme véridique, et rien comme fausse.S X Y
pourSUGGEST X Y
. Sorties «S» comme véridique, et rien comme fausseté.Explication:
la source