เครื่อง Enigma (ตำรวจ)


15

สำหรับโพสต์ของโจรเครื่อง Cheapo Enigma (โจร)

การส่งของตำรวจจะประกอบด้วยโปรแกรม / ฟังก์ชั่นที่ยอมรับข้อมูลหนึ่งไบต์และส่งกลับข้อมูลหนึ่งไบต์ ทุกอินพุตที่เป็นไปได้ต้องสร้างเอาต์พุตเฉพาะ (ในคำอื่น ๆ ฟังก์ชั่นของคุณจะต้อง bijective)

โจรจะพยายามสร้างฟังก์ชันผกผันของคุณโดยใช้รหัสสั้นที่สุด ดังนั้นวัตถุประสงค์ของคุณคือทำให้การทำงานของคุณยากที่จะกลับด้าน

คุณไม่สามารถใช้บิวด์อินที่มีวัตถุประสงค์เพื่อการแฮชหรือการเข้ารหัส แต่เพียงผู้เดียว

จำนวนไบต์ของคุณต้องไม่เกิน 64 ไบต์ โซลูชั่น 0 ไบต์ไม่มีสิทธิ์ชนะ

รูปแบบอินพุต / เอาต์พุต

8 บิต (0 หรือ 1) หรือจำนวนเต็ม 10 ฐานในช่วง 1-256, 0-255 หรือ -128 ถึง 127 สามารถใช้ I / O มาตรฐานหรือไฟล์ I / O ฟังก์ชั่นยังสามารถคืนค่าเป็นเอาท์พุท อินพุตและเอาต์พุตควรอยู่ในช่วงเดียวกัน (ไบนารี, 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
มันไม่ได้หักสักนิดไหมถ้าตำรวจทำเรื่องใหญ่โดยพลการ?
เลมอนที่ถูกทำลายได้

1
โจรตัวนี้อาจเป็นคุณถ้าฉันโพสต์คำตอบตำรวจ 64- บิตที่แมป N ถึง N และคำตอบโจรที่ทำสิ่งเดียวกันในหนึ่งไบต์?
Arnauld

1
คุณอาจต้องการระบุว่า / ควรปรับปรุงข้อมูลการส่งตำรวจอย่างไรเมื่อโจรตอบคำถาม (การอัปเดต "แตก" ตามปกติไม่ได้ใช้ที่นี่ฉันเดาว่าอย่างน้อยก็ไม่ใช่รอยแตกที่แตกต่างและชัดเจน)
Arnauld

3
ในความคิดที่สองคุณอาจต้องการลบกฎนั้นโดยสิ้นเชิง ฉันสามารถทำลายคำตอบส่วนใหญ่ได้ด้วยการโพสต์โจรในเจลลี่
เดนนิส

คำตอบ:


7

Javascript, 11 8 ไบต์, คะแนน: 8/5

x=>x^x/2

ใช้งานง่ายของรหัสสีเทา การถอดรหัสนั้นต้องใช้ทั้งลูป มาดูกันว่าใครจะมาด้วยขนาดที่เล็กที่สุด


ผมคิดว่าx^x/4จะยากเพราะไม่ควรมี builtins มัน ...
คริสโต


1
Bijective นี้เป็นอย่างไร
Leun Nun

1
@LeakyNun อืมไม่แน่ใจว่าคำตอบแบบไหนที่คุณคาดหวัง แต่ฉันจะลอง: รหัสสีเทาเป็นรูปแบบทางเลือกในการแสดงตัวเลขซึ่งแต่ละหมายเลขติดต่อกันจะเปลี่ยนเป็น 1 บิตเท่านั้น (ระยะทาง hammig คือ 1 เสมอ) สำหรับแต่ละหมายเลขมีการเข้ารหัสสีเทาหนึ่งรหัสและการเข้ารหัสไบนารีหนึ่งรายการดังนั้นพวกเขาจึงสร้าง bijection เช่น 7 คือ 0111 ในไบนารีและ 0100 ในสีเทาหมายเลข 8 ถัดไปคือ 1000 ในไบนารีและ 1100 ในสีเทา การเข้ารหัสสีเทานั้นเป็นรหัสขอบของไบนารี
Christoph

1
@LeakyNun ^คือbitor 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 เนื่องจากฉันคิดว่ามันดีกว่านี้มาก เนื่องจากใช้งานได้กับ Clang ที่ทำงานบน OS X เท่านั้นจึงไม่ยุติธรรมสำหรับการแข่งขัน คนนี้ยังค่อนข้างงุ่มง่ามที่จะกลับดังนั้นฉันก็พอเดา


ดี .. นี่มันน่าขบขัน!
Matthew Roh

วิธีแก้ปัญหาที่นี่แต่ฉันมีเวลาค่อนข้างยากกับคุณsrand()ดังนั้นคุณจะต้องตัดสินใจว่ามันเป็นที่ยอมรับในรูปแบบนี้หรือไม่
Appleshell

ฉันไม่สามารถดูว่าโปรแกรมนี้ตอบสนองความต้องการ Bijection ได้อย่างไรเนื่องจากเอาต์พุตเป็นแบบสุ่มไม่ใช่อินพุตทุกตัวมีเอาต์พุตเฉพาะ
โพสต์ Rock Garf Hunter

2
ปัญหาไม่ได้เกิดจากการใช้งาน ปัญหาคือว่ามันขาดสิ่งที่ฉันคิดว่าเป็นความคิดหลักของความท้าทายนี้: การค้นหาอัลกอริทึม trival (จำกัด อยู่ที่ 64 ไบต์และไม่ขึ้นกับภาษา) ที่ไม่สามารถย้อนกลับได้ การส่งข้อมูลของคุณ "รู้สึก" เพื่อหลีกเลี่ยง : ความเป็นอิสระทางภาษาขีด จำกัด 64 ไบต์โดยการเอาต์ซอร์ซมาใช้ในการติดตั้งที่ไม่รู้จัก (rand ไม่ได้ขึ้นอยู่กับภาษา แต่เป็นstdlib ในพื้นที่ ) และกฎแฮช / การเข้ารหัส มันเป็นไปตามกฎของ PPCG แต่ไม่ใช่สิ่งที่ ghosts_in_the_code ตั้งใจไว้กับกฎของเขา
Christoph

1
@ghosts_in_the_code ฟังก์ชั่น RNG และ hash ที่ดีได้รับการออกแบบมาเพื่อให้สามารถย้อนกลับได้ยาก ดังนั้นฉันคิดว่าควรรวมไว้ในกฎนั้น (แม้ว่าการใช้งานจริงอาจไม่ได้รับการออกแบบด้วยวิธีนี้) อย่างไรก็ตามฉันไม่แนะนำและเปลี่ยนกฎในขั้นตอนนี้
Christoph


2

JavaScript, 44 ไบต์22/3

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

ใช้การเรียงลำดับพจนานุกรม (Javascript Default) เพื่อจัดเรียงตัวเลขทั้งหมดใหม่จาก 0-255

ลองออนไลน์!


1
22/3 - ภาษาที่แตกต่างกันดูเหมือนจะยอมรับได้แม้ว่าจะแปลกเล็กน้อย ฉันคิดว่าฉันมี 5 แต่ 256 ได้มาในทางของฉัน :)
Jonathan Allan


1

Javascript, 11/8ไบต์

x=>x**5%257

โดเมน / ช่วงคือ 1 ถึง 256


หืมม Javascript ไม่ดีกับเลขชี้กำลังจำนวนมากหรือไม่ ใช้งานได้ใน Ruby: repl.it/HXvZ/0
histocrat

JavaScript มีเพียงความแม่นยำสองระดับเท่านั้นดังนั้นสิ่งใดก็ตามที่มีมากกว่า ~ 53 บิตไม่สามารถแสดงได้อย่างแม่นยำ x**3และx**5ควรทำงาน
เดนนิส

เอาล่ะทำหน้าที่ฉันที่ถูกต้องสำหรับการสมมติ ฉันจะเปลี่ยนภาษา
ประวัติศาสตร์

หรือทำตามข้อเสนอแนะของเดนนิสตามกฎที่นิยมภาษาผู้ใช้ :) ขอขอบคุณ!
ประวัติศาสตร์

น่าเสียดายที่ตอนนี้กฎแตกไปนิดหน่อยและฉันจะได้รับอนุญาตให้พลิกกลับเป็นภาษาอื่นได้ แม่นยำเนื่องจากข้อ จำกัด ความแม่นยำนี่จะค่อนข้าง verbose ที่จะกลับไปใช้ JS
เดนนิส


1

Javascript, 27/29ไบต์

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

แก้ไข: ช่วง / โดเมนคือ 1.256 สร้างโดยใช้กำลังดุร้ายมากหรือน้อย


น่าเศร้าที่มันเป็น bijective แต่ไม่อยู่ในช่วง [0,256): ค่า 130 ไม่เคยถูกส่งออก แต่ค่า 256 คือ (ซึ่งไม่พอดีกับ 8 บิต int)
Christoph

คะแนน 27/29 ฉันชอบมัน !
Christoph

1
ขอบคุณ! กฎอนุญาตให้ฉันระบุช่วง [1,256] และเป็น bijective ของช่วงนั้น
ฮิสโทแกต

1

1
คะแนน: 16/6 (หมายเหตุ: ฉันไม่คิดว่าควรอนุญาตให้ใช้ภาษาอื่นในการส่งตัวโจร แต่ ณ จุดนี้เป็นเช่นนั้น)
Dennis

1
นอกจากนี้ยังจะน่าสนใจที่จะรู้ว่าฉันสามารถพยายามที่จะเอาชนะการส่งโม่งของคุณโดยการตำรวจอื่น (อีกครั้งโดยใช้เจลลี่หรือ MATL เกินไป)
flawr


1

Ruby, 23 ไบต์

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

ช่วงและโดเมนคือ 0..255 เชื่อม 228 เข้ากับตัวเอง x ครั้งจากนั้นนำโมดูโลผลลัพธ์ 257 (0 แมปไปที่ 0) 228 เป็นหมายเลขเวทย์มนตร์แรกหลังจาก 9 ที่ใช้งานได้ในช่วงนี้ (ให้ค่าที่แตกต่างซึ่งไม่รวม 256)




0

Mathematica ขนาด 13 ไบต์

Mod[#^7,257]&

ใช้ช่วง [1..256] แม้ว่าจะใช้ได้ในช่วง [0..255] เท่า ๆ กัน หากต้องการดูตารางทั้งหมดให้คัดลอก / วางหนึ่งในบรรทัดของรหัสต่อไปนี้ลงในSandram 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 ทำได้ดีมาก! ฉันไม่ควรใช้ภาษา bytey ดังกล่าว
Christopher

3
อย่างไรก็ตามการปิดกั้นชื่อภาษาไม่ใช่ความคิดที่ดี ใช่ภาษานี้โดยเฉพาะมีชื่อสามัญและเป็นเด็ก แต่ทุกคนรู้ว่าเครื่องหมายดอกจันหมายถึงอะไรและเครื่องมือค้นหาไม่สามารถพบได้ในรูปแบบปัจจุบัน
Dennis

@Dennis ในที่สุดก็แก้ไขได้
Christopher
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.