Sprawdź, czy wszystkie cyfry dziesiętne są unikalne


37

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.


Nadal byłbym zainteresowany innymi rozwiązaniami C lub C ++ zgodnie z pytaniem, które zainspirowało to.
Thomas

1
Dlaczego nie ma makr C lub C ++ ani nieokreślonego zachowania? Dziwnie ogranicza się to tylko do dwóch języków.
dfeuer

Odpowiedzi:


31

Skrypt golfowy, 8 7 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 ):

{`..&=}:a

jeśli wystarczy program (54 znaki ):

..&=

5
Trudną częścią takich wyzwań jest bycie pierwszym, który to widzi.
primo

1
@primo jeszcze w jakiś sposób wciąż uzyskują wynik +6 w ciągu pół dnia.
John Dvorak

1
@JanDvorak Parkinson's trywiality at work
Claudiu

2
@Claudiu Możesz zrozumieć prawo. Uświadom sobie, że jesteś tym poddany. W każdym razie idź za odpowiedz.
Cruncher

1
@NathanChere co masz na myśli? ostatni (i jedyny) moment, w którym sugerowano, że luka spadła do -3 przed usunięciem przez sugestię następnego dnia rano. Jeśli nie lubisz odpowiedzi w golfa, nie głosuj za nimi.
John Dvorak

24

Python 2 (28) (32)

lambda n:10**len(set(`n`))>n

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:

lambda n:len(set(`n`))==len(`n`)


1
Ha miałem to dokładna sama odpowiedź gotowy, po prostu zastąpić nzi
Claudiu

1
@Claudiu ja też.f=lambda _:len(`_`)==len(set(`_`))
Oberon

Tak, z tymi wyzwaniami wielkości kęsa, wszyscy zamierzają skupić się na tym samym. Próbowałem też lambda n:max(map('n'.count,'n'))<2(pojedyncze cytaty to backticks), ale są o dwa znaki dłuższe.
xnor

16

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ę,

f←≡∘∪⍨∘⍕

ale nie trzeba go używać:

      ≡∘∪⍨∘⍕ 199
0
      ≡∘∪⍨∘⍕ 198
1
      f←≡∘∪⍨∘⍕
      f¨ 198 199 200 201
1 0 0 1
      ≡∘∪⍨∘⍕¨ 198 199 200 201
1 0 0 1

1
Myślę, że drugi jot można usunąć, aby uzyskać 5. Wciąż sam byłby prawidłową funkcją (choć wymagałoby to grupowania parenów, aby użyć go z każdym operatorem w ostatnim przykładzie).
user46915,

11

Perl, 19 znaków

print<>!~/(\d).*\1/

zakładając, że dane wyjściowe mogą być traktowane jako prawda, a brak danych wyjściowych może być traktowany jako fałsz, logika jest odwrócona. Powinieneś zwrócić true, jeśli nie ma powtórzeń.
John Dvorak

@JanDvorak Brzmi dobrze. Naprawię to.
Tal

Nie meczu operator: <>!~/(\d).*\1/.
primo

@primo Dzięki! Tyle do nauczenia :)
Tal

3
Dane wejściowe są określone jako nieujemna liczba całkowita, więc nie sądzę, że musisz to sprawdzać. Jeśli nie, możesz zmienić \dna ..
hvd

9

Rebmμ (10 znaków)

e? AtsAuqA

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:

e? a: ts a uq a

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?AtsAuqAnie dałbym ci e? 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:

equal? a: to-string a unique a

Rzucanie w niektórych nawiasach, aby uzyskać sedno kolejności oceny:

equal? (a: (to-string a)) (unique a)

Tak więc operator równości prefiksu jest stosowany do dwóch argumentów - pierwszy wynik przypisania do asamej wersji łańcucha, a drugi wynik uniquedział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:

>> rebmu/args "e? AtsAuqA" 17308459             
== true

Istnieją również statystyki i informacje debugowania:

>> rebmu/args/stats/debug "e? AtsAuqA" 48778584 
Original Rebmu string was: 10 characters.
Rebmu as mushed Rebol block molds to: 10 characters.
Unmushed Rebmu molds to: 15 characters.
Executing: [e? a: ts a uq a]
== false

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 za b|pomocą parametru o nazwie A, a następnie o nazwie B). Dodałoby to jeszcze pięć znaków ... powiedzmy, że wywołujesz funkcję „f”

Fa|[e? AtsAugA]

„Śmiejesz się! Śmiali się z Einsteina! Albo czekaj… prawda? Nie… nie wiem.”


Kiedyś myślałem, że język został wymawiane jak Reb moo, ale teraz nie jestem pewien, czy to ma być Rebum mewlub Reb mewczy coś innego.
Justin

2
Po zagraniu w Nethacka przeczytałem Fa|[e? AtsAugA]jakoFalse? SomeGibberish
Justin

@Quincunx snaprawdę rozpada się [w Nethack?
John Dvorak

@JanDvorak Widziałem, jak niektóre listy rozpadają się na [po pewnym czasie
Justin

@Quincunx Po prostu gra z logo. Myślę, że REBmujest prawdopodobnie lepiej. Tak czy inaczej, broda jest ciasna ... szczypie. Chyba masz za co płacisz.
Dr. Rebmu

7

FRACTRAN - 53 38 frakcji

47/10 3/5 106/47 3599/54272 53/61 2881/27136 2479/13568 2077/6784 1943/3392 1541/1696 1273/848 1139/424 871/212 737/106 469/53 142/3953 67/71 5/67 1/147 1/363 1/507 1/867 1/1083 1/1587 1/2523 1/2883 1/4107 1/5547 1/7 1/11 1/13 1/17 1/19 1/23 1/29 1/31 1/37 1/43

Uż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 ).

var ITERS_PER_SEC=1E5;var TIMEOUT_MILLISECS=5E3;var ERROR_INPUT="Invalid input";var ERROR_PARSE="Parse error: ";var ERROR_TIMEOUT="Timeout";var ERROR_INTERRUPT="Interrupted by user";var running,instructions,registers,timeout,start_time,iterations;function clear_output(){document.getElementById("output").value="";document.getElementById("stderr").innerHTML=""};function stop(){running=false;document.getElementById("run").disabled=false;document.getElementById("stop").disabled=true;document.getElementById("clear").disabled=false}function interrupt(){error(ERROR_INTERRUPT)}function error(msg){document.getElementById("stderr").innerHTML=msg;stop()}function factorise(n){var factorisation={};var divisor=2;while(n>1){if(n%divisor==0){var power=0;while(n%divisor==0){n/=divisor;power+=1}if(power!=0)factorisation[divisor]=power}divisor+=1}return factorisation};function fact_accumulate(fact1,fact2){for(var reg in fact2)if(reg in fact1)fact1[reg]+=fact2[reg];else fact1[reg]=fact2[reg];return fact1};function exp_to_fact(expression){expression=expression.trim().split(/\s*\*\s*/);var factorisation={};for(var i=0;i<expression.length;++i){var term=expression[i].trim().split(/\s*\^\s*/);if(term.length>2)throw"error";term[0]=parseInt(term[0]);if(isNaN(term[0]))throw"error";if(term.length==2){term[1]=parseInt(term[1]);if(isNaN(term[1]))throw"error";}if(term[0]<=1)continue;var fact_term=factorise(term[0]);if(term.length==2)for(var reg in fact_term)fact_term[reg]*=term[1];factorisation=fact_accumulate(factorisation,fact_term)}return factorisation}function to_instruction(n,d){instruction=[];divisor=2;while(n>1||d>1){if(n%divisor==0||d%divisor==0){reg_offset=0;while(n%divisor==0){reg_offset+=1;n/=divisor}while(d%divisor==0){reg_offset-=1;d/=divisor}if(reg_offset!=0)instruction.push(Array(divisor,reg_offset))}divisor+=1}return instruction};function run(){clear_output();document.getElementById("run").disabled=true;document.getElementById("stop").disabled=false;document.getElementById("clear").disabled=true;timeout=document.getElementById("timeout").checked;var code=document.getElementById("code").value;var input=document.getElementById("input").value;instructions=[];code=code.trim().split(/[\s,]+/);for(i=0;i<code.length;++i){fraction=code[i];split_fraction=fraction.split("/");if(split_fraction.length!=2){error(ERROR_PARSE+fraction);return}numerator=parseInt(split_fraction[0]);denominator=parseInt(split_fraction[1]);if(isNaN(numerator)||isNaN(denominator)){error(ERROR_PARSE+fraction);return}instructions.push(to_instruction(numerator,denominator))}try{registers=exp_to_fact(input)}catch(err){error(ERROR_INPUT);return}running=true;iterations=0;start_time=Date.now();fractran_iter(1)};function regs_to_string(regs){reg_list=Object.keys(regs);reg_list.sort(function(a,b){return a-b});out_str=[];for(var i=0;i<reg_list.length;++i)if(regs[reg_list[i]]!=0)out_str.push(reg_list[i]+"^"+regs[reg_list[i]]);out_str=out_str.join(" * ");if(out_str=="")out_str="1";return out_str};function fractran_iter(niters){if(!running){stop();return}var iter_start_time=Date.now();for(var i=0;i<niters;++i){program_complete=true;for(var instr_ptr=0;instr_ptr<instructions.length;++instr_ptr){instruction=instructions[instr_ptr];perform_instr=true;for(var j=0;j<instruction.length;++j){var reg=instruction[j][0];var offset=instruction[j][1];if(registers[reg]==undefined)registers[reg]=0;if(offset<0&&registers[reg]<-offset){perform_instr=false;break}}if(perform_instr){for(var j=0;j<instruction.length;++j){var reg=instruction[j][0];var offset=instruction[j][1];registers[reg]+=offset}program_complete=false;break}}if(program_complete){document.getElementById("output").value+=regs_to_string(registers);stop();return}iterations++;if(timeout&&Date.now()-start_time>TIMEOUT_MILLISECS){error(ERROR_TIMEOUT);return}}setTimeout(function(){fractran_iter(ITERS_PER_SEC*(Date.now()-iter_start_time)/1E3)},0)};
<div style="font-size:12px;font-family:Verdana, Geneva, sans-serif;"><div style="float:left; width:50%;">Code:<br><textarea id="code" rows="4" style="overflow:scroll;overflow-x:hidden;width:90%;">47/10 3/5 106/47 3599/54272 53/61 2881/27136 2479/13568 2077/6784 1943/3392 1541/1696 1273/848 1139/424 871/212 737/106 469/53 142/3953 67/71 5/67 1/147 1/363 1/507 1/867 1/1083 1/1587 1/2523 1/2883 1/4107 1/5547 1/7 1/11 1/13 1/17 1/19 1/23 1/29 1/31 1/37 1/43</textarea><br>Input:<br><textarea id="input" rows="2" style="overflow:scroll;overflow-x:hidden;width:90%;">2^142857 * 5</textarea><p>Timeout:<input id="timeout" type="checkbox" checked="true"></input></p></div><div style="float:left; width:50%;">Output:<br><textarea id="output" rows="6" style="overflow:scroll;width:90%;"></textarea><p><input id="run" type="button" value="Run" onclick="run()"></input><input id="stop" type="button" value="Stop" onclick="interrupt()" disabled="true"></input><input id="clear" type="button" value="Clear" onclick="clear_output()"></input>&nbsp;<span id="stderr" style="color:red"></span></p></div></div>

Zamień na 142857inny numer. Dane wyjściowe powinny być 3^1prawdziwe, 1 = 3^0jeśli fałszywe. W przypadku większych liczb zajmuje to trochę czasu (cóż, to jest FRACTRAN ...).


6

JavaScript - 23 znaków

Jako funkcja (ECMAScript 6):

f=x=>!/(.).*\1/.test(x)

Lub pobieranie danych z monitu (25 znaków)

!/(.).*\1/.test(prompt())

6

C # 73 60 59

Pierwszy golf dla mnie ...

Napisz funkcję, która przyjmuje nieujemną liczbę całkowitą jako dane wejściowe

bool f(int i){return(i+"").Distinct().SequenceEqual(i+"");}

Mógłbym rozebrać inną postać, konwertując uintna int, ale raczej podejmę to zadanie zbyt dosłownie, niż na odwrót. No to ruszamy ...


1
Niektóre opcje:i => (i + "").Distinct().SequenceEqual(i + "");
NPSF3000

@ NPSF3000 Dzięki! Edytowałem moją odpowiedź. Miałem na myśli coś takiego, ale cóż ... całkowicie zapomniałem o +""telefonowaniu ToString()pod maską.
Num Lock

Bardziej dosłowna interpretacja „nieujemnej liczby całkowitej” sugeruje, że podana zostanie liczba całkowita ze znakiem, ale nigdy nie będzie ona ujemna.
Shaz

Cóż, myślę, że wtedy będzie dobrze ...
Num Lock

Użyj C # 6 i możesz użyć: bool f (int i) => (i + ""). Distinct (). SequenceEqual (i + ""); (53 bajty)
Stephan Schinkel

5

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”.

->(s){!!(s !~/(.).*\1/)}

Jeśli wartości truthy lub falsy są akceptowane, a nie dosłowne truelub false, wtedy mamy 20 znaków:

->(s){s !~/(.).*\1/}

5

C (87)

Ponieważ nie mogę wygrać, pójdę po wydajność.

Kod funkcji:

int u(uint32_t d){short s=0,f;while(d){f=1<<d%10;if(s&f)return 0;s|=f;d/=10;}return 1;}

Oh, a ponieważ nadal nie mogę wypowiedzieć się na temat innych stanowisk ludzi - Chciałbym powiedzieć, że to było miłe rozwiązanie, nawet jeśli nieprawdziwe kiedy it „przepełnienia”.
DreamWarrior

5

Mathematica, 35 25 znaków

(27, jeśli funkcja wymaga nazwy.)

Unequal@@IntegerDigits@#&

EDYCJA: Zapisano 8 znaków dzięki Belizariuszowi!


Unequal @@ IntegerDigits@# &mógłby zrobić, myślę
dr Belizariusz

@belisarius och, fajnie, szukałem czegoś takiego, ale nie mogłem tego znaleźć (i nie sądziłem, że łańcuch będzie porównywał nieprzylegające elementy). Dzięki, to bardzo skraca!
Martin Ender

Nie musisz nadawać mu nazwy, prawda? Unequal@@IntegerDigits@#&ma 25 znaków.
akater

@Akater prawda, nie widzę wymagania dla nazwy w wyzwaniu. Dzięki!
Martin Ender

5

R, 53 51 48 34 bajtów

function(n)!grepl("(.).*\\1",n,,T)

Wypróbuj online!

Konwertuj na ciąg i podziel. Konwertuj na tabelę zliczeń minus 1, sumuj i neguj

Zainspirowany 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. greplPolecenie zwraca logiczną, która jest następnie zwracane. Wyrażenia regularne w stylu Perla są ustawione na True.


Możesz także przekonwertować na ciąg znaków, używając paste0zamiast toStringi zapisując 2 znaki.
plannapus

Możesz użyć pastezamiast paste0zapisać jeszcze jedną postać.
Gregor,


@ J.Doe: jeszcze lepiej! :)
digEmAll

Zastosował inne podejście. 35 bajtów z wyrażeniem regularnym.
J.Doe

4

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.


Dla funkcji, którą możesz wykonać (-:~.)@":.
marinus

@ marinus O wow, to nawet krótsze niż myślałem. Dzięki!
Mayıʇǝɥʇuʎs

Cześć, znalazłem i opublikowałem krótsze rozwiązanie J: -: ~. &. ":
Galen Iwanow

4

R ( 70 , 60 , 53 , 52)

Dziękujemy wszystkim za przydatne komentarze! Twoje komentarze zostały uwzględnione w odpowiedzi.

### Version 70 chars
f=function(x)!any(duplicated(strsplit(as.character(x),split="")[[1]]))

### Version 60 chars
f=function(x)all(table(strsplit(as.character(x),"")[[1]])<2)

### Version 53 chars
f=function(x)all(table(strsplit(paste(x),"")[[1]])<2)

### Version 52 chars
f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)

f(48778584)
f(17308459)

@plannapus, masz rację. Mylę się co do „reprezentacji bazy 10”.
djhurio

1
Używanie tabeli i porównywanie z 0 zamiast duplikowania może uratować niektóre postacie
Dason

1
I myślę, że możesz pozostawić parametr split bez nazwy. Jestem tylko na telefonie, więc nie mogę łatwo sprawdzić, ale uważam, że jest to drugi parametr strsplit, więc można użyć argumentów pozycyjnych zamiast nazwanych, aby zapisać znaki
Dason

1
A skoro bierzesz już pierwszy element wyniku, strsplitdlaczego nie zmusić x do użycia postaci c(x,"")? f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)jest 1 postać krótsza :)
plannapus

3

Matematyka (20 19)

(22 21, jeśli funkcja wymaga nazwy)

Max@DigitCount@#<2&

lub

Max@DigitCount@#|1&

gdzie | istnieje wpisany jako [Esc] dzieli [Esc]


Miły. Zapomniałem, że istnieje DigitCount i napisałem rozwiązanie oparte na konwersji na ciągi. Twoja jest znacznie lepsza.
Michael Stern,


2

C99, 59 znaków

a(x){int r=1,f[10]={};for(;x;x/=10)r&=!f[x%10]++;return r;}

Technicznie C99 nie ma ukrytego int.
PatrickB

1
Nie tylko „technicznie” został specjalnie i celowo usunięty. Jest to błąd składniowy w C99, a oprócz wymaganej diagnostyki błędy składniowe należą do tej samej kategorii co niezdefiniowane zachowanie (wyraźnie zabronione w pytaniu): jeśli implementacja to akceptuje, standard nie nakłada żadnych wymagań na zachowanie programu.
hvd

2

Groovy (36 znaków)

f={s="$it" as List;s==s.unique(!1)}

Przetestowałem za pomocą:

println f(args[0].toInteger())

„fałsz” można zagrać w golfa za pomocą „1 == 0” lub być może w coś bardziej sprytnego. Dobra odpowiedź
Michael Wielkanoc

@MichaelEaster 0>1jest krótszy.
ace_HongKongIndependence

1
@ace Tak, choć 1 też działa ...
Michael Wielkanoc

@ace, MichaelEaster, dziękuję za pomoc :-)
Will Lp

@WillP, jak sugeruje MichaelEaster, użyj !1zamiast tego.
ace_HongKongIndependence

2

Haskell:

 import Data.List

 all ((== 1) . length) . group . sort . show

Trochę późno na imprezę, ale skoro i tak importujesz Data.List, sugeruję nub, aby usunąć duplikaty z listy. (\x->nub x==x).show
Flonk

Nie main = interact $ show . ap (==) nub . show
używałeś


2

R, 66 65 znaków

f=function(x)!sum(duplicated((x%%10^(i<-1:nchar(x)))%/%10^(i-1)))

Rozdziel cyfry za pomocą dzielenia liczb całkowitych i modulo, a następnie sprawdź, czy są duplikatami.

Stosowanie:

> f(48778584)
[1] FALSE
> f(17308459)
[1] TRUE

Lub, jak sugerował @MickyT, dla 63 znaków:

f=function(x)!anyDuplicated((x%%10^(i<-1:nchar(x)))%/%10^(i-1))

1
Możesz użyć anyDuplicatedzamiast sumi duplicatedza 2 więcej
MickyT

2

C, 58 bajtów

f;a(x){for(f=0;x;x/=10)f+=1<<x%10*3;return!(f&920350134);}

Może przewijać do 7 identycznych cyfr przed przewróceniem.

w programie testowym (łatwiej jest zobaczyć, jak to działa ze stałą ósemkową)

a(x){int f=0;for(;x;x/=10)f+=1<<x%10*3;return!(f&06666666666);}

main(){
scanf("%d",&r);
printf("%o\n",a(r));}

Jeśli zdarzy ci się mieć dużą moc 2 poręcznych, stałą można obliczyć jak f&(1<<30)/7*6


Myślę, że komentarz @xfix był przeznaczony do mojego postu zamiast twojego? W rzeczywistości nie użyłeś int main(int)swojej odpowiedzi ...
ace_HongKongIndependence

Posiadanie informacji zewnętrznych, które nie liczą się do liczby bajtów / znaków kodu, jest oczywiście niedozwolone. Sugeruję usunięcie pierwszej wersji (53 bajtów).
2501

Proszę zobaczyć mój komentarz w podsumowaniu edycji .
2501

Głosowałem za odrzuceniem edycji, ale zgadzam się, że liczby wyglądają źle. Robię je 67 i 63 (61).
Peter Taylor

Moja edycja została odrzucona przez innych użytkowników. Proszę to ponownie ocenić.
2501


1

Javascript 73 znaki

function f(n){return !~(n+'').split('').sort().join('').search(/(\d)\1/)}

1

Befunge 98, 17 bajtów

To niekonkurencyjna odpowiedź, ponieważ Befunge nie ma funkcji.

~:1g1`j@1\1p3j@.1

Wyświetla a, 1jeś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 xwspółrzędna jest wartością ASCII wprowadzonego znaku (przyjmuje znak po znaku) i której ywspółrzędna jest 1. Jeśli cyfra nie była wcześniej widziana, wartość komórki to 32(znak spacji). Jeśli tak jest, ustawiam wartość na 1.

Jako bonus działa to również w przypadku liczb innych niż.



1

Perl 6 (19 bajtów)

{.comb.uniq==.comb}

.combdzieli ciąg na znaki (na przykład 42.combdaje "4", "2"). .uniqusuwa wszystkie nieunikalne postacie. .combznaki w łańcuchu (pierwotnie użyłem .chars, ale .combjest 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.


1

C 76

Nie jest to blisko wygranej, ale i tak opublikuję to, aby pokazać alternatywne podejście.

c;i;a[99];main(){while(~(c=getchar()))a[c]++;for(;i<99;)a[i++]>1&&puts("");}

Drukuje nową linię, jeśli jest fałszywa, nic nie drukuje, jeśli jest prawdą.


Ten program ma niezdefiniowane zachowanie. Prawidłowe podpisy dla głównego to int main(int, char **)lub int main(void). int main(int)nie jest poprawny.
Konrad Borowski

@xfix Zakładam, że w main()porządku?
ace_HongKongIndependence

Tak w porządku. Oznacza to to samo co main(void)(w definicji, w deklaracji deklaruje funkcję z listą nieznanych parametrów).
Konrad Borowski

1

POSIX sh i egrep ( 47 , 43 , 40)

f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
  • [-1 char]: Użyj !zamiast -zz test- Dzięki DigitalTrauma
  • [-1 char]: Użyj `CODE`zamiast $(CODE)- Dzięki DigitalTrauma
  • [-2 znaki]: Użyj fold -1zamiast grep -o .1 - Dzięki DigitalTrauma.
  • [-3 znaki]: Sprawdź powtarzające się cyfry z wyrażeniem regularnym, do którego odwołuje się wstecz.

Jeśli zgodność z POSIX nie jest ważna, echo PARAM |można ją zastąpić <<<PARAM, zmniejszając długość funkcji do 37 :

f()([ ! `egrep '([0-9]).*\1'<<<$1` ])

Stosowanie:

$ if f 48778584; then echo true; else echo false; fi
false
$ if f 17308459; then echo true; else echo false; fi
true

1 notacja jest przestarzałe w niektórych wersjach .fold -Nfold


f()(! [ `fold -1<<<$1|sort|uniq -d` ])według moich
Digital Trauma

@DigitalTrauma: Dobre rzeczy dzięki za udostępnienie. Uważam, że testowane polecenie musi zostać zacytowane, w przeciwnym razie testwykrzykuje się na nim, gdy uniq -dzwraca 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?
Thor

Ach, używałem bash. Sądzę więc, że dłużej, jeśli chcesz zgodności z POSIX.
Cyfrowa trauma

1

Java ( 131 59 57)

57 znaków:

usunięto ^ i $ zgodnie z sugestią @ n̴̖̋h̷͉̃a̷̭̿h̷̰̀ĥ̷̳d̷̰̀ĥ̷̳

boolean u(int n){return !(n+"").matches(".*(.).*\\1.*");}

59 znaków (działa również z liczbami ujemnymi!):

boolean u(int n){return !(n+"").matches("^.*(.).*\\1.*$");}

79 78 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).

boolean u(int n){for(int x=0;n>0&(x>>n%10&1)==0;n/=10)x|=1<<n%10;return n==0;}

131 znaków (zwraca wartość true dla liczb ujemnych):

boolean u(int n){int[] p=new int[]{2,3,5,7,11,13,17,19,32,29};double a=9001312320D;while(n>0){a/=p[n%10];n/=10;}return (long)a==a;}

z komentarzami:

boolean unique(int n){
    int[] p=new int[]{2,3,5,7,11,13,17,19,32,29};//list of 10 first primes
    double a=9001312320D;//10 first primes multiplied
    while(n>0){
        a/=p[n%10];//divide by (n%10+1)th prime
        n/=10;//divide n by 10, next digit
    }
    return (long)a==a;//if a is integer then n has all digits unique
}

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:

boolean u(int i){return m[i];}

m [] to tablica boolowska, która zawiera poprawne odpowiedzi dla wszystkich 32-bitowych liczb całkowitych.


"^.*(.).*\\1.*$"Możesz upuścić ^i $. Są implikowani przezmatches()
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳

Drugie podejście można wykonać za pomocą 10 bitów w postaci int jako tablicy boolowskiej, co wyeliminuje potrzebę tworzenia tabeli głównej.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳

Wiem, że minęły trzy lata, ale jeśli usuniesz spację między return!najkrótszą odpowiedzią, możesz dostać się do 56 bajtów.
Kevin Cruijssen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.