모든 십진수가 고유한지 확인


37

스택 오버플로에서 삭제 된 질문은 때때로 훌륭한 골프 자료를 만듭니다.

음수가 아닌 정수를 입력으로 사용하는 함수를 작성하고 해당 숫자의 밑이 10 인 표현의 모든 숫자가 고유 한 경우 true를 리턴합니다. 예:

48778584 -> false
17308459 -> true

문자 수에는 기능 만 포함됩니다.

C 또는 C ++에서 응답하기로 선택한 경우 : 매크로 없음, 정의되지 않은 동작 없음; 구현 정의 동작 및 컴파일러 경고는 좋습니다.


나는 이것에 영감을 얻은 질문에 따라 다른 C 또는 C ++ 솔루션에 여전히 관심이 있습니다.
토마스

1
C 또는 C ++ 매크로 나 정의되지 않은 동작이없는 이유는 무엇입니까? 이상하게도 두 언어로 제한됩니다.
dfeuer

답변:


31

골프 공, 8 7 자 :

{`..&=}
  • ` -인수를 문자열 화
  • .. -두 번 복제
  • & -자체와 교차 (중복 제거)
  • = -평등을 확인하십시오.

함수의 이름을 지정해야하는 경우 (109 자 ) :

{`..&=}:a

프로그램이 충분하면 (54 자 ) :

..&=

5
이와 같은 도전에 대한 어려운 부분은 그것을 처음 보는 것입니다.
primo

1
@primo 아직, 어떻게 든 그들은 반나절 내에 여전히 +6 점수를 얻습니다.
John Dvorak

1
@JanDvorak 파킨슨의 직장에서의 사소한 법
Claudiu

2
@Claudiu 법을 이해할 수 있습니다. 당신이 그것을 받고 있음을 깨닫습니다. 그런 다음 어쨌든 대답을 찬성하십시오.
Cruncher

1
@NathanChere 무슨 뜻인가요? 허점이 제안 된 마지막 (그리고 유일한) 시간 은 다음날 아침 제안자가 삭제하기 전에 -3으로 떨어졌습니다. 골프 스크립트 답변이 마음에 들지 않으면 찬성하지 마십시오.
John Dvorak

24

파이썬 2 (28) (32)

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

백틱은 문자열 표현을 사용합니다. 집합으로 변환하면 중복이 제거되고 모든 d 자리 숫자보다 크지 만 (d + 1) 숫자는없는 10 ^ d와 비교하여 길이가 감소하는지 확인합니다.

오래된 코드 :

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


1
하 나는이 있었다 정확한 단지 대체, 같은 대답은 준비 n와 함께i
Claudiu

1
@Claudiu 나도 그렇게 했어.f=lambda _:len(`_`)==len(set(`_`))
Oberon

네, 이런 입맛의 도전으로, 모두가 거의 같은 일에 수렴 할 것입니다. 나는 또한 노력하고 lambda n:max(map('n'.count,'n'))<2있었지만 (작은 따옴표는 백틱입니다), 두 글자가 더 깁니다.
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로 만들 수 있다고 생각합니다. 그것은 여전히 ​​유효한 기능 일 것입니다 (마지막 예제에서 각 연산자와 함께 사용하려면 paren을 그룹화해야합니다).
user46915

11

펄, 19 자

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

출력이 true로 처리되고 출력이 false로 처리 될 수 있다고 가정하면 논리가 반전됩니다. 반복이 없으면 true를 반환해야합니다.
John Dvorak

@JanDvorak 맞습니다. 내가 고칠 게
Tal

불일치 연산자 : <>!~/(\d).*\1/.
primo

@primo 감사합니다! 배울 점이 많다 :)
Tal

3
입력은 음이 아닌 정수로 지정되었으므로이를 확인할 필요가 없다고 생각합니다. 당신이 실제로하지 않으면, 당신은 변경할 수 있습니다 \d..
hvd

9

Rebmμ (10 자)

e? AtsAuqA

Rebmu의 "mushing"트릭은 대소 문자를 구분하지 않으므로 문자가 함께 실행됩니다. 사례 전환 이 이루어질 때마다 다음 토큰으로 분할됩니다. CamelCase 종류 대신 전환을 사용함으로써 자본 실행으로 시작하는 고유 한 선택은 "세트 워드"가 만들어진다는 것을 의미합니다. (세트 어는 기호 프로그래밍에서 다른 목적으로 사용될 수 있지만 기본적으로 할당으로 평가됩니다).

따라서이 "무시"는 다음과 같습니다.

e? a: ts a uq a

일련의 대체 사례를 시작한 후에는 새 실행을 시작하지 않으면 첫 번째 이후에 해당 단어를 설정하기 위해 해당 트릭을 사용할 수 없기 때문에 공간이 필요합니다. 그러니 e?AtsAuqA당신 e? a ts a uq a에게 임무를받지 못했습니다.

(참고 : 특별히 좋은 이유가 아닌 이유는 문자 수가 같으면 공백이 없도록 해결책을 다시 생각하는 경향이 있습니다. 대괄호, 괄호 및 문자열은 암시 적으로 기호를 끝내기 때문에 종종 공정합니다. 이에 대한 기회의 수.)

어쨌든 Rebol에 매핑되면 다음과 같이 약어로 표시됩니다.

equal? a: to-string a unique a

평가 순서의 요지를 얻는 데 도움이되는 괄호를 넣으십시오.

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

접두사 항등 연산자는 두 개의 인수에 적용됩니다. 첫 번째 인수 a는 문자열 버전 자체 에 할당 한 결과이고 두 번째 인수 unique는 해당 문자열에 대해 실행 된 결과입니다 . 이렇게하면 unique가 전달한 순서대로 요소를 반환하게됩니다. 예를 들어 "31214"의 고유 한 값은 "3124"입니다.

다음과 같이 실행하십시오.

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

통계 및 디버그 정보도 있습니다.

>> rebmu/args/stats/debug "e? AtsAuqA" 48778584 
Original Rebmu string was: 10 characters.
Rebmu as mushed Rebol block molds to: 10 characters.
Unmushed Rebmu molds to: 15 characters.
Executing: [e? a: ts a uq a]
== false

명명 된 / 재사용 가능한 함수를 정의해야하는 요구 사항이있는 경우 암시 적으로 with라는 매개 변수를 사용하는 "A- 함수"를 작성할 수 있습니다 a|. (B 함수는 b|A라는 매개 변수를 사용하여 만든 다음 B라는 매개 변수를 사용합니다). 문자 5 개를 더 추가하면 "f"함수를 호출한다고합시다.

Fa|[e? AtsAugA]

"당신은 웃고 있습니다! 그들은 아인슈타인을 비웃었습니다! 아니면 기다렸습니다 ... 봤습니까? 나는 ... 모릅니다."


나는 언어가 같은 발음이라고 생각하는 데 사용 Reb moo하지만,해야하는데 경우 지금은 확실하지 않다 Rebum mew거나 Reb mew또는 뭔가.
저스틴

2
Nethack을 한 후, 나는 다음 Fa|[e? AtsAugA]과 같이 읽었습니다False? SomeGibberish
Justin

@Quincunx는 Nethack에서 s실제로 부패 [합니까?
John Dvorak

@ JanDvorak 나는 어떤 편지들이 [시간이 지나면 부패하는 것을 보았습니다]
Justin

@Quincunx 로고 만 가지고 노는 것. REBmu아마 더 나은 것 같아요 . 어느 쪽이든, 턱수염은 팽팽합니다. 당신이 지불하는 것을 얻을 것 같아요.
Dr. 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을 레지스터 2에 넣고 레지스터 5를 1로 설정하여 호출하면 레지스터 3에 출력이 제공됩니다 (거짓이면 0, 참이면 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^11 = 3^0이면 거짓 이어야합니다 . 많은 수의 시간이 걸립니다 (물론,이 입니다 ... FRACTRAN).


6

자바 스크립트-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

감사합니다! 내 답변을 수정했습니다. 나는 내 마음에 이와 같은 것을 가지고 있었지만, 오 ... ... 나는 후드 아래에서 +""전화하는 것을 완전히 잊었다 ToString().
Num Lock 10

"음이 아닌 정수"를보다 문자 그대로 해석하면 부호있는 정수가 전달되지만 음수가되지는 않습니다.
Shaz

글쎄, 그때 괜찮을 것 같아요 ...
Num Lock

C # 6을 사용하면 다음을 사용할 수 있습니다. bool f (int i) => (i + ""). Distinct (). SequenceEqual (i + ""); (53 bytes)
Stephan Schinkel

5

루비 (24 바이트)

정규식을 사용하여 "일부 문자 다음에 0 개 이상의 문자, 그 다음에 동일한 문자"를 찾습니다.

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

truthy 또는 falsy 값은 문자 그대로가 아닌, 인정하는 경우 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@#&

편집 : belisarius 덕분에 8 문자를 절약했습니다!


Unequal @@ IntegerDigits@# &내 생각에
belisarius 박사

@ belisarius oh nice, 나는 그런 것을 찾고 있었지만 찾을 수 없었습니다 (그리고 체인 이 인접하지 않은 요소를 비교할 것이라고 생각하지 않았습니다 ). 고마워요.
마틴 엔더

이름을 지어주지 않아도됩니까? Unequal@@IntegerDigits@#&25 자입니다.
akater

@Akater 사실, 도전에서 이름에 대한 요구 사항을 볼 수 없습니다. 감사!
Martin Ender

5

R, 53 51 48 34 바이트

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

온라인으로 사용해보십시오!

문자열로 변환하고 분리하십시오. 카운트 마이너스 1을 빼고 합산하여 표로 변환

Alex의 가장 일반적인 숫자 답변과 Hugh의 제안에서 영감을 얻었습니다 .

@plannapus 덕분에 한 쌍이 저장되었습니다. @Gregor에서 한 번 더 그리고 익명의 기능으로 만들어 두었습니다.

이제 @ J.Doe 덕분에 훌륭한 정규식이 있습니다. 문자열의 다른 위치와 일치하는 숫자의 단일 문자를 찾습니다. 이 grepl명령은 논리를 반환 한 다음 반환됩니다. Perl 스타일 정규 표현식이 True로 설정되어 있습니다.


paste0대신 toString2자를 사용하여 문자열로 변환 하고 저장할 수도 있습니다 .
plannapus

하나 이상의 문자를 저장 하는 paste대신 사용할 수 있습니다 paste0.
Gregor


@ J.Doe : 더 낫다! :)
digEmAll

다른 접근법을 사용했습니다. 정규 표현식으로 35 바이트 .
J.Doe

4

J (9)

테스트 할 값이 가변적이라고 가정합니다 b (이것은 함수로 만들 수는 있지만 .J가 어떻게 혼동 되는지대한 실마리는 없습니다 . 감사합니다. Marinus!

(-:~.)@":

모든 중복이 제거 된 숫자의 문자열 담당자의 길이가 일반 문자열 담당자의 길이와 같은지 확인합니다.


기능을 위해 당신은 할 수 있습니다 (-:~.)@":.
marinus

@marinus 오 와우, 생각보다 짧아. 감사!
ɐɔıʇǝɥʇ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, 당신이 맞아요. "base 10 representation"에 대해 혼란스러워했습니다.
djhurio

1
중복을 사용하지 않고 테이블을 사용하고 0을 비교하면 일부 문자가 저장 될 수 있습니다.
Dason

1
그리고 split 매개 변수의 이름을 그대로 둘 수 있다고 생각합니다. 난 그냥 내 휴대 전화에있어 쉽게 확인할 수 없지만 그것이 strsplit의 두 번째 매개 변수라고 생각하여 문자를 저장하기 위해 명명 된 인수 대신 위치를 사용할 수 있습니다
Dason

1
그리고 이미 ?를 strsplit사용하여 x를 문자로 강제 변환하지 않는 결과의 첫 번째 요소를 취 했으므로 c(x,"")? f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)is 1 character
short

3

매스 매 티카 (20 19)

(22 함수에 이름이 필요한 경우 21)

Max@DigitCount@#<2&

또는

Max@DigitCount@#|1&

어디 | [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

그루비 (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 10

1
@ace 예,! 1도 작동합니다 ...
Michael Easter

@ace, MichaelEaster, 도움을위한 thx :-)
Will Lp

MichaelEaster가 제안한 @WillP를 !1대신 사용하십시오.
ace_HongKongIndependence 12

2

하스켈 :

 import Data.List

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

파티에 조금 늦었지만 Data.List어쨌든 가져 오기 때문에을 제안 nub하여 List에서 중복을 제거합니다. (\x->nub x==x).show
Flonk

당신은 pl을 사용하지 main = interact $ show . ap (==) nub . show
않았습니다


2

R, 66 65 자

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

정수 나누기와 모듈러스를 사용하여 숫자를 분리 한 다음 중복되는지 확인하십시오.

용법:

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

또는 @MickyT가 제안한 것처럼 63 자 :

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

1
당신은 사용할 수 있습니다 anyDuplicated보다는 sumduplicated2 이상
MickyT

2

C, 58 바이트

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

롤오버하기 전에 동일한 숫자의 집계를 최대 7 자리까지 유지할 ​​수 있습니다.

테스트 프로그램에서 (8 진수 상수로 어떻게 작동하는지 쉽게 알 수 있습니다)

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

main(){
scanf("%d",&r);
printf("%o\n",a(r));}

2의 거듭 제곱을 가지면 상수를 다음과 같이 계산할 수 있습니다. f&(1<<30)/7*6


@xfix의 의견은 귀하 대신 내 게시물을위한 것이라고 생각합니까? 당신은 실제로 사용하지 않았다 int main(int)... 당신의 대답에
ace_HongKongIndependence

코드 바이트 / 문자 수에 포함되지 않는 외부 정보를 갖는 것은 분명히 허용되지 않습니다. 첫 번째 버전 (53 바이트)을 제거하는 것이 좋습니다.
2501

편집 요약 에서 내 의견을 참조하십시오 .
2501

나는 편집을 거부하기로 결정했지만, 카운트가 잘못 보이는 것에 동의합니다. 나는 그들을 67과 63 (61)로 만듭니다.
피터 테일러

다른 사용자가 내 편집을 거부했습니다. 다시 평가하십시오.
2501


1

자바 스크립트 73 자

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

1

Befunge 98, 17 바이트

Befunge에는 기능이 없기 때문에 경쟁이 아닌 답변입니다.

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

1숫자의 숫자가 모두 고유 한 경우 a를 인쇄합니다 . 그렇지 않으면 그냥 끝납니다.

그 Funge 공간에서 셀을 액세스하여 작업이 x좌표 입력 된 문자의 ASCII 값이된다 (문자 입력 문자 소요)와 그 y좌표이다 1. 이전에 숫자가 표시되지 않은 경우 셀 값은 32(공백 문자)입니다. 그렇다면 값을 1로 설정하십시오.

보너스로, 이것은 숫자가 아닌 경우에도 작동합니다.



1

펄 6 (19 바이트)

{.comb.uniq==.comb}

.comb문자열을 문자로 분할합니다 (예 : 42.combgives "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("");}

false이면 새 줄을 인쇄하고 true이면 아무 것도 인쇄하지 않습니다.


이 프로그램에는 정의되지 않은 동작이 있습니다. main의 올바른 서명은 int main(int, char **)또는 int main(void)입니다. int main(int)유효하지 않습니다.
Konrad Borowski

@xfix 내가 괜찮다고 가정 main()합니까?
ace_HongKongIndependence

예, 괜찮습니다. main(void)(정의에서 사용될 때 선언에서 알 수없는 매개 변수 목록으로 함수를 선언 합니다)와 같은 것을 의미합니다 .
Konrad Borowski

1

POSIX sh and egrep ( 47 , 43 , 40)

f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
  • [-1 문자] : 사용 !대신 -ztest- 감사 DigitalTrauma
  • [-1 문자] :`CODE` 대신 사용 $(CODE)-Thanks DigitalTrauma
  • [-2 자] : 1fold -1 대신 사용 -Thanks DigitalTrauma.grep -o .
  • [-3 자] : 역 참조 정규식으로 반복 숫자를 확인합니다.

POSIX 준수가 중요하지 않은 경우 echo PARAM |로 대체 <<<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 : 공유해 주셔서 감사합니다. 테스트 된 명령을 인용해야한다는 것을 test알았습니다. 그렇지 않으면 두 uniq -d줄 이상을 반환 할 때 삐걱 거리지 않습니다 . POSIX 이외의 가장 짧은 버전은 40 자입니다. 나는 그 [ !표기법 에 대해 알고 있지만 그것이 ! [효과가 있다고 놀랐습니다. 왜 그런지 아십니까?
Thor

아 나는 bash를 사용하고 있었다. POSIX 준수를 원한다면 더 길 것 같습니다.
Digital Trauma

1

자바 ( 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̷̰̀ĥ̷̳) :

for 루프를 사용하여 몇 개의 문자를 저장하고 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̷̰ĥ̷̳

두 번째 접근법은 int에서 10 비트를 부울 배열로 사용하여 수행 할 수 있으므로 소수 테이블이 필요하지 않습니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̷̳̳̂

나는 그것이 3 년이라는 것을 알고 있지만 return!가장 짧은 대답 사이의 공백을 제거하면 56 바이트에이를 수 있습니다.
케빈 크루이 ssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.