Cheapo Enigma 기계 (Cops)


15

도둑의 게시물, Cheapo Enigma 기계 (고무)

경찰의 제출은 단일 바이트 데이터를 받아들이고 단일 바이트 데이터를 반환하는 프로그램 / 함수로 구성됩니다. 가능한 모든 입력은 고유 한 출력을 생성해야합니다. (즉, 함수는 형용사 적이어야합니다)

강도는 가능한 짧은 코드를 사용하여 역함수를 만들려고 시도합니다. 따라서 목표는 함수를 반전시키기 어렵게 만드는 것입니다.

해싱 또는 암호화만을 목적으로하는 내장 기능을 사용할 수 없습니다.

바이트 수는 64 바이트를 초과 할 수 없습니다. 0 바이트 솔루션은 이길 수 없습니다.

입출력 형식

8 비트 (0 또는 1) 또는 1-256, 0-255 또는 -128 ~ 127 범위의 10 진 정수입니다. 표준 I / O 또는 파일 I / O를 사용할 수 있습니다. 함수는 값을 출력으로 반환 할 수도 있습니다. 입력 및 출력은 동일한 범위 (2 진, 1-256, 0-255 또는 -128-127)에 속해야합니다. 강도는 또한이 범위를 입력 및 출력에 사용해야합니다.

채점

당신에 대한 최고의 강도 시도에 대한 바이트 수의 비율. 최저 점수가 이깁니다.

강도가 당신을 물리 치려고 시도한 경우에만 (경찰로서) 이길 자격이 있습니다. (이 강도는 당신이 될 수 있습니다)

C ++, 0-255 범위, 31 바이트 사용

int x;
cin>>x;
cout<<(x+1)%256;

C ++, 32 바이트의 가능한 강도 제출

int f(int x)
{return x?x-1:255;}

동일한 언어 또는 유사한 알고리즘을 사용하는 것은 필수가 아닙니다

이것은 경찰과 강도 모두에게 31/32 = 0.97의 점수를줍니다.


1
경찰 제출은 무엇으로 구성됩니까? 언어, 크기 및 전체 프로그램 / 기능 코드?
Arnauld

1
경찰이 임의로 큰 것을 만들 수 있다면 조금 망가지지 않습니까?
Destructible Lemon

1
이 강도는 당신일지도 모릅니다. N을 N에 매핑하는 64 바이트 경찰 답변과 1 바이트에서 동일한 일을하는 강도 답변을 게시 하면 어떻게됩니까?
Arnauld

1
강도가 응답 할 때 경찰 제출을 업데이트해야하는지 여부를 지정할 수 있습니다. (일반적인 "크랙"업데이트는 여기에 적용되지 않습니다. 적어도 독특하고 결정적인 크랙은 아닙니다.)
Arnauld

3
다시 생각하면 해당 규칙을 모두 제거 할 수 있습니다. Jelly에 강도를 게시하여 대부분의 답변을 파괴 할 수 있습니다.
Dennis

답변:


7

자바 스크립트, 11 8 바이트, 점수 : 5분의 8

x=>x^x/2

그레이 코드의 간단한 구현. 일반적으로 디코딩에는 전체 루프가 필요합니다. 누가 가장 작거나 루프없이 나올지 봅시다!


그것을 x^x/4위해 내장되어서는 안되기 때문에 더 힘들 것 같아요 ...
Christoph


1
이 형용사는 어떻습니까?
Leaky Nun

1
@LeakyNun Uhm 어떤 대답을 기대할지 모르겠지만 시도해 볼 것입니다. 회색 코드는 연속되는 각 숫자가 1 비트로 만 변경되는 숫자를 나타내는 대체 형식입니다 (햄 미그 거리는 항상 1). 각 숫자에 대해 정확히 하나의 그레이 인코딩과 하나의 이진 인코딩이 있으므로 궤적을 형성합니다. 예를 들어 7은 이진수로 0111이고 회색으로 0100이며, 다음 숫자 8은 이진수로 1000이고 회색으로 1100입니다. 그레이 코딩은 기본적으로 이진의 에지 코딩입니다.
Christoph

1
@LeakyNun ^은 지수 xor가 아닌 비트 xor입니다. 어쨌든 그것은 마술처럼 보인다
Евгений Новиков

7

C, 64 바이트, 점수 64/71 = 0.901

T[256];f(x){srand(x&&f(x-1));for(;T[x=rand()%256]++;);return x;}

[0 255] 범위에서 입력을받습니다.

온라인으로 사용해보십시오! — TIO (GCC 사용)에서 다음을 생성합니다.

103,198,105,115,081,255,074,236,041,205,186,171,242,251,227,070,
124,194,084,248,027,232,231,141,118,090,046,099,051,159,201,154,
102,050,013,183,049,088,163,037,093,005,023,233,094,212,178,155,
180,017,014,130,116,065,033,061,220,135,112,062,161,225,252,001,
126,151,234,107,150,143,056,092,042,176,059,175,060,024,219,002,
026,254,067,250,170,058,209,230,148,117,216,190,097,137,249,187,
168,153,015,149,177,235,241,179,239,247,000,229,202,011,203,208,
072,071,100,189,031,035,030,028,123,197,020,075,121,036,158,009,
172,016,080,021,111,034,025,125,245,127,164,019,181,078,152,224,
077,052,188,095,119,108,134,043,085,162,004,211,054,226,240,228,
079,073,253,169,008,138,010,213,068,091,243,142,076,215,045,066,
006,196,132,173,222,048,246,032,133,007,244,185,195,217,160,120,
218,106,083,144,087,238,207,096,210,053,101,063,098,128,165,089,
140,012,192,131,047,039,022,147,184,109,182,193,199,237,018,069,
057,157,174,104,122,166,055,110,003,040,139,086,145,114,129,113,
206,167,191,214,146,221,136,038,156,082,200,029,044,204,223,064

C는 특정 rand구현을 요구하지 않기 때문에 다른 시스템에서는 다른 (아직 유효한) 출력을 생성 할 수 있습니다 . 제출물은 구체적으로 TIO에서 실행되는 버전입니다 (링크 된대로).


나는 f(x){return rand(srand(x*229))/229%256;}그것이 훨씬 더 우아하다고 생각하기 때문에 TIO에서 작동하는 내 원본 ( ) 과 같은 버전을 얻을 수 없다는 것에 상당히 실망했습니다 . OS X에서 실행되는 Clang에서만 작동하기 때문에 경쟁에는 불공평합니다. 이것은 여전히 ​​반전하기가 어색하기 때문에 충분합니다.


글쎄 .. 재미있다!
Matthew Roh

여기 에 해결책이 있지만 귀하의와 함께 약간의 어려움을 겪었 srand()으므로이 양식에서 허용 가능한지 결정해야합니다.
Appleshell

출력이 무작위이므로 모든 입력에 고유 한 출력이있는 것은 아니기 때문에이 프로그램이 Bijection 요구 사항을 어떻게 충족하는지 알 수 없습니다.
Post Rock Garf Hunter

2
문제는 구현이 아닙니다. 문제는 내가 생각하기에이 도전에 대한 모든 핵심 아이디어가 부족하다는 것입니다. 귀하의 제출은 허점을 느끼게됩니다. 언어 독립성, 내장의 알 수없는 구현 (외국어는 언어에 의존하지 않고 로컬 stdlib )과 해시 / 암호화 규칙 으로 아웃소싱하여 64 바이트 제한 . 그것은 PPCG의 규칙 안에 있지만 확실히 ghosts_in_the_code가 그의 규칙으로 의도 한 것은 아닙니다.
Christoph

1
@ghosts_in_the_code 좋은 RNG와 해시 함수는 거의 되돌릴 수 없도록 설계되었습니다. 따라서 실제 구현이 이런 식으로 설계되지 않았더라도 규칙에 포함시켜야한다고 생각합니다. 어쨌든 나는이 단계에서 규칙을 변경하는 것을 권장하지 않습니다.
Christoph


2

자바 스크립트, 44 바이트 22/3

x=>a.sort()[x]
for(a=[],i=0;i<256;)a[i]=i++;

사전 식 정렬 (자바 스크립트 기본값)을 사용하여 0에서 255까지의 모든 숫자를 재정렬

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


1
22 / 3- 조금 이상한 경우에도 다른 언어가 허용되는 것 같습니다. 나는 5를 가지고 있다고 생각했지만 256은 내 방식으로 나왔다 :).
Jonathan Allan


1

자바 스크립트, 11/8 바이트

x=>x**5%257

도메인 / 범위는 1-256입니다.


흠, 많은 수의 지수로 Javascript가 나쁜가요? 이것은 루비에서 작동합니다 : repl.it/HXvZ/0
histocrat

JavaScript에는 배정 밀도 부동 소수점 만 있으므로 ~ 53 비트를 초과하는 것은 정확하게 표현할 수 없습니다. x**3x**5작동합니다.
Dennis

글쎄, 가정에 맞습니다. 언어를 바꾸겠습니다.
histocrat

또는 언어를 선호하는 규칙을 고려할 때 Dennis의 제안을 따르십시오. :) 감사합니다!
histocrat

불행히도 현재 규칙이 약간 어려워 다른 언어로 뒤집을 수 있습니다. 정확하게 정밀도 한계 때문에 이것은 JS를 사용하여 반전시키는 것이 장황합니다.
Dennis


1

자바 스크립트, 27/29 바이트

x=>x-6?x*95%127+x*98%131:65

편집 : 범위 / 도메인은 1..256입니다. 무차별 대입으로 다소 생성됩니다.


슬프게도 그것은 형 용적이지만 범위 [0,256]에 있지 않습니다 : 130의 값은 출력되지 않지만 256의 값은 (8 비트 int에 맞지 않음)입니다.
Christoph

/ 29 27 점수 . 나는 그것을 좋아한다!
Christoph

1
감사! 이 규칙을 통해 [1,256] 범위를 지정할 수 있으며 해당 범위에서 형용사입니다.
histocrat



1

루비, 23 바이트

->x{('228'*x).to_i%257}

범위와 도메인은 0..255입니다. 228을 x 번으로 연결 한 다음 결과 modulo 257을 취합니다 (0은 0에 매핑). 228은 9 이후의 첫 번째 마법 번호이며이 범위에서 작동합니다 (256을 포함하지 않는 고유 한 값 제공).


0

파이썬 3, 55 바이트

y=lambda x,i=3:x if i==0 else pow(3,y(5*x,i-1),257)-1

도메인 / 범위는 0-255입니다.


0

파이썬 3, 32 바이트 32/23

V=lambda x:((3+x)%16)*16+x//16

도메인 / 범위는 0-255입니다.

처음 4 바이트를 마지막 4 바이트로 뒤집고 첫 번째 바이트에 3을 더합니다.



0

Mathematica, 13 바이트

Mod[#^7,257]&

[0..255] 범위에서도 똑같이 유효하지만 [1..256] 범위를 사용합니다. 전체 테이블을 보려면 다음 코드 행 중 하나를 Wolfram 샌드 박스에 복사 / 붙여 넣기하십시오 .

Array[ Mod[#^7,257]&, 256]   (for a list of values in order)
Array[ Rule[#,Mod[#^7,257]]&, 256]   (for a list of input-output rules)

0

brainfuck , 37/11

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

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

별로 좋지는 않지만 0-255의 범위



@Dennis 좋은 직업! 나는 그런 바이트 언어를 사용해서는 안됩니다.
Christopher

3
그런데 언어 이름을 검열하는 것은 좋은 생각이 아닙니다. 그렇습니다.이 특정 언어는 평범하고 유치한 이름을 가지고 있지만, 모두 별표의 의미를 알고 있으며 검색 엔진이 현재 형식으로 찾을 수 없습니다.
Dennis

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