Napisz funkcję / program, który przyjmuje jako ciąg ciąg małych / wielkich liter [A-Za-z], który sprawdza, czy występujące litery są unikalne i czy są uporządkowane alfabetycznie (ignorując małe i wielkie litery), czy nie. Dane wyjściowe muszą być zgodne z prawdą, jeśli są unikalne, w kolejności alfabetycznej, a fałsz, jeśli nie.
Oto kilka przypadków testowych
a true
abcdefGHIjklmnopqrSTUVWXyz true
aa false
puz true
puzz false
puzZ false
puZ true
PuZ true
pzu false
pzU false
abcdABCD false
dcba false
Jeśli chcesz, uruchom swój program na wszystkich słowach z listy słów takich jak ta i zamieść kilka interesujących =).
Wynik
Najniższa liczba bajtów wygrywa.
za
być prawdziwa wartość?a
i kończy naz
.Odpowiedzi:
CJam, 8 bajtów
Oto uprząż testowa dla wszystkich przykładów w wyzwaniu. Zwraca
0
lub1
(które są odpowiednio fałszem i prawdą w CJam).A oto skrypt do filtrowania listy słów w pytaniu (uruchomienie zajmuje kilka sekund). Musisz ręcznie skopiować listę słów do pola wejściowego, ponieważ jest ona zbyt długa, aby można było skorzystać z bezpośredniego łącza.
Wyjaśnienie
źródło
Regex (dowolny smak), 55 bajtów
Niektóre osoby nie uważają wyrażenia regularnego za język programowania, ale używano go już wcześniej i nie jest on zbyt krótki.
Dodałem jeden bajt dla
i
flagi (bez rozróżniania wielkości liter). Jest to bardzo proste i może być krótsze do wygenerowania w locie.Jeśli sam regex nie jest dozwolony, możesz użyć tego 56-bajtowego programu Retina sugerowanego przez Martina Büttnera:
Uruchomienie tego na powyższej liście słów dało 10 6-literowych słów w kolejności alfabetycznej.
źródło
i`^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?$
Python 3, 44 bajty
Proste podejście - sprawdź niepowtarzalność, sprawdź sortowanie.
źródło
*s,=...
robi?s=list(input().lower())
.x,*y = [1, 2, 3, 4]
przypisywanie 1 dox
i[2, 3, 4]
doy
.*s,=
islist(s)
... link{*s}
zamiastset(s)
zaoszczędzić 2 bajty.> <> ,
524239 bajtówTego rodzaju pytanie jest jednym z niewielu rodzajów, z którymi> <> jest całkiem wygodne, ponieważ musimy radzić sobie tylko z jednym char na raz.
Wyjaśnienie
Nie zgub się! Tutaj jest dużo zawijania.
Poprzednie rozwiązanie, 42 bajty
Ciekawe jest to, że pomimo tego, że wydaje się mieć tę samą funkcjonalność, stanowi alternatywę
(Zmiana znajduje się w strzałkach i lusterkach po prawej stronie)
faktycznie daje niepoprawne wyniki, ponieważ interpreter> <> używa domyślnego słownika Pythona. To, co się dzieje, polega na tym, że przechodząc przez pustą przestrzeń na końcu drugiego rzędu, zero jest domyślnie umieszczane w pustych przestrzeniach, gdy> <> próbuje uzyskać dostęp do komórki. To wtedy miesza się z
?
warunkową trampoliną na początku tego samego rzędu, ponieważ nowo umieszczone 0 są pomijane, a niev
na końcu.źródło
Haskell, 52 bajty
Zastosowanie:
(and.(zipWith(>)=<<tail).map toLower) "abcd"
które wyjściaTrue
.źródło
C,
67 65 5754 (52) znakówtrochę krótszy:
a nawet krótszy:
Oto mały test: http://ideone.com/ZHd0xl
Po najnowszych sugestiach nadal są dwie krótsze wersje:
Również ten kod opiera się na fakcie, że małe i wielkie litery ASCII różnią się tylko 5-tym bitem (32), który odfiltrowuję. Może to oczywiście nie działać z innymi kodowaniami.
EDYCJA: Najnowsza wersja zawsze ustawia 5. bit, ponieważ
|32
jest krótszy niż&~32
.źródło
for(;(*s&=95)>d;d=*s++);
. I można zainicjowaćd
aby1
nie zmieniając wynik, oszczędzając 1 więcej. Widzieć.d;f(char*s){d=32;for...}
działa, deklarującd
domyślnie jako int globalny (który w GCC jest ostrzeżeniem - „definicja danych nie ma typu ani klasy pamięci” - ale nie błąd). To oszczędza dwa bajty.d
wfor
pętli zamiast własnej instrukcji? W ten sposób oszczędzasz;
.Ruby, 33
Sprawdza, czy posortowane unikalne znaki są takie same jak wszystkie znaki.
źródło
c==c.sort|c
JavaScript (ES5), 101
Poprawiono do 87 przez edc95:
głosujcie na jego komentarz :)
Przy okazji, przypadki testowe obecnie w OP są spełnione, jeśli program sprawdza tylko unikalność, nie uwzględniając kolejności.
Nie mogę jeszcze pisać komentarzy, więc odpowiem na kilka uwag tutaj:
@ edc65: Dzięki! Próbowałem przepisać go za pomocą
some()
, ale nie mogłem znaleźć krótszego rozwiązania, ponieważ chociaż wygląda na to, że pozwoliłoby mi to pozbyć się zbędnej zmiennej b, musisz wpisać „return” dwa razy (to samo zreduce()
), a ty nie można po prostu zwrócić wyniku porównania bezpośrednio, ponieważ ostatnia postać musi zostać zapisana po porównaniu z nią.@ edc65: To miłe użycie operatora przecinka dla 87! Zredagowałem to w mojej odpowiedzi dla większej widoczności.
źródło
return
i,!b
aby zapisać znak.function i(s){b=0;l='';s.toUpperCase().split('').forEach(function(c){if(c<=l)b=1;l=c});return!b}
function i(s){s.toUpperCase(b=0).split(l='').forEach(function(c){if(c<=l)b=1;l=c});return!b}
function i(s){return!s.toUpperCase().split(l='').some(function(c){return(u=l,l=c)<=u})}
Haskell, 90 bajtów
Dostarcza funkcję
f :: String -> Bool
Użycie (przy założeniu, że jest zapisane jako golf.hs).
...
służy do zastąpieniaghci
pełnych komunikatów ładujących.Jeśli ktoś ma
lowercase
metodę krótszą niżimport Distribution.Simple.Utils
wtedy, prosimy o komentarz.źródło
map toLower
odData.Char
zamiastlowercase
l
zf
, tj.f=g.lowercase
(Lubf=g.map toLower
po przełączeniu natoLower
). W ciągug
jednego porównania: Dosyćg l=nub(sort l)==l
.Wolfram Mathematica,
4937 bajtówPS Krótsze rozwiązanie Martina Büttnera:
źródło
#⋃#==#&@*Characters@*ToLowerCase
J, 17 bajtów
Sprawdza, czy posortowany
/:~
ciąg-:
małych liter jest równy~.
ciągowi nub małymi literami .Tak jak w J 1-znakowy długi „ciąg” reprezentowany jako zwykły ciąg (z cudzysłowami) jest tylko atomem znaków, a nie prawdziwym ciągiem, odpowiednio sformatowałem dane wejściowe, aby wszystkie dane wejściowe były prawdziwymi łańcuchami. (W powyższym przykładzie użyłem
1$'a'
.)źródło
MATLAB,
2927 bajtówTeraz dla jednej linii, która ma sens nawet poza golfem.
Jako funkcja anonimowa (użyj jako
o('yourstring')
)Myślę, że ta funkcja jest dość oczywista, ponieważ brzmi jak reklama w gazecie.
Poprzednia wersja (29 bajtów):
Dane wejściowe muszą być prezentowane między'
znakami, np'Potato'
.źródło
Brachylog , 3 bajty
Wypróbuj online!
Predykat kończy się powodzeniem, jeśli dane wejściowe spełniają określone wymagania, a jeśli nie, drukowanie
true.
lubfalse.
uruchamianie jako program kończy się niepowodzeniem .Pierwsza wersja, którą wymyśliłem, nie odnosząc się wprost do alfabetu:
Brachylog , 4 bajty
Wypróbuj online!
źródło
J, 21 znaków
To za długo Argument musi mieć rangę
1
, tzn. Musi być łańcuchem lub wektorem.tolower y
-y
małymi literami./:~ y
-y
w porządku leksykalnym.~. y
- nuby
, czyliy
z usuniętymi duplikatami.x ; y
-x
iy
wkładany do pudełek, a następnie łączony.< y
-y
włożyć do pudełka.x = y
- wx
porównaniu z elementemy
.(< y) = (~. y) ; (/:~ y)
- wektor wskazujący, czyy
jest równy nub i sam posortowany.*/ y
- iloczyn pozycjiy
lub jego logika oraz jeśli pozycje są wartościami logicznymi.*/ (< y) = (~. y) ; (/:~ y)
- wartość logiczna wskazująca pożądaną właściwość małych litery
.źródło
Julia, 44 bajty
Tworzy to anonimową funkcję, która pobiera pojedynczy argument
s
, konwertuje go na małe litery i porównuje z unikalną posortowaną wersją łańcucha. Zwraca wartość logiczną, tj .true
Lubfalse
. Jeśli chcesz to przetestować, przypisz to,f=s->...
a następnie zadzwońf("PuZ")
itp.źródło
Pure Bash 4.x, 37
Dane wejściowe są brane jako parametr wiersza polecenia. Zgodnie ze standardową semantyką powłoki, kod wyjścia 0 oznacza prawda (alfabetycznie), a kod wyjścia! = 0 oznacza fałsz (nie alfabetycznie).
Printf tworzy regex jak w rozwiązaniu @ hsl . Łańcuch wejściowy jest rozwijany do małych liter i porównywany z wyrażeniem regularnym.
Poprzednia odpowiedź:
Bash + coreutils, 52
Proste rozwiązanie:
źródło
C # 6, 18 +
8276 = 94 bajtówWymaga (18 bajtów):
Kod (76 bajtów):
C # 6 obsługuje lambdy do zdefiniowania funkcji, która jest przydatna podczas gry w golfa.
Wersja inna niż C # 6:
Nieskluczony kod:
źródło
JavaScript (ES6) 54
Konwertuj na wielkie litery, a następnie na tablicę i sortuj. Jeśli podczas sortowania dwa elementy są w niewłaściwej kolejności lub równe, zwróć 0 (fałsz) w przeciwnym razie 1 (prawda)
Edycja skróconego thx do @Optimizer (ale nadal 2 więcej niż roztwór @Tamas realizowanego w ES6:
F=s=>[...s.toUpperCase()].every(c=>(u=l,l=c)>u,l='')
)Test w konsoli Firefox / FireBug
źródło
s=
nie wydaje się być wymagane ...C (44 bajty)
f(char*s){return(*s&=95)?f(s+1)>*s?*s:0:96;}
Przetestuj tutaj: http://ideone.com/q1LL3E
Publikowanie tego, ponieważ nie mogę jeszcze komentować, w przeciwnym razie byłaby sugestia, aby poprawić istniejącą odpowiedź C, ponieważ całkowicie ukradłem pomysł bez rozróżniania wielkości liter z istniejącej odpowiedzi C.
Zwraca 0, jeśli ciąg nie jest uporządkowany, a wartość niezerowa, jeśli jest uporządkowana.
źródło
Golang (65 bajtów)
Go nie jest językiem przyjaznym golfowi, a także, ssę golfa ...
Uruchom tutaj: http://play.golang.org/p/xXJX8GjDvr
edycja 106-> 102
edycja 102-> 96
edycja 96-> 91
edycja 91-> 87
edycja 87-> 65
Pokonałem wersję Java, mogę zatrzymać się na dziś
źródło
Java 8 -
90898785 znakówChodzi tutaj o użycie funkcji „zmniejszania”, która śledzi ostatni znak i „poddaje się”, gdy wykryje, że sekwencja nie jest ściśle rosnąca.
grał w golfa:
bez golfa:
przykład:
wydajność:
źródło
Perl 6, 35 bajtów
Powoduje to wywołanie bloku; jeśli mógłbym tylko założyć, że
$_
jest już ustawione pożądane słowo, mógłbym usunąć otaczające nawiasy klamrowe i stracić dwa dodatkowe bajty, ale prawdopodobnie jedynym rozsądnym sposobem na przyjęcie takiego założenia byłoby uruchomienie go-n
i przekazanie słowa jako standardowego wejścia , który dodałby dwa bajty od razu.źródło
.uc.comb
niczego nie zmienia, więc jeśli tablica wielkich i czesanych jest równa posortowanej tablicy i czesanych, oznacza to, że zaczęła się w posortowanej kolejności.R , 37 bajtów
Wypróbuj online!
Delegowanie ponieważ jest znacznie krótsza niż inne i Michała R odpowiedź .
Konwertuje litery na znaki kodowe ASCII za pomocą
utf8ToInt
, a następnie bierze modulo 32, dzięki czemu dolne i górne litery są konwertowane na te same cyfry 1 ... 26. Oblicza różnice par i sprawdza, czy wszystkie są dodatnie.źródło
Perl, 27
Wyrażenie regularne @ hsl buduje się dynamicznie.
Możemy również wykonać odwrotne dopasowanie: przekonwertować dane wejściowe na wyrażenie regularne:
PuZ
=>,.*p.*u.*z.*
a następnie dopasować to do ciągu liter w kolejności alfabetycznej. Wynik - także 27 znaków.źródło
k (6 bajtów)
&
zwraca true, jeśli oba argumenty są prawdziwe/
modyfikuje,&
aby zastosować „nad” listą, podobnie jak fold w językach funkcjonalnych>
Lepszy niż':
modyfikuje,>
aby zastosować „przed każdym”, więc zwraca wektor wartości logicznych określający, które elementy są większe niż ich poprzednik_
czyni to argument małą literą(
0b
oznacza boolean false)q (13 bajtów)
q jest po prostu cukrem syntaktycznym na k.
all
jest zdefiniowany jako&/
, a niższy to_
źródło
Python, 50 bajtów
Spróbuj online tutaj: http://repl.it/c5Y/2
źródło
VBA (161 bajtów)
Porównuje wartość ascii z poprzednią literą małymi literami, zwraca 0 (fałsz), gdy jej wartość jest mniejsza / równa, i wychodzi z funkcji
źródło
Python 2 , 43 bajty
Wypróbuj online!
Umieszcza
<
symbole między wszystkimi literami (konwertowane na małe litery), a następnieeval
s to. Łańcuchowe operatory porównania w Pythonie z wielką przyjemnością oceniają całość jako jedno duże wyrażenie logiczne.źródło
Erlang, 51
Używa uporządkowanego zestawu (analogicznie do
java.util.TreeSet
) do sortowania znaków i odrzucania duplikatów. Nowa lista jest następnie porównywana z ciągiem wejściowym.Funkcja testowa:
źródło
Java, 96
Całkiem proste. Wystarczy przekonwertować wszystkie na niższe i porównać każdą z poprzednimi postaciami.
źródło