Tenga en cuenta que esta es una pregunta que se centra principalmente en estructuras de datos
Introducción
¡Bacefook quiere que la gente sea más amable! Como tal, ¡están implementando un nuevo sistema para sugerir amigos! Su tarea es ayudar a Bacefook a implementar su nuevo sistema de sugerencias.
Presupuesto:
Su programa debe ser un REPL (loop-eval-print leer) que soporta 3 tipos de comandos: FRIEND, SUGGESTy KNOW.
FRIEND X Y- Especifica eso Xy Yson amigos en la red social.
Si X es amigo de Y, entonces Y es amigo de X
Puede, pero no tiene que tener salida
X siempre es amigo de X
KNOW X Y - Emite un valor verdadero si X e Y son amigos, de lo contrario, falso
KNOW X Xsiempre dará como resultado un valor verdadero
SUGGEST X Y- Emite un valor verdadero si X e Y deben ser amigos, de lo contrario, falso X e Y deberían ser amigos si:
X e Y no son amigos
X e Y tienen al menos 1 amigo en común
Se le permite sustituir FRIEND, SUGGESTy KNOWcon sus propias cadenas, pero hay que mencionar lo que la cadena ha reemplazado con cada comando.
Su programa puede recibir entrada / salida de la forma que desee, siempre y cuando sea razonablemente fácil reconocer cómo funciona.
El número de personas en la red social Nestá entre 1 y 100,000, pero puede haber cualquier número de "enlaces de amigos" (bordes).
Si aún no lo ha notado, este es un problema de búsqueda de gráficos. La estructura de datos (probablemente) más fácil (y posiblemente más rápida) para implementar esto sería una matriz de adyacencia.
Casos de prueba
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
Aquí hay algunos casos de prueba más en forma de imagen
Condición de victoria
Este es el código de golf , ¡el código más corto gana!

{A, B, C, D}?SUGGEST UK EU.Respuestas:
SWI-Prolog,
624741 bytesProlog no suele ser útil, pero cuando lo es es simplemente hermoso. Solíamos
a+banotar queaes amigob,a*bqueasabebya?bquebdebería sugerirseao no. La primera línea simplemente dice queX*Yes verdad si bienX+Y,Y+XoX == Yes cierto. Esto implementa la simetría de conocerse entre sí. Preguntar si debería haber una sugerencia es increíblemente simple. Sólo pedimos que si hay unaZtal queX*Yes falso yX*Z, yY*Zes cierto. Exactamente como se describe en el desafío.Si guarda esto como un archivo (p
friends.pl. Ej. ) Y abre SWI-Prolog con este archivo (prolog -l friends.pl), se lo colocará en un REPL.Puedes afirmar amistades como esta:
Puede verificar si las personas se conocen entre sí o se deben hacer sugerencias:
fuente
k(X,Y)conX*Yy lo mismo confysusando diferentes operandos. 21 bytes si he contado correctamente.f.PHP,
138133129bytesPHP supera a Mathematica, una ocurrencia rara.
impresiones
1para la verdad, cadena vacía para la falsedad. Ejecutar-nro probarlo en línea .necesita PHP 7.1 para la asignación de la lista; nombres de usuario entre mayúsculas y minúsculas y deben excluir
a,b,s.Descompostura
$stiene que recortarse porque incluye el carácter de nueva línea.array_intersect_keytiene que estar silenciado o generará advertencias para vacío$$ao$$b.+18+15 bytes para todos los nombres de usuario: Reemplace$$acon$f[$a]y$$bcon$f[$b].fuente
CMD (Lote), 50 + 20 + 135 = 205 bytes
AMIGO.CMD
SABER.CMD
Impresiones
1para amigos, una línea en blanco para extraños.SUGGEST.CMD
Impresiones
1o una línea en blanco. Creo que seis%s consecutivos podrían ser una nueva mejor marca personal.fuente
Python 3,
122118 + 2 = 120 bytesEl uso es exactamente el mismo que el de la respuesta de ovs.
fuente
Python 3,
163149143 + 2 = 145 bytes-6 bytes gracias a @FelipeNardiBatista
Guárdelo en un archivo y ejecútelo como
python3 -i file.pyUsar
- en
f("a", "b")lugar deFRIENDS a b- en
k("a", "b")lugar deKNOW a b- en
s("a", "b")lugar deSUGGEST a bSalida de Falsey: 0, set (),
salida de False Truthy: conjunto no vacío, True
Pruébalo en línea
164 bytes cuando no se usa el intérprete de python como REPL:
Utiliza
-
fparaFRIEND-
sparaSUGGEST- cualquier otra cosa para
KNOWPruébalo en línea
fuente
l.extend([(a,b),(b,a)]), ¿no puedes simplemente hacerlol+=[(a,b),(b,a)]? (No he probado esto todavía)UnboundLocalError. Buena respuesta por cierto!bool()de lasfunción, y usa0,{}yFalsecomo Falsey yyTrueno está vacíosetcomo Truthy, podría guardar 6 bytesMathematica, 164 bytes
Define tres funciones principales
F,SyKcon el comportamiento deseado. Por ejemplo, la secuencia de comandoses el último caso de prueba de la imagen vinculada en el OP; los
Fcomandos no producen resultados (el punto y coma simple parece un pequeño precio a pagar por esto), mientras que los seisSy losKcomandos producencomo se desee.
En cualquier momento,
fes la lista de pares ordenados de la forma{A, B}donde seAconoceB, mientras quepes la lista de personas que aparecen en algún elemento def. LlamandoF@{A, B}suma los cuatro pares ordenados{A, B},{B, A},{A, A}, y{B, B}af.Además, en cualquier momento,
mes la matriz de adyacencia del gráfico subyacente (una persona es adyacente a sí misma y a todos susFamigos); las filas y columnas están indexadas porp, yiconvierte a una persona al número de fila / columna correspondiente. La función auxiliaratoma una matriz y dos personas como entradas y busca la entrada de la matriz cuyas "coordenadas" son las dos personas, devolviendoTruesi el número es positivo yFalsesi es cero. (También es posible llamaracuando una de las personas de entrada aún no es reconocida, por ejemplo, hacer una consulta SABER o SUGERIR antes de cualquier declaración de AMIGO, o preguntar sobre alguna persona pobre que no tiene amigos; esto arroja errores, pero la regla/._@__->0obliga a que la salida sea deFalsetodos modos)Llamar,
K[A, B]por lo tanto, busca sim[A, B]es positivo, lo que implementa elKverbo now. El producto de matrizm.mes la matriz de longitud-2-ruta, que contiene el número de formas de ir de una persona a otra a lo largo de una ruta de longitud 2; esto permiteS[A, B]implementar elSverbo más feo, siempre que verifiquemos manualmente (&&!K@##) que las personas de entrada no se conocen entre sí.Dato divertido: de forma gratuita, esta aplicación nos permite declaramos camarillas de amigos-el comando
F@{A, B, C, D}es equivalente a todosF@{A, B},F@{A, C},F@{A, D},F@{B, C},F@{B, D}, yF@{C, D}combinado.fuente
Python 2 , 118 bytes
Pruébalo en línea!
Como no pude encontrar la herramienta en línea repl para python 2, agregué el TIO Nexus (en formato REPL).
Consulta por opción y su posible salida
0 para Conocido - Ninguno
1 para amigos: verdadero o falso
2 para Sugerir: verdadero o falso
Ejemplo de uso y salida de muestra en un intérprete python repl.
fuente
GNU sed , 158 + 2 (rn flags) = 160 bytes
Dado que sed es un lenguaje basado en expresiones regulares, no hay tipos primitivos, sin mencionar las estructuras de datos abstractos. Los datos de la red se almacenan como texto de formato libre, en este caso como enlaces amigos redundantes como
A-B;B-A;etc., que luego se compara con varios patrones de expresiones regulares.Pruébalo en línea!
Por diseño, sed ejecuta todo el script para cada línea de entrada. Recomiendo probar en modo interactivo, para ver la salida de un comando inmediatamente después de escribir.
Uso: no hay valores de verdad / falsedad en sed, por lo que la convención de salida que uso se toma prestada de bash, por lo que una cadena no vacía se considera verdadera y una cadena vacía como falsa.
F X YparaFRIEND X Y. No tiene salida.K X YparaKNOW X Y. Produce 'K' como verdadero, y nada como falso.S X YparaSUGGEST X Y. Produce 'S' como verdadero, y nada como falso.Explicación:
fuente