Bestimmen Sie, ob alle Dezimalstellen eindeutig sind

37

Gelöschte Fragen zum Stack Overflow sorgen manchmal für großartiges Golfmaterial.

Schreiben Sie eine Funktion, die eine nichtnegative Ganzzahl als Eingabe verwendet und true zurückgibt, wenn alle Ziffern in der Basis-10-Darstellung dieser Zahl eindeutig sind. Beispiel:

48778584 -> false
17308459 -> true

Die Zeichenanzahl umfasst nur die Funktion.

Wenn Sie in C oder C ++ antworten möchten: keine Makros, kein undefiniertes Verhalten; Implementierungsdefiniertes Verhalten und Compiler-Warnungen sind in Ordnung.

Thomas
quelle
Ich würde mich immer noch für andere C- oder C ++ - Lösungen interessieren, wie aus der Frage hervorgeht, die diese inspiriert hat.
Thomas
1
Warum keine C- oder C ++ - Makros oder undefiniertes Verhalten? Das ist seltsamerweise auf nur zwei Sprachen beschränkt.
14.

Antworten:

31

Golfscript, 8 7 Zeichen:

{`..&=}
  • ` - Fassen Sie das Argument zusammen
  • .. - zweimal klonen
  • & - sich selbst schneiden (Duplikate entfernen)
  • = - auf Gleichheit prüfen.

wenn die Funktion benannt werden muss (109 Zeichen ):

{`..&=}:a

wenn ein Programm ausreicht (54 Zeichen ):

..&=
John Dvorak
quelle
5
Das Schwierige an solchen Herausforderungen ist, dass man es als Erster sieht.
Primo
1
@primo dennoch, irgendwie bekommen sie innerhalb eines halben Tages immer noch +6 Punkte.
John Dvorak
1
@ JanDvorak Parkinson Gesetz der Trivialität bei der Arbeit
Claudiu
2
@Claudiu Du kannst das Gesetz verstehen. Erkenne, dass du ihm unterworfen bist. Dann stimme der Antwort trotzdem zu.
Cruncher
1
@ NathanChere was meinst du? Das letzte (und einzige) Mal, dass eine Lücke vorgeschlagen wurde, ging diese auf -3 zurück, bevor sie am nächsten Morgen vom Vorschlagenden gelöscht wurde. Wenn Sie keine Golfscript-Antworten mögen, stimmen Sie diesen nicht zu.
John Dvorak
24

Python 2 (28) (32)

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

Die Backticks nehmen die Stringdarstellung an. Beim Konvertieren in eine Menge werden Duplikate entfernt, und es wird überprüft, ob dies die Länge verringert, indem 10 ^ d verglichen wird, was größer ist als alle d-stelligen Zahlen, aber keine (d + 1) -stelligen Zahlen.

Alter Code:

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

xnor
quelle
1
Ha Ich hatte diese genau gleiche Antwort bereit, ersetzen Sie einfach nmiti
Claudiu
1
@Claudiu ich auch.f=lambda _:len(`_`)==len(set(`_`))
Oberon
Ja, mit diesen mundgerechten Herausforderungen werden sich alle auf so ziemlich dasselbe einigen. Ich habe auch versucht lambda n:max(map('n'.count,'n'))<2(die einfachen Anführungszeichen sind Backticks), aber es sind zwei Zeichen länger.
21.
16

APL (6)

≡∘∪⍨∘⍕

Eines der wenigen Male, bei denen der implizite Stil auch bei APL kürzer ist.

Es sind 8 Zeichen, um ihm einen Namen zu geben.

f←≡∘∪⍨∘⍕

aber das ist nicht nötig um es zu benutzen:

      ≡∘∪⍨∘⍕ 199
0
      ≡∘∪⍨∘⍕ 198
1
      f←≡∘∪⍨∘⍕
      f¨ 198 199 200 201
1 0 0 1
      ≡∘∪⍨∘⍕¨ 198 199 200 201
1 0 0 1
Marinus
quelle
1
Ich denke, der zweite Punkt kann entfernt werden, um ihn zu erstellen. 5. Es wäre immer noch eine gültige Funktion für sich (obwohl für die Verwendung mit jedem Operator im letzten Beispiel das Gruppieren von Parens erforderlich wäre).
user46915
11

Perl, 19 Zeichen

print<>!~/(\d).*\1/
Tal
quelle
Unter der Annahme, dass die Ausgabe als wahr und die Nichtausgabe als falsch behandelt werden kann, ist Ihre Logik umgekehrt. Sie sollten true zurückgeben, wenn keine Wiederholung erfolgt.
John Dvorak
@ JanDvorak Klingt ungefähr richtig. Ich werde das reparieren.
Tal
Nicht-Spiel Betreiber: <>!~/(\d).*\1/.
Primo
@primo Danke! Soviel zu lernen :)
Tal
3
Die Eingabe ist als nicht negative Ganzzahl angegeben, daher muss sie meines Erachtens nicht überprüft werden. Wenn Sie in der Tat nicht tun, können Sie ändern \dzu ..
HDV
9

Rebmμ (10 Zeichen)

e? AtsAuqA

Rebmus "Mushing" -Trick ist, dass die Groß- und Kleinschreibung nicht beachtet wird, sodass die Zeichen zusammenlaufen. Immer wenn ein Fallübergang getroffen wird, wird dieser zum nächsten Token aufgeteilt. Durch die Verwendung von Übergängen anstelle von CamelCase-Übergängen wird durch die einmalige Entscheidung, mit einem Großbuchstaben zu beginnen, ein "Set-Word" erstellt. (Während gesetzte Wörter in der symbolischen Programmierung für andere Zwecke verwendet werden können, werden sie standardmäßig als Zuweisungen ausgewertet.)

Das "entmuscht" also:

e? a: ts a uq a

Der Platz wird benötigt, da Sie mit diesem Trick nach einer Reihe von Läufen abwechselnder Fälle nur dann ein festes Wort nach dem ersten erhalten können, wenn Sie einen neuen Lauf beginnen. Also e?AtsAuqAhättest du bekommen e? a ts a uq a... keine Zuordnung.

(Anmerkung: Aus irgendeinem Grund bevorzuge ich es, Lösungen so zu überdenken, dass keine Leerzeichen entstehen, wenn die Anzahl der Zeichen gleich ist. Da Klammern, Klammern und Zeichenfolgen implizit ein Symbol beenden ... gibt es oft ein Fair Anzahl der Möglichkeiten dafür.)

Auf jeden Fall, wenn dem Rebol zugeordnet, dass es abkürzt:

equal? a: to-string a unique a

Wirf ein paar Klammern ein, um den Kern der Bewertungsreihenfolge zu ermitteln:

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

Der Präfix-Gleichheitsoperator wird also auf zwei Argumente angewendet: Das erste ist das Ergebnis der Zuweisung ader String-Version von sich selbst und das zweite das Ergebnis der uniqueAusführung für diesen String. Es kommt also vor, dass unique die Elemente in der Reihenfolge zurückgibt, in der Sie sie übergeben haben. So ist zum Beispiel "3124" für "31214" eindeutig.

Führen Sie es mit:

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

Es gibt auch einige Statistiken und Debug-Informationen:

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

Wenn die Anforderung besteht, dass eine benannte / wiederverwendbare Funktion definiert werden muss, können Sie eine "A-Funktion" erstellen, die implizit einen Parameter mit dem Namen a mitnimmt a|. (Eine B-Funktion würde mit b|einem Parameter mit dem Namen A und einem mit dem Namen B erstellt werden.) Das würde also fünf weitere Zeichen hinzufügen ... Angenommen, Sie rufen die Funktion "f" auf.

Fa|[e? AtsAugA]

"Du lachst! Sie haben über Einstein gelacht! Oder warten Sie ... oder? Ich ... weiß nicht."

Dr. Rebmu
quelle
Früher habe ich die Sprache wie ausgeprägt denken war Reb moo, aber jetzt bin ich nicht sicher , ob es angenommen hat , sein Rebum mewoder Reb mewanders oder so etwas.
Justin
2
Nachdem ich Nethack gespielt habe, las ich Fa|[e? AtsAugA]alsFalse? SomeGibberish
Justin
@Quincunx zerfällt swirklich [in Nethack?
John Dvorak
@JanDvorak Ich habe einige Briefe gesehen, in die [nach einiger Zeit
Justin
@ Quincunx Nur mit dem Logo spielen. Ich denke REBmuist wahrscheinlich besser. In jedem Fall ist der Bart eng ... es drückt. Schätze, du bekommst, wofür du zahlst.
Dr. Rebmu
7

FRACTRAN - 53 38 Fraktionen

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

Verwendet Division, um die Anzahl der Vorkommen jeder Ziffer zu zählen. Der Aufruf durch Setzen von n in Register 2 und Setzen von Register 5 auf 1 ergibt eine Ausgabe in Register 3 (0, wenn falsch, 1, wenn wahr). Stellen Sie außerdem sicher, dass der Rest Ihres Programms nur Register> 71 verwendet.


Bearbeiten 25/12/14: Es ist 7 Monate und wir haben seit Stapel Snippets bekommen, also hier ist man den Code zu testen (mit meinen könnte-sein-besser Dolmetscher hier ).

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>

Ersetzen Sie 142857durch eine andere Nummer. Die Ausgabe sollte 3^1wahr oder 1 = 3^0falsch sein. Dauert eine Weile für größere Nummern ( na ja , das ist FRACTRAN ...).

Sp3000
quelle
6

JavaScript - 23 Zeichen

Als eine Funktion (ECMAScript 6):

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

Oder Eingaben über eine Eingabeaufforderung (25 Zeichen)

!/(.).*\1/.test(prompt())
MT0
quelle
6

C # 73 60 59

Erstes Golfen für mich ...

Schreiben Sie eine Funktion , die eine nicht negative Ganzzahl als Eingabe verwendet

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

Könnte durch Konvertieren uintin ein anderes Zeichen entfernen int, aber ich nehme die Aufgabe eher zu wörtlich als umgekehrt. Auf geht's ...

Num Lock
quelle
1
Einige Optionen:i => (i + "").Distinct().SequenceEqual(i + "");
NPSF3000
@ NPSF3000 Danke! Bearbeitet meine Antwort. Ich hatte so etwas im Kopf, aber na ja ... ich habe total vergessen +"", ToString()unter der Haube zu telefonieren.
Num Lock
Eine wörtlichere Interpretation von "nichtnegative Ganzzahl" deutet darauf hin, dass eine vorzeichenbehaftete Ganzzahl übergeben wird, die jedoch niemals negativ ist.
Shaz
Nun, ich denke, es wird dann in Ordnung sein ...
Num Lock
Verwenden Sie C # 6 und Sie können Folgendes verwenden: bool f (int i) => (i + ""). Distinct (). SequenceEqual (i + ""); (53 bytes)
Stephan Schinkel
5

Ruby (24 Bytes)

Verwenden Sie einen regulären Ausdruck, um "ein Zeichen, gefolgt von null oder mehr Zeichen, dann dasselbe Zeichen" abzugleichen.

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

Wenn wahrheitsgemäße oder falsche Werte akzeptiert werden und nicht wörtliche trueoder false, erhalten wir 20 Zeichen:

->(s){s !~/(.).*\1/}
John Feminella
quelle
5

C (87)

Da ich nicht gewinnen kann, werde ich mich um Effizienz bemühen.

Funktionscode:

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;}
DreamWarrior
quelle
Oh, und da ich die Beiträge anderer Leute immer noch nicht kommentieren kann, möchte ich sagen, dass dies eine ordentliche Lösung war, auch wenn sie ungenau ist, wenn sie "überläuft".
DreamWarrior
5

Mathematica, 35 25 Zeichen

(27, wenn die Funktion einen Namen benötigt.)

Unequal@@IntegerDigits@#&

BEARBEITEN: 8 Zeichen dank belisarius gespeichert!

Martin Ender
quelle
Unequal @@ IntegerDigits@# &tun, könnte ich denke
Dr. belisarius
@belisarius oh nice, ich suchte nach so etwas, konnte es aber nicht finden (und dachte nicht, dass angekettet nicht benachbarte Elemente vergleichen würde). Danke, das verkürzt das sehr!
Martin Ender
Du musst ihm keinen Namen geben, oder? Unequal@@IntegerDigits@#&ist 25 Zeichen.
Akater
@Akater stimmt, ich kann keine Anforderung für den Namen in der Herausforderung sehen. Vielen Dank!
Martin Ender
5

R 53 51 48 34 Bytes

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

Probieren Sie es online!

In einen String konvertieren und teilen. Konvertiere in eine Tabelle mit Zählungen minus 1, summiere und negiere

Inspiriert von Häufigste Antwortnummer von Alex und Vorschlag von Hugh.

Ein paar gerettet, dank @plannapus Ein weiteres von @Gregor Und ein paar davon, es zu einer anonymen Funktion zu machen

Jetzt mit wunderbarer Regex-Güte dank @ J.Doe. Dies sucht nach einem einzelnen Zeichen in der Zahl, die mit sich selbst übereinstimmt, wo in der Zeichenfolge. Der greplBefehl gibt eine Logik zurück, die dann zurückgegeben wird. Regexes im Perl-Stil sind auf True gesetzt.

MickyT
quelle
Sie können paste0anstelle von toString2 Zeichen auch in Zeichenfolgen konvertieren und diese speichern.
Plannapus
Sie können pasteanstelle von paste0ein weiteres Zeichen speichern.
Gregor
@ J.Doe: noch besser! :)
digEmAll
Verwendete einen anderen Ansatz. 35 Bytes mit Regex.
J.Doe,
4

J (9)

Angenommen, der zu testende Wert ist eine Variable b (ich weiß, dass dies in eine Funktion umgewandelt werden kann, habe aber keine Ahnung, wie . J ist verwirrend. Jede Hilfe hierzu wird geschätzt.) Danke Marinus!

(-:~.)@":

Überprüft, ob die Länge der Zeichenfolgenwiederholung der Zahl mit allen entfernten Duplikaten der Länge der regulären Zeichenfolgenwiederholung entspricht.

ɐɔıɐɔuʇǝɥʇs
quelle
Für eine Funktion können Sie tun (-:~.)@":.
Marinus
@marinus Oh wow, das ist noch kürzer als ich dachte. Vielen Dank!
Dienstag,
HI, ich habe eine kürzere J-Lösung gefunden und gepostet: -: ~. &. ":
Galen Ivanov
4

R ( 70 , 60 , 53 , 52)

Vielen Dank für die nützlichen Kommentare! Ihre Kommentare sind in der Antwort enthalten.

### 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)
Djhurio
quelle
@plannapus, du hast recht. Ich war verwirrt über "Basis 10 Darstellung".
Djhurio
1
Wenn Sie eine Tabelle verwenden und mit 0 vergleichen, anstatt sie zu duplizieren, werden möglicherweise einige Zeichen
gespeichert
1
Und ich denke, Sie könnten den Split-Parameter unbenannt lassen. Ich bin gerade auf meinem Handy und kann es nicht so einfach überprüfen, aber ich glaube, es ist der zweite Parameter von strsplit, so dass Sie anstelle von benannten Argumenten positionelle Argumente verwenden können, um Zeichen zu speichern
Dason
1
Und da Sie bereits das erste Element des Ergebnisses nehmen, strsplitwarum nicht x zu einem Zeichen mit erzwingen c(x,"")? f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)ist 1 Zeichen kürzer :)
Plannapus
3

Mathematica (20 19)

(22 21 wenn die Funktion einen Namen braucht)

Max@DigitCount@#<2&

oder

Max@DigitCount@#|1&

wo | wird eingegeben als [Esc] dividiert [Esc]

Branislav
quelle
Nett. Ich habe vergessen, dass DigitCount existiert, und habe eine Lösung geschrieben, die auf der Konvertierung in Strings basiert. Dein ist viel besser.
Michael Stern
2

C99, 59 Zeichen

a(x){int r=1,f[10]={};for(;x;x/=10)r&=!f[x%10]++;return r;}
Thomas
quelle
C99 hat technisch gesehen kein implizites int.
PatrickB
1
Nicht nur "technisch", sondern gezielt und absichtlich entfernt. Dies ist ein Syntaxfehler in C99, und abgesehen von einer erforderlichen Diagnose gehören Syntaxfehler zur selben Kategorie wie undefiniertes Verhalten (in der Frage ausdrücklich nicht zulässig): Wenn eine Implementierung dies akzeptiert, stellt der Standard keinerlei Anforderungen an das Verhalten des Programms.
HDV
2

Groovy (36 Zeichen)

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

Getestet mit:

println f(args[0].toInteger())
Will Lp
quelle
'false' kann über '1 == 0' oder möglicherweise etwas Clevereres gespielt werden. Gute Antwort
Michael Easter
@MichaelEaster 0>1ist kürzer.
ace_HongKongIndependence
1
@ace Ja, aber! 1 funktioniert auch ...
Michael Ostern
@ace, MichaelEaster, danke für die Hilfe :-)
Will Lp
Verwenden Sie !1stattdessen @WillP, wie von MichaelEaster vorgeschlagen .
ace_HongKongIndependence
2

Haskell:

 import Data.List

 all ((== 1) . length) . group . sort . show
Paul Johnson
quelle
Ein bisschen zu spät zur Party, aber da du Data.Listsowieso importierst, würde ich vorschlagen nub, dass Duplikate aus einer Liste entfernt werden. (\x->nub x==x).show
Flonk
Sie haben nicht pl ...main = interact $ show . ap (==) nub . show
Kazagistar
2

J (8)

Kompetent aus meiner vorherigen Antwort.

*/@~:@":
ɐɔıɐɔuʇǝɥʇs
quelle
2

R, 66 65 Zeichen

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

Trennen Sie die Ziffern mit Integer Division und Modulo und prüfen Sie, ob es sich um Duplikate handelt.

Verwendung:

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

Oder, wie von @MickyT vorgeschlagen, für 63 Zeichen:

f=function(x)!anyDuplicated((x%%10^(i<-1:nchar(x)))%/%10^(i-1))
Plannapus
quelle
1
Sie könnten anyDuplicatedeher als sumund duplicatedfür 2 weitere verwenden
MickyT
2

C 58 Bytes

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

Kann eine Anzahl von bis zu 7 identischen Ziffern vor dem Überschlagen behalten.

im Testprogramm (es ist einfacher zu sehen, wie es mit der Konstanten im Oktal funktioniert)

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));}

Wenn Sie eine große Potenz von 2 zur Hand haben, kann die Konstante wie folgt berechnet werden f&(1<<30)/7*6

Level River St
quelle
Ich denke, der Kommentar von @xfix war für meinen Beitrag anstelle Ihres bestimmt? Sie haben int main(int)in Ihrer Antwort nicht wirklich verwendet ...
ace_HongKongIndependence
Externe Informationen, die nicht für die Codebyte- / Zeichenanzahl zählen, sind offensichtlich nicht zulässig. Ich schlage vor, Sie entfernen die erste Version (53 Bytes).
2501
Bitte beachten Sie meinen Kommentar in der Bearbeitungszusammenfassung .
2501
Ich habe dafür gestimmt, die Bearbeitung abzulehnen, aber ich stimme zu, dass die Zählungen falsch aussehen. Ich mache sie 67 und 63 (61).
Peter Taylor
Meine Bearbeitung wurde von anderen Benutzern abgelehnt. Bitte bewerten Sie es neu.
2501
1

Javascript 73 Zeichen

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

Befunge 98, 17 Bytes

Dies ist eine nicht konkurrierende Antwort, da Befunge keine Funktionen hat.

~:1g1`j@1\[email protected]

Gibt ein aus, 1wenn die Ziffern der Nummer alle eindeutig sind. Ansonsten endet es einfach.

Dies funktioniert, indem auf eine Zelle im Funge-Bereich zugegriffen wird, deren xKoordinate der ASCII-Wert des eingegebenen Zeichens ist (Zeichen für Zeichen eingegeben) und deren yKoordinate ist 1. Wenn die Ziffer noch nicht gesehen wurde, ist der Wert der Zelle 32(Leerzeichen). In diesem Fall setze ich den Wert auf 1.

Als Bonus funktioniert dies auch für Nicht-Nummern.

Justin
quelle
1

PowerShell - 26

!($args|sls '(.)(?=.*\1)')
Rynant
quelle
1

Perl 6 (19 Bytes)

{.comb.uniq==.comb}

.combteilt eine Zeichenfolge in Zeichen (zum Beispiel 42.combgibt "4", "2"). .uniqEntfernt alle nicht eindeutigen Zeichen. .combZeichen in Zeichenfolge (ursprünglich habe ich verwendet .chars, ist aber .combkürzer). ==konvertiert Listen in die Anzahl der darin enthaltenen Elemente und vergleicht die Zahlen. Wenn .ohne Objekt verwendet wird, $_wird der Standardfunktionsparameter angenommen. {}sind Funktionsliterale.

Konrad Borowski
quelle
1

C 76

Dies ist nicht annähernd das Gewinnen, aber ich werde es trotzdem posten, nur um einen alternativen Ansatz zu zeigen.

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

Gibt bei false eine neue Zeile aus und bei true nichts.

ace_HongKongIndependence
quelle
Dieses Programm hat ein undefiniertes Verhalten. Die korrekten Signaturen für main sind int main(int, char **)oder int main(void). int main(int)ist ungültig.
Konrad Borowski
@ xfix Ich nehme an, main()ist das ok?
ace_HongKongIndependence
Ja es ist gut. Es bedeutet dasselbe wie main(void)(wenn es in der Definition verwendet wird, deklariert es in der Deklaration eine Funktion mit unbekannter Parameterliste).
Konrad Borowski
1

POSIX sh und egrep ( 47 , 43 , 40)

f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
  • [-1 Zeichen]: Verwenden Sie !statt -zmit test- Dank DigitalTrauma
  • [-1 Zeichen]: Verwenden Sie `CODE`anstelle von $(CODE)- Dank DigitalTrauma
  • [-2 Zeichen]: Verwenden Sie fold -1anstelle von grep -o .1 - Danke DigitalTrauma.
  • [-3 Zeichen]: Suchen Sie nach wiederholten Ziffern mit einem rückbezogenen regulären Ausdruck.

Wenn die POSIX-Konformität keine Rolle spielt, echo PARAM |können Sie <<<PARAMdie Funktionslänge auf 37 reduzieren :

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

Verwendung:

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

1 In fold -Neinigen Versionen von ist die Notation veraltet fold.

Thor
quelle
f()(! [ `fold -1<<<$1|sort|uniq -d` ])nach meiner Zählung auf 38 gesunken
Digitales Trauma
@DigitalTrauma: Gutes Zeug, danke fürs Teilen. Ich finde, dass der getestete Befehl in Anführungszeichen gesetzt werden muss, sonst testkrächzt er, wenn uniq -dmehr als eine Zeile zurückgegeben wird. Die kürzeste Nicht-POSIX-Version hat also 40 Zeichen. Ich weiß über die [ !Notation Bescheid , aber ich bin überrascht, dass das ! [auch funktioniert. Weißt du, warum das so ist?
Thor
Ah, ich habe Bash benutzt. Ich denke, es ist länger, wenn Sie POSIX-Konformität wünschen.
Digitales Trauma
1

Java ( 131 59 57)

57 Zeichen:

^ und $ als @ n̴̖̋h̷͉̃ã̷͉h̷̭̿d̷̰̀ĥ̷̳ vorgeschlagen entfernt

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

59 Zeichen (funktioniert auch mit negativen Zahlen!):

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

79 78 Zeichen (danke @ n̴̖̋h̷͉̃ã̷͉h̷̭̿d̷̰̀ĥ̷̳):

Verwenden Sie die for-Schleife, um einige Zeichen zu speichern und int als boolesches Array zu verwenden.

Verwenden Sie & anstelle von &&, um 1 Zeichen zu speichern (es stellt sich heraus, dass Java dies zulässt).

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 Zeichen (gibt true für negative Zahlen zurück):

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;}

mit Kommentaren:

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
}

Und die Antwort ist technisch korrekt (die Anzahl der Zeichen enthält nur die Funktion, nicht die globalen Variablen), aber ich denke, es ist Betrug, 29 Zeichen:

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

m [] ist ein boolesches Array, das die richtigen Antworten für alle 32-Bit-Ganzzahlen enthält.

barteks2x
quelle
"^.*(.).*\\1.*$"Sie können fallen ^und $. Sie sind impliziert durchmatches()
n̴̖̋h̷͉̃ã̷͉h̷̭̿d̷̰̀ĥ̷̳
Der zweite Ansatz kann unter Verwendung von 10 Bits in einem int als boolesches Array durchgeführt werden, wodurch die Primzahlentabelle überflüssig wird.
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̷̰̀ĥ̷̳
Ich weiß, es sind drei Jahre vergangen, aber wenn Sie das Leerzeichen return!in der kürzesten Antwort entfernen , können Sie 56 Bytes erreichen.
Kevin Cruijssen