Xác định xem tất cả các chữ số thập phân là duy nhất


37

Các câu hỏi đã bị xóa trên Stack Overflow đôi khi tạo nên chất liệu golf tuyệt vời.

Viết hàm lấy một số nguyên không âm làm đầu vào và trả về true nếu tất cả các chữ số trong biểu diễn cơ sở 10 của số đó là duy nhất. Thí dụ:

48778584 -> false
17308459 -> true

Số lượng ký tự chỉ bao gồm các chức năng.

Nếu bạn chọn trả lời bằng C hoặc C ++: không có macro, không có hành vi không xác định; hành vi xác định thực hiện và cảnh báo trình biên dịch là tốt.


Tôi vẫn quan tâm đến các giải pháp C hoặc C ++ khác theo câu hỏi đã truyền cảm hứng cho câu hỏi này.
Thomas

1
Tại sao không có macro C hoặc C ++ hoặc hành vi không xác định? Đó là giới hạn kỳ lạ chỉ hai ngôn ngữ.
dfeuer

Câu trả lời:


31

Golf, số 8 7 ký tự:

{`..&=}
  • ` - xâu chuỗi đối số
  • .. - nhân bản hai lần
  • & - giao với chính nó (loại bỏ trùng lặp)
  • = - kiểm tra sự bình đẳng.

nếu hàm cần được đặt tên (109 ký tự ):

{`..&=}:a

nếu một chương trình đủ (54 ký tự ):

..&=

5
Phần khó về những thử thách như thế này là lần đầu tiên nhìn thấy nó.
primo

1
@primo chưa, bằng cách nào đó, họ vẫn nhận được điểm +6 trong vòng nửa ngày.
John Dvorak

1
@JanDvorak Luật lệ tầm thường của Parkinson tại nơi làm việc
Claudiu

2
@Claudiu Bạn có thể hiểu luật. Nhận ra bạn đang phải chịu đựng nó. Sau đó, upvote câu trả lời nào.
Cruncher

1
@NathanCó nghĩa là gì? lần cuối cùng (và duy nhất) kẽ hở đó được đề nghị giảm xuống -3 trước khi bị kẻ phá hoại xóa vào sáng hôm sau. Nếu bạn không thích câu trả lời của golf, đừng nâng cao chúng.
John Dvorak

24

Con trăn 2 (28) (32)

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

Các backticks lấy đại diện chuỗi. Chuyển đổi thành một tập hợp sẽ loại bỏ các bản sao và chúng tôi kiểm tra xem điều này có làm giảm độ dài hay không bằng cách so sánh với 10 ^ d, lớn hơn tất cả các số có chữ số d nhưng không có số (d + 1).

Mã cũ:

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


1
Ha Tôi đã có sẵn câu trả lời chính xác này , chỉ cần thay thế nbằngi
Claudiu

1
@Claudiu tôi cũng vậyf=lambda _:len(`_`)==len(set(`_`))
Oberon

Vâng, với những thử thách cỡ cắn này, mọi người sẽ hội tụ khá nhiều thứ giống nhau. Tôi cũng đã thử lambda n:max(map('n'.count,'n'))<2(các trích dẫn đơn là backticks), nhưng đó là hai ký tự dài hơn.
xnor

16

APL (6)

≡∘∪⍨∘⍕

Một trong số ít lần phong cách ngầm cũng ngắn hơn trong APL.

Đó là 8 ký tự để đặt tên cho nó,

f←≡∘∪⍨∘⍕

nhưng không cần thiết phải sử dụng nó:

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

1
Tôi nghĩ rằng jot thứ hai có thể được gỡ bỏ để làm cho nó 5. Nó vẫn sẽ là một chức năng hợp lệ (mặc dù nó sẽ yêu cầu nhóm parens để sử dụng nó với mỗi toán tử trong ví dụ cuối).
dùng46915

11

Perl, 19 ký tự

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

giả sử đầu ra có thể được coi là đúng và không có đầu ra có thể được coi là sai, logic của bạn bị đảo ngược. Bạn nên trả lại đúng nếu không có sự lặp lại.
John Dvorak

@JanDvorak Âm thanh về đúng. Tôi sẽ sửa nó.
Tal

Toán tử không khớp : <>!~/(\d).*\1/.
primo

@primo Cảm ơn! Có quá nhiều thứ để học :)
Tal

3
Đầu vào được chỉ định là số nguyên không âm, vì vậy tôi không nghĩ bạn cần xác minh điều đó. Nếu bạn thực sự không, bạn có thể thay đổi \dthành ..
hvd

9

Rebmμ (10 ký tự)

e? AtsAuqA

Thủ thuật "nham nhở" của Rebmu là nó không phân biệt chữ hoa chữ thường, vì vậy các nhân vật được chạy cùng nhau. Bất cứ khi nào một chuyển đổi trường hợp được nhấn, nó sẽ phân chia thành mã thông báo tiếp theo. Bằng cách sử dụng các hiệu ứng chuyển tiếp thay vì một loại điều của CamelCase, lựa chọn duy nhất để bắt đầu với việc chạy vốn có nghĩa là "từ đặt" được thực hiện. (Mặc dù các từ được đặt có thể được sử dụng cho các mục đích khác trong lập trình tượng trưng, ​​chúng được đánh giá là các bài tập theo mặc định).

Vì vậy, "unmushes" này để:

e? a: ts a uq a

Không gian là cần thiết bởi vì một khi bạn đã bắt đầu một loạt các trường hợp xen kẽ, bạn không thể sử dụng thủ thuật đó để có được một từ được đặt sau lần đầu tiên trừ khi bạn bắt đầu một lần chạy mới. Vì vậy, e?AtsAuqAsẽ có được bạn e? a ts a uq a... không có nhiệm vụ.

(Lưu ý: Vì lý do có thể không có lý do đặc biệt tốt, tôi có xu hướng thích suy nghĩ lại các giải pháp để không có khoảng trắng, nếu số ký tự bằng nhau. Vì dấu ngoặc, dấu ngoặc đơn và chuỗi kết thúc một ký hiệu ... thường có một công bằng số cơ hội cho việc này.)

Trong mọi trường hợp, khi được ánh xạ tới Rebol, nó viết tắt:

equal? a: to-string a unique a

Ném vào một số dấu ngoặc đơn để giúp có được ý chính của thứ tự đánh giá:

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

Vì vậy, toán tử đẳng thức tiền tố được áp dụng cho hai đối số - kết quả đầu tiên của việc gán cho aphiên bản chuỗi của chính nó và kết quả thứ hai của uniqueviệc chạy theo chuỗi đó. Điều đó xảy ra rằng sự độc đáo sẽ cung cấp cho bạn các yếu tố theo cùng thứ tự bạn đã vượt qua chúng ... vì vậy, duy nhất của "31214" là "3124" chẳng hạn.

Chạy nó với:

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

Ngoài ra còn có một số thống kê và thông tin gỡ lỗi:

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

Nếu yêu cầu là người ta phải xác định một hàm được đặt tên / tái sử dụng, bạn có thể tạo một "Hàm A", mặc nhiên lấy tham số có tên là a với a|. (Hàm B sẽ được tạo b|và lấy tham số có tên A rồi đến tên B). Vì vậy, nó sẽ thêm năm ký tự nữa ... giả sử bạn gọi hàm là "f"

Fa|[e? AtsAugA]

"Bạn cười! Họ đã cười với Einstein! Hay chờ đợi ... phải không? Tôi ... không biết."


Tôi đã từng nghĩ ngôn ngữ được phát âm giống như Reb moo, nhưng bây giờ tôi không chắc chắn nếu nó cho là Rebum mewhay Reb mewhay cái gì khác.
Justin

2
Sau khi chơi Nethack, tôi đọc Fa|[e? AtsAugA]False? SomeGibberish
Justin

@Quincunx có sthực sự phân rã [ở Nethack không ?
John Dvorak

@JanDvorak Tôi đã thấy một số chữ cái phân rã thành [sau một thời gian
Justin

@Quincunx Chỉ cần chơi với logo. Tôi nghĩ REBmucó lẽ tốt hơn. Dù bằng cách nào, bộ râu được chặt chẽ .. đó là nhúm. Đoán bạn nhận được những gì bạn phải trả cho.
Bác sĩ Rebmu

7

FRACTRAN - 53 38 phân số

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

Sử dụng phép chia để đếm số lần xuất hiện của mỗi chữ số. Gọi bằng cách đặt n vào thanh ghi 2 và cài đặt thanh ghi 5 thành 1, đưa ra đầu ra trong thanh ghi 3 (0 nếu sai, 1 nếu đúng). Ngoài ra, đảm bảo phần còn lại của chương trình của bạn chỉ sử dụng các thanh ghi> 71.


Chỉnh sửa 25/12/14: Đã 7 tháng và chúng tôi đã nhận được Stack Snippets, vì vậy đây là một để kiểm tra mã (sử dụng trình thông dịch có thể tốt hơn của tôi ở đây ).

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>

Thay thế 142857bằng một số khác. Đầu ra phải là 3^1nếu đúng, 1 = 3^0nếu sai. Mất một lúc để có số lượng lớn hơn (tốt, đây FRACTRAN ...).


6

JavaScript - 23 ký tự

Là một hàm (ECMAScript 6):

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

Hoặc lấy đầu vào từ một dấu nhắc (25 ký tự)

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

6

C # 73 60 59

Lần đầu tiên chơi golf cho tôi ...

Viết hàm lấy số nguyên không âm làm đầu vào

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

Có thể loại bỏ một nhân vật khác bằng cách chuyển đổi uintsang int, nhưng tôi thực hiện nhiệm vụ theo nghĩa đen hơn là cách khác. Chúng ta đi đây ...


1
Một số tùy chọn:i => (i + "").Distinct().SequenceEqual(i + "");
NPSF3000

@ NPSF3000 Cảm ơn! Chỉnh sửa câu trả lời của tôi. Tôi đã có một cái gì đó như thế này trong đầu, nhưng ồ ... tôi hoàn toàn quên mất việc +""gọi điện ToString()dưới mui xe.
Khóa Num

Một cách giải thích theo nghĩa đen hơn của "số nguyên không âm" cho thấy rằng một số nguyên đã ký sẽ được truyền vào, nhưng nó sẽ không bao giờ âm.
Shaz

Chà, tôi đoán là nó sẽ ổn thôi ...
Num Lock

Sử dụng C # 6 và bạn có thể sử dụng: bool f (int i) => (i + ""). Distinc (). SequenceEqual (i + ""); (53 byte)
Stephan Schinkel

5

Ruby (24 byte)

Sử dụng biểu thức chính quy để khớp "một số ký tự, theo sau là 0 hoặc nhiều ký tự, sau đó là cùng một ký tự".

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

Nếu giá trị trung thực hoặc giả được chấp nhận, thay vì theo nghĩa đen truehoặc false, thì chúng tôi nhận được 20 ký tự:

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

5

C (87)

Vì tôi không thể thắng, tôi sẽ đi cho hiệu quả.

Mã chức năng:

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

Ồ, và vì tôi vẫn không thể nhận xét về bài đăng của người khác - Tôi muốn nói rằng đây là một giải pháp gọn gàng, ngay cả khi không chính xác khi nó "tràn".
DreamWar Warrior

5

Toán học, 35 25 ký tự

(27 nếu hàm cần tên.)

Unequal@@IntegerDigits@#&

EDIT: Đã lưu 8 ký tự nhờ belisarius!


Unequal @@ IntegerDigits@# &tôi có thể làm được, tôi nghĩ vậy
Tiến sĩ belisarius

@ Belisarius ồ, tôi đang tìm kiếm thứ gì đó tương tự nhưng không thể tìm thấy nó (và không nghĩ rằng chuỗi sẽ so sánh các yếu tố không liền kề). Cảm ơn, điều đó rút ngắn điều này rất nhiều!
Martin Ender

Bạn không cần phải đặt tên cho nó, phải không? Unequal@@IntegerDigits@#&là 25 ký tự.
akater

@Akater đúng, tôi không thể thấy yêu cầu cho tên trong thử thách. Cảm ơn!
Martin Ender

5

R, 53 51 48 34 byte

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

Hãy thử trực tuyến!

Chuyển đổi thành một chuỗi và phân chia. Chuyển đổi thành bảng đếm trừ 1, tổng và phủ định

Lấy cảm hứng từ câu trả lời số phổ biến nhất của Alex và gợi ý của Hugh.

Một cặp đôi đã được lưu, nhờ @plannapus Thêm một lần nữa từ @Gregor Và một cặp đôi biến nó thành một chức năng ẩn danh

Bây giờ với lòng tốt regex tuyệt vời nhờ @ J.Doe. Cái này tìm kiếm bất kỳ char nào trong số khớp với chính nó trong chuỗi khác. Cácgrepl lệnh trả về một logic mà sau đó được trả về. Regex phong cách Perl được đặt thành True.


Bạn cũng có thể chuyển đổi thành chuỗi bằng cách sử dụng paste0thay vì toStringvà lưu 2 ký tự.
plannapus

Bạn có thể sử dụng pastethay vì paste0để lưu thêm một ký tự.
Gregor


@ J.Doe: thậm chí tốt hơn! :)
digEmAll

Sử dụng một cách tiếp cận khác nhau. 35 byte với regex.
J.Doe

4

J (9)

Giả sử giá trị được kiểm tra là biến b (tôi biết điều này có thể được tạo thành hàm, nhưng không có manh mối về cách . J khó hiểu. Bất kỳ trợ giúp nào về điều này đều được đánh giá cao) Cảm ơn Marinus!

(-:~.)@":

Kiểm tra xem chiều dài của đại diện chuỗi của số có tất cả các trùng lặp được loại bỏ có giống với chiều dài của đại diện chuỗi thông thường không.


Đối với một chức năng bạn có thể làm (-:~.)@":.
bến tàu

@marinus Oh wow, nó thậm chí còn ngắn hơn tôi nghĩ. Cảm ơn!
ɐɔıʇǝɥʇuʎs

HI, tôi đã tìm và đăng một giải pháp J ngắn hơn: -: ~. &. ":
Galen Ivanov

4

R ( 70 , 60 , 53 , 52)

Cảm ơn tất cả các ý kiến ​​hữu ích! Nhận xét của bạn được kết hợp trong câu trả lời.

### 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, bạn nói đúng. Tôi đã nhầm lẫn về "đại diện cơ sở 10".
djhurio

1
Sử dụng bảng và so sánh với 0 thay vì trùng lặp có thể lưu một số ký tự
Dason

1
Và tôi nghĩ rằng bạn có thể để lại tham số chia tách không tên. Tôi chỉ sử dụng điện thoại nên không thể kiểm tra dễ dàng nhưng tôi tin rằng đó là tham số thứ hai của strsplit để bạn có thể sử dụng các đối số được đặt tên thay vì đặt tên để lưu các ký tự
Dason

1
Và vì bạn đã lấy yếu tố đầu tiên của kết quả strsplittại sao không ép buộc x với một nhân vật bằng cách sử dụng c(x,"")? f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)ngắn hơn 1 ký tự :)
plannapus

3

Toán học (20 19)

(22 21 nếu hàm cần tên)

Max@DigitCount@#<2&

hoặc là

Max@DigitCount@#|1&

ở đâu | ist được nhập dưới dạng [Esc] chia [Esc]


Tốt đẹp. Tôi đã quên DigitCount tồn tại và viết một giải pháp dựa trên chuyển đổi thành chuỗi. Của bạn là tốt hơn nhiều.
Michael Stern


2

C99, 59 ký tự

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

C99 không có int ngầm, về mặt kỹ thuật.
PatrickB

1
Không chỉ "về mặt kỹ thuật", nó đã được gỡ bỏ một cách cụ thể và có chủ ý. Đây là lỗi cú pháp trong C99 và ngoài chẩn đoán bắt buộc, lỗi cú pháp nằm trong cùng loại với hành vi không xác định (không được phép rõ ràng trong câu hỏi): nếu việc triển khai chấp nhận điều này, tiêu chuẩn sẽ không yêu cầu gì về hành vi của chương trình.
hvd

2

Groovy (36 ký tự)

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

Đã kiểm tra nó bằng cách sử dụng:

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

'false' có thể được đánh gôn qua '1 == 0' hoặc có thể là thứ gì đó thông minh hơn. Câu trả lời hay
Michael Easter

@MichaelEaster 0>1ngắn hơn.
pastebin.com chém 0mr8spkT

1
@ace Có, mặc dù vậy! 1 hoạt động quá ...
Michael Easter

@ace, MichaelEaster, thx để được giúp đỡ :-)
Will Lp

@WillP theo đề xuất của MichaelEaster, !1thay vào đó hãy sử dụng .
pastebin.com chém 0mr8spkT

2

Haskell:

 import Data.List

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

Đến bữa tiệc muộn một chút, nhưng vì Data.Listdù sao bạn cũng đang nhập, tôi sẽ đề xuất nubloại bỏ trùng lặp khỏi Danh sách. (\x->nub x==x).show
Flonk

Bạn đã không sử dụng pl ...main = interact $ show . ap (==) nub . show
kazagistar

2

J (8)

Sepertae cạnh tranh từ câu trả lời trước của tôi.

*/@~:@":

2

R, 66 65 ký tự

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

Phân tách các chữ số bằng cách sử dụng phép chia số nguyên và modulo, sau đó kiểm tra xem chúng có trùng lặp không.

Sử dụng:

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

Hoặc, như @MickyT đề xuất, cho 63 ký tự:

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

1
Bạn có thể sử dụng anyDuplicatedthay vì sumduplicatedthêm 2 lần nữa
MickyT

2

C, 58 byte

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

Có thể giữ một kiểm đếm lên đến 7 chữ số giống nhau trước khi lăn qua.

trong chương trình thử nghiệm (dễ dàng hơn để xem cách nó hoạt động với hằng số trong bát phân)

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

Nếu bạn có công suất lớn bằng 2, thì hằng số có thể được tính như f&(1<<30)/7*6


Tôi nghĩ rằng nhận xét của @xfix là dành cho bài viết của tôi thay vì của bạn? Bạn đã không thực sự sử dụng int main(int)trong câu trả lời của mình ...
pastebin.com chém 0mr8spkT

Có thông tin bên ngoài không được tính vào số byte / char mã rõ ràng là không được phép. Tôi đề nghị bạn loại bỏ phiên bản đầu tiên (53 byte).
2501

Xin vui lòng xem nhận xét của tôi trong bản tóm tắt chỉnh sửa .
2501

Tôi đã bỏ phiếu để từ chối chỉnh sửa, nhưng tôi đồng ý rằng các số đếm có vẻ sai. Tôi làm cho họ 67 và 63 (61).
Peter Taylor

Chỉnh sửa của tôi đã bị từ chối bởi người dùng khác. Hãy đánh giá lại nó.
2501


1

Javascript 73 ký tự

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

1

Befunge 98, 17 byte

Đây là một câu trả lời không cạnh tranh vì Befunge không có chức năng.

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

In một 1nếu các chữ số của số là duy nhất; mặt khác, nó chỉ kết thúc

Điều này hoạt động bằng cách truy cập vào một ô trong không gian Funge có xtọa độ là giá trị ASCII của ký tự được nhập (lấy ký tự đầu vào theo ký tự) và ytọa độ của nó là 1. Nếu chữ số chưa được nhìn thấy trước đó, giá trị của ô là 32(ký tự khoảng trắng). Nếu đó là như vậy, tôi đặt giá trị thành 1.

Như một phần thưởng, điều này cũng làm việc cho những con số không.



1

Perl 6 (19 byte)

{.comb.uniq==.comb}

.combchia một chuỗi thành các ký tự (ví dụ, 42.combcho "4", "2"). .uniqloại bỏ tất cả các ký tự không phải là duy nhất. .combcác ký tự trong chuỗi (ban đầu tôi đã sử dụng .chars, nhưng .combngắn hơn). ==chuyển đổi danh sách thành số phần tử trong đó và so sánh các số. Khi .được sử dụng mà không có đối tượng trước $_đó , đó là tham số chức năng mặc định được giả sử. {}là các chức năng chữ.


1

C, 76

Đây không phải là nơi gần chiến thắng, nhưng dù sao tôi cũng sẽ đăng nó để thể hiện một cách tiếp cận khác.

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

In một dòng mới nếu sai, in không có gì nếu đúng.


Chương trình này có một hành vi không xác định. Các chữ ký chính xác cho chính là int main(int, char **)hoặc int main(void). int main(int)không hợp lệ
Konrad Borowski

@xfix Tôi giả sử main()là ok rồi?
pastebin.com chém 0mr8spkT

Vâng, nó ổn Nó có nghĩa tương tự như main(void)(khi được sử dụng trong định nghĩa, trong khai báo, nó khai báo một hàm với danh sách tham số không xác định).
Konrad Borowski

1

POSIX sh và egrep ( 47 , 43 , 40)

f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
  • [-1 char]: Sử dụng !thay vì -zvới test- Cảm ơn DigitalTrauma
  • [-1 char]: Sử dụng `CODE`thay vì$(CODE) - Cảm ơn DigitalTrauma
  • [-2 ký tự]: Sử dụng fold -1thay vì grep -o .1 - Cảm ơn DigitalTrauma.
  • [-3 chars]: Kiểm tra các chữ số lặp lại với biểu thức chính quy được phản hồi.

Nếu tuân thủ POSIX không quan trọng echo PARAM |có thể được thay thế bằng cách <<<PARAMgiảm độ dài chức năng xuống 37 :

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

Sử dụng:

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

1 Các fold -Nký hiệu bị phản đối trong một số phiên bản của fold.


f()(! [ `fold -1<<<$1|sort|uniq -d` ])giảm xuống 38 theo số đếm của tôi
Chấn thương kỹ thuật số

@DigitalTrauma: Thứ tốt cảm ơn vì đã chia sẻ. Tôi thấy rằng lệnh đã được thử nghiệm phải được trích dẫn, nếu không thì sẽ testvấp phải nó khi uniq -dtrả về nhiều hơn một dòng. Vì vậy, phiên bản không POSIX ngắn nhất là 40 ký tự. Tôi biết về [ !ký hiệu, nhưng tôi ngạc nhiên rằng nó ! [cũng hoạt động, bạn có biết tại sao không?
Thor

Ah tôi đã sử dụng bash. Vì vậy, tôi đoán nó dài hơn nếu bạn muốn tuân thủ POSIX.
Chấn thương kỹ thuật số

1

Java ( 131 59 57)

57 ký tự:

đã xóa ^ và $ như @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ đề xuất

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

59 ký tự (cũng hoạt động với số âm!):

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

79 78 ký tự (cảm ơn @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳):

Sử dụng vòng lặp để lưu một vài charachers và sử dụng int như một mảng boolean.

Sử dụng & thay vì && để lưu 1 ký tự (Hóa ra java cho phép).

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 ký tự (trả về true cho số âm):

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

với nhận xét:

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
}

Và câu trả lời là đúng về mặt kỹ thuật (số ký tự chỉ bao gồm hàm, không phải biến toàn cục), nhưng tôi nghĩ đó là gian lận, 29 ký tự:

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

m [] là mảng boolean chứa câu trả lời đúng cho tất cả các số nguyên 32 bit.


"^.*(.).*\\1.*$"Bạn có thể thả ^$. Chúng được ngụ ý bởimatches()
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Cách tiếp cận thứ 2 có thể được thực hiện bằng cách sử dụng 10 bit trong một int như là một mảng boolean, điều này sẽ loại bỏ sự cần thiết của bảng nguyên tố.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Tôi biết đã ba năm rồi, nhưng nếu bạn loại bỏ khoảng trống return!trong câu trả lời ngắn nhất, bạn có thể nhận được tới 56 byte.
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.