Niektóre wersje standardowej aplikacji kalkulatora na Androida umożliwiają naciśnięcie klawisza, na przykład „sin”, a następnie klawisza „del”, aby uczynić go „si”. Prawdopodobnie tylko błąd, którego usunięcie nie może im przeszkadzać.
Można wpisać następujące litery / grupy liter:
grzech si s sałata współ do dębnik ta t ln l log lo mi
Tak więc „bez smaku” można pisać na maszynie, ponieważ nie ma smaku, podobnie jak „zatyka się”, ponieważ „c-log-s”. Jednak „got” nie jest możliwe do wpisania, ani „an”, ani „xyz”.
Napisz program, który jako dane wejściowe przyjmuje pojedyncze słowo (lub sekwencję liter, tylko az na wejściu) i generuje dane wyjściowe wskazujące, czy słowo można pisać, czy nie.
Dane wyjściowe mogą być pojedynczymi znakami / literami / cyframi itp. lub może być większy. Wszystkie pisane słowa powinny dawać ten sam wynik. Wszystkie słowa, których nie można wpisać, powinny również generować ten sam wynik.
PS Z ciekawości, czy „bez smaku” jest najdłuższym słowem słownikowym, które można pisać?
źródło
Odpowiedzi:
Perl,
474341 + 1 = 42 bajty-4 bajty dzięki @Sunny Pun. -2 bajty dzięki @Brad Gilbert b2gills i @Downgoat
Uruchom z
-n
flagą.Z pewnością można grać w golfa później, ale w duchu rywalizacji pozostawiam głównie oryginalne wyrażenia, które wymyśliłem na początku. Nic nie zwraca, jeśli jest prawdziwe,
1
jeśli fałszywe.Wypróbuj online!
Pobrałem plik słownika, a najdłuższe znalezione słowo zawierało 11 liter -
tattletales
źródło
co?
powinno wystarczyć, ponieważsin
zajmie sięs
:) Miłej zabawy/log?/
!i
wielkość liter (usuń ) lub że pojedynczy wynik musi mieć sens (usuń jeden!
)/^(s|sin?|co?|t|tan?|ln?|log?|e)+$/
lub jeśli wolisz:/^([celst]|sin?|co|tan?|ln|log?)+$/
JavaScript (ES6), 44 bajty
Myślę, że jest to najkrótszy możliwy regex, ale oczywiście mogę się mylić.
Wyjaśnienie
Oczywistym pierwszym miejscem na początek byłoby wyrażenie regularne, które po prostu zawiera wszystkie opcje osobno:
Po pierwsze, możemy zaobserwować, że
cos
można je utworzyć zco
is
, co czyni go niepotrzebnym:Niektóre z nich, takie jak
sin
isi
, można łączyć, czyniąc ostatnią literę opcjonalną:Działa to, ponieważ
sin?
dopasowujesi
z lub bezn
na końcu, w ten sposób obejmując obasin
isi
.Wydaje się, że jest też dużo
n?
s. Co jeśli połączymy je wszystkie razem?Jeszcze jednym sposobem na golfa byłoby połączenie pozostałych opcji jednoznakowych w zakres postaci, ale pojawia się to na tej samej długości:
I w ten sposób grasz w prosty zwrot regularny. Uważam, że jest to najkrótszy możliwy regex, który pasuje do każdego łańcucha poprawnie, ale być może nie. Będę przyznać +100 nagrodę dla każdego, kto udaje się poprawić na tym regex.
źródło
^(s|t|co?|(l|ta|si)n?|log?|e)+$
/ /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/)
.a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.test
dla 42 bajtów. Wierzę, że jest to dozwolone, ponieważa.test
jest to funkcja anonimowa.f=a.test
nie działa. Zastanawiam się, czy można zadzwonić z alternatywną nazwąa.test
...Pyth,
37332928 bajtówKod zawiera znak niedrukowalny, więc oto
xxd
zrzut heksowy.Wypróbuj online.
Niezwyklenieefektywny astronomicznie. Złożoność czasu i przestrzeni wynosiO (16 n )O (24 n ).Wyjaśnienie
Po pierwsze,
Q
dodaje się domyślnie a.źródło
s
.Galaretka ,
3231302826 bajtówZwraca 0, jeśli słowo można wpisać, 1 jeśli nie. Dzięki @JonathanAllan za grę w golfa na 1 bajcie!
Wypróbuj online!
Jak to działa
źródło
Brachylog , 33 bajty
Naprawiono błąd dzięki @Synoli.
Wypróbuj online!
Dane wyjściowe,
true.
jeśli można je wpisać lubfalse.
inaczej.Wyjaśnienie
Próbujemy dekonkatenacji danych wejściowych, dopóki nie znajdziemy takiej, dla której wszystkie łańcuchy, które konkatenujemy, są przedrostkiem jednego z nich
["sin", "cos", "tan", "log", "lne", "eee]
.źródło
.
potrue
?true.
ifalse.
inaczej. Właśnie to zaimplementowałem: jeśli dane wyjściowe są ignorowane (tak jak tutaj) i nie ma zapisu doSTDOUT
, to zostanie wydrukowanetrue.
lub wfalse.
zależności od tego, czy główny predykat się powiedzie, czy nie. Ma kropkę SWI-Prolog botrue.
ifalse.
są rzeczywiście ważne programy, które zawsze udaje / zawsze kończy się niepowodzeniem.tan
wyraźnego pojawienia się na liście?Perl 6 ,
60 5044 bajtówpierwsza próba ( 60 )
tłumaczenie odpowiedzi Perla 5 ( 50 )
za pomocą
-n
przełącznika ( 43 + 1 )Pierwszy
?
konwertuje wynik na wartość logiczną, a pierwszy+
konwertuje go na liczbę (1
forTrue
,0
forFalse
)źródło
Mathematica, 101 bajtów
Wydaje się, że najtrudniejszymi częściami tego wyzwania są najkrótsze wyrażenia regularne i wybór najbardziej zwięzłego języka odpowiadającego wyrażeniu regularnemu. Nie mam nic wspólnego z tym pierwszym, a Mathematica nie jest dobrym kandydatem na to drugie, ponieważ musisz użyć
StringMatchQ
iRegularExpression
. Mogę odpowiedzieć na twoje PS: czy „bez smaku” jest najdłuższym słowem, które możesz wpisać?Tak więc „tattletale” wydaje się być najdłuższym według jednej postaci.
źródło
True
lubFalse
zamiast pojedynczego znaku.Zastanawiam się , 41 bajtów
Stosowanie:
Zupełnie źle zrozumiałem pytanie, ale teraz wszystko zostało naprawione. Wyjścia
F
dla dopasowania iT
bez dopasowania.Niekonkurencyjne, 35 bajtów
Stosowanie:
Wykorzystuje to odpowiednie wyrażenia regularne, które zostały wdrożone po tym wyzwaniu.
źródło
n
nie można go wpisać, alesin
iln
jest.sa
jako prawdęgot
.?
Aby ekspresja sub uległe; zobacz rexegg.com/regex-quantifiers.html#cheat_sheet . Ale nawet uczynienie go chciwym??
lub zaborczym z?+
jakiegoś powodu nie działa (przynajmniej w PHP).coelostats
wyzwala pułapkę (atlo
ita
).Przetwarzanie, 223 bajty
W końcu zdecydowałem się odpowiedzieć bez wyrażenia regularnego. Aby wywołać funkcję, użyj
l("tasteless");
. Zwraca0
za false i1
za true.Rozszerzony kod z objaśnieniem
Zasadniczo, iterujemy po danym ciągu, budując
b
znak po znaku. Możemy sprawdzić za pomocąd()
jeśli którekolwiek ztan
,log
... zacząćb
. Jeśli tak, to jest ważny. W przeciwnym razie sprawdzamy, czy znak na tej pozycji jest prawidłowy i resetujemyb
. Teraz, jeśli jest nieprawidłowy,0
zostanie zwrócony, w przeciwnym razie nadal będzie ważny. Na koniec, jeśli program jeszcze czegoś nie zwrócił, to wróć1
.źródło
d
funkcja nie może zwrócić znakubool
?boolean
niżint
. Równieżtrue
ifalse
wymagają więcej bajtów niż1
i0
Scala, 49 bajtów
Zwraca true, jeśli podany ciąg pasuje do wyrażenia regularnego, w przeciwnym razie false.
źródło
Python 3 , 154 bajtów
Wypróbuj online!
źródło
Python 3 ,
149130 bajtówedycja nr 1: ogolono 19 bajtów przy użyciu rozwiązania @Henke
źródło
Python 2, 124 bajty
źródło
PHP, 60 bajtów
regex skradziony z ETHproductions :
pobiera dane wejściowe z argumentu wiersza poleceń; Wydruki
1
dla oznaczalnych izolatów,0
dla nie typeable.starsze wersje,
757369 bajtówzastępuje wszystkie możliwe słowa pustym ciągiem, zwraca wynik, neguje.
dzieli dane wejściowe według wyrażeń regularnych. Flaga
1
oznaczaPREG_SPLIT_NO_EMPTY
i mówi,preg_split
aby zwracać tylko niepuste wyniki. Jeśli dane wejściowe są możliwe do wpisania,preg_split
będą mieć tylko puste wyniki, więc zwróci pustą tablicę, co jest fałszem.!
neguje wynik.Obie wersje pobierają dane z argumentu wiersza poleceń
i wypisują,
1
jeśli wynik jest pusty (dane wejściowe można wpisać), w przeciwnym razie nic.Uwagi:
Pakowanie wyrażenia regularnego
?
nie działa tutaj; sprawia, że wyrażenia są pozbawione wyrazu; prawdopodobnie z powodu cofania się. Kolejność alternatyw jest ważna:ta
musi stać przed,t
albo silnik przestanie się dopasowywać, gdy znajdziet
.Znalazłem ściągacz kwantyfikatora , pomyślałem
??
lub?+
może pomóc; ale dla mnie nie działały.źródło
Java 8, 55 bajtów
Disclamer: Kiedyś ETHproductions' regex, ponieważ było wiele bajtów krócej niż kopalnia. Pełne uznanie dla Regexa. Dodałem 24 bajty, aby uczynić ją funkcją Java.
Zwraca,
false
jeśli słowo nie pasuje do Regex, w przeciwnym razietrue
.źródło