Tüm ondalık basamakların benzersiz olup olmadığını belirleyin


37

Yığın Taşması ile ilgili soruların silinmesi bazen harika golf malzemelerini oluşturur.

Girdi olarak negatif olmayan bir tamsayı alan ve bu sayının 10 numaralı temsili içindeki tüm rakamlar benzersizse true döndüren bir işlev yazın. Örnek:

48778584 -> false
17308459 -> true

Karakter sayısı sadece işlevi içerir.

C veya C ++ dilinde cevaplamayı seçerseniz: makro yok, tanımsız davranış yok; uygulama tanımlı davranış ve derleyici uyarıları iyi.


Buna ilham veren soruya göre diğer C veya C ++ çözümleriyle hala ilgileniyorum.
Thomas

1
Neden C veya C ++ makroları veya tanımsız davranış yok? Bu garip bir şekilde sadece iki dili sınırlıyor.
dfeuer

Yanıtlar:


31

Golfscript, 8 7 karakter:

{`..&=}
  • ` - argümanı dize
  • .. - iki kere klon
  • & - kendisiyle kesişir (kopyaları kaldır)
  • = - eşitliği kontrol et.

işlevin adlandırılması gerekiyorsa (109 karakter ):

{`..&=}:a

bir program yeterliyse (54 karakter ):

..&=

5
Bunun gibi zorluklarla ilgili zor kısım, onu ilk gören kişi olmaktır.
primo

1
@primo, yine de bir şekilde, yarım gün içinde hala +6 puan alıyorlar.
John Dvorak

1
@JanDvorak Parkinson işyerinde önemsizlik yasası
Claudiu

2
@ Claudiu Yasayı anlayabilirsiniz. Buna maruz kaldığınızı farkedin. O halde cevabı yine de oyla.
Cruncher

1
@NathanChere ne demek istiyorsun? o deliğin önerildiği son (ve sadece) zaman , ertesi sabah öneri tarafından silinmeden önce -3'e düştü. Golfscript cevaplarını beğenmiyorsanız, onları fazla oylama.
John Dvorak

24

Piton 2 (28) (32)

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

Geri tepme ipleri string temsilidir. Bir kümeye dönüştürme, kopyaları kaldırır ve bunun, uzunluğu (d + 1) -digit sayılarından büyük olmayan tüm d basamaklı sayılardan daha büyük olan 10 ^ d'ye düşürdüğünü kontrol ederiz.

Eski kod:

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


1
Ha ben bu vardı tam sadece yerine, aynı cevap hazır nolani
Claudiu

1
@ Claudiu ben de öyle yaptıf=lambda _:len(`_`)==len(set(`_`))
Oberon

Evet, bu ısırık büyüklüğündeki zorluklarla, herkes hemen hemen aynı şey üzerinde birleşecek. Ben de lambda n:max(map('n'.count,'n'))<2deniyordum (tek tırnaklar geri tepmedir), fakat iki karakter daha uzun.
xnor

16

APL (6)

≡∘∪⍨∘⍕

APL’de de yapışkan tarzın daha kısa olduğu birkaç zamandan biri.

Bir isim vermek için 8 karakter var.

f←≡∘∪⍨∘⍕

ama bunu kullanmak gerekli değil:

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

1
İkinci jotu 5 yapmak için çıkarılabileceğini düşünüyorum. Yine de, kendisi tarafından geçerli bir fonksiyon olacaktır (her ne kadar son örnekte her operatörle kullanmak için gruplandırma parenleri gerektirse de).
user46915 9:15

11

Perl, 19 karakter

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

çıktının doğru olarak kabul edilebildiğini ve çıktının yanlış olarak değerlendirilebileceğini varsayarsak mantığınız tersine çevrilir. Tekrarlama yoksa doğru dönmelisin.
John Dvorak

@JanDvorak Doğru geliyor. Bunu düzelteceğim.
Tal

Değil maç operatörü: <>!~/(\d).*\1/.
primo

@primo Teşekkürler! Öğrenecek çok şey var :)
Tal

3
Girdi negatif olmayan bir tamsayı olarak belirtildi, bu yüzden bunu doğrulamanız gerektiğini düşünmüyorum. Eğer gerçekten yapmazsanız, değiştirebileceğiniz \diçin ..
hvd

9

Rebmμ (10 karakter)

e? AtsAuqA

Rebmu'nun “heyecan verici” numarası büyük / küçük harfe duyarsız olduğu için karakterler bir arada çalışıyor. Bir vaka geçişine ne zaman basılırsa, bu bir sonraki belirtecine ayrılır. CamelCase gibi bir şey yerine geçişler kullanarak, büyük harflerle başlamak için benzersiz bir seçim "set-kelime" yapılması anlamına gelir. (Sembolik programlamaya set kelimeler başka amaçlar için de kullanılabilirken, varsayılan olarak atama olarak değerlendirilir).

Yani bu "unushushes" için:

e? a: ts a uq a

Bu alana ihtiyaç duyulur, çünkü bir kez bir dizi sıradan dava açmaya başladığınızda, yeni bir koşuya başlamadıkça bu numarayı ilk sıradan sonra bir kelime almak için kullanamazsınız. Yani e?AtsAuqAseni yakalardı e? a ts a uq a... görev yok.

(Not: Özellikle iyi bir sebepten kaynaklanamayan bir nedenden ötürü, karakter sayıları eşitse boşluk kalmayacak şekilde yeniden düşünmeyi tercih ediyorum. Parantezler, parantezler ve dizgiler dolaylı olarak bir sembol sona erdirirse bunun için fırsat sayısı.)

Her durumda, Rebol'a eşlendiğinde kısaltıldığı:

equal? a: to-string a unique a

Değerlendirme sırasını hatırlatmak için bazı parantez içine atmak:

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

Bu nedenle, önek eşitliği operatörü iki argümana uygulanır - ilki akendi dize sürümüne atanmanın sonucu , ikincisi ise uniqueo dizeye karşı çalıştırılmasının sonucu . Öyle olur ki, benzersiz size öğeleri geçerken aynı sırayla geri verir ... yani "31214" in benzersizliği "3124" olur.

Şununla çalıştır:

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

Bazı istatistikler ve hata ayıklama bilgileri de var:

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

Gereksinim, adlandırılmış / yeniden kullanılabilir bir işlev tanımlamak zorundaysa, dolaylı olarak ile adlandırılmış bir parametre alan bir "A işlevi" yapabilirsiniz a|. (Bir B-fonksiyonu oluşturulur b|ve A ile B denilen bir parametre alır). Böylece beş karakter daha eklenir ... diyelim ki "f" işlevini çağırıyorsunuz

Fa|[e? AtsAugA]

“Gülüyorsun! Einstein'a güldüler! Ya da bekle ... onlar mı? Ben ... bilmiyorum.”


Dilin telaffuz edildiğini düşünürdüm Reb moo, ama şimdi olması Rebum mewya Reb mewda başka bir şey olması gerektiğinden emin değilim .
Justin,

2
NetHack oynadıktan sonra okuduğum Fa|[e? AtsAugA]olarakFalse? SomeGibberish
Justin

@Quincunx, Nethack'ta sgerçekten bozuluyor [mu?
John Dvorak

@JanDvorak Bazı mektupların çürümekte olduğunu gördüm [bir süre sonra
Justin '

@Quincunx Sadece logolu oynuyor. Bence REBmumuhtemelen daha iyi. Her iki durumda da, sakal sıkı .. tutam. Sanırım ödediğiniz paranın karşılığını alıyorsunuz.
Dr. Rebmu

7

FRACTRAN - 53 38 kesirler

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

Her basamağın oluşum sayısını saymak için bölme kullanır. Kayıt 2'ye n koyarak ve kayıt 5'e 1 ayarlayarak çağrı, kayıt 3'e çıkış verir (yanlışsa 0, doğruysa 1). Ayrıca, programınızın geri kalanının sadece> 71 numaralı kayıtları kullandığından emin olun.


Düzenleme 25/12/14: 7 ay oldu ve o zamandan beri Stack Snippet'leri aldık, bu yüzden kodu test etmek için bir tane ( burada daha iyi olabilirim tercümanımı kullanarak ).

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>

142857Başka bir numara ile değiştirin . Çıktı 3^1true 1 = 3^0ise, false ise olmalıdır . Daha büyük sayılar için bir süre alır (iyi, bu ise ... FRACTRAN).


6

JavaScript - 23 Karakterler

Bir fonksiyon olarak (ECMAScript 6):

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

Veya bilgi isteminden girdi almak (25 karakter)

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

6

C # 73 60 59

İlk benim için golf ...

Girdi olarak negatif olmayan bir tamsayı alan bir işlev yazın

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

Dönüştürerek başka bir karakter şerit Could uintiçin int, ama yerine başka bir yol, etrafımızda daha fazla ciddiye görev alır. İşte başlıyoruz ...


1
Bazı seçenekler:i => (i + "").Distinct().SequenceEqual(i + "");
NPSF3000

@ NPSF3000 Teşekkürler! Cevabımı düzenledi. Aklımda böyle bir şey vardı, ama ah peki ... Başlığın altını +""aramayı tamamen unuttum ToString().
Num Lock

"Olumsuz tamsayı" nın daha gerçek bir yorumu, imzalı bir tamsayı geçirileceğini, ancak asla olumsuz olmayacağını öne sürüyor.
Shaz

Sanırım her şey yoluna girecek ...
Num Lock

C # 6 kullanın ve şunları kullanabilirsiniz: bool f (int i) => (i + ""). Distinct (). SequenceEqual (i + ""); (53 bayt)
Stephan Schinkel

5

Yakut (24 bayt)

"Bazı karakterleri, ardından sıfır veya daha fazla karakterleri, ardından aynı karakterleri" eşleştirmek için normal bir ifade kullanın.

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

Eğer gerçek veya sahte değerler kabul edilirse, değişmez trueveya false20 karakter alırız:

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

5

C (87)

Kazanamadığım için verimlilik için gidiyorum.

İşlev kodu:

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

Hala başkalarının yazılarda yorum yapamam çünkü Oh, ve - Bunu söylemek istiyorum bu bile yanlış ise ne zaman "taşmaları", düzgün bir çözüm oldu.
DreamWarrior

5

Mathematica, 35 25 karakter

(27, işlevin bir isme ihtiyacı varsa.)

Unequal@@IntegerDigits@#&

EDIT: belisarius sayesinde 8 karakter kurtarıldı!


Unequal @@ IntegerDigits@# &yapabilirim, sanırım
Dr. belisarius

@belisarius oh nice, öyle bir şey arıyordum ama bulamadım (ve zincirin bitişik olmayan elemanları karşılaştıracağını düşünmedim ). Teşekkürler, bu çok kısaltır!
Martin Ender

Ona bir isim vermek zorunda değilsin, değil mi? Unequal@@IntegerDigits@#&25 karakterdir.
akater

@Akater true, mücadelede isim için bir gereklilik göremiyorum. Teşekkürler!
Martin Ender

5

R, 53 51 48 34 Bayt

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

Çevrimiçi deneyin!

Bir dizeye dönüştür ve böl. Bir sayım eksi 1 tablosuna dönüştürmek, toplamı ve olumsuz

Esinlenerek En çok aranan Alex'in cevabı, Hugh'un önerisi.

@Plannapus sayesinde bir çift kurtarıldı @Gregor'dan bir tane daha ve bunu anonim bir işlev haline getiren bir çift

Şimdi @JDoe sayesinde harika regex iyiliği ile. Bu, sayıdaki herhangi bir karakterin kendisiyle eşleşen dizgede başka bir yer arar. greplKomut sonra döndürülen mantıksal döndürür. Perl tarzı regexes True olarak ayarlanır.


Ayrıca, dize kullanarak paste0yerine dönebilir toStringve 2 karakter kaydedebilirsiniz.
plannapus

Bir karakter daha kaydetmek pasteyerine, paste0onu kullanabilirsiniz .
Gregor


@ J.Doe: daha da iyi! :)
digEmAll

Farklı bir yaklaşım kullandım. Regex ile 35 bayt .
J.Doe

4

J (9)

Test edilecek değer değişkeni olduğunu varsayar b (Bunun bir fonksiyonu haline getirilebilir biliyorum ama bir ipucu yok nasıl karıştırıyor. J. Bu herhangi bir Yardım takdir) sayesinde Marinus!

(-:~.)@":

Çıkarılan tüm kopyalarla birlikte sayının dize rep uzunluğunun normal dize rep uzunluğuyla aynı olup olmadığını kontrol eder.


Bir fonksiyon için yapabilirsiniz (-:~.)@":.
marinus

@ marinus Oh vay, düşündüğümden daha da kısa. Teşekkürler!
ɐɔıʇǝɥʇuʎs

HI, daha kısa bir J çözümü buldum ve yayınladım: -: ~. &. ":
Galen Ivanov

4

R ( 70 , 60 , 53 , 52)

Yararlı yorumlarınız için hepinize teşekkür ederiz! Yorumlarınız cevaba dahil edilmiştir.

### 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, haklısın. "10 taban temsili" hakkında kafam karıştı.
djhurio

1
Tablo kullanmak ve çoğaltılmış yerine 0'a göre karşılaştırmak bazı karakterleri koruyabilir
Dason

1
Ve bence split parametresini isimsiz bırakabilirsin. Ben sadece telefondayım, bu yüzden kolayca kontrol edemiyorum ama strsplit'in ikinci parametresi olduğuna inanıyorum; böylece karakterleri kaydetmek için adlandırılmış değişkenler yerine konumsal kullanabilirsiniz
Dason

1
Ve zaten strsplitx'in bir karakteri kullanarak neden zorlamadığı sonucunun ilk unsurunu seçtiğiniz için c(x,"")? f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)1 karakter daha kısa :)
plannapus

3

Mathematica (20 19)

(22 21 eğer fonksiyon bir isim isterse)

Max@DigitCount@#<2&

veya

Max@DigitCount@#|1&

nerede [Esc] bölü [Esc] olarak girildi


Güzel. DigitCount'un var olduğunu unuttum ve dizgelere dönüşüme dayalı bir çözüm yazdım. Seninkiler çok daha iyi.
Michael Stern


2

C99, 59 karakter

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

C99, teknik olarak örtük bir int'e sahip değil.
PatrickB

1
Sadece "teknik olarak" değil, özellikle ve bilerek kaldırıldı. Bu, C99'daki bir sözdizimi hatasıdır ve gerekli bir tanılama dışında, sözdizimi hataları tanımsız davranış (aynı soruya açıkça izin verilmez) ile aynı kategoridedir: bir uygulama bunu kabul ederse, standart programın davranışına ilişkin hiçbir gereklilikte bulunmaz.
hvd

2

Harika (36 karakter)

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

Kullanarak test edildi:

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

'false', '1 == 0' aracılığıyla veya muhtemelen daha akıllıca bir şeyle golf oynayabilir. İyi cevap
Michael Paskalya

@MichaelEaster 0>1daha kısa.
ace_HongKongIndependence

1
@ace Evet, yine de! 1 de çalışıyor ...
Michael Easter

@ace, MichaelEaster, yardım için teşekkürler :-)
Lp

MichaelEaster tarafından önerilen @WillP !1yerine kullanın.
ace_HongKongIndependence

2

Haskell:

 import Data.List

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

Partiye biraz geç kaldım, ama Data.Listyine de ithal ettiğinizden beri nub, ki bir Listeden kopyaları kaldıran önerebilirim . (\x->nub x==x).show
Flonk

Pl kullanmadınız ...main = interact $ show . ap (==) nub . show
kazagistar


2

R, 66 65 karakter

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

Tamsayı bölme ve modulo kullanarak basamakları ayırın, sonra kopya olup olmadıklarını kontrol edin.

Kullanımı:

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

Veya, @MickyT'nin önerdiği gibi 63 karakter için:

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

1
Sen kullanabilirsiniz anyDuplicatedziyade sumve duplicated2 daha
MickyT

2

C, 58 bayt

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

Dönmeden önce 7 aynı haneye kadar taksitli tutabilir.

Test programında (Sekizli sabit ile nasıl çalıştığını görmek kolaydır)

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

Eğer kullanışlı 2 büyük bir güce sahipseniz, sabit gibi hesaplanabilir f&(1<<30)/7*6


Sanırım @xfix tarafından yapılan yorum benim yerime yazılmalı mıydı? Aslında int main(int)cevabında kullanılmadın ...
ace_HongKongIndependence

Bayt / char sayımı koduna dahil olmayan harici bilgilere sahip olmak kesinlikle yasaktır. İlk sürümü çıkarmanızı öneririm (53 bayt).
2501,

Lütfen düzenleme özetindeki yorumuma bakın .
2501,

Düzenlemeyi reddetmek için oy kullandım, ancak sayıların yanlış göründüğünü kabul ediyorum. Onları 67 ve 63 (61) yapıyorum.
Peter Taylor

Düzenlemem diğer kullanıcılar tarafından reddedildi. Lütfen tekrar değerlendirin.
2501,


1

Javascript 73 karakter

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

1

Befunge 98, 17 bayt

Befunge'in bir fonksiyonu olmadığı için bu, rakipsiz bir cevaptır.

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

1Sayının rakamlarının tümü benzersizse a'yı yazdırır ; Aksi takdirde, sadece biter.

Olan Funge uzayda bir hücre erişerek Bu çalışmalar xkoordinat girilen karakter ASCII değeri (karakter girişi karakter taşır) olan ve ykoordinat 1. Rakam daha önce görülmediyse, hücrenin değeri 32(boşluk karakteri) olur. Öyleyse değeri 1 olarak ayarlarım.

Bir bonus olarak, bu numara olmayanlar için de geçerlidir.



1

Perl 6 (19 bayt)

{.comb.uniq==.comb}

.combbir dize karakterlere böler (örneğin, 42.combverir "4", "2"). .uniqtüm benzersiz olmayan karakterleri kaldırır. .combdizedeki karakterler (başlangıçta kullandım .charsancak .combdaha kısa). ==Listeleri içindeki eleman sayısına dönüştürür ve sayıları karşılaştırır. Daha .önce nesne olmadan kullanıldığında $_, varsayılan işlev olan parametre kabul edilir. {}işlev değişmezleridir.


1

C, 76

Bu kazanmaya yakın bir yer değil, ama yine de alternatif bir yaklaşım göstermek için göndereceğim.

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

False olursa yeni bir satır yazdırır, true ise hiçbir şey yazdırmaz.


Bu programın tanımsız bir davranışı var. Main için doğru imzalar int main(int, char **)veya int main(void). int main(int)geçerli değil.
Konrad Borowski

@ xfix main()tamam mı?
ace_HongKongIndependence

Evet bu iyi. Bu aynı anlama gelir main(void)(tanımda kullanıldığında, bildirimde bilinmeyen parametre listesine sahip bir işlev bildirir).
Konrad Borowski

1

POSIX sh ve egrep ( 47 , 43 , 40)

f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
  • [-1 karakter]: Kullanım !yerine -zile test- Teşekkür DigitalTrauma
  • [-1 char]:`CODE` Bunun yerine kullanın $(CODE)- Thanks DigitalTrauma
  • [-2 karakter]: 1fold -1 yerine kullanın - Thanks DigitalTrauma.grep -o .
  • [-3 karakter]: Geriye dönük normal ifadeyle tekrarlanan rakamları kontrol et.

POSIX uyumluluğu önemli değilse , işlevlerin uzunluğu 37'ye düşürülerek echo PARAM |değiştirilebilir :<<<PARAM

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

Kullanımı:

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

1 notasyonu bazı sürümlerinde kullanımdan kaldırılmıştır .fold -Nfold


f()(! [ `fold -1<<<$1|sort|uniq -d` ])sayımla 38'e düştü
Digital Trauma

@ DigitalTrauma: paylaşım için iyi şeyler teşekkürler. Test edilen komutun alıntılanması gerektiğini biliyorum, aksi takdirde birden fazla satır döndürdüğünde testüzerinde titriyor uniq -d. Yani POSIX dışı en kısa versiyon 40 karakterdir. [ !Gösterimi biliyorum ama bunun ! [da işe yaradığından şaşırdım, bunun neden olduğunu biliyor musunuz?
Thor,

Ah, bash kullanıyordum. POSIX uygunluğunu istiyorsanız, sanırım daha uzun.
Dijital Travma

1

Java ( 131 59 57)

57 karakter:

kaldırıldı ^ ve $ as @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ önerdi

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

59 karakter (ayrıca negatif sayılarla da çalışır!):

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

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

Birkaç takipçiyi kaydetmek için loop için kullanın ve bir boolean dizisi olarak int kullanın.

1 karakter kaydetmek için & yerine & kullanın. (Java’nun izin verdiği anlaşılıyor).

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 (negatif sayılar için doğru döndürür):

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

yorumlarla:

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
}

Ve teknik olarak doğru olan cevap (karakter sayısı global değişkenleri değil sadece işlevi içerir), ama sanırım hile yapıyor, 29 karakter:

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

m [], tüm 32 bit tam sayılar için doğru cevapları içeren bir boolean dizisidir.


"^.*(.).*\\1.*$"Düşebilirsin ^ve $. Onlar tarafından ima edildimatches()
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

İkinci yaklaşım, bir boolean dizisi olarak int'de 10 bit kullanılarak, asal tabla ihtiyacını ortadan kaldıracak şekilde yapılabilir.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Üç yıl geçtiğini biliyorum, ancak aradaki return!en kısa cevabı kaldırırsanız, 56 bayta ulaşabilirsiniz.
Kevin Cruijssen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.