W tym wyzwaniu dostajesz dwa słowa: Twoim zadaniem jest ustalenie, czy są obok siebie .
Dwie litery sąsiadują, jeśli:
- Są to ta sama litera lub
- Są przylegające leksykograficznie.
Przykładowo, J znajduje się w sąsiedztwie I , J i K, tylko. Z nie sąsiaduje z A
Dwa słowa sąsiadują, jeśli:
- Są tej samej długości i
- Każda litera przylega do innej litery w innym słowie.
Na przykład, CAT sąsiaduje SAD , a C> D, A, A, T>> s .
ZA DARMO nie sąsiaduje z GRRD (każde E potrzebuje litery do połączenia) .
Wejście wyjście
Masz dwa ciągi znaków i musisz zwrócić prawdziwą wartość, jeśli są sąsiednie, w przeciwnym razie wartość fałsz. Powinieneś wrócić w ciągu minuty dla wszystkich poniższych przypadków testowych.
Możesz założyć, że ciągi będą zawierać tylko wielkie litery, litery alfabetu.
Dwa ciągi znaków mogą być przekazywane jako lista lub łączone z cudzysłowami lub bez nich.
Przypadki testowe
Prawda:
A A
A B
C B
DD CE
DE FC
ABCD BCDE
AACC DBBB
DJENSKE FDJCLMT
DEFGHIJKL HJLEHMCHE
IKLIJJLIJKKL LJLJLJLJLJHI
ACEGIKMOQSUWY BLNPRDFTVHXJZ
QQSQQRRQSTTUQQRRRS PQTTPPTTQTPQPPQRTP
ELKNSDUUUELSKJFESD DKJELKNSUELSDUFEUS
Falsy:
A C
A Z
B J
JK J
CC BA
CE D
DJENSKE GDJCLMT
DEFGHIJKL HJLHMCHE
IJKLIJKLKIJL LIJLLHJLJLLL
AWSUKMEGICOQY RSHXBLJLNQDFZ
QQSQQRRQSTTUQQQRRS PQTTPPTTQTPQPPQRTT
ELKNSDUVWELSKJFESD DKJELKNSUELSDUFEUS
To jest golf golfowy , więc wygrywa najkrótsza ważna odpowiedź!
źródło
"A A"
?{'string1' 'string2'}
byłaby również do przyjęcia?Odpowiedzi:
CJam,
141312 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe jednocześnie .
Algorytm
Niech s i t będą dwoma posortowanymi słowami o tej samej długości. Aby s i t były leksykograficznie przylegające (LA), konieczne i wystarczające jest, aby wszystkie pary odpowiadających im znaków były również LA.
Warunek jest wyraźnie wystarczający dla wszystkich słów i niezbędny dla słów o długości 1 .
Teraz przyjmijmy, s i t mają długość n> 1 i pozwolić i b są pierwszymi znakami, wzgl., Z s i t .
Od s i t są LA, istnieją pewne bijective odwzorowanie φ między bohaterami s i bohaterów t takie, że x i φ (x) to la dla wszystkich x w S , co oznacza, że | x - cp (x) | ≤ 1 dla wszystkich x w s .
Niech C = φ (a) i d = φ -1 (b) . Ze względu 's i b jest minimalności, a ≤ D (1) i b ≤ C (2) .
Ponadto, jako b i d , i i C i LA, d ≤ b + 1 (3), i c ≤ a + 1 (4) .
Łącząc (1) i (3) oraz (2) i (4) , otrzymujemy, że a ≤ d ≤ b + 1 i b ≤ c ≤ a + 1 , z którego wywnioskujemy, że a - 1 ≤ b ≤ a + 1 , a w związku z tym, że i b są la.
Teraz, łącząc (1) i (4) oraz (2) i (3) , otrzymujemy, że c - 1 ≤ a ≤ d i d - 1 ≤ b ≤ c , z którego wywnioskujemy, że c - 1 ≤ d ≤ c + 1 , a w związku z tym, że c i d są la.
Zatem jeśli redefiniujemy φ o φ (a) = b oraz φ (d) = c , | x - φ (x) | ≤ 1 nadal utrzymać dla wszystkich x w s , a w szczególności dla wszystkich x w S [1:] .
W ten sposób, y [0] = a i T [0] = B i s: [1] i T [1:] , to la.
Ponieważ s [1:] ma długość n - 1 , dowodzi to konieczności indukcji.
Kod
źródło
C->Y, D->X
, a te można po prostu usunąć.MATL , 10
1217bajtówWykorzystuje to podejście Dennisa : najpierw posortuj i porównaj znaki w pasujących pozycjach.
Dane wejściowe to tablica ciągów o formacie
{'CAT 'SAD'}
.Dane wyjściowe to tablica zer i jedynek. Wynik jest prawdomówny, jeśli zawiera wszystkie ( zgodnie z prawdą).
Wykorzystuje aktualną wersję (10.2.1) , która jest wcześniejsza niż to wyzwanie.
EDYCJA:
Xl
Nazwa funkcji została zmieniona na|
nowsze wersje języka (io
nie jest już konieczna). Poniższy link zawiera te modyfikacje.Wypróbuj online!
Objaśnienie :
Stare podejście, które akceptuje ciągi jako osobne dane wejściowe: 12 bajtów :
EDYCJA : kod w linku został zmodyfikowany zgodnie ze zmianami w języku; patrz komentarz powyżej.
Wypróbuj online !
Objaśnienie :
źródło
[1 0 1]
jest w MATL-u fałszywa. To się przydaje.[0 0]
jest prawdziwa?C, 233 bajty
Możesz to przetestować, zapisując to jako,
adj.h
a następnie używając tegoadj.c
pliku:Następnie skompiluj za pomocą
gcc adj.c -o adj
. Dane wyjściowe to:źródło
Python 2, 90 bajtów
Prosta anonimowa funkcja, muszę mieć osobne sprawdzenie długości, ponieważ
zip
po prostu się skontaktuję. Istnieje podobna funkcja witertools
(zip_longest
), która wstawiałaby puste ciągi, ale byłoby to dość kosztowne.Testowanie z
produkuje:
źródło
JavaScript (ES6), 86
90 94Edytuj 4 bajty zapisane thx @ Nee
Edytuj 2 4 bajty zapisane thx @ Mwr247
Uwaga: sprawdzanie sąsiedztwa pary liter. Przyjąć parę jako podstawa 36 liczba n , gdy litery są równe, to
n = a*36+a = a*37
. Jeśli występuje różnica 1,n = a*36+a+1 = a*37+1
lubn = a*36+a-1 = a*37-1
.n % 37
Musi więc wynosić 0, 1 lub 36. In%37%36
musi być 0 lub 1.Uwaga 2: dodane „0” służy do zapewnienia, że aib mają tę samą długość. Jest więc krótszy
a.length==b.length
źródło
''
zamiast pierwszego,'0'
ponieważ nie zmienia to wartości analizy.b
sort z odniesieniem do znaku:(a,b)=>[...[...a].sort(),0].every((x,i)=>parseInt(x+([...b].sort()[i]||0),36)%37%36<2)
= 86 bajtówJavaScript ES6,
117 bajtów116 bajtów111 bajtów109 bajtówPrzypadki testowe
Kredyt
źródło
[...s]
zamiasts.split('')
?Pyth,
3731 bajtówWypróbuj online ze wszystkimi testami!
Ogolono 6 bajtów za pomocą skróconej notacji redukującej (
-F
zamiast.U-bZ
)Rozwiązanie inspirowane Dennis
Pierwsze zgłoszenie do codegolf!
Wyjaśnienie
Możemy podzielić wyrażenie na dwie części, które są porównywane w
&
celu uzyskania wyniku. Spróbuję wyjaśnić, pisząc jakiś pseudo-PythonNajpierw sprawdzamy, czy długość dwóch słów jest taka sama
Następnie stosujemy metodę Dennisa:
Następnie używamy
-
operatora do filtrowania wszystkich elementów tej listy, które nie są w[Z1
([0, 1]
), i sprawdzamy, czy wynik jest pustą listą zqY
źródło
JavaScript (ES6), 87 bajtów
Używa symetrycznego zerowego sprawdzania zakresu przez podzielenie przez wartość maksymalną, a następnie obcięcie za pomocą bitowego „lub” (
|
). Krótszy niż konieczność wykonania dwóch kontroli lub jednej zMath.abs()
.źródło
Haskell,
6763 bajtówPrzykład użycia:
f "FREE" "GRRD"
->False
.Jak to działa (uwaga:
f
jest częściowo pozbawiona punktów, a drugi parametrb
nie pojawia się w definicji):Edycja: @xnor znalazł 4 bajty do zapisania. Dzięki!
źródło
id x
nie wystarczyx
? A może[pred x..succ x]
?\x->map($x)[pred,id,succ]
, więc toid
była tylko resztka. Oczywiście..
bije wszystko. Dzięki!C, 172 bajty
Przypadki testowe
źródło
PowerShell, 140 bajtów
Być może uda się to skrócić. Obecnie nie jest konkurencyjny w stosunku do Pythona ani JavaScript, ale używa nieco innego podejścia, więc pomyślałem, że go opublikuję.
Wyjaśnienie
Ten kod jest naprawdę mylący dla kogoś, kto nie mówi płynnie w PowerShell, więc postaram się go rozbić na angielski najlepiej jak potrafię ...
Zaczynamy
param($a,$b)
od normalnego przyjmowania danych wejściowych .Cała reszta kodu jest tak naprawdę jedną instrukcją i może być uszkodzona,
(...)-and(...)
aby przetestować dwie instrukcje boolowskie z-and
operatorem.Pareny po lewej stronie można złamać,
(... -eq ...)
aby sprawdzić równość dwóch obiektów. W tym przypadku obiektami są.Count
s (to znaczy długość) dwóch nowych tablic znakowych. Każdy wewnętrzny paren($a=[char[]]$a|sort)
pobiera oryginalne słowo wejściowe, ponownie rzutuje je jako tablicę znaków, a następnie sortuje i zapisuje z powrotem w tej samej zmiennej. Robimy to zarówno dla, jak$a
i dla$b
. Lewa strona sprawdza w ten sposób, że słowa wejściowe są tej samej długości. Jeśli nie są one tej samej długości, ta połowa zewnętrznej instrukcji boolowskiej zakończy się niepowodzeniem iFalse
zostanie wygenerowana.Przechodząc do prawej strony, ponownie testujemy dwie instrukcje boolowskie
(... -and ...)
. Lewa strona sprawdza, czy coś jest większe niż lub równe ujemnemu 1 z-ge-1
. Coś jest zerowe, element skonstruowanej matrycy$c
, który jest utworzony:0..($a.count-1)
|%{...}
$a
i odejmujemy wartość ASCII indeksowanego znaku w$b
|sort
edytowany przez wartość liczbowąDruga strona instrukcji przyjmuje maksymalną wartość
$c[-1]
tablicy i zapewnia, że jest ona mniejsza niż lub równa 1 z-le1
.Zatem, jeśli dwa ciągi wejściowe są rzeczywiście sąsiadujące,
$c
tablica będzie podobna@(-1,-1,-1...0,0,0...1,1,1)
. Tak więc pierwszym elementem będzie,-1
a ostatnim elementem będzie1
. Jeśli nie są one sąsiadujące, różnica w wartościach ASCII dla konkretnej pary albo będzie,< -1
albo> 1
, więc ta połowa zewnętrznego boolowskiego testu zakończy się niepowodzeniem iFalse
zostanie wyprowadzona.Tylko wtedy, gdy obie strony przejdą, wyjdzie
True
, a zatem łańcuchy są LA.źródło
Rdza,
269264 bajtówRozszerzony:
Przypadki testowe:
źródło
APL, 59 bajtów (znaków)
(61, jeśli musimy dostarczyć {i}, 63 z f ←)
Nie jestem najlepszym APLerem, ale to po prostu zbyt dobra zabawa.
(0=+/2≤|¨∊-/{⎕av⍳⍵}¨(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵])∧=/⍴¨∊¨⍺⍵
=/⍴¨∊¨⍺⍵
czy dane wejściowe są równie długie?∧
i wszystkie poniżej(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵]
posortuj oba dane wejściowe i ułóż je tak, aby były jak najdłuższe z nich (zawijają się, jeśli zwiększysz ich długość)|¨∊-/{⎕av⍳⍵}
konwertuj oba wektory char na wektory int ich wartości ascii, wykonaj odejmowanie wektora i bezwzględnie wszystkie wartości0=+/2≤
zsumuj wartości większe lub równe dwa i sprawdź, czy wynik jest równy 0źródło
K (oK) , 27 bajtów
Rozwiązanie:
Wypróbuj online!
Przykłady:
Wyjaśnienie:
Najpierw posortuj każdy ciąg, następnie pad do tej samej długości, następnie weź jeden z drugiego (wartości znaków ASCII znaków), wynik kwadratowy, ponieważ nie ma wbudowanego
abs
, weź maksymalną różnicę i sprawdź, czy jest mniejsza niż 2.źródło
J, 27 bajtów
bez golfa
wyjaśnił
&(3&u:@/:~)
sortuje oba argumenty i konwertuje je na liczby ascii,:
tworzy macierz 2 xn, gdzie n jest liczbą znaków argumentów-/
odejmuje jeden wiersz od drugiego, dając listę długości n reprezentującą odległość odpowiednich znaków(2>|)
zwraca 1, jeśli wartość bezwzględna odległości jest mniejsza niż 2, w przeciwnym razie 0*/
mnoży wszystkie te0
si1
razem: stąd końcowy wynik to 1 iff wszystkie pary odpowiednich znaków są sąsiadujące.Wypróbuj online!
źródło