ตรวจสอบว่าตัวเลขทศนิยมทั้งหมดไม่ซ้ำกัน


37

คำถามที่ถูกลบใน Stack Overflowบางครั้งทำเพื่อวัสดุกอล์ฟที่ดี

เขียนฟังก์ชันที่รับจำนวนเต็มที่ไม่ใช่ค่าลบเป็นอินพุตและส่งกลับค่าจริงถ้าตัวเลขทั้งหมดในการแสดง 10 ฐานของหมายเลขนั้นไม่ซ้ำกัน ตัวอย่าง:

48778584 -> false
17308459 -> true

จำนวนตัวละครมีเพียงฟังก์ชั่น

หากคุณเลือกที่จะตอบใน C หรือ C ++: ไม่มีมาโครไม่มีพฤติกรรมที่ไม่ได้กำหนด ลักษณะการทำงานที่กำหนดไว้ในการใช้งานและคำเตือนของคอมไพเลอร์นั้นใช้ได้


ฉันยังคงสนใจในโซลูชัน C หรือ C ++ อื่น ๆ ตามคำถามที่สร้างแรงบันดาลใจ
โทมัส

1
เหตุใดจึงไม่มีมาโคร C หรือ C ++ หรือพฤติกรรมที่ไม่ได้กำหนด นั่นเป็นการ จำกัด เพียงสองภาษาเท่านั้น
dfeuer

คำตอบ:


31

Golfscript, 8 7 ตัวอักษร:

{`..&=}
  • ` - ระบุอาร์กิวเมนต์
  • .. - โคลนสองครั้ง
  • & - ตัดกับตัวเอง (ลบรายการที่ซ้ำกัน)
  • = - ตรวจสอบความเท่าเทียมกัน

ถ้าฟังก์ชั่นจะต้องมีชื่อ (109 ตัวอักษร ):

{`..&=}:a

ถ้าโปรแกรมพอเพียง (54 ตัวอักษร ):

..&=

5
ส่วนที่ยากเกี่ยวกับความท้าทายเช่นนี้คือการได้เห็นเป็นคนแรก
primo

1
@primo ยังไงก็ตามพวกเขายังคงได้คะแนน +6 ภายในครึ่งวัน
John Dvorak

1
กฎของ @JanDvorak Parkinson เรื่องไม่สำคัญในการทำงาน
Claudiu

2
@Claudiu คุณสามารถเข้าใจกฎหมาย ตระหนักว่าคุณถูกยัดเยียด แล้วโหวตคำตอบต่อไป
Cruncher

1
@Nathan คุณหมายถึงอะไร? เวลาสุดท้าย (และเท่านั้น) ที่ช่องโหว่ได้รับการแนะนำให้ลดลงเหลือ -3 ก่อนที่จะถูกลบโดยผู้แนะนำในเช้าวันรุ่งขึ้น ถ้าคุณไม่ชอบคำตอบ golfscript อย่าโหวตพวกเขา
John Dvorak

24

Python 2 (28) (32)

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

Backticks ใช้การแทนค่าสตริง การแปลงเป็นชุดจะลบข้อมูลที่ซ้ำกันออกและเราตรวจสอบว่าสิ่งนี้ลดความยาวลงหรือไม่โดยเปรียบเทียบกับ 10 ^ d ซึ่งมากกว่าตัวเลข d- หลักทั้งหมด แต่ไม่มี (d + 1) -digit ตัวเลข

รหัสเก่า:

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


1
ฮ่าฉันมีนี้แน่นอนคำตอบเดียวกันพร้อมเพียงแทนที่nด้วยi
Claudiu

1
@Claudiu ก็เช่นกัน I.f=lambda _:len(`_`)==len(set(`_`))
Oberon

ใช่ด้วยความท้าทายขนาดกัดเหล่านี้ทุกคนจะมาบรรจบกันในสิ่งเดียวกัน ฉันก็พยายามlambda n:max(map('n'.count,'n'))<2(คำพูดเดียวคือ backticks) แต่มันก็สองตัวอักษรอีกต่อไป
xnor

16

APL (6)

≡∘∪⍨∘⍕

หนึ่งในสองสามครั้งที่สไตล์ APL ก็สั้นลงเช่นกัน

มี 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
ฉันคิดว่า jot ที่สองสามารถลบออกได้เพื่อให้มัน 5 มันจะยังคงเป็นฟังก์ชั่นที่ถูกต้องด้วยตัวเอง (แม้ว่ามันจะต้องมีการจัดกลุ่ม parens เพื่อใช้กับผู้ให้บริการแต่ละราย
user46915

11

Perl, 19 ตัวอักษร

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

สมมติว่าเอาต์พุตสามารถถือว่าเป็นจริงและไม่สามารถถือว่าเอาต์พุตเป็นเท็จได้ตรรกะของคุณจะกลับด้าน คุณควรกลับคืนจริงถ้าไม่มีการพูดซ้ำ
John Dvorak

@JanDvorak ฟังดูถูกแล้ว ฉันจะแก้ไขมัน
Tal

<>!~/(\d).*\1/ผู้ประกอบการไม่ได้การแข่งขัน:
primo

@primo ขอบคุณ! มากที่จะเรียนรู้ :)
Tal

3
อินพุตถูกระบุว่าเป็นจำนวนเต็มที่ไม่เป็นลบดังนั้นฉันไม่คิดว่าคุณจะต้องตรวจสอบ หากคุณแน่นอนไม่ได้คุณสามารถเปลี่ยนไป\d .
hvd

9

Rebmμ (10 ตัวอักษร)

e? AtsAuqA

เคล็ดลับ "mushing" ของ Rebmu คือมันไม่ตรงตามตัวพิมพ์ใหญ่ - เล็กดังนั้นตัวละครจึงทำงานร่วมกัน เมื่อใดก็ตามที่มีการเข้าสู่ช่วงการเปลี่ยนภาพจะเป็นการแบ่งโทเค็นถัดไป ด้วยการใช้ช่วงการเปลี่ยนภาพแทนที่จะเป็นประเภทของ CamelCase ทางเลือกที่ไม่ซ้ำใครในการเริ่มต้นด้วยตัวพิมพ์ใหญ่หมายถึง "set-word" (ในขณะที่ชุดคำสามารถใช้เพื่อวัตถุประสงค์อื่น ๆ ในการเขียนโปรแกรมเชิงสัญลักษณ์พวกเขาจะได้รับการประเมินเป็นค่าเริ่มต้น)

ดังนั้นนี่คือ "unmushes" ถึง:

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)

ดังนั้นโอเปอเรเตอร์ความเสมอภาคของคำนำหน้าจึงถูกนำไปใช้กับสองอาร์กิวเมนต์ - ผลลัพธ์แรกของการกำหนดให้aกับเวอร์ชันสตริงของตัวเองและผลลัพธ์ที่สองของ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|ซึ่งจะใช้เวลาโดยปริยายพารามิเตอร์การตั้งชื่อด้วย (ฟังก์ชั่น B จะถูกสร้างขึ้นด้วยb|และใช้พารามิเตอร์ชื่อ A แล้วหนึ่งชื่อ B) นั่นจะเพิ่มตัวละครอีกห้าตัว ... สมมุติว่าคุณเรียกฟังก์ชัน "f"

Fa|[e? AtsAugA]

"คุณหัวเราะ! พวกเขาหัวเราะเยาะไอน์สไตน์! หรือรอ ... พวกเขาเหรอ? ฉัน ... ไม่รู้"


ผมเคยคิดว่าภาษาที่ได้รับการออกเสียงเหมือนReb mooกัน แต่ตอนนี้ผมไม่แน่ใจว่ามันควรจะเป็นRebum mewหรือReb mewหรือสิ่งอื่นใด
Justin

2
หลังจากเล่น Nethack ฉันอ่านFa|[e? AtsAugA]เป็นFalse? SomeGibberish
Justin

@Quincunx sสลายตัวไป[ใน Nethack จริงๆเหรอ?
John Dvorak

@JanDvorak ฉันเห็นจดหมายบางฉบับพังทลายลงใน [หลังจากเวลา
จัสติน

@Quincunx เพียงแค่เล่นกับโลโก้ ฉันคิดว่าREBmuน่าจะดีกว่า ไม่ว่าจะด้วยวิธีใดหนวดเคราแน่น คิดว่าคุณได้สิ่งที่คุณจ่ายไป
ดร. Rebmu

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

ใช้การหารเพื่อนับจำนวนการเกิดของแต่ละหลัก โทรโดยใส่ n ใน register 2 และตั้ง register 5 เป็น 1 ให้ output ใน register 3 (0 ถ้า false, 1 ถ้าเป็นจริง) ตรวจสอบให้แน่ใจว่าส่วนที่เหลือของโปรแกรมของคุณใช้การลงทะเบียน> 71


แก้ไข 25/12/14: เป็นเวลา 7 เดือนและเราได้รับสแต็กสแต็คมาแล้วดังนั้นนี่คือหนึ่งในการทดสอบโค้ด (โดยใช้ล่ามที่ดีขึ้นของฉันที่นี่ )

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^1จริง1 = 3^0ถ้าเป็นเท็จ ใช้เวลาสักพักสำหรับตัวเลขที่มากขึ้น (นี่คือ 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

การตีความตามตัวอักษรของ "จำนวนเต็มที่ไม่ใช่ค่าลบ" ที่แท้จริงแสดงให้เห็นว่าจำนวนเต็มที่ลงนามแล้วจะถูกส่งเข้ามา แต่จะไม่เป็นลบ
Shaz

ฉันเดาว่ามันจะโอเคแล้ว ...
Num Lock

ใช้ C # 6 และคุณสามารถใช้: bool f (int i) => (i + "") Distinct (). SequenceEqual (i + ""); (53 ไบต์)
Stephan Schinkel

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

โอ้และเนื่องจากฉันยังไม่สามารถแสดงความคิดเห็นในโพสต์ของคนอื่น - ฉันอยากจะบอกว่านี่เป็นทางออกที่เรียบร้อยแม้ว่าจะไม่ถูกต้องเมื่อมัน "ล้น"
DreamWarrior

5

Mathematica, 35 25 ตัวอักษร

(27 ถ้าฟังก์ชันต้องการชื่อ)

Unequal@@IntegerDigits@#&

แก้ไข:บันทึก 8 ตัวอักษรขอบคุณ belisarius!


Unequal @@ IntegerDigits@# &ทำได้ฉันคิดว่า
ดร. เบลิซาเรียส

@ Belisarius โอ้ดีฉันกำลังมองหาอะไรแบบนั้น แต่หาไม่เจอ (และไม่คิดว่าจะถูกล่ามโซ่จะเปรียบเทียบองค์ประกอบที่ไม่อยู่ติดกัน) ขอบคุณที่ทำให้สิ่งนี้สั้นลงมาก!
Martin Ender

คุณไม่จำเป็นต้องตั้งชื่อใช่มั้ย Unequal@@IntegerDigits@#&คือ 25 ตัวอักษร
akater

@Akater จริงฉันไม่เห็นความต้องการชื่อในการท้าทาย ขอบคุณ!
Martin Ender

5

R, 53 51 48 34 Bytes

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

ลองออนไลน์!

แปลงเป็นสตริงและแยก แปลงเป็นตารางจำนวนลบด้วย 1, ผลรวมและลบล้าง

แรงบันดาลใจจากคำตอบทั่วไปของ Alex และคำแนะนำโดย Hugh

คู่รักบันทึกไว้ขอบคุณ @plannapus อีกหนึ่งคนจาก @Gregor และอีกสองคนทำให้มันเป็นฟังก์ชั่นนิรนาม

ตอนนี้ด้วยความดีของ regex ที่ยอดเยี่ยมต้องขอบคุณ @J.Doe สิ่งนี้จะมองหาอักขระตัวเดียวในจำนวนที่ตรงกับตัวมันเองซึ่งอยู่ในสายอักขระ greplคำสั่งส่งคืนตรรกะที่ถูกส่งกลับแล้ว Perl สไตล์ regexes ถูกตั้งค่าเป็น True


นอกจากนี้คุณยังสามารถแปลงเป็นสตริงโดยใช้paste0แทนtoStringและบันทึกได้ 2 ตัวอักษร
plannapus

คุณสามารถใช้pasteแทนpaste0การบันทึกอักขระได้อีกหนึ่งตัว
Gregor


@ J.Doe: ดียิ่งขึ้น! :)
digEmAll

ใช้วิธีการอื่น 35 ไบต์พร้อม regex
J.Doe

4

J (9)

สมมติว่าค่าที่จะทดสอบนั้นเป็นตัวแปรb (ฉันรู้ว่านี่สามารถทำให้เป็นฟังก์ชันได้ แต่ไม่มีเงื่อนงำว่า J จะสับสนได้อย่างไรความช่วยเหลือในเรื่องนี้ได้รับการชื่นชม) Marinus!

(-:~.)@":

ตรวจสอบว่าความยาวของตัวแทนสตริงของจำนวนที่มีการลบรายการที่ซ้ำกันทั้งหมดจะเหมือนกับความยาวของตัวแทนสตริงปกติ


(-:~.)@":สำหรับฟังก์ชั่นที่คุณสามารถทำได้
marinus

@marinus โอ้ว้าวมันสั้นกว่าที่ฉันคิดเอาซะอีก ขอบคุณ!
Mayıʇǝɥʇuʎs

สวัสดีฉันพบและโพสต์คำตอบสั้น ๆ ของ J: -: ~. &. ":
Galen Ivanov

4

R ( 70 , 60 , 53 , 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
และฉันคิดว่าคุณสามารถปล่อยพารามิเตอร์การแยกไว้โดยไม่มีชื่อ ฉันแค่อยู่ในโทรศัพท์ของฉันดังนั้นจึงไม่สามารถตรวจสอบได้อย่างง่ายดาย แต่ฉันเชื่อว่ามันเป็นพารามิเตอร์ที่สองของ strsplit ดังนั้นคุณสามารถใช้ตำแหน่งแทนอาร์กิวเมนต์ที่มีชื่อเพื่อบันทึกอักขระ
Dason

1
และเนื่องจากคุณได้รับองค์ประกอบแรกของผลลัพธ์ที่strsplitว่าทำไมไม่บังคับให้ x เป็นตัวละครที่ใช้c(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&

ที่ไหน | ist ถูกป้อนเป็น [Esc] หาร [Esc]


ดี ฉันลืม DigitCount มีอยู่และเขียนวิธีแก้ปัญหาตามการแปลงเป็นสตริง ของคุณดีกว่ามาก
Michael Stern


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

Groovy (36 ตัวอักษร)

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

ทดสอบโดยใช้:

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

'false' สามารถเล่นกอล์ฟผ่าน '1 == 0' หรืออาจเป็นสิ่งที่ฉลาดกว่า คำตอบที่ดี
Michael Easter

@MichaelEaster 0>1สั้นกว่า
ace_HongKongIndependence

1
@ace ใช่! 1 ทำงานด้วย ...
Michael Easter

@ace, MichaelEaster, ขอบคุณสำหรับความช่วยเหลือ :-)
Will Lp

@WillP ตามที่ MichaelEaster แนะนำให้ใช้!1แทน
ace_HongKongIndependence

2

Haskell:

 import Data.List

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

สายไปงานเลี้ยงเล็ก ๆ น้อย ๆ แต่เนื่องจากคุณกำลังนำเข้าData.Listต่อไปฉันจะแนะนำnubซึ่งจะเป็นการลบรายการที่ซ้ำออกจากรายการ (\x->nub x==x).show
Flonk

คุณไม่ได้ใช้ pl ...main = interact $ show . ap (==) nub . show
kazagistar


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และduplicatedอีก 2
MickyT

2

C, 58 ไบต์

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

สามารถเก็บตัวเลขที่เหมือนกันได้มากถึง 7 หลักก่อนที่จะพลิก

ในโปรแกรมทดสอบ (ง่ายกว่าที่จะเห็นว่ามันทำงานอย่างไรกับค่าคงที่เป็นฐานแปด)

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)ในคำตอบของคุณ ...
ace_HongKongIndependence

ไม่อนุญาตให้มีข้อมูลภายนอกที่ไม่นับจำนวนไบต์ / อักขระถ่าน ฉันขอแนะนำให้คุณลบเวอร์ชันแรก (53 ไบต์)
2501

โปรดดูความคิดเห็นของฉันในการสรุปการแก้ไข
2501

ฉันโหวตให้ปฏิเสธการแก้ไข แต่ฉันยอมรับว่าจำนวนดูผิด ฉันทำให้พวกเขา 67 และ 63 (61)
Peter Taylor

การแก้ไขของฉันถูกปฏิเสธโดยผู้ใช้รายอื่น โปรดประเมินอีกครั้ง
2501



1

Befunge 98, 17 ไบต์

นี่เป็นคำตอบที่ไม่แข่งขันเนื่องจาก Befunge ไม่มีฟังก์ชั่น

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

พิมพ์ a 1หากตัวเลขของตัวเลขทั้งหมดไม่ซ้ำกัน มิฉะนั้นจะสิ้นสุดเพียง

งานนี้โดยการเข้าถึงเซลล์ในพื้นที่ Funge ที่มีxการประสานงานเป็นค่า ASCII ของตัวละครป้อน (ใช้เวลาตัวท่านด้วยอักขระ) และผู้ประสานงานy 1หากไม่เคยเห็นตัวเลขมาก่อนค่าของเซลล์คือ32(อักขระเว้นวรรค) หากเป็นเช่นนั้นฉันจะตั้งค่าเป็น 1

เป็นโบนัสสิ่งนี้ใช้ได้กับหมายเลขที่ไม่ใช่เช่นกัน



1

Perl 6 (19 ไบต์)

{.comb.uniq==.comb}

.combแยกสตริงออกเป็นอักขระ (ตัวอย่างเช่น42.combให้"4", "2") .uniqลบอักขระที่ไม่ซ้ำกันทั้งหมดออก .combอักขระเป็นสตริง (แต่เดิมฉันใช้.charsแต่.combสั้นกว่า) ==แปลงรายการเป็นจำนวนองค์ประกอบในนั้นและเปรียบเทียบตัวเลข เมื่อ.มีการใช้งานโดยไม่ต้องวัตถุมาก่อน$_ซึ่งเป็นพารามิเตอร์ฟังก์ชั่นเริ่มต้นจะถือว่า {}ฟังก์ชั่นเป็นตัวอักษร


1

C, 76

นี่ไม่ใช่ที่ใกล้ที่จะชนะ แต่ฉันจะโพสต์ไว้เพื่อแสดงวิธีการอื่น

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

พิมพ์บรรทัดใหม่ถ้าเท็จพิมพ์อะไรถ้าเป็นจริง


โปรแกรมนี้มีพฤติกรรมที่ไม่ได้กำหนด ลายเซ็นที่ถูกต้องสำหรับหลักหรือint main(int, char **) ไม่ถูกต้อง int main(void)int main(int)
Konrad Borowski

@ xfix ฉันถือว่าmain()โอเคไหม?
ace_HongKongIndependence

ใช่มันไม่เป็นไร มันหมายถึงสิ่งเดียวกันกับmain(void)(เมื่อใช้ในการกำหนดในการประกาศมันประกาศฟังก์ชั่นที่มีรายการพารามิเตอร์ที่ไม่รู้จัก)
Konrad Borowski

1

POSIX sh และ egrep ( 47 , 43 , 40)

f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
  • [-1 อักขระ]:ใช้!แทน-zด้วยtest- ขอบคุณ DigitalTrauma
  • [-1 อักขระ]:ใช้`CODE`แทน$(CODE)- ขอบคุณ DigitalTrauma
  • [-2 ตัวอักษร]:ใช้fold -1แทนgrep -o .1 - ขอบคุณ DigitalTrauma
  • [-3 ตัวอักษร]:ตรวจสอบตัวเลขซ้ำด้วยนิพจน์ทั่วไปที่อ้างอิงกลับ

หากไม่echo PARAM |สามารถแทนที่ความสอดคล้อง POSIX ได้<<<PARAMให้ลดความยาวของฟังก์ชันเป็น37 :

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

การใช้งาน:

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

1 สัญกรณ์จะเลิกในบางรุ่นfold -Nfold


f()(! [ `fold -1<<<$1|sort|uniq -d` ])ลงไปที่ 38 โดยการนับของฉัน
บาดเจ็บดิจิตอล

@DigitalTrauma: สิ่งที่ดีขอบคุณสำหรับการแบ่งปัน ฉันพบว่าคำสั่งทดสอบจะต้องยกมามิฉะนั้นtestcroaks มันเมื่อuniq -dส่งกลับมากกว่าหนึ่งบรรทัด ดังนั้นเวอร์ชันที่ไม่ใช่ POSIX ที่สั้นที่สุดคือ 40 ตัวอักษร ฉันรู้เกี่ยวกับ[ !สัญกรณ์ แต่ฉันประหลาดใจที่ใช้! [งานได้คุณรู้หรือไม่ว่าทำไมถึงเป็นเช่นนั้น
ธ อร์

อาฉันใช้ทุบตี ดังนั้นฉันเดาว่ามันจะนานกว่านี้ถ้าคุณต้องการความสอดคล้อง POSIX
Digital Trauma

1

Java ( 131 59 57)

57 ตัวอักษร:

ลบ ^ และ $ ตามที่แนะนำ @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

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

59 ตัวอักษร (ใช้ได้กับตัวเลขติดลบ!):

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

79 78 ตัวอักษร (ขอบคุณ @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳):

ใช้สำหรับลูปเพื่อบันทึกตัวอักษรสองสามตัวและใช้ int เป็นอาร์เรย์บูลีน

ใช้ & แทน && เพื่อบันทึก 1 ตัวอักษร (ปรากฎว่า java อนุญาตให้ใช้)

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 ตัวอักษร (คืนค่าจริงสำหรับจำนวนลบ):

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

ด้วยความคิดเห็น:

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
}

และคำตอบที่ถูกต้องทางเทคนิค (จำนวนตัวอักษรมีเพียงฟังก์ชั่นไม่ใช่ตัวแปรทั่วโลก) แต่ฉันคิดว่ามันโกง 29 ตัวอักษร:

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

m [] เป็นอาร์เรย์บูลีนที่มีคำตอบที่ถูกต้องสำหรับจำนวนเต็ม 32 บิตทั้งหมด


"^.*(.).*\\1.*$"คุณสามารถวางและ^ $พวกเขามีความหมายโดยmatches()
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

วิธีที่สองสามารถทำได้โดยใช้ 10 บิตใน int เป็นอาร์เรย์บูลีนซึ่งจะช่วยลดความต้องการตารางสำคัญ
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

ฉันรู้ว่ามันผ่านมาสามปีแล้ว แต่ถ้าคุณลบช่องว่างระหว่างreturn!คำตอบที่สั้นที่สุดคุณจะได้ 56 ไบต์
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.