당신은 문자열이 제공됩니다. 0-9의 9 개의 고유 정수를 포함합니다. 누락 된 정수를 반환해야합니다. 문자열은 다음과 같습니다.
123456789
> 0
134567890
> 2
867953120
> 4
당신은 문자열이 제공됩니다. 0-9의 9 개의 고유 정수를 포함합니다. 누락 된 정수를 반환해야합니다. 문자열은 다음과 같습니다.
123456789
> 0
134567890
> 2
867953120
> 4
답변:
@Sarge Borsch 덕분에 + 아름다움
`99066**2`.strip
99066**2
0 ~ 9를 포함하는 문자열을 생성하는 짧은 방법입니다.
764**4
2 바이트를 절약 할 수 있습니다.
764**4
없는 5
, 8
그리고9
763**4
=338920744561
⎕D∘~
⎕D
D의 igits
∘
(모나 딕 함수를 만들기 위해 다음의 이차원 함수에 왼쪽 인수를 묶습니다)
~
[논쟁]을 제외하고
⎕D~⊢
⎕D
D의 igits
~
외
⊢
올바른 주장
⎕D~⍞
⎕D
D의 igits
~
외
⍞
문자 입력
DJMcMayhem 덕분에 10 바이트가 절약되었습니다!
((([]())[]{}){()()({}[()])}{}[{{}}])
Ascii의 모든 자릿수의 합은 525입니다.이 프로그램은 입력을 합산하고 525에서 빼서 누락 된 자릿수를 얻습니다.
((([]())[]{}){()()({}[()])}{} )
525를 푸시합니다. 이것은 9 개의 입력 요소가 시작될 것이라는 사실을 이용합니다. 이것은 []
9로 평가되어 525와 같은 큰 숫자를 빠르게 얻을 수있게합니다.
다음으로 비트가 있습니다.
[{{}}]
입력을 합산하여 총계에서 뺍니다.
negative(sum(input()))
끝으로 옮기면 스택 높이 nilad를 남용하여 525를 더 쉽게 밀 수 있습니다. (([][][]()()()){()()({}[()])}{}[{{}}])
10 바이트를 절약해야합니다
(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
48 * 9 + 45에서 ASCII 코드를 더하고 빼기
->s{477-s.sum}
이런 식으로 사용
f=->s{477-s.sum}
puts f["123456789"]
훨씬 똑똑한 트릭으로 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`^`)
바이트를 저장합니다.
-6 기본 일몰
덕분에 -2 Martin Ender 덕분에
.
$*_5$*
+`_1|1_
1
모든 숫자를 그 수 _
와 5로 1
바꾸십시오.
.
$*_5$*
_
s와 s를 모두 제거하십시오 1
.
+`_1|1_
1
남은 수를 세십시오 .
1
.
.
^
5
^.
$*9¶
.
$*_
+`_¶_
¶
_
_
에 1
바이트를 저장합니다.)
s=>(15-`0x${s}`%15)%15
@xnor의 Python 답변 포트, JavaScript에는 모듈러스 연산자가 아닌 나머지 연산자 만 있기 때문에 단일 단계로 수행 할 수 없습니다. 편집 : @ Arnauld 덕분에 6 바이트가 절약되었습니다.
s=>[...s].map(c=>r-=c,r=45)|r
;-)
reduce
. 어쨌든 +1
s[0]!='0'
, 이미 사용하는 답변이 eval
있습니다.
s=>(15-`0x${s}`%15)%15
있습니까?
-[-[->-<],]>++.
여기서 사용해보십시오 . 이 솔루션은 랩핑에 의존하므로 표준 Brainfuck (8 비트 셀)에서만 작동합니다.
Brainfuck이 실제로 경쟁 할 수있는 드문 날이지만이 도전은 BF 사양과 꽤 잘 어울 렸습니다!
이 대답을 똑바로 세분화하는 대신 더 이해하기 쉽고 더 흥미로운 것으로 생각하기 때문에 반복을 단계별로 수행하고 싶습니다.
참고 :이 솔루션은 대부분 Wheat Wizard의 Brain-Flak 답변에서 영감을 받았습니다 .
그의 대답에서 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
그의 대답에서 지적했듯이 입력이 정확히 길이 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
이것이이 문제에 대한 원래의 대답이지만 더 잘할 수 있습니다.
흥미롭게도 이전 답변은 + 대신 +로 시작하더라도 작동합니다.
+[[->-<],>+<]>++++.
Brainfuck 은 루프를 시작하기 위해 셀에 무언가 가 필요했습니다 . 우리는 다른 곳으로 갈 수 있었을 때 추가로 4를 추가했습니다.
-[[->-<],>+<]>++.
일부 완전히 의도적 인 (읽기 : 시행 착오) 루프 속임수, A의 프로그램 떨어져 시작 -이 개 흥미로운 결과로 리드 :
1 + 10 + 2 = 13이고, 우리는 원래의 대답으로 끝납니다.
다시 생각해 보면 이것은 아마도 간단한 Brainfuck 프로그램에 대한 과도한 쓰기 일 것입니다.
이 솔루션에 대해 조금 더 생각한 후에 2 바이트를자를 수있었습니다.
이전 단계에 대해 명확히하고 싶었습니다
. 루프에 들어가는 빼기 에는 1이 효과적으로 추가되지만 실제로 수행중인 작업은 두 번째 셀에서 255를 뺀 것입니다 (1 결과).
돌이켜 보면 명백하지만 첫 번째 셀에서 1을 빼는 것은 두 번째 셀에 1을 더하는 것과 같습니다 (첫 번째 셀의 모든 것이 두 번째 셀에서 빼기 때문).
-[-[->-<],]>++.
첫 번째 루프의 시작 부분에 "-"를 추가하여 "> + <"를 제거 할 수있었습니다. 프로그램은 무한정 반복 될 것이기 때문에 "> + <"가있는 곳이 아니라 거기에 가야합니다.
477-Tr@ToCharacterCode@#&
문자열을 입력으로 받아서 정수를 반환하는 순수한 함수. Mathematica는 긴 명령 이름을 가지고 있으며 문자열과 정수 사이를 변환하기를 꺼려하여이 문제에 특히 나쁩니다. 내가 찾을 수있는 가장 좋은 것은 Level River St 's Ruby answer의 알고리즘 으로, 입력 문자열의 총 ASCII 코드를 기반으로 계산을 수행합니다. Mathematica에서 이것은 하나의 긴 명령 이름 만 사용합니다.
<?=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
흥미로운 체크섬 접근 방식을 사용하는 더 짧은 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
.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
A,sq-
A, e# The range from 0 to 9: [0 1 2 3 4 5 6 7 8 9]
s e# Cast to a string: "0123456789"
q e# The input
- e# Remove all characters from the range that are in the input
e# Implicit output
에 +1 포함 -r
s/$/0123456789/
:
s/(.)(.*)\1/\2/
t
s/$/0123456789/ # Append 0123456789
: # Start loop
s/(.)(.*)\1/\2/ # remove a duplicate character
t # loop if something changed
ẹ:Ị↔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
구현은 오래되고 버그가 많기 때문에 필요한 이유 ẹ
입니다.
¬∋ℕ
3 가지 문자로만 작동해야한다는 주장을 할 수 있습니다. 즉, 제가 먼저 시도한 것입니다. 그렇지 않은 데에는 여러 가지 이유가 있으며, Brachylog를 변경할 수있는 그럴듯한 방법이 없다고 생각합니다.
¬∋ℕ
not 의미하는 것을 특별히 프로그래밍하지 않으면 Prolog에서 이와 같은 작업 을 수행하는 것도 불가능합니다 not in
. ¬
Brachylog \+
에서 Prolog 와 동일 하며 그 의미는 "이것을 검증하지 않는 모든 것에 대한 선택 포인트를 제공"하기보다는 "폐쇄 된 세계 가정에서는 불가능"이라는 의미입니다. )
(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에서 빼면 입력에서 누락 된 숫자가 다시 나타납니다.
5v&;52/ni?@.>!&oW+
넓히는
5 v
& ;
5 2 / n i ? @ .
> ! & o W + . .
. .
. .
이 브레인-플락 답변 과 같은 종류의 방법을 사용합니다 .
5, 2, 연결, 5, 연결 및 부정을 눌러 스택에 -525 값을 작성하십시오.
그런 다음 반복적으로 입력을 받고 입력 끝이 될 때까지 추가하십시오.
마지막 입력을 제거하고 마지막 추가 결과를 부정 (긍정적으로 작성)하고 문자를 출력하고 정지합니다.
-525 이상에서 작업하는 이유는 각 입력 반복에 대해 문자 출력이 적중되기 때문입니다. 값이 음수이므로 루프가 종료되고 음수 값이 양수가 될 때까지 아무것도 출력되지 않습니다.
셀에 입력이 입력됩니다
A1
.
암호:
=REGEXEXTRACT(4&2^29,"[^"&A1&"]")
Steve Kass 덕분에 6 바이트를 절약했습니다.
이전 코드 :
=REGEXEXTRACT("0123456789","[^"&A1&"]")
결과:
=REGEXEXTRACT(0&49^9,"[^"&A1&"]")
유사한 논리가 주어지면 유효한 솔루션입니다. 답변이 업데이트되었습니다.
더 나은 수학을 수행하여 프로그램을 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를 되돌려 야하지만). 는 ~
하지만, 제대로 작동합니다.
#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
param($n)0..9|?{$n-notmatch$_}
input을 취하고 $n
범위 0..9
(즉, 0, 1, 2 ... 9
)를 구성한 다음 Where-Object
절 ( |?{...}
)을 사용하여 정규식을 수행하는 숫자를 가져옵니다 -notmatch
. 그것은 파이프 라인에 남아 있으며 출력은 암시 적입니다.