경찰 및 강도 (고무) 하드 코딩


12

이것은 도전입니다. 이 도전에 대한 경찰의 실은 여기

고려해야 할 흥미로운 질문은 다음과 같습니다.

일련의 숫자가 있다면 어떤 시퀀스에 대해 이야기하기 전에 몇 개의 숫자를 제공해야합니까?

예를 들어 부터 시작하여 양의 정수에 대해 이야기하고 싶다면 라고 말할 수 있지만 실제로 충분합니까?1 , 2 , 3 , 11,2,3,

이 질문에 대답하고 코드 골퍼가되는 한 가지 방법이 있습니다. 해당 항을 생성하는 가장 짧은 코드가 시퀀스의 모든 항을 생성하는 경우 시퀀스의 충분한 항을 제공했습니다. 우리가 이것을 코드 골프로 생각한다면, 이는 테스트 케이스를 통과하는 가장 짧은 코드가 원하는 작업을 수행 할 수 있도록 충분한 테스트 사례를 제공했음을 의미합니다.

도전

이 도전은 도전입니다. 경찰이 테스트 케이스를 제시 할 것이고 강도는 의도 된 순서 이외의 테스트 케이스를 속일 수있는 더 짧은 방법을 찾아야합니다. 경찰은 다음과 같은 것들을 발표 할 것입니다.

  • 양의 정수를 입력으로 사용하고 출력으로 정수를 생성하는 코드 조각입니다. 이 코드는 0 개 또는 1 개일 수 있지만 인덱싱이 무엇인지 명확해야합니다. 이 코드는 시퀀스를 정의합니다.

  • 출력에 영향을 줄 수있는 관련 플랫폼 또는 언어 요구 사항 (예 : longint 크기)

  • 코드에 의해 계산 된 시퀀스 의 첫 번째 항 과 함께 숫자 입니다. 이것들은 "테스트 케이스"로 작동합니다.nnn

강도는 제시된 언어보다 짧은 언어를 사용하고 모든 테스트 사례를 통과하는 프로그램을 찾을 것입니다 ( 경찰의 코드 와 같은 첫 번째 입력에 대해 동일한 출력을 생성 함 ). 강도 코드는 보다 큰 숫자에 대해 경찰의 프로그램 출력과 달라야합니다 .nnn

채점

강도는 더 많은 균열이 더 나은 균열을 발견합니다. 원래 균열보다 더 짧은 유효한 답을 찾아서 답을 다시 해독 할 수 있습니다. 두 번째로 답이 크래킹되면 첫 번째 크래커가 아닌 두 번째 크래커에 포인트가 제공됩니다.


2
우리는 강도들이 답을 얻기 위해 서로를 때리는 것을 허용하지
않습니까

@ fəˈnɛtɪk Sounds, 좋았습니다.
Ad Hoc Garf Hunter

답변:



5

JavaScript, fəˈnɛtɪk 님의 답변 (17 바이트)

x=>"11237"[x]||22

훨씬 더 낮은 점수를 얻기 위해 하드 코딩하기가 쉬웠습니다 ... 0- 인덱싱 된 항목 대한 참조 구현과 다릅니다 . 이것은 잘 알려진 JS 골프 트릭을 사용합니다. 범위를 초과하는 정수로 시퀀스로 인덱싱하면 잘못된 값 ( )을 반환 하므로 논리 OR ( ) 을 사용하여 기본값으로 간단히 강제 변환 할 수 있습니다. case , 시퀀스의 마지막 항뿐만 아니라 후속 항도 처리합니다.x6undefined||22

테스팅

let f=x=>"11237"[x]||22

for (x of [1,2,3,4,5,6,7]) {
  console.log(x + ' -> ' + f(x))
}

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


4

하스켈 , Laikoni의 대답 , 15 바이트

b n=n*div(n+1)2

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

나는 일반적으로 의견에서 이와 같은 것을 지적하지만 경찰과 강도는 좀 더 목이 났다고 생각했습니다.

이것은 BMO의 답변 에서 특별한 경우를 뺀 것입니다 b 42. Laikoni의 원본은 부동 소수점을 통과하기 때문에 필요하지 않습니다. 반올림 오류를 줄 수는 있지만 정확한 Integer산술이 아닌 숫자를 찾으십시오 . 예를 들면 다음과 같습니다.

a 100000000000000000000000 = 4999999999999999580569600000000000000000000000
b 100000000000000000000000 = 5000000000000000000000000000000000000000000000

나는 이것이 가능할 것이라고 생각했기 때문에 (필요한 용어로 다시 쓸 수 있다고 썼지 만) 그것이 효과가있는 가치를 찾지 못했다.
ბიმო

4

Python 2 , xnor 's answer , 43 바이트

첫 번째 차이점은 .n=69

f=lambda n,p=2:n<1or-~f(n-(~-2**p%p<2),p+1)

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

크레딧

이 크랙에 대한 많은 크레딧은이 방법을 사용하여 가능한 공격에 대한 의견을 게시 한 @ Mr.Xcoder 와 44 바이트 솔루션을 찾은 @PoonLevi 에게 전달 해야 합니다.

어떻게?

이론

pap

(1)ap11(modp)

특히 :a=2

2p11(modp)

따라서 다음 과 같은 양의 정수 가 있습니다.k

2p1=kp+1

어느 것이나

2 p1 = 2 k p + 1 2 p1 1

2p=2kp+2
2p1=2kp+1
(2)2p11(modp)

이 마지막 공식은 파이썬 코드에서 파생 된 것으로서 는 그 자체로 비교적 소수는 아니지만 유지 합니다.2p=22

이제 가장 중요한 부분 인 페르마의 작은 정리의 대화는 사실이 아닙니다. 우리는 할 수 있습니다 에 대한 몇 가지 합성 수를 . 이러한 숫자라고 페르마 pseudoprimes을 기본으로 . 밑면 2에 대한 Fermat 의사 프라임은 Poulet 번호 라고도 합니다.Nan11(modn)na

밑이 첫 번째 Fermat 의사 프라임 (또는 첫 번째 Poulet 번호)은 이며 다음과 같습니다.N = 341 = 11 × 312n=341=11×31

2 3411 1

234111(mod341)
234111(mod341)

이것은 우리의 알고리즘이 예상 69 번째 소수 ( 대신 을 반환한다는 것을 의미합니다 .347341347

이행

@PoonLevi 는 기반으로하는 다음 44 바이트 솔루션을 찾았습니다 .(2)

f=lambda n,p=1:n and-~f(n-(~-2**p%p==1),p+1)

사용하여 <2대신 ==1, 우리는 1 바이트를 저장하지만 우리는 도입 , 순서에 있기 때문에 :2 11 012110(mod1)

f=lambda n,p=1:n and-~f(n-(~-2**p%p<2),p+1)

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

로 시작하면 반복 횟수가 1 회 줄어들 기 때문에 예상 항이 1 씩 줄어 듭니다.p=2

f=lambda n,p=2:n and-~f(n-(~-2**p%p<2),p+1)

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

마지막 트릭은 n<1or대신에 사용하는 것입니다 n and. 이것은 길지만 마지막 반복 이 0 대신 True 를 반환 하도록하여 각 항에 누락 된 오프셋을 추가합니다.


여러분 모두 축하합니다! 이것이 내가 생각한 해결책입니다. 나는 도전 동기 부여에서 "어떤 시퀀스에 대해 이야기하기 전에 몇 개의 숫자를 제공해야합니까?" 파이썬 골프 외계인은 다른 순서에 대해 이야기한다고 가정합니다.
xnor

@ xnor 나는 "파이썬 골프 외계인"의 아이디어를 사랑합니다
dylnan

3

파이썬 3 , crashoz , 45 바이트

lambda n:int(60*math.sin(n/10-2))
import math

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

이 표현 x*60-x**3*10+x**5/2-x**7/84은 항 까지의 에 60을 곱한 Taylor 계열입니다 . 이는 사용 된 입력에 대해 충분히 정확하지만 값이 높을수록 잘린 항이 더 적합 해짐에 따라 둘이 분기됩니다.x 7sin(x)x7



2

하스켈 , Laikoni의 대답 , 26 22 바이트

Laikonidiv 덕분에 infix를 사용하지 않고 -4 바이트 !

b 42=0;b n=n*div(n+1)2

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

설명

들어 용어 로 다시 쓸 수 온 우리에게 패턴 일치 충분히 바이트를 제공하는 이 28 바이트 내에서 균열을 리드 :n > 200n20ceiling(realToFrac n/2)div(n+1)2n>20

b 42=0

아, 나는 그것을 생각하지 않았다. 좀 더 퍼즐을하고 싶을 때 20 바이트의 균열로 이어지는 다른 접근법이 있습니다. 또한 ((n+1)`div`2)-> div(n+1)2.
Laikoni

@Laikoni : 네, 아직 공개하지 마십시오! 죄송합니다. 골프를 치고 나서 꽤 오래 걸렸습니다. 업데이트하겠습니다.
ბიმო

2

> <> , crashoz의 답변 203 바이트

:l2-$g:0=?;n:





M
-
B
"
BM
",
7M
!"
BBM
!",
7CM
!"-
BBBM
!!",
7BBMM
!!,,
7BBBMM
!!,,
7BBBMM
!!!,,
7BBBBMM
!!!,,
7BBBBMM
!!!!,,
7BBBBBMM
!!!!,,
7BBBBBMM
!!!!!,,
7BBBBBBMM

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

위의 홀수 / 짝수 n=20는 중앙에 반복되는 요소를 제외하고는 동일 하다는 사실로 영리한 것을 시도했지만 모든 요소를 ​​하드 코딩하는 것이 더 쉬웠습니다.

입력은 -v플래그 를 통해 이루어 집니다. 34 이상의 요소에 대해서는 아무것도 인쇄하지 않습니다.


2

파스칼 (FPC) , AlexRacer의 답변 , 80 바이트

var n,m:word;begin read(n);while n<>0 do begin n:=n div 2;m:=m+n;end;write(m)end.

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

경우 의 출력은 동일하지만, 상기 출력 코드 , AlexRacer의 코드를 출력하면서 .N = 128 (127) 1260n120n=128127126

답은 늦었지만, 어쨌든 @AlexRacer에게 좋은 퍼즐을 주셔서 감사합니다!


1
와우, 이것은 내가 가진 것보다 훨씬 짧습니다. PPCG에 오신 것을 환영합니다!
AlexRacer


1

JavaScript, fəˈnɛtɪk 님의 답변 (17 바이트)

TIO 링크 또는 스택 스 니펫 결과에서 보다 큰 항목에 대해서는 실패한다는 것을 알 수 있습니다.15

x=>2.7182819**x|1

정확도가 (처음 값) 에만 필요한 경우 16 바이트에서도 잘 작동합니다.15n1415x=>Math.exp(x)|1

테스팅

f=x=>2.7182819**x|1
g=x=>(3-(5/63)**.5)**x|1

tmp=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
console.log(tmp.map(f).join(","))
console.log(tmp.map(g).join(","))

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


1

Husk , BMO의 5 바이트 를  3  2 바이트로 크래킹

-1 BMO 덕분에 ( LdΣ-> 사람 주어진 경우 Tnum, L수행 "문자열 표현의 길이")

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

a(0)a(23)a(24)
3←d+164

T(0)=010


축하합니다. 이것이 나의 정확한 해결책이었습니다! 그러나 난 그냥에 대한 주목 TNumLLd 동일 절약 당신에게 바이트)
ბიმო

아아, 나는 위키에서 "숫자"를 검색하여 디지털 길이를 찾았지만에 L대한 "문자열 표현의 길이"로 재정의 하는 것을 발견하지 못했습니다 Tnum.
Jonathan Allan

(이것은 음이 아닌 정수에 대해서만 동등합니다-이것에 충분합니다.)
Jonathan Allan


0

JavaScript, fəˈnɛtɪk 's answer , 23 바이트

0n14

x=>14-`${73211e9}`[x]|0

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

어떻게?

표현식 `${73211e9}`은 문자열로 확장되어 "73211000000000"14에서 빼는 14 개의 값으로 구성된 조회 테이블을 제공하여 예상되는 시퀀스를 제공합니다.

n14

(14 - undefined) | 0
=== NaN | 0
=== 0

21 바이트

NaNn14

x=>14-`${73211e9}`[x]

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.