W tym wyzwaniu otrzymujesz ciąg wejściowy zawierający ciąg znaków X, Y i Z, np. „XYZZ”. X, Y i Z reprezentują określoną postać. Ten wzór jest następnie porównywany z drugim ciągiem wejściowym. Jeśli wzorzec istnieje jako podłańcuch na drugim wejściu, zwróć True
, w przeciwnym razie zwróć False
. Po znalezieniu wzorca w słowie program przestaje wyszukiwać i wraca True
.
Przykłady
Wzór: „XXYY”
succeed ---> True (pattern found: ccee)
success ---> False (pattern not matched)
balloon ---> True (pattern found: lloo)
Wzór: „XYXYZ”
bananas ---> True (pattern found: nanas)
banana ---> False (pattern not found)
- Uwaga: To nie jest rzeczywiste wejście. To jest przykład działania programu. Twój program powinien wypisać
True
lubFalse
lub inne wartości Truthy / Falsy.
Inne ważne / przydatne informacje
- Wzorzec nie musi zawierać X, Y i Z, może zawierać X i Y, a nawet (choć nieco bezcelowo) tylko X.
- Wzorzec nie może być pusty, ale nie zostanie użyty jako przypadek testowy.
- Wyszukiwany ciąg nie będzie pusty i będzie pisany małymi literami.
- Kolejność alfabetyczna X, Y i Z we wzorze nie ma znaczenia.
- X, Y i Z muszą być unikalnymi znakami.
- Możesz użyć dowolnej biblioteki.
- Wynik zależy od wielkości kodu , w bajtach. Najniższy wynik wygrywa.
Powodzenia!
Odpowiedzi:
Perl 5 , 85 bajtów
Zaoszczędzono 40 bajtów dzięki sugestii Petera Taylora! (zobacz moją starszą wersję poniżej, aby zobaczyć różnice)
83 bajty kodu +
-pl
flaga.Wypróbuj online!
XYXYZ jest przekształcany w
((?!\1).)((?!\1)(?!\2).)\1\2((?!\1)(?!\2)(?!\3).)
(tak, niektóre testy nie mogą być prawdziwe, ale w ten sposób są krótsze), a następnie drugie wejście jest sprawdzane pod kątem tego wyrażenia regularnego. (zobacz wyjaśnienia mojej starszej wersji, aby uzyskać więcej intuicji, jak to działa)Moja starsza wersja:
Podziękowania dla Arnaulda za wskazanie błędu, który popełniłem w mojej pierwszej wersji.
113 bajtów kodu +
-pl
flagi i-Mre=eval
.Wypróbuj online!
Na przykład XYXYZ: (.) (.) (.) Pierwszy regex będzie przekształcić wzór do \ 1 \ 2 i dodać na końcu badania, aby sprawdzić, czy
$1
,$2
i$3
są różne: jeśli tak, to$\
jest ustawiona na jeden. Następnie drugie wejście jest testowane względem tego wyrażenia regularnego i$\
jest domyślnie drukowane na końcu.Wyrażenie regularne wygenerowane dla XYXYZ to
(.)(.)\1\2(.)(?{++$c;$\=1if!grep{$v{$c}{${$_}}++}1..3})^
.(Dodam trochę więcej szczegółów do wyjaśnień, kiedy będę miał chwilę)
źródło
(.)((?!\1).)\1\2((?!\1)(?!\2).)
?Galaretka , 9 bajtów
Zwraca liczbę przypadków znalezienia wzorca, przy czym niezerowe oznacza prawdę, a zero - fałsz.
Wypróbuj online!
Jak to działa
źródło
JavaScript (ES6), 94 bajty
Działa poprzez przekształcenie wzorca w wyrażenie regularne, np. Do
XYXYZ
generowania/(.)(?!\1)(.)\1\2(?!\2)(?!\1)(.)/
.Zauważam ciekawe rozróżnienie między wyrażeniami regularnymi PCRE i JavaScript: w PCRE
\<n>
nie udaje się (i dlatego się(?!\<n>)
udaje) przed zdefiniowaniem grupy przechwytywania, podczas gdy JavaScript z powodzeniem dopasowuje pusty ciąg (i dlatego się(?!\<n>)
nie udaje).źródło
Python 2 , 70 bajtów
Wypróbuj online!
Sprawdza, czy łańcuch pasuje do wzorca przy użyciu metody opisanej w tej odpowiedzi . Używa prefiksu szukanego ciągu, którego długość jest równa wzorowi. Odcina pierwszy znak ciągu znaków, dopóki nie zostanie znalezione dopasowanie lub
False
stanie się puste73 bajty:
Wypróbuj online
Sprawdza, czy łańcuch pasuje do wzorca przy użyciu metody opisanej w tej odpowiedzi . Rekurencyjnie sprawdza wszystkie podciągi, rozgałęziając się w celu usunięcia pierwszego lub ostatniego znaku, aż łańcuch będzie pusty.
źródło
Python 3 , 100 bajtów
Wypróbuj online!
źródło
05AB1E ,
1916 bajtówWypróbuj online!
Zwróci 1, jeśli prawda, zero, jeśli nie prawda.
Może to być 14 bajtów, jeśli dozwolone jest zwracanie możliwych wartości XYZ:
05AB1E , 14 bajtów
Wypróbuj online 2!
źródło
1
iTrue
(co jest zwykle wadą dla tego rodzaju wyzwań), ale jeśli specyfikacja wyzwania może być interpretowana jako pozwalająca nam zdefiniować prawdę / fałsz dla wyzwania druga wersja działa tak, jak mówisz.Java 7,
177176173 bajtówWyjaśnienie:
Kod testowy:
Wypróbuj tutaj.
Wydajność:
źródło
PHP, 89 bajtów
Prezent od @Christoph i @Titus
PHP, 105 bajtów
Prezent od @Christoph
PHP, 167 bajtów
źródło
++$p
zamiast($p+1)
, chociaż tak naprawdę go nie testowałem.[,$a,$b]=$argv;foreach(str_split($a)as$k=>$v)$r.=$k==($p=strpos($a,$v))?"(.)":"\\".++$p;echo preg_match("#$r#",$b);
.[,$a,$b]=$argv;foreach(str_split($a)as$v)$r.=$x[$v]?"\\$x[$v]":'(.)'.!$x[$v]=++$y;echo preg_match("#$r#",$b);
(Pamiętaj, że powinieneś zachować swoje stare wyniki<strike>
)!
. To jest bardziej warte niż punkty, do których mógłbym dotrzeć z twoim fajnym rozwiązaniem.$argv
do$a
i$b
; -6 bajtów zfor(;a&$v=$argv[1][$i++];)
; -1 bajt z dłuższymi nazwami zmiennych ( naprawdę! Use$vv
zamiast$v
,$ii
zamiast$i
,$rr
zamiast$r
,$yy
zamiast$y
można użyć$$vv
zamiast$x[$v]
)C #,
184165155 bajtówdzięki aloisdg!
rozwiązanie cofania, jako bonus działa ze wzorem z dowolnymi postaciami!
źródło
var s=l==n.Length;
? Używasz go tylko wreturn s?!s:
(gdzie!s
jest zawszefalse
), więc możesz go zmienić nareturn l==n.Length?0>1:
. Także, co to jest:(n[i]!=n[j]||n[i]!=n[j])
. Sprawdzaszn[i]!=n[j]
dwa razy .. Zawsze będzietrue or true
/false or false
..: Sint l = p.Length,i = 0, j;
i++
i twojąj--
wewnątrz pętli for. na przykład:for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))
Rubin,
6361 bajtówZamiast szukać wzorca wyrażenia regularnego, po prostu spróbuj podstawić „X”, „Y” i „Z” na wszystkie możliwe sposoby i znaleźć dosłowne dopasowanie.
(Właściwie to ta sama koncepcja, co odpowiedź 05AB1E firmy carusocomputing)
źródło
JavaScript (ES6),
92898786 bajtówPobiera dane wejściowe
p
(wzorzec) is
(ciąg) w składni curry(p)(s)
. Zwraca0
/1
.Sformatowane i skomentowane
Przypadki testowe
źródło
Matematyka 18 znaków (nie licząc łańcucha i wzoru)
Przykłady:
True
True
źródło