Usunięte pytania na temat przepełnienia stosu czasami stanowią świetny materiał do gry w golfa.
Napisz funkcję, która przyjmuje na wejściu nieujemną liczbę całkowitą i zwraca wartość true, jeśli wszystkie cyfry w reprezentacji 10 tej liczby są unikalne. Przykład:
48778584 -> false
17308459 -> true
Liczba znaków obejmuje tylko funkcję.
Jeśli zdecydujesz się odpowiedzieć w C lub C ++: bez makr, bez niezdefiniowanego zachowania; zachowanie zdefiniowane w implementacji i ostrzeżenia kompilatora są w porządku.
Odpowiedzi:
Skrypt golfowy,
87 znaków:`
- sprecyzować argument..
- klon dwa razy&
- przecinają się ze sobą (usuwaj duplikaty)=
- sprawdź równość.jeśli funkcja musi zostać nazwana (
109 znaków ):jeśli wystarczy program (
54 znaki ):źródło
Python 2 (28)
(32)Backticks przyjmują ciąg znaków. Konwersja na zbiór usuwa duplikaty i sprawdzamy, czy to zmniejsza długość, porównując do 10 ^ d, który jest większy niż wszystkie cyfry d, ale nie ma cyfr (d + 1).
Stary kod:
źródło
n
zi
f=lambda _:len(`_`)==len(set(`_`))
lambda n:max(map('n'.count,'n'))<2
(pojedyncze cytaty to backticks), ale są o dwa znaki dłuższe.APL (6)
Jeden z niewielu przypadków, gdy milczący styl jest również krótszy w APL.
Ma 8 znaków, aby nadać mu nazwę,
ale nie trzeba go używać:
źródło
Perl, 19 znaków
źródło
<>!~/(\d).*\1/
.\d
na.
.Rebmμ (10 znaków)
Sztuczka Rebmu polega na tym, że rozróżnia małe i wielkie litery, więc postacie są uruchamiane razem. Ilekroć trafione zostanie przejście sprawy, zostanie ono podzielone na następny token. Dzięki zastosowaniu przejść zamiast rzeczy CamelCase, jedyny w swoim rodzaju wybór, aby zacząć od kapitału, oznacza „ustalone słowo”. (Chociaż słowa-zestawy mogą być używane do innych celów w programowaniu symbolicznym, domyślnie są one oceniane jako zadania).
To „unmushuje”, aby:
Miejsce jest potrzebne, ponieważ po rozpoczęciu serii przebiegów naprzemiennych spraw nie można użyć tej sztuczki, aby uzyskać ustawione słowo po pierwszym, chyba że rozpoczniesz nowy przebieg. Więc
e?AtsAuqA
nie dałbym cie? a ts a uq a
... żadnego zadania.(Uwaga: z tego, co może nie być szczególnie dobrego powodu, wolę przemyśleć rozwiązania, aby nie było spacji, jeśli liczba znaków jest równa. Ponieważ nawiasy, nawiasy i ciągi niejawnie kończą symbol ... często są uczciwe liczba możliwości.)
W każdym razie, gdy jest mapowany na Rebol, który skraca:
Rzucanie w niektórych nawiasach, aby uzyskać sedno kolejności oceny:
Tak więc operator równości prefiksu jest stosowany do dwóch argumentów - pierwszy wynik przypisania do
a
samej wersji łańcucha, a drugi wynikunique
działania na tym łańcuchu. Zdarza się, że unikalny zwróci Ci elementy w takiej samej kolejności, w jakiej je przekazałeś ... tak unikalny dla „31214” to na przykład „3124”.Uruchom z:
Istnieją również statystyki i informacje debugowania:
Jeśli wymaga się zdefiniowania funkcji o nazwie / wielokrotnego użytku, można utworzyć „funkcję A”, która domyślnie przyjmuje parametr o nazwie z
a|
. (Funkcja B zostałaby utworzona zab|
pomocą parametru o nazwie A, a następnie o nazwie B). Dodałoby to jeszcze pięć znaków ... powiedzmy, że wywołujesz funkcję „f”„Śmiejesz się! Śmiali się z Einsteina! Albo czekaj… prawda? Nie… nie wiem.”
źródło
Reb moo
, ale teraz nie jestem pewien, czy to ma byćRebum mew
lubReb mew
czy coś innego.Fa|[e? AtsAugA]
jakoFalse? SomeGibberish
s
naprawdę rozpada się[
w Nethack?REBmu
jest prawdopodobnie lepiej. Tak czy inaczej, broda jest ciasna ... szczypie. Chyba masz za co płacisz.FRACTRAN -
5338 frakcjiUżywa podziału, aby policzyć liczbę wystąpień każdej cyfry. Wywołaj, wpisując n do rejestru 2 i ustawiając rejestr 5 na 1, daje wyjście w rejestrze 3 (0 jeśli fałsz, 1 jeśli prawda). Upewnij się również, że reszta programu używa tylko rejestrów> 71.
Edytuj 25/12/14: Minęło 7 miesięcy i od tego czasu otrzymaliśmy Fragmenty kodu, więc oto jeden z nich, aby przetestować kod (korzystając z mojego lepszego interpretera tutaj ).
Zamień na
142857
inny numer. Dane wyjściowe powinny być3^1
prawdziwe,1 = 3^0
jeśli fałszywe. W przypadku większych liczb zajmuje to trochę czasu (cóż, to jest FRACTRAN ...).źródło
JavaScript - 23 znaków
Jako funkcja (ECMAScript 6):
Lub pobieranie danych z monitu (25 znaków)
źródło
C #
736059Pierwszy golf dla mnie ...
Mógłbym rozebrać inną postać, konwertującNo to ruszamy ...uint
naint
, ale raczej podejmę to zadanie zbyt dosłownie, niż na odwrót.źródło
i => (i + "").Distinct().SequenceEqual(i + "");
+""
telefonowaniuToString()
pod maską.Rubinowy (24 bajty)
Użyj wyrażenia regularnego, aby dopasować „jakiś znak, następnie zero lub więcej znaków, a następnie ten sam znak”.
Jeśli wartości truthy lub falsy są akceptowane, a nie dosłowne
true
lubfalse
, wtedy mamy 20 znaków:źródło
C (87)
Ponieważ nie mogę wygrać, pójdę po wydajność.
Kod funkcji:
źródło
Mathematica,
3525 znaków(27, jeśli funkcja wymaga nazwy.)
EDYCJA: Zapisano 8 znaków dzięki Belizariuszowi!
źródło
Unequal @@ IntegerDigits@# &
mógłby zrobić, myślę≠
będzie porównywał nieprzylegające elementy). Dzięki, to bardzo skraca!Unequal@@IntegerDigits@#&
ma 25 znaków.R,
53514834 bajtówWypróbuj online!
Konwertuj na ciąg i podziel. Konwertuj na tabelę zliczeń minus 1, sumuj i negujZainspirowany najczęstszą odpowiedzią numerową Alexa i sugestią Hugh.Para uratowana dzięki @plannapus Jeszcze jedno od @Gregor I para od uczynienia go anonimową funkcją
Teraz ze wspaniałą dobrością wyrażenia regularnego dzięki @ J.Doe. Wyszukuje dowolny pojedynczy znak w liczbie, która pasuje do siebie w innym miejscu w ciągu.
grepl
Polecenie zwraca logiczną, która jest następnie zwracane. Wyrażenia regularne w stylu Perla są ustawione na True.źródło
paste0
zamiasttoString
i zapisując 2 znaki.paste
zamiastpaste0
zapisać jeszcze jedną postać.J (9)
Zakłada, że wartość do przetestowania jest zmienna
b
(wiem, że można ją przekształcić w funkcję, ale nie mam pojęcia, w jaki sposób . J. jest mylący. Jakakolwiek pomoc w tym zakresie jest doceniana)Dzięki Marinus!Sprawdza, czy długość powtórzenia ciągu liczby po usunięciu wszystkich duplikatów jest taka sama, jak długość zwykłego powtórzenia ciągu.
źródło
(-:~.)@":
.R (
70,60,53, 52)Dziękujemy wszystkim za przydatne komentarze! Twoje komentarze zostały uwzględnione w odpowiedzi.
źródło
strsplit
dlaczego nie zmusić x do użycia postacic(x,"")
?f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)
jest 1 postać krótsza :)Matematyka (
2019)(
2221, jeśli funkcja wymaga nazwy)lub
gdzie | istnieje wpisany jako [Esc] dzieli [Esc]
źródło
Brachylog , 1 bajt
Wypróbuj online!
źródło
C99, 59 znaków
źródło
Groovy (36 znaków)
Przetestowałem za pomocą:
źródło
0>1
jest krótszy.!1
zamiast tego.Haskell:
źródło
Data.List
, sugerujęnub
, aby usunąć duplikaty z listy.(\x->nub x==x).show
main = interact $ show . ap (==) nub . show
J (8)
Kompetentnie oddzielne od mojej poprzedniej odpowiedzi.
źródło
R,
6665 znakówRozdziel cyfry za pomocą dzielenia liczb całkowitych i modulo, a następnie sprawdź, czy są duplikatami.
Stosowanie:
Lub, jak sugerował @MickyT, dla 63 znaków:
źródło
anyDuplicated
zamiastsum
iduplicated
za 2 więcejC, 58 bajtów
Może przewijać do 7 identycznych cyfr przed przewróceniem.
w programie testowym (łatwiej jest zobaczyć, jak to działa ze stałą ósemkową)
Jeśli zdarzy ci się mieć dużą moc 2 poręcznych, stałą można obliczyć jak
f&(1<<30)/7*6
źródło
int main(int)
swojej odpowiedzi ...Haskell , 34 bajty
Wypróbuj online!
źródło
Javascript 73 znaki
źródło
Befunge 98, 17 bajtów
To niekonkurencyjna odpowiedź, ponieważ Befunge nie ma funkcji.
Wyświetla a,
1
jeśli wszystkie cyfry numeru są unikalne; w przeciwnym razie to się po prostu kończy.Działa to poprzez dostęp do komórki w przestrzeni Funge, której
x
współrzędna jest wartością ASCII wprowadzonego znaku (przyjmuje znak po znaku) i którejy
współrzędna jest1
. Jeśli cyfra nie była wcześniej widziana, wartość komórki to32
(znak spacji). Jeśli tak jest, ustawiam wartość na 1.Jako bonus działa to również w przypadku liczb innych niż.
źródło
PowerShell - 26
źródło
Perl 6 (19 bajtów)
.comb
dzieli ciąg na znaki (na przykład42.comb
daje"4", "2"
)..uniq
usuwa wszystkie nieunikalne postacie..comb
znaki w łańcuchu (pierwotnie użyłem.chars
, ale.comb
jest krótszy).==
konwertuje listy na liczbę zawartych w nim elementów i porównuje liczby. Kiedy.
jest używany bez obiektu wcześniej,$_
domyślnie przyjmuje się parametr funkcji.{}
są literałami funkcyjnymi.źródło
C 76
Nie jest to blisko wygranej, ale i tak opublikuję to, aby pokazać alternatywne podejście.
Drukuje nową linię, jeśli jest fałszywa, nic nie drukuje, jeśli jest prawdą.
źródło
int main(int, char **)
lubint main(void)
.int main(int)
nie jest poprawny.main()
porządku?main(void)
(w definicji, w deklaracji deklaruje funkcję z listą nieznanych parametrów).POSIX sh i egrep (
47,43, 40)!
zamiast-z
ztest
- Dzięki DigitalTrauma`CODE`
zamiast$(CODE)
- Dzięki DigitalTraumafold -1
zamiastgrep -o .
1 - Dzięki DigitalTrauma.Jeśli zgodność z POSIX nie jest ważna,
echo PARAM |
można ją zastąpić<<<PARAM
, zmniejszając długość funkcji do 37 :Stosowanie:
1 notacja jest przestarzałe w niektórych wersjach .
fold -N
fold
źródło
f()(! [ `fold -1<<<$1|sort|uniq -d` ])
według moichtest
wykrzykuje się na nim, gdyuniq -d
zwraca więcej niż jedną linię. Zatem najkrótsza wersja inna niż POSIX ma 40 znaków. Wiem o[ !
notacji, ale jestem zaskoczony, że to! [
też działa, wiesz dlaczego?Java (
1315957)57 znaków:
usunięto ^ i $ zgodnie z sugestią @ n̴̖̋h̷͉̃a̷̭̿h̷̰̀ĥ̷̳d̷̰̀ĥ̷̳
59 znaków (działa również z liczbami ujemnymi!):
7978 znaków (dzięki @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳):Użyj for, aby zapisać kilka characherów i użyj int jako tablicy boolowskiej.
Użyj & zamiast &&, aby uratować 1 postać (Okazuje się, że Java na to pozwala).
131 znaków (zwraca wartość true dla liczb ujemnych):
z komentarzami:
I odpowiedź, która jest technicznie poprawna (liczba znaków obejmuje tylko funkcję, a nie zmienne globalne), ale myślę, że to oszustwo, 29 znaków:
m [] to tablica boolowska, która zawiera poprawne odpowiedzi dla wszystkich 32-bitowych liczb całkowitych.
źródło
"^.*(.).*\\1.*$"
Możesz upuścić^
i$
. Są implikowani przezmatches()
return!
najkrótszą odpowiedzią, możesz dostać się do 56 bajtów.