सस्ते एनिग्मा मशीन (पुलिस)


15

लुटेरों के पोस्ट के लिए, सस्ता एनिग्मा मशीन (लुटेरे)

एक पुलिस के प्रस्तुत करने में एक प्रोग्राम / फ़ंक्शन शामिल होगा जो डेटा के एक बाइट को स्वीकार करता है और डेटा का एक बाइट लौटाता है। हर संभव इनपुट को एक अद्वितीय आउटपुट का उत्पादन करना चाहिए। (दूसरे शब्दों में, आपका कार्य विशेषण होना चाहिए)

लुटेरे जितना संभव हो उतना कम कोड का उपयोग करके आपका उलटा कार्य करने का प्रयास करेंगे। इसलिए आपका उद्देश्य आपके कार्य को उल्टा करना कठिन बनाता है।

आप बिल्ट-इन का उपयोग नहीं कर सकते जिनके पास हैशिंग या एन्क्रिप्शन का एकमात्र उद्देश्य है।

आपकी बाइट गिनती 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
क्या एक पुलिस सबमिशन से मिलकर बनता है? भाषा, आकार और पूर्ण कार्यक्रम / फ़ंक्शन कोड?
अरनुलद

1
अगर पुलिस सिर्फ एक मनमाने ढंग से बड़ी चीज बना सकती है तो क्या यह थोड़ा टूट गया है?
विनाशकारी नींबू

1
यह डाकू आप हो सकते हैं यदि मैं एक 64-बाइट पुलिस वाले को उत्तर देता हूं कि एन से एन के नक्शे और एक डाकू का जवाब है जो एक बाइट में एक ही काम करता है?
अरनुलद

1
आप यह निर्दिष्ट करना चाह सकते हैं कि क्या / कैसे पुलिस सबमिशन को अपडेट किया जाना चाहिए जब लुटेरे इसका जवाब दें। (सामान्य रूप से "क्रैक" अपडेट यहां लागू नहीं होता है, मुझे लगता है। कम से कम एक अद्वितीय और निश्चित दरार के रूप में नहीं।)
अर्नाड

3
दूसरे विचार पर, आप उस नियम को पूरी तरह से हटाना चाहते हैं। मैं जेली में एक डाकू को पोस्ट करके अधिकांश उत्तरों को नष्ट कर सकता हूं।
डेनिस

जवाबों:


7

जावास्क्रिप्ट, 11 8 बाइट्स, स्कोर: 8/5

x=>x^x/2

ग्रे कोड का सरल कार्यान्वयन। हमें डिकोड करने के लिए एक पूरे लूप की आवश्यकता होती है। आइए देखें कि सबसे छोटा या बिना लूप के भी कौन आता है!


मुझे लगता है कि x^x/4मुश्किल होगा क्योंकि वहाँ इसके लिए नहीं बनाया जाना चाहिए ...
क्रिस्टोफ़


1
यह कैसे विशेषण है?
लीकी नून

1
@LeakyNun उम्म सुनिश्चित नहीं है कि आप किस तरह के उत्तर की उम्मीद करते हैं, लेकिन मैं कोशिश करूंगा: ग्रे कोड एक संख्या का प्रतिनिधित्व करने का एक वैकल्पिक रूप है जहां प्रत्येक लगातार संख्या केवल 1 बिट (हैमिग दूरी हमेशा 1) में बदलती है। प्रत्येक संख्या के लिए वास्तव में एक ग्रे एन्कोडिंग और एक बाइनरी एन्कोडिंग है, इसलिए वे एक आक्षेप बनाते हैं। उदाहरण 7 बाइनरी में 0111 और ग्रे में 0100 है, अगली संख्या 8 बाइनरी में 1000 और ग्रे में 1100 है। ग्रे कोडिंग मूल रूप से बाइनरी का एज कोडिंग है।
क्रिस्टोफ़

1
@LeakyNun बिटकॉइन एक्सर ^है, एक्सप्रेशन नहीं। वैसे भी यह जादू दिखता है
гвгений Новиков

7

सी, 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

ध्यान दें कि अन्य प्रणालियों पर, यह अलग (लेकिन अभी भी मान्य) आउटपुट का उत्पादन कर सकता है, क्योंकि सी एक विशेष को अनिवार्य नहीं करता है rand कार्यान्वयन को है। मेरा सबमिशन विशेष रूप से टीआईओ (जैसा जुड़ा हुआ) पर चलने वाला संस्करण है।


मैं काफी निराश हूं कि मुझे f(x){return rand(srand(x*229))/229%256;}TIO पर काम करने के लिए अपने मूल ( ) जैसे संस्करण नहीं मिल पाए , क्योंकि मुझे लगता है कि यह बहुत अधिक सुरुचिपूर्ण है। चूँकि यह केवल OS X पर चलने वाले Clang पर काम करता है, इसलिए यह प्रतियोगिता के लिए उचित नहीं है। यह अभी भी बहुत अजीब है उल्टा है, इसलिए मुझे लगता है कि पर्याप्त है।


खैर..यह मनोरंजक है!
मैथ्यू रोह

यहाँ समाधान , लेकिन मेरे पास आपके साथ एक कठिन समय था srand(), इसलिए आपको यह तय करना होगा कि क्या यह इस रूप में स्वीकार्य है।
App ’

मैं यह देखने में विफल रहता हूं कि यह प्रोग्राम बायजेन्स आवश्यकता को कैसे पूरा करता है, क्योंकि आउटपुट यादृच्छिक है हर इनपुट में एक अद्वितीय आउटपुट नहीं है।
पोस्ट रॉक गार्फ हंटर

2
समस्या कार्यान्वयन नहीं है। समस्या यह है कि इसमें कमी है कि मुझे क्या लगता है कि इस चुनौती के सभी प्रमुख विचार हैं: एक ट्रिबल एल्गोरिथ्म खोजना (इसलिए 64 बाइट्स और भाषा स्वतंत्र तक सीमित है) जो रिवर्स करने के लिए नॉनट्रीट है। आपका सबमिशन "महसूस" करने के लिए पर निर्भर करता है: भाषा स्वतंत्रता, एक बाइटिन के अनजान कार्यान्वयन के लिए आउटसोर्सिंग द्वारा 64 बाइट की सीमा (रैंड भाषा पर नहीं, बल्कि स्थानीय stdlib ) और हैश / एन्क्रिप्शन नियम पर निर्भर करती है । यह PPCG के नियमों के भीतर है, लेकिन निश्चित रूप से ऐसा नहीं है कि घोस्ट_इन_थे_कोड अपने नियमों के साथ है।
क्रिस्टोफ

1
@ghosts_in_the_code अच्छे RNG और हैश फ़ंक्शन दोनों को शायद ही प्रतिवर्ती होने के लिए डिज़ाइन किया गया है। इसलिए मुझे लगता है कि उन्हें उस नियम में शामिल किया जाना चाहिए (भले ही वास्तविक कार्यान्वयन इस तरह से डिज़ाइन नहीं किया गया हो)। वैसे भी मैं इस स्तर पर नियमों को बदलने की सिफारिश नहीं करता हूं।
क्रिस्टोफ


2

जावास्क्रिप्ट, 44 बाइट्स 22/3

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

0-255 से सभी नंबरों को पुनर्व्यवस्थित करने के लिए lexicographic सॉर्ट (जावास्क्रिप्ट डिफ़ॉल्ट) का उपयोग करता है

इसे ऑनलाइन आज़माएं!


1
22/3 - भिन्न भाषा स्वीकार्य लगती है, भले ही थोड़ी विषम हो। मुझे लगा कि मेरे पास 5 हैं, लेकिन 256 मेरे रास्ते में मिला :)।
जोनाथन एलन

2

सी (जीसीसी) , 32 27/30 बाइट्स

5 बाइट्स गोल्फ के लिए क्रिस्टोफ़ के लिए धन्यवाद ।

f(x){x=x?f(x*5+1&255)+1:0;}

इसे ऑनलाइन आज़माएं!


1
स्कोर 32/30 । आप के f(x){x=x?f(x*5+1&255)+1:0;}स्कोर के लिए स्विच करना चाह सकते हैं 27/30
क्रिस्टोफ

1

जावास्क्रिप्ट, 11/8 बाइट्स

x=>x**5%257

डोमेन / रेंज 256 के माध्यम से 1 है।


हम्म, क्या बड़ी संख्या में प्रतिपादकों के साथ जावास्क्रिप्ट खराब है? यह रूबी में काम करता है: repl.it/HXvZ/0
histocrat

जावास्क्रिप्ट में केवल डबल-सटीक फ़्लोट्स हैं, इसलिए ~ 53 बिट्स से अधिक के साथ कुछ भी सटीक रूप से प्रस्तुत नहीं किया जा सकता है। x**3और x**5काम करना चाहिए।
डेनिस

ठीक है, मुझे संभालने के लिए सही काम करता है। मैं भाषा बदल दूंगा।
हिस्टोक्रेट

या डेनिस का सुझाव, नियमों को पक्षपाती भाषाओं के पक्ष में दिया गया। :) धन्यवाद!
हिस्टोक्रेट

दुर्भाग्य से, इस समय नियम थोड़े टूटे हुए हैं, और मुझे इसे दूसरी भाषा के साथ उलटने की अनुमति होगी। सटीक रूप से सटीक सीमा के कारण, यह जेएस का उपयोग करके उलटा करने के लिए क्रियात्मक होगा।
डेनिस


1

जावास्क्रिप्ट, 27/29 बाइट्स

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

Edit: Range/Domain is 1..256. Generated via brute force, more or less.


Sadly it's bijective but not in range [0,256): the value of 130 is never outputted but a value of 256 is (which doesn't fit a 8 bit int).
Christoph

Score 27 / 29. I like it !
Christoph

1
Thanks! The rules allow me to specify a range of [1,256], and it's bijective on that range.
histocrat

1

Octave, 16/6

@(x)mod(x*3,256)

Try it online!


1
Score: 16/6 (Note: I don't think it should be allowed to use another language for the robber submission, but at this point, it is.)
Dennis

1
It would also be interesting to know whether I can try to beat your robber submission by making another cop (again using Jelly or MATL too)
flawr


1

Ruby, 23 bytes

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

Range and domain is 0..255. Concatenate 228 to itself x times, then take the result modulo 257 (0 maps to 0). 228 is the first magic number after 9 that works for this range (gives distinct values that don't include 256).


0

Python 3, 55 bytes

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

Domain/Range is 0-255.



0

Mathematica, 13 bytes

Mod[#^7,257]&

Uses the range [1..256], although it's equally valid on the range [0..255]. To see the entire table, copy/paste one of the following lines of code into the Wolfram sandbox:

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

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

Try it online!

Not very good but range of 0-255



@Dennis Nice job! I should not use such a bytey language.
Christopher

3
By the way, censoring language names isn't a good idea. Yes, this particular languages has an ordinary and childish name, but everyone knows what the asterisk stands for, and it cannot be found by the search engine in its current form.
Dennis

@Dennis finally fixed that
Christopher
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.