लीडरबोर्ड - JIT संकलित (कम बेहतर है)
- es1024 - 81.2 अंक (एक काम कर रहे संकलक सहित!)
- कीथ रैंडल - 116 अंक
- इल - 121 अंक
लीडरबोर्ड - व्याख्या की गई (कम बेहतर है)
- मार्टिन ब्यूटनर - 706654 अंक (लगभग 2 घंटे)।
- criptych - 30379 अंक (97 सेकंड)
आपका मिशन, क्या आपको इसे स्वीकार करने का विकल्प चुनना चाहिए, यह संभव है कि सबसे छोटा संभव बायटेकोड दुभाषिया / वीएम लिखा जाए। VM / दुभाषिया एक छोटी CISC वास्तुकला का उपयोग करता है (संचालन आकार में भिन्न हो सकता है), नीचे दी गई भाषा के साथ। पूरा होने पर, आपको यह साबित करने के लिए कि सही आउटपुट (3,126,900,366) मुद्रित करने के लिए 3 सीपीयू रजिस्टर का मूल्य प्रिंट करना होगा।
संकलक
यदि आप अपने स्वयं के परीक्षण करना चाहते हैं, तो एक संकलक नीचे पोस्ट किया गया है। अपने उत्तर के साथ अपने परीक्षणों को पोस्ट करने के लिए स्वतंत्र महसूस करें।
"वीएम" विनिर्देशों
वीएम में 3 32 बिट अहस्ताक्षरित अभिन्न रजिस्टर हैं: आर 0, आर 1, आर 2। उन्हें 0x00, 0x01 और 0x02 के रूप में हेक्स में दर्शाया गया है।
निम्नलिखित कार्यों का समर्थन किया जाना चाहिए:
प्रारूप [नाम] [... ऑपरेंड्स ...], [हेक्साडेसिमल ऑप-कोड] [... ऑपरेंड्स ने दोहराया ...]
- लोड [रजिस्टर] [4 बाइट मूल्य], 0x00 [रजिस्टर] [4 बाइट मूल्य]
- PUSH [रजिस्टर], 0x02 [रजिस्टर]
- पीओपी [रजिस्टर], 0x03 [रजिस्टर]
- ADD [रजिस्टर, 1 बाइट] [रजिस्टर, 1 बाइट], 0x04 [रजिस्टर] [रजिस्टर]
- SUB [रजिस्टर, 1 बाइट] [रजिस्टर, 1 बाइट], 0x05 [रजिस्टर] [रजिस्टर]
- MUL [रजिस्टर, 1 बाइट] [रजिस्टर, 1 बाइट], 0x06 [रजिस्टर] [रजिस्टर]
- DIV [रजिस्टर, 1 बाइट] [रजिस्टर, 1 बाइट], 0x07 [रजिस्टर] [रजिस्टर]
- JMP [कोड लाइन, 4 बाइट्स], 0x08 [4 बाइट कोड लाइन नंबर]
- सीएमपी [रजिस्टर, 1 बाइट] [रजिस्टर, 1 बाइट], 0x09 [रजिस्टर] [रजिस्टर]
- BRANCHLT [कोड लाइन, 4 बाइट्स], 0x0a [4 बाइट कोड लाइन नंबर]
कुछ नोट:
- ऊपर दिए गए गणित के संचालन में पहले रजिस्टर में आउटपुट देते हुए, एक साथ 2 रजिस्टरों के मूल्यों को जोड़ा जाता है।
- सीएमपी, तुलना ऑपरेटर, को 2 रजिस्टरों के मूल्यों की तुलना करनी चाहिए और शाखा निर्देशों पर भविष्य के उपयोग के लिए आउटपुट को कुछ आंतरिक ध्वज (यह कार्यान्वयन विशिष्ट हो सकता है) में संग्रहीत करना चाहिए।
- यदि BRANCH को CMP से पहले बुलाया जाता है, जब तक BRANCHEQ को नहीं बुलाया जाता है, "VM" को शाखा नहीं देना चाहिए।
- PUSH / POP स्टैक से अनिश्चित रूप से पुश या पॉप नंबर।
- जंप और ब्रांच ऑपरेटर एक विशिष्ट ऑपरेशन (कोड की लाइन) पर कूदते हैं, न कि बाइनरी एड्रेस।
- शाखा संचालन तुलना नहीं करते हैं। बल्कि, वे आउटपुट को निष्पादित करने की अंतिम तुलना से लेते हैं।
- ब्रांच और जंप ऑपरेटर एक शून्य आधारित लाइन नंबर इंडेक्सिंग सिस्टम का उपयोग करते हैं। (जैसे JMP 0 पहली पंक्ति में कूदता है)
- सभी ऑपरेशनों को अहस्ताक्षरित नंबरों पर किया जाना चाहिए, जो शून्य पर ओवरफ्लो करते हैं और पूर्णांक ओवरफ्लो पर एक अपवाद नहीं फेंकते हैं।
- शून्य द्वारा विभाजन की अनुमति नहीं है और इस तरह, कार्यक्रम के व्यवहार को परिभाषित नहीं किया गया है। आप कर सकते हैं (उदाहरण के लिए) ...
- प्रोग्राम को क्रैश करें।
- VM का निष्पादन समाप्त करें और इसे वर्तमान स्थिति में लौटाएं।
- एक "ERR: Division by 0" संदेश दिखाएं।
- कार्यक्रम की समाप्ति को तब परिभाषित किया जाता है जब अनुदेश सूचक कार्यक्रम के अंत तक पहुंच जाता है (एक गैर खाली कार्यक्रम माना जा सकता है)।
उत्पादन वास्तव में यह होना चाहिए (newlines शामिल)
R0 3126900366
R1 0
R2 10000
अंक
सूत्र की गणना निम्न सूत्र के आधार पर की जाती है:Number Of Characters * (Seconds Needed To Run / 2)
अलग-अलग समय के कारण होने वाले हार्डवेयर अंतर से बचने के लिए, प्रत्येक परीक्षण मेरे कंप्यूटर (i5-4210u, 8GB ram) पर या तो ubuntu सर्वर या विंडोज 8 में चलाया जाएगा, इसलिए कोशिश करें कि कुछ पागल-विदेशी-रनटाइम का उपयोग न करें जो केवल दोहरी G5 पर संकलित करता है मैक प्रो बिल्कुल 762.66 एमबी मुक्त रैम के साथ।
यदि आप एक विशेष रनटाइम / भाषा का उपयोग कर रहे हैं, तो कृपया इसके लिए एक लिंक पोस्ट करें।
- इच्छुक पार्टियों के लिए, मैंने परीक्षण कोड (C # में लिखा है) यहां पोस्ट किया है: http://pastebin.com/WYCG5Uqu
परीक्षण कार्यक्रम
से आइडिया आया यहाँ है , इसलिए हम उनके कार्यक्रम के कुछ संशोधित संस्करण का उपयोग करेंगे।
कार्यक्रम के लिए सही आउटपुट है: 3,126,900,366
सी में:
int s, i, j;
for (s = 0, i = 0; i < 10000; i++) {
for (j = 0; j < 10000; j++)
s += (i * j) / 3;
}
कोड में: [R0 s का प्रतिनिधि है, J का R1, i का R2]
LOAD R0 0
LOAD R2 0 <--outer loop value
LOAD R1 0 <--inner loop value
--Begin inner loop--
PUSH R1 <--push inner loop value to the stack
MUL R1 R2 <--(i*j)
PUSH R2
LOAD R2 3
DIV R1 R2 <-- / 3
POP R2
ADD R0 R1 <-- s+=
POP R1
PUSH R2
LOAD R2 1
ADD R1 R2 <--j++
POP R2
PUSH R2
LOAD R2 10000
CMP R1 R2 <-- j < 10000
POP R2
BRANCHLT 3 <--Go back to beginning inner loop
--Drop To outer loop--
LOAD R1 1
ADD R2 R1 <--i++
LOAD R1 10000
CMP R2 R1 <-- i < 10000
LOAD R1 0 <--Reset inner loop
BRANCHLT 2
बाइनरी / हेक्स में:
0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x02 0x00 0x00 0x00 0x00
0x00 0x01 0x00 0x00 0x00 0x00
0x02 0x01
0x06 0x01 0x02
0x02 0x02
0x00 0x02 0x00 0x00 0x00 0x03
0x07 0x01 0x02
0x03 0x02
0x04 0x00 0x01
0x03 0x01
0x02 0x02
0x00 0x02 0x00 0x00 0x00 0x01
0x04 0x01 0x02
0x03 0x02
0x02 0x02
0x00 0x02 0x00 0x00 0x27 0x10
0x09 0x01 0x02
0x03 0x02
0x0a 0x00 0x00 0x00 0x03
0x00 0x01 0x00 0x00 0x00 0x01
0x04 0x02 0x01
0x00 0x01 0x00 0x00 0x27 0x10
0x09 0x02 0x01
0x00 0x01 0x00 0x00 0x00 0x00
0x0a 0x00 0x00 0x00 0x02
बोनस अंक (प्रभाव गुणक रूप से लागू किए जाते हैं) जैसे यदि आप तीनों के लिए अर्हता प्राप्त करते हैं, तो यह होगा ((अक्षर * 0.50) * 0.75) * 0.90
- अगर इंटरप्रिटर वास्तव में JIT कंपाइलर है तो 50% की कमी
- यदि यह किसी भी प्रकार के लूप को अनियंत्रित / सार्थक अनुकूलन पर लागू करता है तो 25% की कमी होती है।
- अगर आप VM को बढ़ाते हैं तो 10% की कमी होती है
- BRANCHEQ [कोड लाइन, 4 बाइट्स] (शाखा यदि बराबर - opcode 0x0b)
- BRANCHGT [कोड लाइन, 4 बाइट्स] (शाखा यदि अधिक से अधिक - opcode 0x0c)
- BRANCHNE [कोड लाइन, 4 बाइट्स] (यदि नहीं के बराबर शाखा - opcode 0x0d)
- RLOAD [रजिस्टर 1] [रजिस्टर 2] (रजिस्टर 2 के मूल्य को रजिस्टर करने के लिए 1 - opcode 0x01)।
अनुमति नहीं देना
- कार्यक्रम में परीक्षण मामले को रोकना निषिद्ध है। आपको या तो STDIN से या एक फ़ाइल से बायटेकोड को स्वीकार करना चाहिए (इससे कोई फर्क नहीं पड़ता)।
- प्रोग्राम को चलाए बिना आउटपुट लौटना।
- किसी अन्य तरीके से आप वीएम आवश्यकता को धोखा देने के बारे में सोच सकते हैं।
CMP
कम या समानता के लिए जाँच करता है ? और इसके परिणाम का क्या होता है?
MUL
और DIV
अण्डरपास भी हैं। क्या उन्हें हस्ताक्षरित या अहस्ताक्षरित होना चाहिए? गुणन अतिप्रवाह पर क्या होता है?