Déterminer si tous les chiffres décimaux sont uniques


37

Les questions supprimées sur le débordement de pile constituent parfois un excellent matériau pour le golf.

Ecrivez une fonction qui prend un entier non négatif en entrée et renvoie true si tous les chiffres de la représentation en base 10 de ce nombre sont uniques. Exemple:

48778584 -> false
17308459 -> true

Le nombre de caractères inclut uniquement la fonction.

Si vous choisissez de répondre en C ou C ++: pas de macros, pas de comportement indéfini; le comportement défini par l'implémentation et les avertissements du compilateur sont corrects.


Je serais toujours intéressé par d’autres solutions C ou C ++ selon la question qui a inspiré celle-ci.
Thomas

1
Pourquoi pas de macros C ou C ++ ou de comportement indéfini? C'est étrangement limité à deux langues.
dfeuer le

Réponses:


31

Golfscript, 8 7 caractères:

{`..&=}
  • ` - stringifier l'argument
  • .. - cloner deux fois
  • & - se croiser avec lui-même (supprimer les doublons)
  • = - vérifier l’égalité.

si la fonction doit être nommée (dix9 caractères ):

{`..&=}:a

si un programme suffit (54 caractères ):

..&=

5
La partie difficile des défis de ce type est d’être le premier à le voir.
Primo

1
@primo encore, ils obtiennent toujours un score de +6 en une demi-journée.
John Dvorak

1
@JanDvorak La loi de trivialité au travail de Parkinson
Claudiu

2
@Claudiu Vous pouvez comprendre la loi. Réalisez que vous y êtes soumis. Puis upvote la réponse quand même.
Cruncher

1
@NathanChere que voulez-vous dire? la dernière (et unique) fois que cette échappatoire avait été suggérée, elle était tombée à -3 avant d'être effacée par le suggérant le lendemain matin. Si vous n'aimez pas les réponses Golfscript, ne les invitez pas.
John Dvorak

24

Python 2 (28) (32)

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

Les backticks prennent la représentation sous forme de chaîne. La conversion en un ensemble supprime les doublons et nous vérifions si cela diminue la longueur en comparant à 10 ^ d, ce qui est supérieur à tous les nombres à d chiffres, mais à aucun nombre (d + 1) à chiffres.

Ancien code:

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


1
Ha j'avais exactement cette même réponse prête, il suffit de remplacer npari
Claudiu

1
@Claudiu moi aussi.f=lambda _:len(`_`)==len(set(`_`))
Oberon

Oui, avec ces défis minimes, tout le monde va converger sur à peu près la même chose. J'essayais aussi lambda n:max(map('n'.count,'n'))<2(les guillemets simples sont des backticks), mais c'est deux caractères plus longs.
xnor

16

APL (6)

≡∘∪⍨∘⍕

Une des rares fois où le style tacite est également plus court dans APL.

C'est 8 caractères pour lui donner un nom,

f←≡∘∪⍨∘⍕

mais ce n'est pas nécessaire de l'utiliser:

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

1
Je pense que le deuxième commentaire peut être supprimé pour en faire 5. Ce serait toujours une fonction valide en soi (bien que cela nécessiterait de grouper des parenthèses pour pouvoir l'utiliser avec chaque opérateur dans le dernier exemple).
user46915

11

Perl, 19 caractères

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

en supposant que la sortie peut être traitée comme vraie et non-sortie peut être traitée comme fausse, votre logique est inversée. Vous devriez retourner true s'il n'y a pas de répétition.
John Dvorak

@ JanDvorak Cela semble à peu près correct. Je vais arranger ça.
Tal

Opérateur Non-match: <>!~/(\d).*\1/.
Primo

@primo Merci! Tellement à apprendre :)
Tal

3
L'entrée est spécifiée comme étant un entier non négatif, donc je ne pense pas que vous deviez vérifier cela. Si vous ne le faites pas, vous pouvez changer \dpour ..
hvd

9

Rebmμ (10 caractères)

e? AtsAuqA

Le truc "mushing" de Rebmu est qu'il est insensible à la casse, donc les personnages sont exécutés ensemble. Chaque fois qu'une transition de casse est touchée, cela se scinde au prochain jeton. En utilisant des transitions au lieu de choses du genre CamelCase, le choix unique de commencer par une course majuscule signifie qu'un "mot fixe" est créé. (Bien que les mots définis puissent être utilisés à d'autres fins dans la programmation symbolique, ils sont évalués comme assignations par défaut).

Donc, cela "dissipe" de:

e? a: ts a uq a

L'espace est nécessaire, car une fois que vous avez commencé une série de séries de cas, vous ne pouvez pas utiliser cette astuce pour obtenir un mot défini après le premier, à moins que vous ne commenciez une nouvelle série. Alors, e?AtsAuqAje vous aurais eu e? a ts a uq a... aucune affectation.

(Remarque: pour une raison qui peut ne pas être particulièrement bonne, j'ai tendance à préférer repenser les solutions pour qu'il n'y ait pas d'espaces, si le nombre de caractères est égal. Puisque les crochets, les parenthèses et les chaînes se terminent implicitement à un symbole ... nombre de possibilités pour cela.)

Dans tous les cas, lorsque mappé sur le Rebol qu’il abrévie:

equal? a: to-string a unique a

Jeter quelques parenthèses pour vous aider à comprendre l'essentiel de l'ordre d'évaluation:

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

Ainsi, l'opérateur d'égalité de préfixe est appliqué à deux arguments: le premier est le résultat de l'affectation ade la version de chaîne de lui-même et le second, du résultat de uniqueson exécution sur cette chaîne. Il se trouve que unique vous rendra les éléments dans le même ordre que vous les avez passés ... si unique de "31214" est "3124" par exemple.

Exécutez-le avec:

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

Il y a aussi quelques statistiques et informations de débogage:

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

Si l'exigence est que vous devez définir une fonction nommée / réutilisable, vous pouvez créer une "fonction A" qui prend implicitement un paramètre nommé a avec a|. (Une fonction B serait créée avec b|et prendrait un paramètre nommé A puis un nommé B). Donc, cela ajouterait cinq autres caractères ... disons que vous appelez la fonction "f"

Fa|[e? AtsAugA]

"Tu ris! Ils se moquaient d'Einstein! Ou attends ... est-ce qu'ils ont? Je ... ne sais pas."


Je pensais que la langue a été prononcé comme Reb moo, mais maintenant je ne sais pas s'il est censé être Rebum mewou Reb mewou autre chose.
Justin

2
Après avoir joué Nethack, je l' ai lu Fa|[e? AtsAugA]commeFalse? SomeGibberish
Justin

@ Quincunx sse décompose- t-il vraiment [dans Nethack?
John Dvorak

@JanDvorak J'ai vu des lettres se décomposer en [après un certain temps
Justin

@Quincunx Je ne fais que jouer avec le logo. Je pense que REBmuc'est probablement mieux. Quoi qu'il en soit, la barbe est serrée ... elle pince. Devinez que vous obtenez ce que vous payez.
Dr. Rebmu

7

FRACTRAN - 53 38 fractions

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

Utilise la division pour compter le nombre d’occurrences de chaque chiffre. Appelez en mettant n dans le registre 2 et en mettant le registre 5 à 1, donne la sortie dans le registre 3 (0 si faux, 1 si vrai). Assurez-vous également que le reste de votre programme utilise uniquement des registres> 71.


Edit 25/12/14: Cela fait 7 mois et nous avons depuis reçu Stack Snippets, alors en voici un pour tester le code (en utilisant mon interprète qui pourrait être meilleur ici ).

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>

Remplacez 142857par un autre numéro. La sortie devrait être 3^1si vrai, 1 = 3^0si faux. Cela prend du temps pour les grands nombres (enfin, c'est FRACTRAN ...).


6

JavaScript - 23 caractères

En tant que fonction (ECMAScript 6):

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

Ou en prenant une entrée à partir d'une invite (25 caractères)

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

6

C # 73 60 59

Premier golf pour moi ...

Écrire une fonction qui prend un entier non négatif en entrée

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

Pourrait enlever un autre personnage en convertissant uinten int, mais je préfère prendre la tâche trop littéralement que l'inverse. Et c'est parti ...


1
Quelques options:i => (i + "").Distinct().SequenceEqual(i + "");
NPSF3000

@ NPSF3000 Merci! Edité ma réponse. J'avais quelque chose comme ça dans mon esprit, mais bon… j'ai totalement oublié d' +""appeler ToString()sous le capot.
Verrouillage numérique

Une interprétation plus littérale de "entier non négatif" suggère qu'un entier signé sera transmis, mais ne sera jamais négatif.
Shaz

Eh bien, je suppose que tout ira bien alors ...
Num Lock

Utilisez C # 6 et vous pouvez utiliser: bool f (int i) => (i + ""). Distinct (). SequenceEqual (i + ""); (53 bytes)
Stephan Schinkel

5

Ruby (24 octets)

Utilisez une expression régulière pour faire correspondre "un caractère, suivi de zéro ou plusieurs caractères, puis du même caractère".

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

Si les valeurs de vérité ou de fausseté sont acceptées, plutôt que littérales trueou falsealors, nous obtenons 20 caractères:

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

5

C (87)

Puisque je ne peux pas gagner, je vais chercher l'efficacité.

Code de fonction:

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, et comme je ne peux toujours pas commenter les posts personnes - je voudrais dire que c'était une solution propre, même si inexact quand il « déborde ».
DreamWarrior

5

Mathematica, 35 à 25 caractères

(27 si la fonction nécessite un nom.)

Unequal@@IntegerDigits@#&

EDIT: 8 personnages sauvés grâce à belisarius!


Unequal @@ IntegerDigits@# &pourrait faire, je pense
Dr. belisarius

@ belisarius oh gentil, je cherchais quelque chose comme ça mais je ne pouvais pas le trouver (et je ne pensais pas que chaîné comparerait des éléments non adjacents). Merci, cela raccourcit beaucoup!
Martin Ender

Vous n'êtes pas obligé de lui donner un nom, non? Unequal@@IntegerDigits@#&est de 25 caractères.
Akater

@Akater true, je ne vois pas d'exigence concernant le nom dans le challenge. Merci!
Martin Ender

5

R, 53 51 48 34 octets

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

Essayez-le en ligne!

Convertir en chaîne et scinder. Convertir en une table des comptes moins 1, additionner et annuler

Inspiré par la réponse numérique la plus courante d'Alex et la suggestion de Hugh.

Un couple sauvé, grâce à @plannapus Un de plus de @Gregor Et un couple qui en fait une fonction anonyme

Maintenant, avec la bonté regex merveilleuse grâce à @ J.Doe. Ceci recherche n'importe quel caractère dans le nombre qui correspond à lui-même sinon où dans la chaîne. La greplcommande retourne une logique qui est ensuite renvoyée. Les expressions rationnelles de style Perl sont définies sur True.


Vous pouvez également convertir en chaîne à l' aide au paste0lieu de toStringet enregistrer 2 caractères.
Plannapus

Vous pouvez utiliser à la pasteplace de paste0pour sauvegarder un caractère supplémentaire.
Gregor


@ J.Doe: encore mieux! :)
digEmAll

Utilisé une approche différente. 35 octets avec regex.
J.Doe

4

J (9)

Suppose que la valeur à tester est variable b (je sais que cela peut être transformé en une fonction, mais je ne sais pas comment . J est déroutant. Toute aide est appréciée) Merci Marinus!

(-:~.)@":

Vérifie si la longueur de la représentation de chaîne du nombre avec tous les doublons supprimés est identique à la longueur de la représentation de chaîne normale.


Pour une fonction que vous pouvez faire (-:~.)@":.
marinus

@marinus Oh wow, c'est encore plus court que je pensais. Merci!
Samedi

HI, j'ai trouvé et posté une solution J plus courte: -: ~. &. ":
Galen Ivanov

4

R ( 70 , 60 , 53 , 52)

Merci à tous pour les commentaires utiles! Vos commentaires sont incorporés dans la réponse.

### 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, vous avez raison. Je suis confus au sujet de la "représentation en base 10".
djhurio

1
L'utilisation de la table et la comparaison avec 0 au lieu de dupliqué peuvent sauver certains caractères
Dason

1
Et je pense que vous pouvez laisser le paramètre split anonyme. Je suis juste sur mon téléphone, donc je ne peux pas vérifier facilement, mais je crois que c'est le deuxième paramètre de strsplit, vous pouvez donc utiliser des arguments positionnels plutôt que des arguments nommés pour enregistrer les caractères
Dason

1
Et puisque vous prenez déjà le premier élément du résultat de strsplitpourquoi ne pas forcer x à un personnage utilisant c(x,"")? f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)est 1 caractère plus court :)
plannapus

3

Mathematica (20 19)

(22 21 si la fonction a besoin d'un nom)

Max@DigitCount@#<2&

ou

Max@DigitCount@#|1&

où | ist entré en tant que [Esc] divise [Esc]


Agréable. J'ai oublié que DigitCount existait et j'ai écrit une solution basée sur la conversion en chaînes. Le votre est beaucoup mieux.
Michael Stern


2

C99, 59 caractères

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

C99 n'a pas d'int implicite, techniquement.
PatrickB

1
Pas simplement "techniquement", il a été spécifiquement et intentionnellement supprimé. Il s’agit d’une erreur de syntaxe dans C99 et, mis à part le diagnostic requis, les erreurs de syntaxe appartiennent à la même catégorie que le comportement indéfini (explicitement interdit dans la question): si une implémentation accepte cela, la norme n’impose aucune exigence quant au comportement du programme.
hvd

2

Groovy (36 caractères)

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

Testé en utilisant:

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

'false' peut être joué via '1 == 0' ou éventuellement avec un moyen plus intelligent. Bonne réponse
Michael Easter,

@ MichaelEaster 0>1est plus court.
pastebin.com slash 0mr8spkT

1
@ace Oui, cependant! 1 fonctionne aussi ...
Michael Easter,

@ace, MichaelEaster, merci pour l'aide :-)
Will Lp

@WillP comme suggéré par MichaelEaster, utilisez !1plutôt.
pastebin.com slash 0mr8spkT

2

Haskell:

 import Data.List

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

A little late to the party, but since you're importing Data.List anyway I'd suggest nub, which removes duplicates from a List. (\x->nub x==x).show
Flonk

You didnt use pl... main = interact $ show . ap (==) nub . show
kazagistar


2

R, 66 65 characters

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

Separate the digits using integer division and modulo, then check if they are duplicates.

Usage:

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

Or, as @MickyT suggested, for 63 characters:

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

1
You could use anyDuplicated rather than sum and duplicated for 2 more
MickyT

2

C, 58 bytes

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

Can keep a tally of up to 7 identical digits before rolling over.

in test program (it's easier to see how it works with the constant in octal)

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

If you happen to have a large power of 2 handy the constant can be calculated like f&(1<<30)/7*6


I think the comment by @xfix was intended for my post instead of yours? You didn't actually used int main(int) in your answer...
pastebin.com slash 0mr8spkT

Having external information that doesn't count towards the code byte/char count is obviously not allowed. I suggest you remove the first version (53 bytes).
2501

Please see my comment in the edit summary.
2501

I voted to reject the edit, but I agree that the counts look wrong. I make them 67 and 63 (61).
Peter Taylor

My edit was rejected by other users. Please re-evaluate it.
2501


1

Javascript 73 chars

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

1

Befunge 98, 17 bytes

This is a non-competing answer because Befunge does not have functions.

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

Prints a 1 if the number's digits are all unique; otherwise, it just ends.

This works by accessing a cell in the Funge space whose x coordinate is the ASCII value of the character inputted (takes input character by character) and whose y coordinate is 1. If the digit has not been seen before, the value of the cell is 32 (space character). If that is so, I set the value to 1.

As a bonus, this works for non-numbers as well.



1

Perl 6 (19 bytes)

{.comb.uniq==.comb}

.comb splits a string into characters (for example, 42.comb gives "4", "2"). .uniq removes all non-unique characters. .comb characters in string (originally I used .chars, but .comb is shorter). == converts lists into number of elements in it, and compares the numbers. When . is used without object before, $_ which is default function parameter is assumed. {} are function literals.


1

C, 76

This is no where near winning, but I'll post it anyway just to show an alternative approach.

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

Prints a new line if false, prints nothing if true.


This program has an undefined behavior. The correct signatures for main are int main(int, char **) or int main(void). int main(int) is not valid.
Konrad Borowski

@xfix I assume main() is ok then?
pastebin.com slash 0mr8spkT

Yes, it's fine. It means the same thing as main(void) (when used in definition, in declaration it declares a function with unknown parameter list).
Konrad Borowski

1

POSIX sh and egrep (47, 43, 40)

f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
  • [-1 char]: Use ! instead of -z with test - Thanks DigitalTrauma
  • [-1 char]: Use `CODE` instead of $(CODE) - Thanks DigitalTrauma
  • [-2 chars]: Use fold -1 instead of grep -o .1 - Thanks DigitalTrauma.
  • [-3 chars]: Check for repeated digits with a backreferenced regular expression.

If POSIX compliance is not important echo PARAM | can be replaced by <<<PARAM, reducing the functions length to 37:

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

Usage:

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

1 The fold -N notation is deprecated in some versions of fold.


f()(! [ `fold -1<<<$1|sort|uniq -d` ]) down to 38 by my count
Digital Trauma

@DigitalTrauma: Good stuff thanks for sharing. I find that the tested command must be quoted, otherwise test croaks on it when uniq -d returns more than one line. So the shortest non-POSIX version is 40 characters. I know about the [ ! notation, but I am suprised that ! [ also works, do you know why that is?
Thor

Ah I was using bash. So I guess its longer if you want POSIX conformance.
Digital Trauma

1

Java ( 131 59 57)

57 characters:

removed ^ and $ as @n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ suggested

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

59 characters (works also with negative numbers!):

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

79 78 characters (thanks @n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ ):

Use for loop to save a few charachers and use int as a boolean array.

Use & instead of && to save 1 character (It turns out that java allows it).

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 characters (returns true for negative numbers):

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

with comments:

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
}

And answer that is technically correct (character count includes only the function, not global variables), but I think it's cheating, 29 characters:

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

m[] is boolean array that contains correct answers for all 32-bit integers.


"^.*(.).*\\1.*$" You can drop ^ and $. They are implied by matches()
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

The 2nd approach can be done by using 10 bits in an int as a boolean array, which will eliminate the need for the prime table.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

I know it's been three years, but if you remove the space between return! in the shortest answer, you can get to 56 bytes.
Kevin Cruijssen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.