Zauważ, że to pytanie dotyczy przede wszystkim struktur danych
Wprowadzenie
Bacefook chce, aby ludzie byli bardziej przyjaźni! W związku z tym wdrażają nowy system sugerowania znajomych! Twoim zadaniem jest pomóc Bacefook we wdrożeniu nowego systemu sugerowania.
Dane techniczne:
Twój program musi być REPL (pętla odczytu eval-print) wspieranie 3 rodzaje polecenie: FRIEND
, SUGGEST
i KNOW
.
FRIEND X Y
- Określa, że X
i Y
są przyjaciółmi w sieci społecznej.
Jeśli X jest przyjacielem Y, to Y jest przyjacielem X
Może, ale nie musi mieć danych wyjściowych
X zawsze przyjaźni się z X
KNOW X Y
- Wypisuje prawdę, jeśli X i Y są przyjaciółmi, w przeciwnym razie fałsz
KNOW X X
zawsze wyświetli prawdziwą wartość
SUGGEST X Y
- Wypisuje prawdę, jeśli X i Y powinny być przyjaciółmi, w przeciwnym razie fałsz. X i Y powinny być przyjaciółmi, jeśli:
X i Y nie są przyjaciółmi
X i Y mają co najmniej 1 wspólnego znajomego
Masz prawo do wymiany FRIEND
, SUGGEST
oraz KNOW
z własnych strun, ale trzeba wspomnieć, co ciąg wymianie każdą komendę.
Twój program może przyjmować dane wejściowe / wyjściowe w dowolny pożądany sposób, o ile można dość łatwo rozpoznać, jak to działa.
Liczba osób w sieci społecznościowej N
wynosi od 1 do 100 000, ale może istnieć dowolna liczba „linków do znajomych” (krawędzi).
Jeśli jeszcze tego nie zauważyłeś, jest to problem z wyszukiwaniem wykresów. (Prawdopodobnie) najłatwiejszą (i prawdopodobnie najszybszą) strukturą danych, w której można to zaimplementować, byłaby macierz przylegania.
Przypadki testowe
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
Oto kilka innych przypadków testowych w formie obrazu
Warunek wygranej
To jest golf golfowy , wygrywa najkrótszy kod!
{A, B, C, D}
?SUGGEST UK EU
.Odpowiedzi:
SWI-Prolog,
624741 bajtówProlog nie jest zbyt często przydatny, ale kiedy jest, jest po prostu piękny. Będziemy używać
a+b
do notowania, żea
są to znajomib
,a*b
którzya
wiedząb
ia?b
żeb
należy to zasugerowaća
lub nie. Pierwszy wiersz po prostu mówi, żeX*Y
jest prawdziwa, czy teżX+Y
,Y+X
czyX == Y
to prawda. To implementuje symetrię wzajemnego poznania się. Pytanie o sugestię jest niezwykle proste. My po prostu zapytać, czy nie jestZ
tak, żeX*Y
jest fałszywa, aX*Z
iY*Z
to prawda. Dokładnie tak, jak opisano w wyzwaniu.Jeśli zapiszesz to jako plik (np.
friends.pl
) I otworzysz SWI-Prolog za pomocą tego pliku (prolog -l friends.pl
), zostaniesz przeniesiony do REPL.Możesz zawrzeć takie przyjaźnie:
Możesz sprawdzić, czy ludzie się znają, lub sugestię:
źródło
k(X,Y)
zeX*Y
i tak samo zf
is
używając różnych argumentów. 21 bajtów, jeśli poprawnie policzyłem.f
.PHP,
138 133129 bajtówPHP pokonuje Mathematica - rzadkie zjawisko.
drukuje
1
dla prawdy, pusty ciąg dla fałszu. Uruchom go-nr
lub przetestuj online .wymaga PHP 7.1 do przypisania listy; nazwy użytkowników są wielkość liter i należy wykluczyć
a
,b
,s
.awaria
$s
musi zostać przycięty, ponieważ zawiera znak nowej linii.array_intersect_key
musi zostać wyciszony, aby wygenerował ostrzeżenie o pustym$$a
lub$$b
.+18+15 bajtów dla wszystkich nazw użytkowników: Wymień$$a
się$f[$a]
i$$b
z$f[$b]
.źródło
CMD (partia), 50 + 20 + 135 = 205 bajtów
FRIEND.CMD
KNOW.CMD
Nadruki
1
dla przyjaciół, pusta linia dla nieznajomych.SUGGEST.CMD
Wydruki
1
lub pusta linia. Myślę, że sześć kolejnych%
może być nowym osobistym rekordem.źródło
Python 3,
122118 + 2 = 120 bajtówUżycie jest dokładnie takie samo jak odpowiedź ovs.
źródło
Python 3,
163149143 + 2 = 145 bajtów-6 bajtów dzięki @FelipeNardiBatista
Zapisz go do pliku i uruchom jako
python3 -i file.py
Użyj
-
f("a", "b")
zamiastFRIENDS a b
-
k("a", "b")
zamiastKNOW a b
-
s("a", "b")
zamiastSUGGEST a b
Wyjście Falsey: 0, set (),
Wyjście False Truthy: niepuste, True
Wypróbuj online
164 bajty, gdy nie używasz interpretera Pythona jako REPL:
Wykorzystuje
-
f
zaFRIEND
-
s
zaSUGGEST
- cokolwiek innego do
KNOW
Wypróbuj online
źródło
l.extend([(a,b),(b,a)])
, nie możesz tego zrobićl+=[(a,b),(b,a)]
? (Jeszcze tego nie testowałem)UnboundLocalError
. Nawiasem mówiąc, fajna odpowiedź!bool()
zs
funkcji i użyjesz0
,{}
aFalse
jako Falsey iTrue
nie pustyset
jak Truthy, możesz zapisać 6 bajtówMathematica, 164 bajty
Określa trzy główne funkcje
F
,S
iK
z pożądanym zachowaniu. Na przykład sekwencja poleceńjest ostatnim przypadkiem testowym z obrazu połączonego w PO; te
F
komendy wydajność bez wyjścia (pojedynczy średnik zdaje małą cenę za to zapłacić), natomiast sześćS
iK
poleceń wydajnościązgodnie z życzeniem.
W dowolnym momencie
f
jest lista uporządkowanych par postaci, o{A, B}
którejA
wieB
, ap
lista osób pojawiających się w jakimś elemencief
. WywołanieF@{A, B}
dodaje cztery pary uporządkowane{A, B}
,{B, A}
,{A, A}
, i{B, B}
dof
.Ponadto, w dowolnym momencie,
m
jest macierz przylegania podstawowego wykresu (osoba przylega do siebie i wszystkich swoichF
przyjaciół); wiersze i kolumny są indeksowane przezp
ii
konwertuje osobę na odpowiedni numer wiersza / kolumny. Funkcja pomocnikaa
przyjmuje macierz i dwie osoby jako dane wejściowe i wyszukuje pozycję macierzy, której „współrzędne” to dwie osoby, zwracane,True
jeśli liczba jest dodatnia, aFalse
jeśli zero. (Można również zadzwonić,a
gdy jedna z osób wejściowych nie jest jeszcze rozpoznana - na przykład, zadając WIEDZIE lub SUGEROWANE zapytanie przed deklaracjami PRZYJACIELA lub pytając o jakąś biedną osobę, która nie ma przyjaciół; to rzuca błędy, ale reguła/._@__->0
i tak wymusza wyjścieFalse
.)Wywołanie
K[A, B]
sprawdza zatem, czym[A, B]
jest dodatnie, co implementujeK
teraz czasownik. Iloczyn macierzy jest macierząm.m
o długości 2 ścieżek, zawierającą liczbę sposobów przejścia od jednej osoby do drugiej wzdłuż ścieżki o długości 2; pozwala toS[A, B]
na implementacjęS
najgorszego czasownika, o ile dodatkowo sprawdzamy ręcznie (&&!K@##
), czy ludzie, których dane wejściowe jeszcze się nie znają.Ciekawostka: za darmo, to realizacja pozwala nam zadeklarować klik przyjaciół-komenda
F@{A, B, C, D}
jest odpowiednikiem wszystkichF@{A, B}
,F@{A, C}
,F@{A, D}
,F@{B, C}
,F@{B, D}
, iF@{C, D}
łączone.źródło
Python 2 , 118 bajtów
Wypróbuj online!
Ponieważ nie mogłem znaleźć narzędzia online do replikacji dla Pythona 2, dodałem TIO Nexus (w formacie REPL).
Zapytanie o opcję i jej możliwe wyjście
0 dla Znanych - Brak
1 dla przyjaciół - prawda lub fałsz
2 dla Sugeruj - prawda lub fałsz
Przykład użycia i przykładowe dane wyjściowe w interpreterie python repl.
źródło
GNU sed , 158 + 2 (flagi rn) = 160 bajtów
Ponieważ sed jest językiem opartym na wyrażeniach regularnych, nie ma prymitywnych typów, nie wspominając już o abstrakcyjnych strukturach danych. Dane sieciowe są przechowywane jako tekst w dowolnym formacie, w tym przypadku jako nadmiarowe linki znajomych,
A-B;B-A;
itp., Które są następnie dopasowywane do różnych wzorców wyrażeń regularnych.Wypróbuj online!
Z założenia sed uruchamia cały skrypt dla każdego wiersza wprowadzania. Polecam testowanie w trybie interaktywnym, aby zobaczyć wynik polecenia natychmiast po wpisaniu.
Zastosowanie: w sed nie ma żadnych wartości prawda / fałsz, więc konwencja wyjściowa, której używam, jest zapożyczona z bash, przy czym niepusty ciąg jest uważany za prawdziwy, a pusty ciąg jako fałsz.
F X Y
dlaFRIEND X Y
. Nie ma wyjścia.K X Y
dlaKNOW X Y
. Wykazuje „K” jako prawdę, a nic tak jak fałsz.S X Y
dlaSUGGEST X Y
. Wykazuje „S” jako prawdę, a nic tak jak fałsz.Wyjaśnienie:
źródło