Tentukan apakah semua angka desimal unik

37

Pertanyaan yang terhapus di Stack Overflow terkadang menghasilkan materi golf yang bagus.

Tulis fungsi yang mengambil integer nonnegatif sebagai input, dan mengembalikan true jika semua digit dalam representasi basis 10 dari angka tersebut adalah unik. Contoh:

48778584 -> false
17308459 -> true

Hitungan karakter hanya mencakup fungsi.

Jika Anda memilih untuk menjawab dalam C atau C ++: tidak ada makro, tidak ada perilaku tidak terdefinisi; perilaku yang ditentukan implementasi dan peringatan kompiler baik-baik saja.

Thomas
sumber
Saya masih tertarik pada solusi C atau C ++ lainnya sesuai pertanyaan yang menginspirasi yang satu ini.
Thomas
1
Mengapa tidak ada makro C atau C ++ atau perilaku yang tidak terdefinisi? Itu anehnya hanya terbatas pada dua bahasa.
dfeuer

Jawaban:

31

Skrip golf, 8 7 karakter:

{`..&=}
  • ` - pertegas argumen
  • .. - mengkloning dua kali
  • & - berpotongan dengan dirinya sendiri (menghapus duplikat)
  • = - periksa kesetaraan.

jika fungsi perlu dinamai (109 karakter ):

{`..&=}:a

jika suatu program mencukupi (54 karakter ):

..&=
John Dvorak
sumber
5
Bagian tersulit dari tantangan seperti ini adalah menjadi yang pertama melihatnya.
primo
1
@primo, entah bagaimana, mereka masih mendapatkan skor +6 dalam setengah hari.
John Dvorak
1
@JanDvorak Parkinson, hukum sepele di tempat kerja
Claudiu
2
@Claudiu Anda dapat memahami hukum. Sadarilah bahwa Anda menjadi sasarannya. Kemudian tetap pilih jawabannya.
Cruncher
1
@NathanChere apa maksudmu? waktu terakhir (dan satu-satunya) celah itu disarankan turun menjadi -3 sebelum dihapus oleh suggester keesokan paginya. Jika Anda tidak menyukai jawaban skrip golf, jangan balas memilihnya.
John Dvorak
24

Python 2 (28) (32)

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

Backticks mengambil representasi string. Konversi ke set menghapus duplikat, dan kami memeriksa apakah ini mengurangi panjang dengan membandingkan dengan 10 ^ d, yang lebih besar dari semua angka d-digit tetapi tidak ada (d + 1) -digit angka.

Kode lama:

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

Tidak
sumber
1
Ha saya sudah siap jawaban yang sama persis ini , ganti saja ndengani
Claudiu
1
@Claudiu begitu juga aku.f=lambda _:len(`_`)==len(set(`_`))
Oberon
Ya, dengan tantangan ukuran gigitan ini, semua orang akan bertemu pada hal yang hampir sama. Saya juga mencoba lambda n:max(map('n'.count,'n'))<2(tanda kutip tunggal adalah backticks), tetapi dua karakter lagi.
xnor
16

APL (6)

≡∘∪⍨∘⍕

Salah satu dari beberapa kali gaya tacit lebih pendek di APL juga.

Itu 8 karakter untuk memberinya nama,

f←≡∘∪⍨∘⍕

tapi itu tidak perlu untuk menggunakannya:

      ≡∘∪⍨∘⍕ 199
0
      ≡∘∪⍨∘⍕ 198
1
      f←≡∘∪⍨∘⍕
      f¨ 198 199 200 201
1 0 0 1
      ≡∘∪⍨∘⍕¨ 198 199 200 201
1 0 0 1
marinus
sumber
1
Saya pikir catatan kedua dapat dihapus untuk membuatnya 5. Masih akan menjadi fungsi yang valid dengan sendirinya (meskipun akan membutuhkan pengelompokan parens untuk menggunakannya dengan masing-masing operator pada contoh terakhir).
user46915
11

Perl, 19 karakter

print<>!~/(\d).*\1/
Tal
sumber
dengan asumsi output dapat diperlakukan sebagai true dan no-output dapat diperlakukan sebagai false, logika Anda dibalik. Anda harus mengembalikan true jika tidak ada pengulangan.
John Dvorak
@ JanDvorak Kedengarannya benar. Saya akan memperbaikinya.
Tal
Operator tidak-pertandingan: <>!~/(\d).*\1/.
primo
@ primo Terima kasih! Begitu banyak yang harus dipelajari :)
Tal
3
Input ditetapkan sebagai bilangan bulat non-negatif, jadi saya rasa Anda tidak perlu memverifikasi itu. Jika Anda memang tidak, Anda dapat mengubah \dke ..
hvd
9

Rebmμ (10 karakter)

e? AtsAuqA

Trik "mushing" Rebmu adalah bahwa case-insensitive, jadi karakter dijalankan bersama. Setiap kali transisi kasus dipukul, itu terbagi ke token berikutnya. Dengan menggunakan transisi alih-alih jenis CamelCase, pilihan unik untuk memulai dengan modal besar berarti "set-word" dibuat. (Sementara set-words dapat digunakan untuk tujuan lain dalam pemrograman simbolik, mereka dievaluasi sebagai tugas secara default).

Jadi ini "tidak bersuara" ke:

e? a: ts a uq a

Ruang diperlukan karena setelah Anda memulai serangkaian proses bergantian, Anda tidak dapat menggunakan trik itu untuk mendapatkan kata-kata setelah yang pertama kecuali Anda memulai proses baru. Jadi e?AtsAuqAakan membuat Anda e? a ts a uq a... tidak ada tugas.

(Catatan: Untuk alasan yang mungkin bukan alasan yang bagus, saya cenderung lebih suka memikirkan kembali solusi sehingga tidak ada spasi, jika jumlah karakter sama. Karena tanda kurung, tanda kurung, dan string secara implisit mengakhiri simbol ... sering kali ada yang adil sejumlah peluang untuk ini.)

Bagaimanapun, ketika dipetakan ke Rebol yang disingkat:

equal? a: to-string a unique a

Melemparkan beberapa tanda kurung untuk membantu mendapatkan inti dari urutan evaluasi:

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

Jadi operator kesetaraan awalan diterapkan pada dua argumen - yang pertama hasil penugasan untuk aversi string itu sendiri, dan yang kedua hasil uniquedijalankan terhadap string itu. Kebetulan yang unik akan memberi Anda kembali elemen dalam urutan yang sama dengan yang Anda lewati ... begitu unik dari "31214" adalah "3124" misalnya.

Jalankan dengan:

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

Ada juga beberapa statistik dan informasi debug:

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

Jika persyaratannya adalah seseorang harus mendefinisikan fungsi yang dinamai / digunakan kembali, Anda dapat membuat "A-function" yang secara implisit mengambil parameter bernama a with a|. (Fungsi B akan dibuat dengan b|dan mengambil parameter bernama A lalu yang bernama B). Jadi itu akan menambah lima karakter lagi ... katakanlah Anda memanggil fungsi "f"

Fa|[e? AtsAugA]

"Kamu tertawa! Mereka menertawakan Einstein! Atau tunggu ... kan? Aku ... tidak tahu."

Rebmu
sumber
Dulu aku pikir bahasa itu diucapkan seperti Reb moo, tapi sekarang aku tidak yakin apakah itu seharusnya Rebum mewatau Reb mewatau sesuatu yang lain.
Justin
2
Setelah bermain Nethack, saya membaca Fa|[e? AtsAugA]sebagaiFalse? SomeGibberish
Justin
@ Quincunx sbenar - benar membusuk [di Nethack?
John Dvorak
@ JanDvorak Saya telah melihat beberapa surat membusuk [setelah beberapa waktu
Justin
@ Quincunx Hanya bermain-main dengan logo. Saya pikir REBmumungkin lebih baik. Either way, jenggotnya kencang..itu menjepit. Kira Anda mendapatkan apa yang Anda bayar.
Dr. Rebmu
7

FRACTRAN - 53 38 pecahan

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

Gunakan pembagian untuk menghitung jumlah kemunculan setiap digit. Panggilan dengan memasukkan n di register 2 dan mengatur register 5 ke 1, memberikan output di register 3 (0 jika salah, 1 jika benar). Juga, pastikan sisa program Anda hanya menggunakan register> 71.


Sunting 25/12/14: Sudah 7 bulan dan kami sudah mendapatkan Cuplikan Stack, jadi inilah salah satu untuk menguji kodenya (menggunakan juru bahasa saya yang bisa lebih baik di sini ).

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>

Ganti 142857dengan nomor lain. Keluaran harus 3^1jika benar, 1 = 3^0jika salah. Membawa sedangkan untuk angka yang lebih besar (baik, ini adalah FRACTRAN ...).

Sp3000
sumber
6

JavaScript - 23 Karakter

Sebagai fungsi (ECMAScript 6):

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

Atau mengambil input dari prompt (25 karakter)

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

C # 73 60 59

Golf pertama untuk saya ...

Tulis fungsi yang mengambil bilangan bulat negatif sebagai input

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

Bisa strip karakter lain dengan mengkonversi uintke int, tapi aku suka mengambil tugas terlalu harfiah dari jalan di sekitar lainnya. Ini dia ...

Num Lock
sumber
1
Beberapa opsi:i => (i + "").Distinct().SequenceEqual(i + "");
NPSF3000
@ NPSF3000 Terima kasih! Mengedit jawaban saya. Saya memiliki sesuatu seperti ini di pikiran saya, tetapi oh well ... Saya benar-benar lupa +""menelepon di ToString()bawah tenda.
Num Lock
Interpretasi yang lebih literal dari "bilangan bulat negatif" menunjukkan bahwa bilangan bulat yang ditandatangani akan diteruskan, tetapi tidak akan pernah menjadi negatif.
Shaz
Yah, kurasa tidak apa-apa kalau begitu ...
Num Lock
Gunakan C # 6 dan Anda dapat menggunakan: bool f (int i) => (i + ""). Distinct (). SequenceEqual (i + "")); (53 byte)
Stephan Schinkel
5

Ruby (24 byte)

Gunakan ekspresi reguler untuk mencocokkan "beberapa karakter, diikuti oleh nol atau lebih karakter, lalu karakter yang sama".

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

Jika nilai true atau falsy diterima, bukan literal trueatau false, maka kita mendapatkan 20 karakter:

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

C (87)

Karena saya tidak bisa menang, saya akan mengejar efisiensi.

Kode fungsi:

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
sumber
Oh, dan karena saya masih tidak bisa mengomentari pos orang lain - Saya ingin mengatakan bahwa ini adalah solusi yang rapi, bahkan jika tidak akurat ketika "meluap".
DreamWarrior
5

Mathematica, 35 25 karakter

(27 jika fungsi membutuhkan nama.)

Unequal@@IntegerDigits@#&

EDIT: Disimpan 8 karakter berkat belisarius!

Martin Ender
sumber
Unequal @@ IntegerDigits@# &saya kira bisa melakukannya
Dr. belisarius
@ belisarius oh bagus, saya sedang mencari sesuatu seperti itu tetapi tidak dapat menemukannya (dan tidak berpikir bahwa rantai akan membandingkan elemen yang tidak berdekatan). Terima kasih, ini lebih pendek!
Martin Ender
Anda tidak harus memberi nama, kan? Unequal@@IntegerDigits@#&adalah 25 karakter.
akater
@ Akater benar, saya tidak bisa melihat persyaratan untuk nama dalam tantangan. Terima kasih!
Martin Ender
5

R, 53 51 48 34 Bytes

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

Cobalah online!

Konversikan ke string dan pisah. Konversikan ke daftar jumlah minus 1, jumlahkan dan negasikan

Terinspirasi oleh Jawaban bilangan paling umum oleh Alex dan saran dari Hugh.

Satu pasangan disimpan, terima kasih kepada @plannapus Satu lagi dari @Gregor Dan pasangan dari menjadikannya fungsi anonim

Sekarang dengan kebaikan regex yang luar biasa terima kasih kepada @ Joe. Ini mencari setiap karakter tunggal dalam jumlah yang cocok dengan dirinya sendiri di mana saja dalam string. The greplperintah mengembalikan logis yang kemudian kembali. Reg gaya reg diatur ke True.

MickyT
sumber
Anda juga dapat mengonversi ke string menggunakan paste0bukan toStringdan menyimpan 2 karakter.
plannapus
Anda dapat menggunakan pastealih-alih paste0menyimpan satu karakter lagi.
Gregor
@ J. Aduh: lebih baik! :)
digEmAll
Menggunakan pendekatan yang berbeda. 35 byte dengan regex.
J.
4

J (9)

Asumsikan nilai yang akan diuji adalah dalam variabel b (Saya tahu ini dapat dibuat menjadi fungsi, tetapi tidak memiliki petunjuk tentang bagaimana . J membingungkan. Setiap bantuan tentang ini dihargai) Terima kasih Marinus!

(-:~.)@":

Cek apakah panjang string rep nomor dengan semua duplikat dihapus sama dengan panjang rep string biasa.

ɐɔıʇǝɥʇu
sumber
Untuk suatu fungsi bisa Anda lakukan (-:~.)@":.
marinus
@marinus Oh wow, itu lebih pendek dari yang saya kira. Terima kasih!
ɐɔıʇǝɥʇuʎs
HI, saya menemukan dan memposting solusi J yang lebih pendek: -: ~. &. ":
Galen Ivanov
4

R ( 70 , 60 , 53 , 52)

Terima kasih atas komentar yang bermanfaat! Komentar Anda dimasukkan dalam jawaban.

### 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
sumber
@plannapus, Anda benar. Saya bingung tentang "basis 10 representasi".
djhurio
1
Menggunakan tabel dan membandingkan dengan 0 bukannya digandakan mungkin menyimpan beberapa karakter
Dason
1
Dan saya pikir Anda bisa membiarkan parameter split tidak disebutkan namanya. Saya hanya menggunakan ponsel saya jadi tidak bisa mengeceknya dengan mudah, tetapi saya percaya ini adalah parameter kedua strsplit sehingga Anda bisa menggunakan argumen posisi dan bukan nama untuk menyimpan karakter
Dason
1
Dan karena Anda sudah mengambil elemen pertama dari hasil strsplitmengapa tidak memaksa x menggunakan karakter c(x,"")? f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)lebih pendek 1 karakter :)
plannapus
3

Mathematica (20 19)

(22 21 jika fungsi membutuhkan nama)

Max@DigitCount@#<2&

atau

Max@DigitCount@#|1&

dimana | ist dimasukkan sebagai [Esc] membagi [Esc]

branislav
sumber
Bagus. Saya lupa DigitCount ada, dan menulis solusi berdasarkan konversi ke string. Milikmu jauh lebih baik.
Michael Stern
2

C99, 59 karakter

a(x){int r=1,f[10]={};for(;x;x/=10)r&=!f[x%10]++;return r;}
Thomas
sumber
C99 tidak memiliki int implisit, secara teknis.
PatrickB
1
Bukan hanya "secara teknis", itu secara khusus dan sengaja dihapus. Ini adalah kesalahan sintaksis dalam C99, dan selain dari diagnostik yang diperlukan, kesalahan sintaksis berada dalam kategori yang sama dengan perilaku yang tidak terdefinisi (secara eksplisit tidak diizinkan dalam pertanyaan): jika suatu implementasi menerima ini, standar tidak membuat persyaratan apa pun tentang perilaku program.
hvd
2

Groovy (36 karakter)

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

Mengujinya menggunakan:

println f(args[0].toInteger())
Will Lp
sumber
'false' dapat di-golf melalui '1 == 0' atau sesuatu yang lebih pintar. Jawaban yang bagus
Michael Easter
@MichaelEaster 0>1lebih pendek.
pastebin.com memangkas 0mr8spkT
1
@ Ya, meskipun! Saya juga bekerja ...
Michael Easter
@ace, MichaelEaster, thx untuk bantuan :-)
Will Lp
@ WillP seperti yang disarankan oleh MichaelEaster, gunakan !1saja.
pastebin.com memangkas 0mr8spkT
2

Haskell:

 import Data.List

 all ((== 1) . length) . group . sort . show
Paul Johnson
sumber
Agak terlambat ke pesta, tapi karena kau Data.Listtetap mengimpor aku sarankannub , yang menghapus duplikat dari Daftar.(\x->nub x==x).show
Flonk
Anda tidak menggunakan ... main = interact $ show . ap (==) nub . show
kazagistar
2

J (8)

Sepertae yang kompeten dari jawaban saya sebelumnya.

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

R, 66 65 karakter

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

Pisahkan digit menggunakan divisi integer dan modulo, lalu periksa apakah duplikat.

Pemakaian:

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

Atau, seperti yang disarankan @MickyT, untuk 63 karakter:

f=function(x)!anyDuplicated((x%%10^(i<-1:nchar(x)))%/%10^(i-1))
plannapus
sumber
1
Anda bisa menggunakan anyDuplicateddaripada sumdan duplicateduntuk 2 lebih
MickyT
2

C, 58 byte

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

Dapat menyimpan penghitungan hingga 7 digit identik sebelum berguling.

dalam program uji (lebih mudah untuk melihat cara kerjanya dengan konstanta dalam oktal)

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

Jika Anda memiliki kekuatan besar 2 berguna, konstanta dapat dihitung seperti f&(1<<30)/7*6

Level River St
sumber
Saya pikir komentar oleh @xfix ditujukan untuk posting saya, bukan milik Anda? Anda sebenarnya tidak menggunakan int main(int)jawaban Anda ...
pastebin.com memangkas 0mr8spkT
Memiliki informasi eksternal yang tidak diperhitungkan terhadap kode byte / char count jelas tidak diperbolehkan. Saya sarankan Anda menghapus versi pertama (53 byte).
2501
Silakan lihat komentar saya di ringkasan edit .
2501
Saya memilih untuk menolak suntingan, tetapi saya setuju bahwa penghitungan terlihat salah. Saya membuatnya 67 dan 63 (61).
Peter Taylor
Hasil edit saya ditolak oleh pengguna lain. Harap evaluasi ulang itu.
2501
1

Javascript 73 karakter

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

Menembus 98, 17 byte

Ini adalah jawaban yang tidak bersaing karena Befunge tidak memiliki fungsi.

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

Mencetak a 1jika digit angka semuanya unik; jika tidak, itu hanya berakhir.

Ini bekerja dengan mengakses sel di ruang Funge yang xkoordinatnya adalah nilai ASCII dari karakter yang dimasukkan (mengambil karakter masukan berdasarkan karakter) dan yang ykoordinatnya adalah 1. Jika digit belum terlihat sebelumnya, nilai sel adalah 32(karakter spasi). Jika demikian, saya menetapkan nilai ke 1.

Sebagai bonus, ini juga berlaku untuk non-angka.

Justin
sumber
1

PowerShell - 26

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

Perl 6 (19 byte)

{.comb.uniq==.comb}

.combmembagi string menjadi karakter (misalnya, 42.combmemberi "4", "2"). .uniqmenghapus semua karakter non-unik..combkarakter dalam string (awalnya saya gunakan .chars, tetapi .comblebih pendek). ==mengubah daftar menjadi sejumlah elemen di dalamnya, dan membandingkan jumlahnya. Ketika .digunakan tanpa objek sebelumnya, $_yang merupakan parameter fungsi default diasumsikan. {}adalah fungsi literal.

Konrad Borowski
sumber
1

C, 76

Ini bukan tempat yang hampir menang, tetapi saya akan mempostingnya hanya untuk menunjukkan pendekatan alternatif.

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

Mencetak baris baru jika salah, tidak mencetak apa pun jika benar.

pastebin.com memangkas 0mr8spkT
sumber
Program ini memiliki perilaku yang tidak terdefinisi. Tanda tangan yang benar untuk utama adalah int main(int, char **)atau int main(void). int main(int)tidak valid.
Konrad Borowski
@ memperbaiki Saya anggap main()tidak apa-apa?
pastebin.com memangkas 0mr8spkT
Ya, tidak apa-apa. Ini berarti hal yang sama dengan main(void)(ketika digunakan dalam definisi, dalam deklarasi menyatakan fungsi dengan daftar parameter yang tidak diketahui).
Konrad Borowski
1

POSIX sh dan egrep ( 47 , 43 , 40)

f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
  • [-1 char]: Gunakan !sebagai ganti -zdengan test- Terima kasih DigitalTrauma
  • [-1 char]: Gunakan `CODE`sebagai ganti $(CODE)- Terima kasih DigitalTrauma
  • [-2 karakter]: Gunakan fold -1sebagai ganti grep -o .1 - Terima kasih DigitalTrauma.
  • [-3 karakter]: Periksa digit berulang dengan ekspresi reguler direferensikan.

Jika kepatuhan POSIX tidak penting echo PARAM |dapat diganti dengan <<<PARAM, mengurangi panjang fungsi menjadi 37 :

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

Pemakaian:

$ 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 -Nnotasi sudah ditinggalkan di beberapa versi fold.

Thor
sumber
f()(! [ `fold -1<<<$1|sort|uniq -d` ]) turun ke 38 menurut hitungan saya
Trauma Digital
@DigitalTrauma: Bagus, terima kasih sudah berbagi. Saya menemukan bahwa perintah yang diuji harus dikutip, jika tidak testkadarnya ketika uniq -dmengembalikan lebih dari satu baris. Jadi versi non-POSIX terpendek adalah 40 karakter. Saya tahu tentang [ !notasi, tetapi saya terkejut bahwa itu ! [juga berfungsi, apakah Anda tahu mengapa demikian?
Thor
Ah saya menggunakan bash. Jadi saya kira ini lebih lama jika Anda ingin kesesuaian POSIX.
Trauma Digital
1

Jawa ( 131 59 57)

57 karakter:

dihapus ^ dan $ seperti yang disarankan @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

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

59 karakter (berfungsi juga dengan angka negatif!):

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

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

Gunakan untuk loop untuk menyimpan beberapa charachers dan gunakan int sebagai array boolean.

Gunakan & alih-alih && untuk menyimpan 1 karakter (Ternyata java mengizinkannya).

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 karakter (menghasilkan true untuk angka negatif):

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

dengan komentar:

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
}

Dan jawaban yang secara teknis benar (jumlah karakter hanya mencakup fungsi, bukan variabel global), tapi saya pikir itu curang, 29 karakter:

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

m [] adalah array boolean yang berisi jawaban yang benar untuk semua bilangan bulat 32-bit.

barteks2x
sumber
"^.*(.).*\\1.*$"Anda dapat menjatuhkan ^dan $. Mereka diimplikasikan olehmatches()
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
Pendekatan ke-2 dapat dilakukan dengan menggunakan 10 bit dalam sebuah int sebagai boolean array, yang akan menghilangkan kebutuhan akan tabel utama.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
Saya tahu ini sudah tiga tahun, tetapi jika Anda menghapus ruang return!di antara jawaban tersingkat, Anda bisa mencapai 56 byte.
Kevin Cruijssen