すべての10進数が一意かどうかを判別


37

Stack Overflowで削除された質問は、素晴らしいゴルフ教材になる場合があります。

入力として非負の整数を取り、その数値の基数10表現のすべての数字が一意である場合にtrueを返す関数を作成します。例:

48778584 -> false
17308459 -> true

文字数には関数のみが含まれます。

CまたはC ++で回答することを選択した場合:マクロなし、未定義の動作なし。実装定義の動作とコンパイラの警告は問題ありません。


私は、この解決策に影響を与えた質問ごとに、他のCまたはC ++ソリューションにまだ興味があります。
トーマス

1
CまたはC ++マクロや未定義の動作がないのはなぜですか?奇妙なことに、2つの言語に限定されています。
dfeuer

回答:


31

Golfscript、 8 7文字:

{`..&=}
  • ` -引数を文字列化する
  • .. -2回クローン
  • & -それ自体と交差(重複を削除)
  • = -平等を確認してください。

関数に名前を付ける必要がある場合(109文字):

{`..&=}:a

プログラムで十分な場合(54文字):

..&=

5
このような課題についての難しい部分は、それを最初に見ることです。
プリモ

1
@primoまだ、どういうわけか、彼らはまだ半日以内に+6スコアを取得します。
ジョンドヴォルザーク

1
@JanDvorakパーキンソンの職場での自明の法則
Claudiu

2
@Claudiu法律を理解できます。あなたがそれにさらされていることに気づきなさい。とにかく答えに投票してください。
ランチャー

1
@NathanChereどういう意味ですか?抜け穴が示唆された最後の(そして唯一の)時刻は、翌朝に提案者によって削除される前に-3に落ちました。golfscriptの回答が気に入らない場合は、賛成しないでください。
ジョン・ドヴォラック

24

Python 2(28)(32)

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

バックティックは文字列表現を取ります。セットに変換すると重複が削除され、すべてのd桁の数字よりも大きいが(d + 1)桁の数字がない10 ^ dと比較して長さが短くなるかどうかが確認されます。

古いコード:

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


1
ハ私はこれとまったく同じ答えを用意しましたが、代わりni
Claudiu

1
@Claudiuもそうでした。f=lambda _:len(`_`)==len(set(`_`))
Oberon

ええ、これらの一口サイズの課題で、誰もがほぼ同じことに集中しようとしています。私も試してみましたlambda n:max(map('n'.count,'n'))<2(一重引用符はバッククォートです)が、2文字長くなります。
xnor

16

APL(6)

≡∘∪⍨∘⍕

APLでも暗黙のスタイルが短い数少ない時間の1つ。

名前を付けるのは8文字です。

f←≡∘∪⍨∘⍕

しかし、それを使用する必要はありません:

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

1
2番目のコメントは削除して5にすることができると思います。それ自体は有効な関数です(ただし、最後の例では、各演算子でそれを使用するために括弧をグループ化する必要があります)。
user46915

11

Perl、19文字

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

出力をtrueとして扱い、出力なしをfalseとして扱うことができると仮定すると、ロジックが逆になります。繰り返しがない場合はtrueを返す必要があります。
ジョンドヴォラック

@JanDvorakは正しいと思う。それを修正します。
タル

不一致演算子:<>!~/(\d).*\1/
primo

@primoありがとう!学ぶべきことはたくさんあります:)
タル

3
入力は負でない整数として指定されているため、それを確認する必要はないと思います。あなたは確かにない場合は、変更することができます\d.
hvd

9

Rebmμ(10文字)

e? AtsAuqA

Rebmuの「マッシング」トリックは、大文字と小文字を区別しないため、文字が一緒に実行されることです。ケース移行時がヒットに、次のトークンに分割されます。CamelCaseのようなものの代わりにトランジションを使用することにより、キャピタルランで開始する独自の選択は、「単語のセット」が作成されることを意味します。(セットワードは、シンボリックプログラミングの他の目的に使用できますが、既定では割り当てとして評価されます)。

したがって、これは次のことを「アンマッシュ」します。

e? a: ts a uq a

代替ケースの一連の実行を開始すると、新しい実行を開始しない限り、そのトリックを使用して最初の後にセットワードを取得することはできないため、スペースが必要です。だからe?AtsAuqAあなたを得たでしょうe? a ts a uq a ...割り当てんでした。

(注:特に正当な理由ではないかもしれませんが、文字数が等しい場合、スペースがなくなるようにソリューションを再考する傾向があります。括弧、括弧、および文字列は暗黙的に記号を終了するので...しばしば公平ですこれの機会の数。)

いずれにせよ、Rebolにマップされたとき、それは短縮されます:

equal? a: to-string a unique a

評価順序の要点を把握するために、いくつかの括弧を使用します。

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

したがって、接頭辞等値演算子は2つの引数に適用されます。1つ目aは、文字列バージョン自体の代入結果、2つ目は、uniqueその文字列に対して実行され。uniqueは、渡したのと同じ順序で要素を返します...たとえば、「31214」の一意は「3124」です。

以下で実行します:

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

いくつかの統計とデバッグ情報もあります。

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

名前付き/再利用可能な関数を定義する必要があるという要件がある場合、aという名前のパラメーターを暗黙的にとる「A関数」を作成できますa|。(B関数は、Aで作成され、b|Aという名前のパラメーターを取り、次にBという名前のパラメーターを取ります)。そのため、さらに5文字が追加されます...関数「f」を呼び出すとしましょう

Fa|[e? AtsAugA]

「あなたは笑う!彼らはアインシュタインを笑った!または待つ...彼らがしたか?私は...知らない。」


私はかつて言語がのように発音されると思ってReb mooいましたが、今ではそれが他の何かなのRebum mewReb mewどうかはわかりません。
ジャスティン

2
Nethackをプレイした後、次のように読みFa|[e? AtsAugA]ましたFalse? SomeGibberish
ジャスティン

@QuincunxはNethackでs本当に衰退し[ますか?
ジョンドボラック

@JanDvorakいくつかの文字が崩壊するのを見ました[しばらくしてから
ジャスティン

@Quincunxロゴをいじるだけ。REBmuおそらくもっと良いと思います。いずれにせよ、ひげはきついです。あなたが支払うものを手に入れると思います。
レブム博士14年

7

FRACTRAN- 53 38分数

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

除算を使用して、各桁の出現回数をカウントします。レジスタ2にnを入れてレジスタ5を1に設定して呼び出すと、レジスタ3に出力が与えられます(falseの場合は0、trueの場合は1)。また、プログラムの残りの部分で71を超えるレジスタのみを使用するようにしてください。


編集25/12/14:それは7か月が経ち、それからStack Snippetsを手に入れたので、ここでコードをテストします(ここで私のより良いインタープリターを使用し)。

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>

142857別の番号に置き換えます。出力は3^1trueの1 = 3^0場合、falseの場合になります。数値が大きい場合しばらく時間かかります(これ FRACTRAN ...です)。


6

JavaScript-23文字

関数として(ECMAScript 6):

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

またはプロンプト(25文字)から入力を取得

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

6

C#73 60 59

私にとって最初のゴルフ...

入力として非負の整数を取る関数を書く

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

に変換するuintことintで別の文字を取り除くことができますが、私はむしろ逆方向よりも文字通りにタスクを取ります。 さあ ...


1
いくつかのオプション:i => (i + "").Distinct().SequenceEqual(i + "");
NPSF3000

@ NPSF3000ありがとう!私の答えを編集しました。私はこのようなことを心に抱いていましたが、まあ... フードの下で+""電話することを完全に忘れていましたToString()
Num Lock

「非負の整数」のよりリテラルな解釈は、符号付き整数が渡されることを示唆していますが、負になることはありません。
シェーズ

さて、私は...それは[OK]をだろうと思います
のNum Lock

C#6を使用すると、以下を使用できます。bool f(int i)=>(i + "")。Distinct()。SequenceEqual(i + ""); (53バイト)
ステファンシンケル

5

ルビー(24バイト)

正規表現を使用して、「ある文字の後にゼロ個以上の文字が続き、次に同じ文字が続く」に一致します。

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

リテラルtrueまたはfalseでなく、真実または偽の値が受け入れられた場合、20文字になります。

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

5

C(87)

私は勝てないので、効率のために行きます。

機能コード:

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

ああ、私はまだ他の人の投稿にコメントできないので、「オーバーフロー」したときに不正確であっても、これはきちんとした解決策であったと言いたいです。
ドリームウォーリアー

5

Mathematica、35 25文字

(関数に名前が必要な場合は27。)

Unequal@@IntegerDigits@#&

編集:ベリサリウスのおかげで8文字を保存しました!


Unequal @@ IntegerDigits@# &できると思います
ベリサリウス博士14年

@belisariusいいですね、私はそのようなものを探していましたが、それを見つけることができませんでした(そしてチェーンが隣接していない要素を比較するとは思わなかった)。おかげで、これは大幅に短縮されました!
マーティンエンダー

名前を付ける必要はありませんか?Unequal@@IntegerDigits@#&25文字です。
akater

@Akater true、チャレンジの名前の要件が表示されません。ありがとう!
マーティンエンダー

5

R、53 51 48 34バイト

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

オンラインでお試しください!

文字列に変換して分割します。カウントマイナス1のテーブルに変換し、和と否定

アレックスによる最も一般的な番号の回答とヒューによる提案に触発されました。

@plannapusのおかげでカップルが保存されました@Gregorからもう1人

@ J.Doeのおかげで、今では素晴らしい正規表現の良さがあります。これは、文字列内の他の場所でそれ自体と一致する番号で単一の文字を探します。greplコマンドが返され、その論理を返します。Perlスタイルの正規表現はTrueに設定されます。


また、paste0代わりにtoStringを使用して文字列に変換し、2文字を保存することもできます。
plannapus 14

paste代わりにpaste0を使用して、もう1つのキャラクターを保存できます。
グレゴール


@ J.Doe:さらに良い!:)
digEmAll

別のアプローチを使用しました。正規表現で35バイト
J.Doe

4

J(9)

テストする値が可変であると仮定しますb (これを関数にすることができることは知っていますが、Jが混乱する方法については手がかりがありません。これに関する助けはありがたいです)ありがとうMarinus!

(-:~.)@":

すべての重複が削除された番号の文字列担当者の長さが、通常の文字列担当者の長さと同じかどうかを確認します。


あなたができる機能について(-:~.)@":
マリヌ

@marinusああ、それは思ったよりもさらに短い。ありがとう!
ɐɔıʇǝɥʇuʎs

こんにちは、短いJソリューションを見つけて投稿しました:-:〜。&。 ":
ガレンイワノフ

4

R(706053、52)

有益なコメントをありがとうございました!あなたのコメントは答えに組み込まれています。

### 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、あなたは正しい。「ベース10表現」について混乱しました。
djhurio

1
テーブルを使用して、代わりに重複の0と比較すると、一部の文字を救うかもしれない
Dason

1
また、splitパラメーターには名前を付けないでおくことができると思います。私は自分の携帯電話上でだけだそう簡単にチェックすることはできませんが、私はあなたの代わりに文字を保存するための名前付き引数の位置を使用できるよう、それはstrsplitの2番目のパラメータであると考えている
Dason

1
そして、strsplitなぜc(x,"")?を使用してxを文字に強制しないのかという結果の最初の要素をすでに取得しているので、f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)1文字短くなります:)
plannapus

3

Mathematica(20 19)

22 21関数に名前が必要な場合)

Max@DigitCount@#<2&

または

Max@DigitCount@#|1&

どこ| [Esc] divides [Esc]として入力します


いいね DigitCountの存在を忘れ、文字列への変換に基づいたソリューションを作成しました。あなたの方がずっといいです。
マイケルスターン14


2

C99、59文字

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

技術的には、C99には暗黙的なintはありません。
PatrickB

1
「技術的に」だけでなく、具体的かつ意図的に削除されました。これはC99の構文エラーであり、必要な診断を除いて、構文エラーは未定義の動作と同じカテゴリにあります(質問では明示的に許可されていません):実装がこれを受け入れる場合、標準はプログラムの動作に関する要件を一切作成しません
hvd

2

グルーヴィー(36文字)

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

次を使用してテストしました:

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

「false」は「1 == 0」またはもっと賢い方法でゴルフできます。良い答え
マイケルイースター

@MichaelEaster 0>1は短いです。
pastebin.comスラッシュ0mr8spkT

1
@aceはい、しかしあまりにも1つの作品...!
マイケルイースター

@ ace、MichaelEaster、ヘルプのthx :-)
ウィルLp

MichaelEasterが示唆する@WillPを!1代わりに使用します。
pastebin.comスラッシュ0mr8spkT

2

ハスケル:

 import Data.List

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

パーティーに少し遅れましたが、Data.Listとにかくインポートしているのでnub、リストから重複を削除することをお勧めします。(\x->nub x==x).show
フランク

pl ...を使用しませんmain = interact $ show . ap (==) nub . show
でした


2

R、66 65文字

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

整数の除算とモジュロを使用して数字を区切り、それらが重複しているかどうかを確認します。

使用法:

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

または、@ MickyTが示唆したように、63文字の場合:

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

1
あなたは使用することができanyDuplicatedなく、sumそしてduplicated2以上のために
MickyT

2

C、58バイト

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

ロールオーバーする前に、最大7桁の同じ数字の集計を保持できます。

テストプログラム内(8進数の定数でどのように動作するかを簡単に確認できます)

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

2のべき乗が便利な場合は、次のように定数を計算できます。 f&(1<<30)/7*6


@xfixによるコメントは、あなたの投稿ではなく、私の投稿を意図したものだと思いますか?あなたが実際に使用していないint main(int)あなたの答えに...
pastebin.com 0mr8spkTスラッシュ

コードバイト/文字カウントにカウントされない外部情報を持つことは明らかに許可されません。最初のバージョン(53バイト)を削除することをお勧めします。
2501年

編集概要の私のコメントをご覧ください。
2501

編集を拒否することに投票しましたが、カウントが間違っているように見えることに同意します。67と63(61)にします。
ピーターテイラー

私の編集は他のユーザーによって拒否されました。再評価してください。
2501


1

Javascript 73文字

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

1

Befunge 98、17バイト

Befungeには機能がないため、これは非競合的な回答です。

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

1数字の桁がすべて一意である場合にaを出力します。それ以外の場合は、終了します。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.