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
, SUGGEST
y KNOW
.
FRIEND X Y
- Especifica eso X
y Y
son 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 X
siempre 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
, SUGGEST
y KNOW
con 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 N
está 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+b
anotar quea
es amigob
,a*b
quea
sabeb
ya?b
queb
debería sugerirsea
o no. La primera línea simplemente dice queX*Y
es verdad si bienX+Y
,Y+X
oX == Y
es 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 unaZ
tal queX*Y
es falso yX*Z
, yY*Z
es 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*Y
y lo mismo conf
ys
usando diferentes operandos. 21 bytes si he contado correctamente.f
.PHP,
138133129bytesPHP supera a Mathematica, una ocurrencia rara.
impresiones
1
para la verdad, cadena vacía para la falsedad. Ejecutar-nr
o 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
$s
tiene que recortarse porque incluye el carácter de nueva línea.array_intersect_key
tiene que estar silenciado o generará advertencias para vacío$$a
o$$b
.+18+15 bytes para todos los nombres de usuario: Reemplace$$a
con$f[$a]
y$$b
con$f[$b]
.fuente
CMD (Lote), 50 + 20 + 135 = 205 bytes
AMIGO.CMD
SABER.CMD
Impresiones
1
para amigos, una línea en blanco para extraños.SUGGEST.CMD
Impresiones
1
o 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.py
Usar
- en
f("a", "b")
lugar deFRIENDS a b
- en
k("a", "b")
lugar deKNOW a b
- en
s("a", "b")
lugar deSUGGEST a b
Salida 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
-
f
paraFRIEND
-
s
paraSUGGEST
- cualquier otra cosa para
KNOW
Prué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 las
función, y usa0
,{}
yFalse
como Falsey yyTrue
no está vacíoset
como Truthy, podría guardar 6 bytesMathematica, 164 bytes
Define tres funciones principales
F
,S
yK
con el comportamiento deseado. Por ejemplo, la secuencia de comandoses el último caso de prueba de la imagen vinculada en el OP; los
F
comandos no producen resultados (el punto y coma simple parece un pequeño precio a pagar por esto), mientras que los seisS
y losK
comandos producencomo se desee.
En cualquier momento,
f
es la lista de pares ordenados de la forma{A, B}
donde seA
conoceB
, mientras quep
es 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,
m
es la matriz de adyacencia del gráfico subyacente (una persona es adyacente a sí misma y a todos susF
amigos); las filas y columnas están indexadas porp
, yi
convierte a una persona al número de fila / columna correspondiente. La función auxiliara
toma una matriz y dos personas como entradas y busca la entrada de la matriz cuyas "coordenadas" son las dos personas, devolviendoTrue
si el número es positivo yFalse
si es cero. (También es posible llamara
cuando 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/._@__->0
obliga a que la salida sea deFalse
todos modos)Llamar,
K[A, B]
por lo tanto, busca sim[A, B]
es positivo, lo que implementa elK
verbo now. El producto de matrizm.m
es 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 elS
verbo 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 Y
paraFRIEND X Y
. No tiene salida.K X Y
paraKNOW X Y
. Produce 'K' como verdadero, y nada como falso.S X Y
paraSUGGEST X Y
. Produce 'S' como verdadero, y nada como falso.Explicación:
fuente