누락 된 정수를 출력


34

당신은 문자열이 제공됩니다. 0-9의 9 개의 고유 정수를 포함합니다. 누락 된 정수를 반환해야합니다. 문자열은 다음과 같습니다.

123456789
 > 0

134567890
 > 2

867953120
 > 4

5
@riker 시퀀스에서 누락 된 숫자를 찾는 것 같습니다. 이것은 세트에서 누락 된 숫자를 찾는 것 같습니다.
DJMcMayhem

10
@Riker 연결된 도전이 엄격하게 증가하는 시퀀스 (잠재적으로 여러 자리 숫자)를 갖는 것을 감안할 때 중복되는 것으로 생각하지 않지만 여기서는 임의의 순서입니다.
AdmBorkBork

3
조쉬! 지금까지 아무도 언급하지 않았으므로 메인에 게시하기 전에 미래의 도전 아이디어를 게시하고 의미있는 피드백을 얻을 수있는 샌드 박스 로 안내합니다. 이는 STDIN / STDOUT과 같은 세부 정보를 정리하는 데 도움이되었으며 여기에서 다운 보트를 받기 전에 중복 딜레마를 해결했습니다.
AdmBorkBork

1
9-x % 9가 0을 제외한 모든 숫자에 대해 작동하는 것은 수치스러운 일입니다. 나보다 더 영리한 사람이 작동하는 방법을 찾을 수 있습니다.
Bijan

2
여러 답변은 함수 입력으로 정수를 사용합니다. 허용 되나요?
Dennis

답변:


36

파이썬 2 , 18 16 바이트

@Sarge Borsch 덕분에 + 아름다움

`99066**2`.strip

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

99066**2 0 ~ 9를 포함하는 문자열을 생성하는 짧은 방법입니다.


7
32043을 더 아름다운 숫자로 변경할 수 있습니다. 99066은 중심 대칭이거나 (중심 주위에서 180도 회전하면 변경되지 않음) 97779 (회문, 두 개의 다른 숫자)
Sarge Borsch

1
OP에서 숫자를 두 번 인쇄 할 수 있으면 764**42 바이트를 절약 할 수 있습니다.
Titus

@Titus이 764**4없는 5, 8그리고9
로드

1
오타 ... 의미 763**4=338920744561
Titus

25

파이썬 , 22 바이트

lambda s:-int(s,16)%15

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

산술 솔루션. 입력 문자열을 16 진으로 해석하고 무시하고 결과 모듈로 15를 가져옵니다.


2
이것이 왜 작동하는지 설명 할 수 있습니까?
KarlKastor

1
@KarlKastor, base 16의 modulo 15는 base 10의 modulo 9와 유사하게 작동합니다. Modulo base-1은 10 ≡ 1 (mod base-1) 때문에 숫자의 합을 취하면 일정합니다. 가능한 모든 자릿수의 합계는 일정하므로 누락 된 자릿수는이 상수와 입력 숫자 (모듈러스 기준 -1)의 차이입니다.
mik


12

Brain-Flak , 48 38 36 + 3 = 39 바이트

DJMcMayhem 덕분에 10 바이트가 절약되었습니다!

((([]())[]{}){()()({}[()])}{}[{{}}])

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

설명

Ascii의 모든 자릿수의 합은 525입니다.이 프로그램은 입력을 합산하고 525에서 빼서 누락 된 자릿수를 얻습니다.

((([]())[]{}){()()({}[()])}{}      )

525를 푸시합니다. 이것은 9 개의 입력 요소가 시작될 것이라는 사실을 이용합니다. 이것은 []9로 평가되어 525와 같은 큰 숫자를 빠르게 얻을 수있게합니다.

다음으로 비트가 있습니다.

                             [{{}}]

입력을 합산하여 총계에서 뺍니다.


이것은 어떻게 작동합니까?
Pavel

@ ГригорийПерельман 설명이 추가되었습니다!
밀 마법사

2
negative(sum(input()))끝으로 옮기면 스택 높이 nilad를 남용하여 525를 더 쉽게 밀 수 있습니다. (([][][]()()()){()()({}[()])}{}[{{}}])10 바이트를 절약해야합니다
DJMcMayhem

대신 477을 빼서 30 바이트
Jo King

12

하스켈 , 24 23 바이트

(477-).sum.map fromEnum

온라인으로 사용해보십시오! 사용법 : (477-).sum.map fromEnum $ "123456890". 477은 0을 제외하고 1에서 9까지의 문자 코드의 합계입니다.이 익명 함수는 477에서 모든 숫자 문자 코드의 합계를 빼서 누락 된 코드를 찾습니다.

문자 숫자를 정수로 바꾸는 것이 1 바이트 더 깁니다.

(45-).sum.map(read.pure)
foldl(\a b->a-read[b])45

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


10

젤리 , 3 바이트

ØDḟ

“0123456789” ( ) 에서 입력 문자열을 필터링 ( )하기 만하면 됩니다.ØD

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


3
나는 모든 골프 언어 (및 일부 골프 이외의 언어)가 동일한 알고리즘을 사용하는 방식을 좋아하지만 Jelly는 사용하는 내장의 이름이 가장 짧고 인수를 되돌릴 수있는 가장 작은 이름을 가지고 있습니다 .

1
@ ais523 APL이 동일한 (그것이 APL이 될 것을 제외 함수 / 프로그램보다는 니펫) 한 글자이다 Ø= , D= D, = ~, 마찬가지로 ⎕D~'867953120'.
Adám

3
나는 대답을 스크롤하면서 : "젤리에서 3 문자를 예측하고 있습니다." 빙고. : ^ D
DLosc

9

루비, 14

48 * 9 + 45에서 ASCII 코드를 더하고 빼기

->s{477-s.sum}

이런 식으로 사용

f=->s{477-s.sum}

puts f["123456789"]

9

자바 스크립트 (ES6), 26

훨씬 똑똑한 트릭으로 1 바이트 저장 thx @Neil 편집

1에서 9까지의 모든 값을 Xor하면 Xor 1이 한 번 더 나오고 결과는 0입니다. 따라서 단일 값이 누락되면 결 측값이됩니다.

s=>eval([1,...s].join`^`)

테스트

f=s=>eval([1,...s].join`^`)

function go() {

  var i=I.value;
  O.textContent = f(i)
}  

go()
<input oninput='go()' value='012987653' id=I>
<pre id=O></pre>


s=>eval([1,...s].join`^`)바이트를 저장합니다.
Neil

@Neil ... 그리고 그것은 훨씬 더 재미있다
edc65

나는이 끝이 후 의심 짧은 온 느낌이 내 대답 D 어쨌든 좋은 골프 +1 :.
Christoph

1
@Christoph 글쎄 그것은 당신이 단어를 전파하려는 것처럼 들리는 ...
Neil

@ Neil 절대적으로 :) 그것이 도움이되었음을 알게되어 반갑습니다!
Christoph

8

망막 , 27 21 19 바이트

-6 기본 일몰
덕분에 -2 Martin Ender 덕분에

.
$*_5$*
+`_1|1_

1

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

모든 숫자를 그 수 _와 5로 1바꾸십시오.

.
$*_5$*

_s와 s를 모두 제거하십시오 1.

+`_1|1_ 


1남은 수를 세십시오 .

1

두 번째 답변의 첫 번째 줄은 바로 그럴 수 있습니다 ..
Neil

교체 대신 중복 제거를 사용하여 몇 바이트를 절약 할 수 있습니다. 온라인 사용해보기
Business Cat

아, 그리고 여기에 첫 번째 응답의 이전 바이트 수까지 두 번째 응답을 얻는 것이 었습니다 ...^ 5 ^. $*9¶ . $*_ +`_¶_ _
Neil

@ Neil 나는 원래보다 하나 줄였습니다.
Riley

(허, 내 대답에 의심 비슷한 모양, 유일한 차이점은로 전환한다는 것입니다 _1바이트를 저장합니다.)


6

자바 스크립트 (ES6), 31 29 28 22 바이트

s=>(15-`0x${s}`%15)%15

@xnor의 Python 답변 포트, JavaScript에는 모듈러스 연산자가 아닌 나머지 연산자 만 있기 때문에 단일 단계로 수행 할 수 없습니다. 편집 : @ Arnauld 덕분에 6 바이트가 절약되었습니다.


s=>[...s].map(c=>r-=c,r=45)|r;-)
ETHproductions

3
당신은 너무 사랑에 빠졌습니다 reduce. 어쨌든 +1
edc65

@Arnauld 나는 그것이 작동 할 때 그것을 보지 못했지만 s[0]!='0', 이미 사용하는 답변이 eval있습니다.
Neil

당신은 할 수 s=>(15-`0x${s}`%15)%15있습니까?
Arnauld

@Arnauld Bah, 그리고 이미 Batch 포트에 대해서도 그렇게했습니다.
Neil

6

Brainfuck, 17 15 바이트

-[-[->-<],]>++.

여기서 사용해보십시오 . 이 솔루션은 랩핑에 의존하므로 표준 Brainfuck (8 비트 셀)에서만 작동합니다.

Brainfuck이 실제로 경쟁 할 수있는 드문 날이지만이 도전은 BF 사양과 꽤 잘 어울 렸습니다!

이 대답을 똑바로 세분화하는 대신 더 이해하기 쉽고 더 흥미로운 것으로 생각하기 때문에 반복을 단계별로 수행하고 싶습니다.
참고 :이 솔루션은 대부분 Wheat Wizard의 Brain-Flak 답변에서 영감을 받았습니다 .

설명

1 단계, 26 바이트

그의 대답에서 Wheat Wizard는 ASCII 값의 합계가 0-9에서 525까지임을 지적했습니다. 그리고 표준 Brainfuck은 [0,255]의 개념만을 가지기 때문에 525 % 256 = 13 입니다. 다시 말해 13 개의 그물에서 입력의 ASCII 값을 빼면 숫자가 빠집니다.

이 프로그램의 첫 번째 버전은 다음과 같습니다.
1. 첫 번째 셀에 13을 넣
습니다. 두 번째 셀에 입력을 가져옵니다.
3. 첫 번째 셀에서 두 번째 셀을 뺍니다.
4. 입력이 남아 있으면 2로 이동합니다
. 5. 첫 번째 셀을 인쇄합니다

간단한 솔루션의 코드는 다음과 같습니다.

+++++++++++++ #Set the first cell to 13  
>,            #Take inputs into the second cell  
[[<->-],]     #Subtract the second cell from the first cell and repeat until inputs are over  
<.            #Print the first cell  

2 단계, 19 바이트

그의 대답에서 지적했듯이 입력이 정확히 길이 9임을 알기 때문에 그 값을 상수로 사용하고 처음에 긴 +의 긴 문자열을 제거 할 수 있습니다.
또한 13을 더한 시점 (감사, 교환 속성!)은 중요하지 않으므로 빼기 및 인쇄 단계와 혼합합니다.

,        #Take input to enter the loop
[[->-<], #Subtract the first cell from the second cell 
>+<]     #Add 1 for each input; totaling 9
>++++    #Add the missing 4 to make 13
.        #And print

이것이이 문제에 대한 원래의 대답이지만 더 잘할 수 있습니다.

3 단계, 17 바이트

흥미롭게도 이전 답변은 + 대신 +로 시작하더라도 작동합니다.

+[[->-<],>+<]>++++.

Brainfuck 은 루프를 시작하기 위해 셀에 무언가 가 필요했습니다 . 우리는 다른 곳으로 갈 수 있었을 때 추가로 4를 추가했습니다.

-[[->-<],>+<]>++.

일부 완전히 의도적 인 (읽기 : 시행 착오) 루프 속임수, A의 프로그램 떨어져 시작 -이 개 흥미로운 결과로 리드 :

  1. 하나는 두 번째 셀에 추가됩니다 (끝 부분에 1 바이트 저장).
  2. 루프는 한 번의 추가 시간으로 실행되며 9 대신 총 10이됩니다 (다른 1 바이트 절약).

1 + 10 + 2 = 13이고, 우리는 원래의 대답으로 끝납니다.

다시 생각해 보면 이것은 아마도 간단한 Brainfuck 프로그램에 대한 과도한 쓰기 일 것입니다.

4 단계, 15 바이트

이 솔루션에 대해 조금 더 생각한 후에 2 바이트를자를 수있었습니다.

이전 단계에 대해 명확히하고 싶었습니다
. 루프에 들어가는 빼기 에는 1이 효과적으로 추가되지만 실제로 수행중인 작업은 두 번째 셀에서 255를 뺀 것입니다 (1 결과).

돌이켜 보면 명백하지만 첫 번째 셀에서 1을 빼는 것은 두 번째 셀에 1을 더하는 것과 같습니다 (첫 번째 셀의 모든 것이 두 번째 셀에서 빼기 때문).

-[-[->-<],]>++.

첫 번째 루프의 시작 부분에 "-"를 추가하여 "> + <"를 제거 할 수있었습니다. 프로그램은 무한정 반복 될 것이기 때문에 "> + <"가있는 곳이 아니라 거기에 가야합니다.



5

Mathematica, 25 바이트

477-Tr@ToCharacterCode@#&

문자열을 입력으로 받아서 정수를 반환하는 순수한 함수. Mathematica는 긴 명령 이름을 가지고 있으며 문자열과 정수 사이를 변환하기를 꺼려하여이 문제에 특히 나쁩니다. 내가 찾을 수있는 가장 좋은 것은 Level River St 's Ruby answer의 알고리즘 으로, 입력 문자열의 총 ASCII 코드를 기반으로 계산을 수행합니다. Mathematica에서 이것은 하나의 긴 명령 이름 만 사용합니다.


5

PHP, 27

<?=trim(32043**2,$argv[1]);

Rod의 답변 에서 트릭을 사용하여 모든 숫자가 포함 된 문자열을 생성 한 다음 누락 된 숫자를 제외한 모든 숫자를 제거합니다.


PHP, 41

for($b=1;$i<9;$b^=$argv[1][$i++]);echo$b;

아직 보지 않았기 때문에 xor를 사용합니다 .


나는 트림에 대해 생각하지 않았습니다. 대안 가치32043,32286,33144,35172,35337,35757,35853,37176,37905,38772,39147,39336,40545,42744,43902,44016,45567,45624,46587,48852,49314,49353,50706,53976,54918,55446,55524,55581,55626,56532,57321,58413,58455,58554,59403,60984,61575,61866,62679,62961,63051,63129,65634,65637,66105,66276,67677,68763,68781,69513,71433,72621,75759,76047,76182,77346,78072,78453,80361,80445,81222,81945,83919,84648,85353,85743,85803,86073,87639,88623,89079,89145,89355,89523,90144,90153,90198,91248,91605,92214,94695,95154,96702,97779,98055,98802,99066
Jörg Hülsermann

5

Bash + coreutils, 19 바이트

흥미로운 체크섬 접근 방식을 사용하는 더 짧은 bash 솔루션을 찾았습니다 .

sum -s|dc -e524?--P

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

설명:

sum명령은 체크섬과 블록 수를 인쇄합니다. 자세한 내용은 알지 못하지만 -s(System V 알고리즘) 옵션 을 사용하면 체크섬이 각 입력 문자 코드의 ASCII 합계와 같습니다. 따라서 동일한 입력 문자의 순서가 변경 될 때 체크섬이 일정하게 유지됩니다.

을 감안할 때 867953120스크립트가 어떻게 작동하는지 테스트 케이스 (마지막 예)로, 여기에 있습니다 :

  • sum -s출력 473 1. 누락 된 정수가 없으면 체크섬은 525입니다.
  • dc -e524?524를 누른 다음 파이프 입력을 누릅니다. 스택은 다음과 같습니다 1 473 524. 아이디어는 525에서 체크섬을 빼는 것이지만 sum 출력 1도 마찬가지이므로 함께 사용해야합니다.
  • --P. 두 뺄셈 (524- (473-1))을 적용한 후 스택은 다음과 같습니다 52. 'P'를 사용하면 ASCII 코드가있는 문자를 인쇄합니다 4.

4

포트란 95, 146128 바이트

function m(s)
character(len=10)::s,t
t='0123456789'
do j=1,10
k=0
do i=1,9
if(s(i:i)==t(j:j))k=1
end do
if(k==0)m=j-1
end do
end

그리 짧지 않아요.

언 골프 드 :

integer function m(s)
    implicit none

    character(len=9)::s
    character(len=10)::t
    integer:: i, j, k

    t='0123456789'
    do j=1,10
        k=0
        do i=1,9
            if (s(i:i) == t(j:j)) k=1
        end do
        if (k==0) m=j-1
    end do

end function m



3

Brachylog (2), 5 바이트

ẹ:Ị↔x

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

틀림없이 더 짧아야합니다 (왜 여전히 필요한지 혼란 스럽습니다 ). 그러나 이것이 내가 할 수있는 최선입니다.

설명

ẹ:Ị↔x
ẹ      Split the input into a list of characters
 :Ị    Pair that list with the string "0123456789"
   ↔x  Remove all elements of the list from the string

x구현은 오래되고 버그가 많기 때문에 필요한 이유 입니다.
Fatalize

실제로 ¬∋ℕ3 가지 문자로만 작동해야한다는 주장을 할 수 있습니다. 즉, 제가 먼저 시도한 것입니다. 그렇지 않은 데에는 여러 가지 이유가 있으며, Brachylog를 변경할 수있는 그럴듯한 방법이 없다고 생각합니다.

¬∋ℕnot 의미하는 것을 특별히 프로그래밍하지 않으면 Prolog에서 이와 같은 작업 을 수행하는 것도 불가능합니다 not in. ¬Brachylog \+에서 Prolog 와 동일 하며 그 의미는 "이것을 검증하지 않는 모든 것에 대한 선택 포인트를 제공"하기보다는 "폐쇄 된 세계 가정에서는 불가능"이라는 의미입니다. )
Fatalize

프롤로그에서이를 수행 할 수있는 유일한 방법 은 사전 에 "라벨을 붙이는" 것이지만, 이는 술어의 내용에 따라 Brachylog의 평가 순서를 어설프게 하는 것을 의미합니다. 그것은 그것이 가지고있는 문제 중 하나 일뿐입니다. 다른 많은 것들이 있습니다.

3

공통 리스프, 47 바이트

(lambda(s)(- 45(reduce'+ s :key'digit-char-p)))

언 골프 드 :

(lambda (s) (- 45 (reduce '+ s :key 'digit-char-p)))

설명 :

(reduce '+ s :key 'digit-char-p)

이것은의 문자를 반복 s하여 숫자로 변환 한 다음 추가합니다. Digit-char-p는 문자 수를 "true"값으로 반환하므로 테스트 또는 변환으로 사용할 수 있습니다.

(- 45 ...)

45에서 빼면 입력에서 누락 된 숫자가 다시 나타납니다.


3

Cubix , 18 바이트

5v&;52/ni?@.>!&oW+

넓히는

    5 v
    & ;
5 2 / n i ? @ .
> ! & o W + . .
    . .
    . .

여기 사용해보십시오

브레인-플락 답변 과 같은 종류의 방법을 사용합니다 .

5, 2, 연결, 5, 연결 및 부정을 눌러 스택에 -525 값을 작성하십시오.
그런 다음 반복적으로 입력을 받고 입력 끝이 될 때까지 추가하십시오.
마지막 입력을 제거하고 마지막 추가 결과를 부정 (긍정적으로 작성)하고 문자를 출력하고 정지합니다.

-525 이상에서 작업하는 이유는 각 입력 반복에 대해 문자 출력이 적중되기 때문입니다. 값이 음수이므로 루프가 종료되고 음수 값이 양수가 될 때까지 아무것도 출력되지 않습니다.




3

Google 스프레드 시트, 39 33 바이트

셀에 입력이 입력됩니다 A1.

암호:

=REGEXEXTRACT(4&2^29,"[^"&A1&"]")

Steve Kass 덕분에 6 바이트를 절약했습니다.

이전 코드 :

=REGEXEXTRACT("0123456789","[^"&A1&"]")

결과:

여기에 이미지 설명을 입력하십시오


숫자 2 ^ 29에는 4를 제외한 모든 숫자가 있으므로 33 바이트 : = REGEXEXTRACT (4 & 2 ^ 29, "[^"& A4 & "]")
Steve Kass

@SteveKass 니스. =REGEXEXTRACT(0&49^9,"[^"&A1&"]")유사한 논리가 주어지면 유효한 솔루션입니다. 답변이 업데이트되었습니다.
그랜트 밀러

3

Befunge 98, 14 12 바이트

더 나은 수학을 수행하여 프로그램을 1 줄과 1 바이트로 이동하여 1 바이트를 절약했습니다.

~+;@.%a--7;#

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

설명

ASCII 값의 합계는 누락 된 숫자에 따라 477에서 468 사이입니다. 이것을 7에서 빼면 -470에서 -461의 범위를 얻습니다. 이 숫자를 10 씩 수정하면 0-9 범위가되며 인쇄 할 수 있습니다.

~+;       ;#    Sums the ASCII values of all characters to stdIn
~          #    The # doesn't skip over the ~ because it's on the end of a line
~               Once EOF is hit, the ~ reverses the IP's direction
          ;#    Jump the ; that was used before
       --7      Subtract the sum from 7 (really just 0 - (sum - 7))
     %a         Mod it by 10
   @.           Print and exit

정수 입력 대신 ASCII 값을 사용하는 이유는 &온라인 시도 의 명령이 EOF에서 중지 되기 때문입니다 (IP를 되돌려 야하지만). 는 ~하지만, 제대로 작동합니다.

이전 프로그램 , 14 바이트

#v~+
@>'i5*--,

10 자리 모두의 ASCII 값의 합은 525입니다. 525에서 주어진 자릿수의 합을 빼면 누락 된 문자의 ASCII 값을 얻습니다.

#v~+         Sums the ASCII values of all characters on stdIn
             Moves to the next line when this is done
 >'i5*       Pushes 525 (105 * 5)
      --     Subtracts the sum from 525
@       ,    Prints and exits

2

PowerShell , 30 바이트

param($n)0..9|?{$n-notmatch$_}

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

input을 취하고 $n범위 0..9(즉, 0, 1, 2 ... 9)를 구성한 다음 Where-Object절 ( |?{...})을 사용하여 정규식을 수행하는 숫자를 가져옵니다 -notmatch. 그것은 파이프 라인에 남아 있으며 출력은 암시 적입니다.



2

Pyth, 5 바이트

-jkUT

시도 해봐!

설명

-jkUT
    T   # 10
   U    # The unary range of ten: [0,1,..,9]
 jk     # join that on the empty string
-       # set minus

"-jUT"도 약간 작동하지만 모든 int에 대해 줄 바꿈을 생성합니다.


2

05AB1E , 5 바이트

žhISK

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

설명

žh     # from the string "0123456789"
    K  # remove
  IS   # each digit of the input

6
큰 소리로 말할 수 있기 때문에 좋아합니다. ""žhISK ", 그는 모자에 그의 지팡이를 흔들고 작은 흰 토끼가 연기의 퍼프에 나타남으로 울었다.
Penguino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.