एडलर -32 चेकसम की गणना करें


32

पृष्ठभूमि

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

परिभाषा

चलो बी = [ख 1 , ⋯, ख n ] एक बाइट सरणी होना।

के एडलर -32 चेकसम बी के परिणाम के रूप में परिभाषित किया गया कम + 65536 × उच्च है, जहां:

  • कम: = ((1 + b 1 + = + b n ) mod 65521)

  • उच्च: = (((1 + b 1 ) + (1 + b 1 + b 2 ) + ⋯ (1 + b 1 + ) + b n )) mod 65521)

कार्य

इनपुट के रूप में एक बाइट सरणी को देखते हुए, गणना करें और अपने एडलर -32 चेकसम को लौटाएं, जो निम्नलिखित का पालन करता है।

  • आप इनपुट को बाइट्स या पूर्णांकों की एक सरणी के रूप में, या एक स्ट्रिंग के रूप में ले सकते हैं।

    दोनों स्थितियों में, मुद्रण योग्य ASCII वर्णों के अनुरूप केवल बाइट्स इनपुट में होंगे।

    आप मान सकते हैं कि इनपुट की लंबाई 0 <लंबाई4096 को संतुष्ट करेगी ।

  • यदि आप आउटपुट प्रिंट करना चुनते हैं, तो आप 256 तक किसी भी सकारात्मक आधार का उपयोग कर सकते हैं।

    यदि आप यूनरी चुनते हैं, तो सुनिश्चित करें कि दुभाषिया 16 गीब रैम के साथ मशीन पर आउटपुट के 2 32 - 983056 बाइट्स को संभाल सकता है ।

  • बिल्ट-इन जो एडलर -32 चेकसम की गणना करते हैं, निषिद्ध हैं।

  • मानक नियम लागू होते हैं।

परीक्षण के मामलों

String:     "Eagles are great!"
Byte array: [69, 97, 103, 108, 101, 115, 32, 97, 114, 101, 32, 103, 114, 101, 97, 116, 33]
Checksum:   918816254

String:     "Programming Puzzles & Code Golf"
Byte array: [80, 114, 111, 103, 114, 97, 109, 109, 105, 110, 103, 32, 80, 117, 122, 122, 108, 101, 115, 32, 38, 32, 67, 111, 100, 101, 32, 71, 111, 108, 102]
Checksum:   3133147946

String:     "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
Byte array: [126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126]
Checksum:   68095937

String:     <1040 question marks>
Byte array: <1040 copies of 63>
Checksum:   2181038080

7
मैं ध्यान दूंगा कि यहां कई उत्तर बड़े या बहुत बड़े इनपुट अनुक्रमों के साथ विफल हो जाएंगे, जब वे 32 या 64-बिट पूर्णांक रकमों को ओवरफ्लो करते हैं, जब तक कि संगणों की गणना नहीं की जाती है तब तक मोडुलो ऑपरेशन को स्थगित करने के कारण। सही मायने में आज्ञाकारी कार्यान्वयन को समय-समय पर मॉडुलो ऑपरेशन करने की आवश्यकता होती है ताकि समय-समय पर रकम को बहने से बचाया जा सके। एक 32-बिट हस्ताक्षरित पूर्णांक केवल 4096 0xff के बाद ओवरफ्लो हो जाएगा। 0xff के 256 MiB के बाद 64-बिट हस्ताक्षरित पूर्णांक ओवरफ्लो हो जाएगा।
मार्क एडलर

@ मर्क एडलर एचएम, निष्पक्ष बिंदु। चूंकि मैंने यह निर्दिष्ट नहीं किया है कि समाधानों को मनमाने ढंग से लंबे तार के लिए काम करना होगा और मैं मौजूदा उत्तरों को अमान्य नहीं करना चाहता, मैं इनपुट की लंबाई के लिए एक सीमा निर्धारित करूंगा।
डेनिस

@MarkAdler मुझे नहीं लगता कि यह मायने रखता है। मुझे पूरा यकीन है कि अतिप्रवाह (हस्ताक्षरित 32-बिट पूर्णांक) केवल 4104 या अधिक बाइट्स इनपुट के साथ हो सकता है, क्योंकि मोडुलो n * (n + 1) / 2 * 255 + n से पहले उच्च का अधिकतम मूल्य है । उसके ऊपर, चुनौती मुद्रण योग्य ASCII वर्णों के अनुरूप बाइट्स के लिए प्रतिबंधित करती है।
डेनिस

हम भाषाओं को उनके संख्यात्मक प्रकारों को ओवरफ्लो करने की अनुमति भी दे सकते हैं, और केवल यह आवश्यक है कि लौटा परिणाम समकक्ष हो, सही परिणाम के लिए अतिप्रवाह के लिए लेखांकन।
मील

1
@PeterCordes हाँ, 32-बिट की सरणियाँ पूरी तरह से ठीक हैं। कम से कम मेरी राय में, सबमिशन को एल्गोरिथ्म को गोल करने पर ध्यान केंद्रित करना चाहिए, और I / O के लिए जितना संभव हो उतना कम ध्यान देना चाहिए।
डेनिस

जवाबों:


3

जेली, 19 17 बाइट्स

+\,S‘S€%65521ḅ⁹²¤

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

+\,S‘S€%65521ḅ⁹²¤    Main monadic chain. Takes array as only argument.

                     The array is shown here as [b1 b2 ... bn].
+\                   Reduce by addition (+) while returning immediate results.
                         yields [b1 b1+b2 ... b1+b2+...+bn].

  ,                  Concatenate with...
   S                 the sum of the argument.
                         yields [[b1 b1+b2 ... b1+b2+...+bn] b1+b2+...+bn].

    ‘                Increment [each].
                         yields [[1+b1 1+b1+b2 ... 1+b1+b2+...+bn] 1+b1+b2+...+bn].

     S€              Sum each list.
                         yields [[1+b1+1+b1+b2+...+1+b1+b2+...+bn] 1+b1+b2+...+bn].

       %65521        Modulo [each] by 65521.

             ḅ⁹²¤    Convert from base    65536    to integer.
              ⁹                        256
               ²                           squared

अभी तक बेहतर:⁹²¤
डेनिस

1
@ डेनिस मैंने तब आपकी 18-बाइट को निकाल दिया था।
लीक नन

1
ठीक है, आप आगे बढ़ चुके हैं ..
लीक नून

64

मैथेमेटिका, 46 बाइट्स

{1,4^8}.Fold[##+{0,#&@@#}&,{1,0},#]~Mod~65521&

एक अनाम फ़ंक्शन जो पूर्णांक सरणी लेता है और एडलर -32 देता है, कुछ मील और मार्टिन से सुधार के साथ (टिप्पणियां देखें)।

मील 'भी 46 बाइट्स है , लेकिन तेजी से:

{1,4^8}.{Tr@#+1,Tr[Accumulate@#+1]}~Mod~65521&

37
... क्या आप सिर्फ अपने प्रसिद्ध एल्गोरिथ्म गोल्फ?
मेगो

25
मुझे माफ़ कर दो अगर मैं थोड़ा स्टार हूं। यह हर रोज़ नहीं है कि आप सॉफ्टवेयर इंजीनियरिंग में इतना बड़ा नाम हमारी छोटी सी साइट पर देखें। नाव पर स्वागत है!
मेगो

6
यह सब बड़ा नहीं है।
मार्क एडलर

3
यदि आप मुझसे मतलब रखते हैं, तो यह पहली बार है जब मैंने गणितज्ञ में एडलर -32 को लागू करने के बारे में सोचा।
मार्क एडलर

9
या शायद आपने कोड गोल्फ में शामिल होने के बाद से ही इस समाधान को तैयार कर लिया है, बस इसके पूछे जाने की प्रतीक्षा कर रहे हैं। "आखिरकार!" ;-)
एंटी हापला

13

जूलिया, 73 46 बाइट्स

x->[sum(x)+1;sum(cumsum(x)+1)]%65521⋅[1;4^8]

यह एक अनाम फ़ंक्शन है जो किसी सरणी को स्वीकार करता है और पूर्णांक देता है। इसे कॉल करने के लिए, इसे एक वैरिएबल पर असाइन करें।

हम गठबंधन करते हैं sum(x) + 1 और sum(cumsum(x) + 1)एक सरणी है, जहां में xइनपुट सरणी है, और प्रत्येक सापेक्ष 65521. ले हम तो 1 और 4 के साथ डॉट उत्पाद की गणना 8 , जो हमें देता है (sum(x) + 1) + 4^8 * sum(cumsum(x) + 1), जो वास्तव में एडलर -32 सूत्र है।

इसे ऑनलाइन आज़माएं! (सभी परीक्षण मामले शामिल हैं)

Sp3000 और डेनिस के लिए 27 बाइट्स बचाए गए!


वाह, यह वास्तव में चालाक है।
बिल्ली

@ मुझे सबसे अधिक चतुरता के लिए धन्यवाद देने के लिए Sp3000 और डेनिस है। :)
एलेक्स ए।

11

x86-64 मशीन कोड फ़ंक्शन: 33 32 बाइट्स (या इनपुट के बजाय 31 30 बाइट्स )int[]char[]

x86-32 मशीन कोड फ़ंक्शन: 31 बाइट्स

जीएनयू सी इनलाइन- एसएसएम कोड टुकड़ा के रूप में: 2 बी 1 बी (बस retइंस) बचाता है ।

टिप्पणी की स्रोत और परीक्षण चालक GitHub पर

64 बिट संस्करण मानक सिस्टम वी x86-64 एबीआई के साथ सी से सीधे कॉल करने योग्य है (2 डमी आर्ग का उपयोग करके मैं चाहता हूं कि रेज में आ जाता है)। कस्टम कॉलिंग कन्वेंशन asm कोड के लिए असामान्य नहीं हैं, इसलिए यह एक बोनस सुविधा है।

32 बिट मशीन कोड 1 बी बचाता है, क्योंकि उच्च और निम्न हिस्सों के साथ विलय push16/push16 => pop32 केवल 32 बिट मोड में काम करने के करता है। एक 32 बिट फ़ंक्शन को कस्टम कॉलिंग कन्वेंशन की आवश्यकता होगी। हमें इसके खिलाफ पकड़ नहीं बनानी चाहिए, लेकिन C से कॉल करने के लिए एक आवरण फ़ंक्शन की आवश्यकता होती है।

4096 ~(एएससीआईआई 126) बाइट्स को संसाधित करने के बाद high = 0x3f040000, low = 0x7e001,। इसलिए highसबसे महत्वपूर्ण बिट अभी तक सेट नहीं किया गया है। मेरे कोड इस का लाभ लेता है, सदस्यता का विस्तार eaxमें edx:eaxसाथ cdqके शून्यीकरण के तरीके के रूप edx

# See the NASM source below
0000000000401120 <golfed_adler32_amd64>:
  401120:       31 c0                   xor    eax,eax
  401122:       99                      cdq    
  401123:       8d 7a 01                lea    edi,[rdx+0x1]
0000000000401126 <golfed_adler32_amd64.byteloop>:
  401126:       ac                      lods   al,BYTE PTR ds:[rsi]
  401127:       01 c7                   add    edi,eax
  401129:       01 fa                   add    edx,edi
  40112b:       e2 f9                   loop   401126 <golfed_adler32_amd64.byteloop>
000000000040112d <golfed_adler32_amd64.end>:
  40112d:       66 b9 f1 ff             mov    cx,0xfff1
  401131:       92                      xchg   edx,eax
  401132:       99                      cdq    
  401133:       f7 f1                   div    ecx
  401135:       52                      push   rdx
  401136:       97                      xchg   edi,eax
  401137:       99                      cdq    
  401138:       f7 f1                   div    ecx
  40113a:       66 52                   push   dx      # this is the diff from last version: evil push/pop instead of shift/add
  40113c:       58                      pop    rax
  40113d:       66 5a                   pop    dx
  40113f:       c3                      ret    
0000000000401140 <golfed_adler32_amd64_end>:

0x40 - 0x20 = 32 बाइट्स।


टिप्पणी की NASM स्रोत:

चाल:

  • xchg eax, r32एक बाइट है; mov से सस्ता है। 8086 को कुल्हाड़ी में डेटा की जरूरत थी> = 386 की तुलना में बहुत अधिक सामान के लिए, इसलिए उन्होंने अब-शायद ही कभी इस्तेमाल किए जाने वाले ओपोड-स्पेस पर बहुत खर्च करने का फैसला किया xchg ax, r16

  • उच्च और निम्न को एक ही रजिस्टर में मर्ज करने के लिए push64 और push16 को मिलाना दो divएस के आसपास reg-reg डेटा मूवमेंट निर्देशों को बचाता है । इस चाल का 32 बिट संस्करण और भी बेहतर काम करता है: push16 / push16 / pop32केवल 5B कुल, 6 नहीं।

चूंकि हम धक्का / पॉप करते हैं, इसलिए यह SysV amd64 ABI (एक लाल क्षेत्र के साथ) में इनलाइन asm के लिए सुरक्षित नहीं है

golfed_adler32_amd64_v3:   ; (int dummy, const char *buf, int dummy, uint64_t len)

    ;; args: len in rcx,  const char *buf in rsi
    ;; Without dummy args, (unsigned len, const char *buf),  mov ecx, edi is the obvious solution, costing 2 bytes

    xor     eax,eax         ; scratch reg for loading bytes
    cdq                     ; edx: high=0
    lea     edi, [rdx+1]    ; edi: low=1
    ;jrcxz  .end            ; We don't handle len=0.  unlike rep, loop only checks rcx after decrementing
.byteloop:
    lodsb                   ; upper 24b of eax stays zeroed (no partial-register stall on Intel P6/SnB-family CPUs, thanks to the xor-zeroing)
    add     edi, eax        ; low += zero_extend(buf[i])
    add     edx, edi        ; high += low
    loop   .byteloop
.end:
    ;; exit when ecx = 0, eax = last byte of buf
    ;; lodsb at this point would load the terminating 0 byte, conveniently leaving eax=0

    mov     cx, 65521       ; ecx = m = adler32 magic constant.  (upper 16b of ecx is zero from the loop exit condition.  This saves 1B over mov r32,imm32)
    ;sub    cx, (65536 - 65521) ; the immediate is small enough to use the imm8 encoding.  No saving over mov, though, since this needs a mod/rm byte

    xchg    eax, edx        ; eax = high,  edx = buf[last_byte]
    cdq                     ; could be removed if we could arrange things so the loop ended with a load of the 0 byte

    div     ecx             ; div instead of idiv to fault instead of returning wrong answers if high has overflowed to negative.  (-1234 % m is negative)
    push    rdx             ; push high%m and 6B of zero padding

    xchg    eax, edi        ; eax=low
    cdq
    div     ecx             ; edx = low%m

    ;; concatenate the two 16bit halves of the result by putting them in contiguous memory
    push    dx              ; push low%m with no padding
    pop     rax             ; pop  high%m << 16 | low%m   (x86 is little-endian)

    pop     dx              ; add rsp, 2 to restore the stack pointer

    ;; outside of 16bit code, we can't justify returning the result in the dx:ax register pair
    ret
golfed_adler32_amd64_end_v3:

मैंने rcxदो लूप काउंटरों के बजाय एक सरणी सूचकांक के रूप में उपयोग करने पर भी विचार किया , लेकिन adler32 (s)! = Adler32 (रिवर्स (s))। इसलिए हम उपयोग नहीं कर सके loop। -लेन की गिनती शून्य की ओर करना और movzx r32, [rsi+rcx]बस बहुत से बाइट्स का उपयोग करना।

अगर हम अपने आप को पॉइंटर बढ़ाने पर विचार करना चाहते हैं, तो 32 बिट कोड शायद जाने का रास्ता है। यहां तक ​​कि x32 एबीआई (32 बिट पॉइंटर्स) पर्याप्त नहीं है, क्योंकि inc esi2 बी amd64 पर है, लेकिन i386 पर 1 बी। यह प्रत्येक तत्व को बाजी में शून्य-विस्तारित करने के लिए हरा xor eax,eax/ lodsb/ loop: 4 बी कुल मिलाकर कठिन प्रतीत होता है । inc esi/ movzx r32, byte [esi]/ loop5 बी है।

scas64 बी मोड में 1 बी इंस्ट्रक्शन के साथ पॉइंटर को बढ़ाने के लिए एक और विकल्प है। ( rdi/ के ediबजाय rsi, इसलिए हम पॉइंटर arg को अंदर ले जाएंगे rdi)। हम ध्वज परिणाम का उपयोग scasलूप स्थिति के रूप में नहीं कर सकते हैं, हालाँकि, क्योंकि हम eax को शून्य रखना नहीं चाहते हैं। अलग-अलग रजिस्टर आवंटन लूप के बाद बाइट को बचा सकता है।


int[] इनपुट

पूर्ण फ़ंक्शन लेना uint8_t[]"मुख्य" उत्तर है, क्योंकि यह एक अधिक दिलचस्प चुनौती है। int[]हमारे कॉलर को इस भाषा में करने के लिए कहने के लिए अनपैक करना एक अनुचित बात है, लेकिन यह 2B को बचाता है।

यदि हम अपने इनपुट को 32 बिट पूर्णांक के अनपैक्ड सरणी के रूप में लेते हैं, तो हम एक बाइट को आसानी से बचा सकते हैं (उपयोग करें lodsdऔर xor eax,eax / cdqबस के साथ बदलें xor edx,edx)।

हम lodsd/ के साथ edx को शून्य करके एक और बाइट बचा सकते हैं cdq, और लूप को फिर से व्यवस्थित कर सकते हैं ताकि यह बाहर निकलने से पहले 0 तत्व को समाप्त कर दे। (हम अभी भी मान रहे हैं कि यह मौजूद है, भले ही यह intएक स्ट्रिंग है, स्ट्रिंग नहीं)।

; untested: I didn't modify the test driver to unpack strings for this
golfed_adler32_int_array:
    ; xor   edx,edx
    lodsd                   ; first element. only the low byte non-zero
    cdq                     ; edx: high=0
    lea     edi, [rdx+1]    ; edi: low=1
    ;jrcxz  .end            ; handle len=0?  unlike rep, loop only checks rcx after decrementing
.intloop:
    add     edi, eax        ; low += buf[i]
    add     edx, edi        ; high += low
    lodsd                   ; load buf[i+1] for next iteration
    loop   .intloop
.end:
    ;; exit when ecx = 0, eax = terminating 0

    xchg    eax, edx
    ;cdq               ; edx=0 already, ready for div
    ; same as the char version

मैंने एक अप्रयुक्त संस्करण भी बनाया scasd(1B संस्करण add edi,4) का उपयोग करता है और add eax, [rdi]इसके बजाय lodsd, लेकिन यह भी 30 बाइट्स है। highलूप के अंत में ईएक्स में होने वाली बचत कहीं और बड़े कोड द्वारा संतुलित की जाती है। यह 0इनपुट में एक समाप्ति तत्व के आधार पर नहीं होने का लाभ है , हालांकि, जो शायद एक अनपैक्ड सरणी के लिए अनुचित है, जहां हमें लंबाई भी स्पष्ट रूप से दी गई है।


C ++ 11 परीक्षण चालक

गीथूब लिंक देखें। यह उत्तर बहुत बड़ा हो रहा था, और परीक्षण चालक को बड़े कोड के साथ अधिक सुविधाएँ मिलीं।


2
मैंने मुख्य रूप से बाइट्स के बजाय पूर्णांक की अनुमति दी क्योंकि कई भाषाओं में एक बाइट प्रकार भी नहीं है। 32-बिट पूर्णांक असेंबली के लिए एक अप्राकृतिक विकल्प हो सकता है, लेकिन कोड गोल्फ नियमों के भीतर रहते हुए अंतिम बाइट को निचोड़ने के बारे में है। यदि एक "अप्राकृतिक" विकल्प कम बाइट गिनती की ओर जाता है, तो मैं कहूंगा कि इसके लिए जाना चाहिए।
डेनिस

@ डेनिस: मुझे कुछ भाषाओं के लिए नियम की आवश्यकता समझ में आती है। मैं चाहता हूं कि नियम के लिए एक तरीका था कि आप केवल int[]इसका उपयोग करें यदि यह आवश्यक था, या 4 से अधिक बाइट्स कोड या कुछ और बचाया। मुझे समस्या का समाधान प्रस्तुत करने में कोई समस्या नहीं है adler32(int[]), लेकिन मुझे लगता है कि adler32(char[])समस्या अधिक दिलचस्प है, क्योंकि यह वास्तविक adler32 फ़ंक्शन है। यह मैं वास्तव में asm में गोल्फ होना चाहता हूँ। (और मैं किसी और बाइट को किसी भी तरह से बचाना पसंद करूंगा, क्योंकि वास्तविक जीवन में एश, 33 बाइट्स = 48 बाइट्स अगर अगला फ़ंक्शन उपयोग करता है ALIGN 16)। मुझे लगता है कि मैं दोनों को गोल्फ देता रहूंगा।
पीटर कॉर्डेस

@ डेनिस: भी, क्या हमें लेन = 0 मामले को संभालने की आवश्यकता है? मैं एक के do{}while(--len)बजाय लूप की शैली का उपयोग करके 2 बी बचाता हूं while(len--){}
पीटर कॉर्डेस

4
जब स्पष्टीकरण की बात आती है, तो अधिक विस्तृत, बेहतर।
डेनिस 16

3
@ कोट: नहीं, मुझे दर्द नहीं होता। मैं अपना समय Stackoverflow के उत्तर लिखने के लिए asm / प्रदर्शन प्रश्नों पर खर्च नहीं करूँगा, और अगर मैंने किया तो x86 टैग विकी को अपडेट करना : P यदि आप जानना चाहते हैं कि कोड धीमा या तेज़ क्यों चलता है, तो आपको asm को देखना और समझना होगा। एक बार जब आप ऐसा कर लेते हैं, तो आप यह देखना शुरू कर देते हैं कि कंपाइलर कब तेज कोड बना सकता था ... और आखिरकार आप यह सोचने लगते हैं कि कंपाइलर कोड को कैसे लिख सकता है। प्रदर्शन के बजाय कोड आकार के लिए अनुकूलन करना कभी-कभी एक दिलचस्प बदलाव होता है।
पीटर कॉर्ड्स

8

MATL , 22 बाइट्स

tsQwYsQsh16W15-\l8Mh*s

इनपुट संख्या का एक सरणी या इसी ASCII स्ट्रिंग हो सकता है।

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

व्याख्या

t       % Take array or string as input. Duplicate
sQ      % Sum all its values, and add 1
wYsQs   % Swap. Cumulative sum, add 1, sum
h       % Concatenate horizontally
16W     % 2^16: gives 65536
15-     % Subtract 15: gives 65521
\       % Element-wise modulo operation
l       % Push 1
8M      % Push 65536 again
h       % Concatenate horizontally: gives array [1, 65535]
*s      % Element-wise multiplication and sum. Display

7

दरअसल, 36 बाइट्स

;Σu@;╗lR`╜HΣu`MΣk`:65521@%`M1#84ⁿ@q*

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

स्पष्टीकरण:

;Σu@;╗lR`╜HΣu`MΣk`:65521@%`M1#84ⁿ@q*
;Σu                                   sum(input)+1
   @;╗lR                              push a copy of input to reg0, push range(1, len(input)+1)
        `╜HΣu`M                       map over range: sum(head(reg0,n))+1
               Σk                     sum, combine lower and upper into a list
                 `:65521@%`M          modulo each by 65521
                            1#84ⁿ@q*  dot product with [1,4**8]

7

जावा, 84 बाइट्स

long a(int[]i){long a=1,b=0;for(int p:i)b=(b+(a=(a+p)%(p=65521)))%p;return b<<16|a;}

यदि जावा सॉल्यूशंस को हमेशा पूरा कंपाइलेबल कोड माना जाता है तो कृपया मुझे बताएं।

Ungolfed

long a(int[] i) {
    long a = 1, b = 0;
    for (int p : i) b = (b + (a = (a + p) % (p = 65521))) % p;
    return b << 16 | a;
}

ध्यान दें

आप इनपुट परिवर्तित करना होगा Stringकरने के लिए int[]( int[]एक से बाइट कम है byte[]याchar[] )।

उत्पादन

String:     "Eagles are great!"
Byte Array: [69, 97, 103, 108, 101, 115, 32, 97, 114, 101, 32, 103, 114, 101, 97, 116, 33]
Checksum:   918816254
Expected:   918816254

String:     "Programming Puzzles & Code Golf"
Byte Array: [80, 114, 111, 103, 114, 97, 109, 109, 105, 110, 103, 32, 80, 117, 122, 122, 108, 101, 115, 32, 38, 32, 67, 111, 100, 101, 32, 71, 111, 108, 102]
Checksum:   3133147946
Expected:   3133147946

String:     "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
Byte Array: [126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126]
Checksum:   68095937
Expected:   68095937

String:     "?????????...?"
Byte Array: [63, 63, 63, 63, 63, 63, 63, 63, 63, ...,63]
Checksum:   2181038080
Expected:   2181038080

1
अच्छा जवाब, और साइट पर आपका स्वागत है! इसके अलावा, ऐसे समाधान जो पूर्ण नहीं हैं और संकलन योग्य हैं जब तक कि चुनौती स्पष्ट रूप से यह नहीं कहती है कि यह एक पूर्ण कार्यक्रम होना चाहिए। यह एक पूर्ण कार्य है, इसलिए यह मायने रखता है।
DJMcMayhem

6

पीट, 120 कोडेल 1 कोड करना

20 कोड के साथ:

२० को कूटना

नोट्स / यह कैसे काम करता है?

  • चूंकि इनपुट के रूप में किसी सरणी या स्ट्रिंग का उपयोग करना संभव नहीं है, यह प्रोग्राम पूर्णांक की एक श्रृंखला (इनपुट के रूप में एससीआई अक्षर का प्रतिनिधित्व) करके काम करता है। मैंने पहले चरित्र इनपुट का उपयोग करने के बारे में सोचा था, लेकिन समाप्ति के लिए एक अच्छा समाधान खोजने के लिए संघर्ष किया, इसलिए अब यह समाप्त हो गया जब कोई भी अंक 1 से छोटा होता है। यह मूल रूप से समाप्ति के लिए केवल नकारात्मक मूल्य था, लेकिन मुझे प्रोग्राम लिखने के बाद आरंभीकरण को बदलना पड़ा, इसलिए अब मैं आवश्यक नहीं फिट कर सकता 2, केवल 1(ट्रेस छवि पर 26/45)। हालांकि इससे कोई फर्क नहीं पड़ता क्योंकि चुनौती के नियमों के अनुसार, केवल मुद्रण योग्य एएससीआई पात्रों की अनुमति है।

  • लूप को पुन: प्रस्तुत करने के साथ लंबे समय तक संघर्ष किया, हालांकि मुझे अंत में काफी सुरुचिपूर्ण समाधान मिला। कोई pointerया switchसंचालन नहीं , केवल इंटरप्रेटर दीवारों में चल रहा है जब तक कि यह इनपुट (43-> 44 ट्रेस छवियों पर) को पढ़ने के लिए हरे रंग के कोडेल में परिवर्तित नहीं हो जाता।

  • लूप समाप्ति को पहले इनपुट को डुप्लिकेट करने, 1 जोड़ने और फिर जाँचने से प्राप्त किया जाता है कि क्या यह 1 से बड़ा है। यदि यह है, तो कोडल चॉइस ट्रिगर होता है और निचले रास्ते पर निष्पादन जारी रहता है। यदि यह नहीं है, तो कार्यक्रम बाएं (उज्ज्वल पीले कोडल, 31/50 ट्रेस छवियों पर) को दर्शाता है।

  • समर्थित इनपुट आकार दुभाषिया कार्यान्वयन निर्भर है, हालांकि सही दुभाषिया के साथ मनमाने ढंग से बड़े इनपुट का समर्थन करना संभव होगा (उदाहरण के लिए, एक जावा दुभाषिया जो BigIntegerआंतरिक मूल्यों का उपयोग करता है )

  • बस देखा कि सेटअप में एक अनावश्यक DUPऔर CC(ट्रेस छवियों में 7-> 8-> 9) शामिल हैं। पता नहीं कैसे हुआ। यह प्रभावी रूप से एक noop है, हालांकि, यह 16 बार कोडेल चयनकर्ता को टॉगल करता है जिसके परिणामस्वरूप कोई बदलाव नहीं होता है।

Npiet ट्रेस छवियां

सेटअप और पहला लूप:

starttrace

लूप समाप्ति, आउटपुट और निकास:

endtrace

आउटपुट

मुझे माफ कर दो अगर मैं केवल एक आउटपुट शामिल करता हूं, तो बस इनपुट में लंबा समय लगता है: ^)

String: "Eagles are great!"

PS B:\Marvin\Desktop\Piet> .\npiet.exe adler32.png
? 69
? 97
? 103
? 108
? 101
? 115
? 32
? 97
? 114
? 101
? 32
? 103
? 114
? 101
? 97
? 116
? 33
? -1
918816254

Npiet का पता लगाने के लिए [65, -1]

trace: step 0  (0,0/r,l nR -> 1,0/r,l dR):
action: push, value 4
trace: stack (1 values): 4

trace: step 1  (1,0/r,l dR -> 2,0/r,l dB):
action: duplicate
trace: stack (2 values): 4 4

trace: step 2  (2,0/r,l dB -> 3,0/r,l nM):
action: multiply
trace: stack (1 values): 16

trace: step 3  (3,0/r,l nM -> 4,0/r,l nC):
action: duplicate
trace: stack (2 values): 16 16

trace: step 4  (4,0/r,l nC -> 5,0/r,l nY):
action: duplicate
trace: stack (3 values): 16 16 16

trace: step 5  (5,0/r,l nY -> 6,0/r,l nM):
action: duplicate
trace: stack (4 values): 16 16 16 16

trace: step 6  (6,0/r,l nM -> 7,0/r,l nC):
action: duplicate
trace: stack (5 values): 16 16 16 16 16

trace: step 7  (7,0/r,l nC -> 8,0/r,l nY):
action: duplicate
trace: stack (6 values): 16 16 16 16 16 16

trace: step 8  (8,0/r,l nY -> 9,0/r,l lB):
action: switch
trace: stack (5 values): 16 16 16 16 16
trace: stack (5 values): 16 16 16 16 16

trace: step 9  (9,0/r,l lB -> 10,0/r,l dM):
action: multiply
trace: stack (4 values): 256 16 16 16

trace: step 10  (10,0/r,l dM -> 11,0/r,l nR):
action: multiply
trace: stack (3 values): 4096 16 16

trace: step 11  (11,0/r,l nR -> 12,0/r,l lY):
action: multiply
trace: stack (2 values): 65536 16

trace: step 12  (12,0/r,l lY -> 13,0/r,l lM):
action: duplicate
trace: stack (3 values): 65536 65536 16

trace: step 13  (13,0/r,l lM -> 14,0/r,l nM):
action: push, value 3
trace: stack (4 values): 3 65536 65536 16

trace: step 14  (14,0/r,l nM -> 15,0/r,l dM):
action: push, value 2
trace: stack (5 values): 2 3 65536 65536 16

trace: step 15  (15,0/r,l dM -> 16,0/r,l lC):
action: roll
trace: stack (3 values): 16 65536 65536

trace: step 16  (16,0/r,l lC -> 17,0/r,l nB):
action: sub
trace: stack (2 values): 65520 65536

trace: step 17  (17,0/r,l nB -> 18,0/r,l dB):
action: push, value 1
trace: stack (3 values): 1 65520 65536

trace: step 18  (18,0/r,l dB -> 19,0/r,l dM):
action: add
trace: stack (2 values): 65521 65536

trace: step 19  (19,0/r,l dM -> 19,1/d,r dC):
action: duplicate
trace: stack (3 values): 65521 65521 65536

trace: step 20  (19,1/d,r dC -> 18,1/l,l lC):
action: push, value 1
trace: stack (4 values): 1 65521 65521 65536

trace: step 21  (18,1/l,l lC -> 17,1/l,l nC):
action: push, value 1
trace: stack (5 values): 1 1 65521 65521 65536

trace: step 22  (17,1/l,l nC -> 16,1/l,l dB):
action: sub
trace: stack (4 values): 0 65521 65521 65536

trace: step 23  (16,1/l,l dB -> 15,1/l,l lB):
action: push, value 1
trace: stack (5 values): 1 0 65521 65521 65536

trace: step 24  (15,1/l,l lB -> 13,2/l,l dG):
action: in(number)
? 65
trace: stack (6 values): 65 1 0 65521 65521 65536

trace: step 25  (13,2/l,l dG -> 12,2/l,l dR):
action: duplicate
trace: stack (7 values): 65 65 1 0 65521 65521 65536

trace: step 26  (12,2/l,l dR -> 11,2/l,l lR):
action: push, value 1
trace: stack (8 values): 1 65 65 1 0 65521 65521 65536

trace: step 27  (11,2/l,l lR -> 10,2/l,l lY):
action: add
trace: stack (7 values): 66 65 1 0 65521 65521 65536

trace: step 28  (10,2/l,l lY -> 9,2/l,l nY):
action: push, value 1
trace: stack (8 values): 1 66 65 1 0 65521 65521 65536

trace: step 29  (9,2/l,l nY -> 8,1/l,r nB):
action: greater
trace: stack (7 values): 1 65 1 0 65521 65521 65536

trace: step 30  (8,1/l,r nB -> 7,1/l,r lY):
action: switch
trace: stack (6 values): 65 1 0 65521 65521 65536
trace: stack (6 values): 65 1 0 65521 65521 65536

trace: step 31  (7,1/l,l lY -> 6,2/l,l nY):
action: push, value 2
trace: stack (7 values): 2 65 1 0 65521 65521 65536

trace: step 32  (6,2/l,l nY -> 5,3/l,l dB):
action: pointer
trace: stack (6 values): 65 1 0 65521 65521 65536

trace: step 33  (5,3/r,l dB -> 7,4/r,l dM):
action: add
trace: stack (5 values): 66 0 65521 65521 65536

trace: step 34  (7,4/r,l dM -> 8,4/r,l dC):
action: duplicate
trace: stack (6 values): 66 66 0 65521 65521 65536

trace: step 35  (8,4/r,l dC -> 9,3/r,l lC):
action: push, value 3
trace: stack (7 values): 3 66 66 0 65521 65521 65536

trace: step 36  (9,3/r,l lC -> 10,3/r,l nC):
action: push, value 2
trace: stack (8 values): 2 3 66 66 0 65521 65521 65536

trace: step 37  (10,3/r,l nC -> 11,3/r,l dY):
action: roll
trace: stack (6 values): 0 66 66 65521 65521 65536

trace: step 38  (11,3/r,l dY -> 12,3/r,l dG):
action: add
trace: stack (5 values): 66 66 65521 65521 65536

trace: step 39  (12,3/r,l dG -> 13,3/r,l lG):
action: push, value 2
trace: stack (6 values): 2 66 66 65521 65521 65536

trace: step 40  (13,3/r,l lG -> 14,3/r,l nG):
action: push, value 1
trace: stack (7 values): 1 2 66 66 65521 65521 65536

trace: step 41  (14,3/r,l nG -> 15,3/r,l dR):
action: roll
trace: stack (5 values): 66 66 65521 65521 65536
trace: white cell(s) crossed - continuing with no command at 17,3...

trace: step 42  (15,3/r,l dR -> 17,3/r,l lB):

trace: step 43  (17,3/r,l lB -> 13,2/l,l dG):
action: in(number)
? -1
trace: stack (6 values): -1 66 66 65521 65521 65536

trace: step 44  (13,2/l,l dG -> 12,2/l,l dR):
action: duplicate
trace: stack (7 values): -1 -1 66 66 65521 65521 65536

trace: step 45  (12,2/l,l dR -> 11,2/l,l lR):
action: push, value 1
trace: stack (8 values): 1 -1 -1 66 66 65521 65521 65536

trace: step 46  (11,2/l,l lR -> 10,2/l,l lY):
action: add
trace: stack (7 values): 0 -1 66 66 65521 65521 65536

trace: step 47  (10,2/l,l lY -> 9,2/l,l nY):
action: push, value 1
trace: stack (8 values): 1 0 -1 66 66 65521 65521 65536

trace: step 48  (9,2/l,l nY -> 8,1/l,r nB):
action: greater
trace: stack (7 values): 0 -1 66 66 65521 65521 65536

trace: step 49  (8,1/l,r nB -> 7,1/l,r lY):
action: switch
trace: stack (6 values): -1 66 66 65521 65521 65536
trace: stack (6 values): -1 66 66 65521 65521 65536

trace: step 50  (7,1/l,r lY -> 6,1/l,r dY):
action: pop
trace: stack (5 values): 66 66 65521 65521 65536

trace: step 51  (6,1/l,r dY -> 4,1/l,r lY):
action: push, value 3
trace: stack (6 values): 3 66 66 65521 65521 65536

trace: step 52  (4,1/l,r lY -> 3,1/l,r nY):
action: push, value 2
trace: stack (7 values): 2 3 66 66 65521 65521 65536

trace: step 53  (3,1/l,r nY -> 2,1/l,r nM):
action: duplicate
trace: stack (8 values): 2 2 3 66 66 65521 65521 65536

trace: step 54  (2,1/l,r nM -> 1,1/l,r dG):
action: pointer
trace: stack (7 values): 2 3 66 66 65521 65521 65536

trace: step 55  (1,1/r,r dG -> 2,2/r,r lR):
action: roll
trace: stack (5 values): 65521 66 66 65521 65536

trace: step 56  (2,2/r,r lR -> 2,3/d,l nR):
action: push, value 1
trace: stack (6 values): 1 65521 66 66 65521 65536

trace: step 57  (2,3/d,l nR -> 2,4/d,l lC):
action: switch
trace: stack (5 values): 65521 66 66 65521 65536
trace: stack (5 values): 65521 66 66 65521 65536

trace: step 58  (2,4/d,r lC -> 2,5/d,r nM):
action: mod
trace: stack (4 values): 66 66 65521 65536

trace: step 59  (2,5/d,r nM -> 4,5/r,r dM):
action: push, value 3
trace: stack (5 values): 3 66 66 65521 65536

trace: step 60  (4,5/r,r dM -> 6,5/r,r lM):
action: push, value 2
trace: stack (6 values): 2 3 66 66 65521 65536

trace: step 61  (6,5/r,r lM -> 7,5/r,r nC):
action: roll
trace: stack (4 values): 65521 66 66 65536

trace: step 62  (7,5/r,r nC -> 8,5/r,r dM):
action: mod
trace: stack (3 values): 66 66 65536

trace: step 63  (8,5/r,r dM -> 11,5/r,r lM):
action: push, value 3
trace: stack (4 values): 3 66 66 65536

trace: step 64  (11,5/r,r lM -> 12,5/r,r nM):
action: push, value 1
trace: stack (5 values): 1 3 66 66 65536

trace: step 65  (12,5/r,r nM -> 13,5/r,r dC):
action: roll
trace: stack (3 values): 66 65536 66

trace: step 66  (13,5/r,r dC -> 14,5/r,r nB):
action: multiply
trace: stack (2 values): 4325376 66

trace: step 67  (14,5/r,r nB -> 15,5/r,r nM):
action: add
trace: stack (1 values): 4325442

trace: step 68  (15,5/r,r nM -> 16,5/r,r dB):
action: out(number)
4325442
trace: stack is empty
trace: white cell(s) crossed - continuing with no command at 19,5...

trace: step 69  (16,5/r,r dB -> 19,5/r,r nM):

5

C89, 70 बाइट्स

h,l,m=65521;A(char*B){h=0;l=1;while(*B)h+=l+=*B++;return h%m<<16|l%m;}

परीक्षण करने के लिए (साथ संकलन gcc -std=c89 -lm golf.c):

#include <stdio.h>
int main(int argc, char** argv) {
    printf("%u\n", A("Eagles are great!"));
    printf("%u\n", A("Programming Puzzles & Code Golf"));
    printf("%u\n", A("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"));
    return 0;
}

zlibस्रोत कैसे दिखता है? हम्म ...
बिल्ली

1
इस कार्यान्वयन ने मेरे x86 asm संस्करण के लिए एक अच्छा प्रारंभिक बिंदु बनाया।
पीटर कॉर्डेस

forइसके बजाय 1 बाइट बचा सकते हैं while:for(h=0,l=1;*B;)h+=l+=*B++;
निंजाल नज

5

भूलभुलैया , 37 36 32 31 बाइट्स

}?"{655:}21:}%=}){%{{36*+!
:++)

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

पूर्णांकों की सूची के रूप में इनपुट। कार्यक्रम एक त्रुटि के साथ समाप्त होता है (जिसका त्रुटि संदेश STDERR को जाता है)।

व्याख्या

भूलभुलैया प्राइमर:

  • भूलभुलैया में मनमाना-सटीक पूर्णांक, मुख्य और ऑक्स के दो ढेर हैंलैब्रिंथ (इलरी) के होते हैं, जो शुरू में शून्य (अनंत) अनंत राशि से भरे होते हैं।
  • स्रोत कोड एक भूलभुलैया जैसा दिखता है, जहां निर्देश सूचक (आईपी) गलियारों का अनुसरण करता है जब यह (यहां तक ​​कि कोनों के आसपास भी) हो सकता है। कोड पढ़ने के क्रम में पहले वैध चरित्र से शुरू होता है, अर्थात इस मामले में शीर्ष बाएं कोने में। जब आईपी जंक्शन के किसी भी रूप में आता है (यानी इसके अलावा कई आसन्न कोशिकाएं), तो यह मुख्य स्टैक के शीर्ष के आधार पर एक दिशा लेगा। बुनियादी नियम हैं: नकारात्मक होने पर बाएं मुड़ें, शून्य होने पर आगे बढ़ते रहें, सकारात्मक होने पर दाएं मुड़ें। और जब इनमें से एक भी संभव नहीं है क्योंकि दीवार है, तो आईपी विपरीत दिशा में ले जाएगा। मृत सिरों को मारते समय आईपी भी घूमता है।
  • अंकों को मुख्य स्टैक के शीर्ष 10 से गुणा करके और फिर अंकों को जोड़कर संसाधित किया जाता है। एक नया नंबर शुरू करने के लिए, आप एक शून्य को धक्का दे सकते हैं _

हालांकि कोड 4x2 "कमरे" से शुरू होता है, जो वास्तव में दो अलग-अलग दो-दो-छोरों को एक साथ निचोड़ा जाता है। आईपी ​​बस स्टैक मानों के कारण एक बार में एक लूप से चिपक जाता है।

इसलिए कोड एक 2x2 (क्लॉकवाइज) लूप से शुरू होता है, जो कि उपसर्गों की गणना करते समय इनपुट पढ़ता है:

}   Move last prefix sum over to aux.
?   Read an integer from STDIN or push 0 on EOF, which exits the loop.
+   Add current value to prefix sum.
:   Duplicate this prefix sum.

अब हमें ऑक्स स्टैक पर सभी उपसर्ग रकम मिल गई है , साथ ही सभी मूल्यों पर योग की एक प्रति और मुख्य0 पर ईओएफ से । इसके साथ, हम एक और 2x2 (दक्षिणावर्त) लूप में प्रवेश करते हैं जो गणना करने के लिए सभी उपसर्गों को पूरा करता है ।HIGH

"   No-op. Does nothing.
{   Pull one prefix sum over from aux. When we're done, this fetches a 0,
    which exits the loop.
)   Increment prefix sum.
+   Add it to HIGH.

मुख्य ढेर अब है LOW - 1और HIGHसिवाय हम सापेक्ष अभी तक नहीं लिया है और शून्य,। कोड का शेष पूरी तरह से रैखिक है:

655      Turn the zero into 655.
:}       Make a copy and shift it over to aux.
21       Turn the copy on main into 65521.
:}       Make a copy and shift it over to aux.
%        Take HIGH mod 65521.
=        Swap HIGH with the other copy of 65521 on aux.
}){      Move 65521 back to aux, increment LOW-1 to LOW, 
         move 65521 back to main.
%        Take LOW mod 65521.
{        Move HIGH back to main.
{        Move the other copy of 655 back to main.
36       Turn it into 65536.
*        Multiply HIGH by that.
+        Add it to LOW.
!        Print it.

आईपी ​​अब एक मृत अंत हिट और चारों ओर बदल जाता है। +और *अनिवार्य रूप से ढेर तल पर शून्य की वजह से कोई-ऑप्स कर रहे हैं। 36अब के शीर्ष बदल जाता है मुख्य में 63है, लेकिन दो {{पुल से दो शून्य aux यह की चोटी पर। फिर %शून्य से विभाजित करने की कोशिश करता है जो कार्यक्रम को समाप्त करता है।

ध्यान दें कि लेबिरिंथ मनमाने ढंग से सटीक पूर्णांक का उपयोग करता है, इसलिए जब तक कि राशि का अंत नहीं होता है, तब तक मोडुलो को हटाते हुए पूर्णांक के प्रवाह के साथ समस्या नहीं होगी।


5

पायथन 2, 60 58 बाइट्स

H=h=65521
l=1
for n in input():l+=n;h+=l
print h%H<<16|l%H

एक बहुत ही सरल दृष्टिकोण। यह एक पूर्ण कार्यक्रम है जो STDIN के माध्यम से पूर्णांकों की सूची लेता है, जैसे [72, 105, 33]

(अद्भुत अलियासिंग / आरंभीकरण टिप के लिए @xnor को धन्यवाद)


2
65521 को अलियास करते हुए आप H=h=65521इनिशियलाइज़ कर सकते हैं।h
xnor

4

जे, 30 बाइट्स

+/(+65536&*)&(65521|+/)&:>:+/\

यह शायद एक अलग ट्रेन के साथ अधिक संघनित हो सकता है।

प्रयोग

यहाँ प्रतियों के x $ yसाथ एक सूची बनाता है ।xy

   f =: +/(+65536&*)&(65521|+/)&:>:+/\
   f 69 97 103 108 101 115 32 97 114 101 32 103 114 101 97 116 33
918816254
   f 80 114 111 103 114 97 109 109 105 110 103 32 80 117 122 122 108 101 115 32 38 32 67 111 100 101 32 71 111 108 102
3133147946
   f (32 $ 126)
68095937
   f (1040 $ 63)
2181038080
   f (4096 $ 255)
2170679522

व्याख्या

+/(+65536&*)&(65521|+/)&:>:+/\
f (           g           ) h     Monad train (f g h) y = (f y) g (h y)
+/                                Sum the input list
                           +/\    Sum each prefix of the input, forms a list
x     f   &   g   &:   h    y     Composed verbs, makes (g (h x)) f (g (h y))
                         >:       Increment the sum and increment each prefix sum
               (m f g) y          Hook, makes m f (g y)
                    +/            Sum the prefix sums
              65521|              Take the sum and prefix total mod 65521
    (f g) y                       Hook again
    65536&*                       Multiply the prefix total by 65536
                                  This is a bonded verb, it will only multiply
                                  using a fixed value now
   +                              Add the sum and scaled prefix total

4

सप्तक, ५२ 50 बाइट्स

सहेजे गए 2 बाइट्स @LuisMendo का धन्यवाद

@(B)mod([sum(S=cumsum(B)+1),S(end)],65521)*[4^8;1]

इनपुट के रूप में पूर्णांकों की एक सरणी लेता है।

कम से पिछले तत्व से लिया जाता है उच्च बल्कि स्पष्ट रूप से योग की गणना की तुलना में (संक्षेप से पहले), की ... एक भव्य कुल बचत 1 बाइट !

नमूना विचारधारा पर चलता है


@LuisMendo ऊह, मैं भूल गया +B। मुझे लगता है कि इनपुट युक्ति कहता है कि आप पूर्णांक ले सकते हैं, इसलिए शायद मैं बस यही करूँगा।
बीकर

3

सीजेएम, 30 29 बाइट्स

q~{1$+}*]:)_W>]1fb65521f%2G#b

पूर्णांकों की सूची के रूप में इनपुट।

इसका परीक्षण यहां करें।

व्याख्या

q~       e# Read and evaluate input.
{        e# Fold this block over the list, computing prefix sums.
  1$+    e#   Copy the last prefix and add the current element.
}*
]        e# Wrap the prefix sums in an array.
:)       e# Increment each. This will sum to HIGH.
_W>      e# Copy the list and truncate to only the last element, i.e.
         e# the sum of the entire input plus 1. This is LOW.
]        e# Wrap both of those lists in an array.
1fb      e# Sum each, by treating it as base 1 digits.
65521f%  e# Take each modulo 65521.
2G#b     e# Treat the list as base 65536 digits, computing 65536*HIGH + LOW.

3

पर्ल 6 , 60 बाइट्स

{(.sum+1)%65521+65536*((sum(1,*+.shift...->{!$_})-1)%65521)}

स्पष्टीकरण:

{
  # $_ is the implicit parameter for this lambda because this block doesn't have
  # an explicit parameter, and @_ isn't seen inside of it.
  # ( @_ takes precedence over $_ when it is seen by the compiler )

  # .sum is short for $_.sum
  ( .sum + 1 ) % 65521 + 65536
  *
  (
    (
      sum(

        # generate a sequence:

        1,         # starting with 1
        * + .shift # lambda that adds previous result (*) with $_.shift
        ...        # generate until:
        -> { !$_ } # $_ is empty

        # ^ I used a pointy block with zero parameters
        # so that the block doesn't have an implicit parameter
        # like the surrounding block

        # this is so that $_ refers to the outer $_

      ) - 1        # remove starting value
    ) % 65521
  )
}

परीक्षा:

#! /usr/bin/env perl6
use v6.c;
use Test;

# give the lambda a name
my &Adler32 = {(.sum+1)%65521+65536*((sum(1,*+.shift...->{!$_})-1)%65521)}

my @tests = (
  (  918816254,  'Eagles are great!'),
  ( 3133147946,  'Programming Puzzles & Code Golf'),
  (   68095937,  '~' x 32,     "'~' x 32"),
  ( 2181038080,  63 xx 1040,   "'?' x 1040"),
);

plan +@tests;

for @tests -> ($checksum, $input, $gist? ) {
  my @array := do given $input {
    when Str { .encode.Array }
    default { .Array }
  }

  is Adler32(@array), $checksum, $gist // $input.perl
}
1..4
ok 1 - "Eagles are great!"
ok 2 - "Programming Puzzles \& Code Golf"
ok 3 - '~' x 32
ok 4 - '?' x 1040

3

पायथन 3 (79 बाइट्स)

आर। कप के समाधान पर आधारित है।

lambda w,E=65521:(1+sum(w))%E+(sum(1+sum(w[:i+1])for i in range(len(w)))%E<<16)

मैंने गुणन को एक शिफ्ट से बदल दिया और कोष्ठक की एक जोड़ी को हटा दिया।

क्योंकि मैं उन टिप्पणियों को पोस्ट नहीं कर सकता जो मैंने एक नया उत्तर दिया है।



3

हास्केल, 54 50 बाइट्स

m=(`mod`65521).sum
g x=m(-1:scanl(+)1x)*4^8+m(1:x)

प्रयोग उदाहरण: g [69,97,103,108,101,115,32,97,114,101,32,103,114,101,97,116,33]-> 918816254

scanl प्रारंभिक मूल्य (->) शामिल है 1सूची (-> [1,1+b1,1+b1+b2,..]) ) शामिल है , इसलिए sumबंद है 1, जो -1कि संक्षेप से पहले सूची में प्रस्तुत करने के द्वारा तय किया गया है ।

संपादित करें: 4 बाइट्स के लिए धन्यवाद @xnor।


ऐसा लगता है कि आप में जोड़ने पर बाहर निकाल सकते हैं m: m=(`mod`65521).sum g x=m(-1:scanl(+)1x)*4^8+m(1:x)। वहाँ शायद एक बेहतर तरीका है prepending की तुलना में रकम तय करने के लिए।
xnor

3

जावास्क्रिप्ट (ईएस 7), 52 50 बाइट्स

a=>a.map(b=>h+=l+=b,h=0,l=1)&&l%65521+h%65521*4**8

ES6 51 बाइट्स लेता है (4 ** 8 को 65536 के साथ बदलें)। यदि आप एक स्ट्रिंग संस्करण चाहते हैं, तो 69 बाइट्स के लिए:

s=>[...s].map(c=>h+=l+=c.charCodeAt(),h=0,l=1)&&l%65521+h%65521*65536

संपादित करें: @ user81655 के लिए 2 बाइट्स धन्यवाद सहेजा गया।


3

एआरएम थम्ब -2 फ़ंक्शन स्वीकार करना uint8_t[]: 40 बाइट्स (गैर-मानक एबीआई और 36B के लिए int[])

विशेषताएं: गैर आस्थगित modulo, तो मनमाने आकार के इनपुट ठीक हैं। वास्तव में विभाजन निर्देश का उपयोग नहीं करता है, इसलिए यह धीमा नहीं है। (गलती से, कम से कम उस कारण से नहीं: पी)

कम सख्त नियमों का पालन करने से बचत:

  • -2 बी अगर हमें रजिस्टर का उपयोग करने से पहले उन्हें सहेजना नहीं है।
  • एक uint32_t[]सरणी में बाइट को अनपैक करने के लिए कॉलर की आवश्यकता के लिए -2 बी ।

तो, सबसे अच्छा मामला 36 बी है।

// uint8_t *buf in r0,  uint32_t len in r1
00000000 <adler32arm_golf2>:
   0:   b570            push    {r4, r5, r6, lr} //
   2:   2201            movs    r2, #1          // low
   4:   2300            movs    r3, #0          // high
   6:   f64f 75f1       movw    r5, #65521      ; 0xfff1 = m
0000000a <adler32arm_golf2.byteloop>:
   a:   f810 4b01       ldrb.w  r4, [r0], #1    // post-increment byte-load
   e:   4422            add     r2, r4          // low += *B
  10:   4413            add     r3, r2          // high += low
  12:   42aa            cmp     r2, r5          // subtract if needed instead of deferred modulo
  14:   bf28            it      cs
  16:   1b52            subcs   r2, r2, r5
  18:   42ab            cmp     r3, r5
  1a:   bf28            it      cs              // Predication in thumb mode is still possible, but takes a separate instruction
  1c:   1b5b            subcs   r3, r3, r5
  1e:   3901            subs    r1, #1          // while(--len)
  20:   d1f3            bne.n   a <.byteloop2>
  22:   eac2 4003       pkhbt   r0, r2, r3, lsl #16   // other options are the same size: ORR or ADD.
  26:   bd70            pop     {r4, r5, r6, pc}  // ARM can return by popping the return address (from lr) into the pc; nifty
00000028 <adler32arm_end_golf2>:

0x28 = 40 बाइट्स


टिप्पणियाँ:

log%mअंत में के बजाय , हम if(low>=m) low-=mलूप के अंदर करते हैं। यदि हम उच्च से पहले कम करते हैं, तो हम जानते हैं कि न 2*mतो संभवतः अधिक हो सकता है , इसलिए मोडुलो केवल घटाना या नहीं होने की बात है। थम्ब 2 मोड में A cmpऔर विधेय subकेवल 6B है। Thumb2 मोड में 8B के लिए मानक मुहावरा% है:

UDIV R2, R0, R1         // R2 <- R0 / R1
MLS  R0, R1, R2, R0     // R0 <- R0 - (R1 * R2 )

निहित लंबाई adler(char *)संस्करण स्पष्ट लंबाई के समान कोड-आकार हैadler(uint8_t[], uint32_t len) । हम किसी भी 2 बी निर्देश के साथ लूप-निकास स्थिति के लिए झंडे सेट कर सकते हैं।

अंतर्निहित लंबाई संस्करण में 2 ^ 32 बार लूप करने के बजाय खाली स्ट्रिंग के साथ सही ढंग से काम करने का लाभ है।


साथ इकट्ठा / संकलित करें:

arm-linux-gnueabi-as --gen-debug -mimplicit-it=always -mfloat-abi=soft -mthumb adler32-arm.S

या

arm-linux-gnueabi-g++ -Wa,-mimplicit-it=always -g -static -std=gnu++14 -Wall -Wextra -Os -march=armv6t2 -mthumb -mfloat-abi=soft test-adler32.cpp -fverbose-asm adler32-arm.S -o test-adler32
qemu-arm ./test-adler32

इसके बिना -static, चल रही प्रक्रिया को qemu-armगतिशील लिंकर नहीं मिला। (और हां, मैं इस उत्तर के लिए केवल एआरएम क्रॉस-डेवेल सेटअप स्थापित करता हूं, क्योंकि मुझे लगा कि मेरा अनुमानित-सबटाइटल विचार साफ-सुथरा था।) amd64 Ubuntu पर, इंस्टॉल करें gcc-arm-linux-gnueabig++-arm-linux-gnueabi । मैंने पाया gdb-arm-none-eabiकि बमुश्किल काम करना जुड़ा हुआ था qemu-arm -g port

टिप्पणी स्रोत:

// There's no directive to enable implicit-it=always

// gcc uses compiler uses these in its output
.syntax unified
.arch armv8-a
.fpu softvfp

.thumb      @ aka .code 16

.p2align 4
.globl adler32arm_golf    @ put this label on the one we want to test

.thumb_func
adler32arm_golf:
adler32arm_golf2:   @ (uint8_t buf[], uint32_t len)
        @ r0 = buf
        @ r1 = len
        push    {r4, r5, r6, lr}   @ even number of regs keeps the stack aligned.  Good style? since there's no code-size saving

        movs    r2, #1          @ r2: low
        movs    r3, #0          @ r3: high
                                @ r4 = tmp for loading bytes
        movw    r5, #65521      @ r5: modulo constant

adler32arm_golf2.byteloop2:
        ldrb    r4, [r0], #1    @ *(buf++) post-increment addressing.  4B encoding
        @ldrb    r4, [r0, r1]   @ 2B encoding, but unless we make the caller pass us buf+len and -len, it needs extra code somewhere else
        @ldmia   r0!, {r4}      @ int[] version:  r4 = [r0]; r0+=4;  post-increment addressing.  2B encoding.

        add     r2, r2, r4      @ low += tmp
        add     r3, r3, r2      @ high += low;   // I think it's safe to do this before the modulo range-reduction for low, but it would certainly work to put it after.

        cmp     r2, r5
        subhs   r2, r5          @ if(low>=m) low-=m;   @ 6B total for %.  predicated insns require an IT instruction in thumb2

        cmp     r3, r5
        subhs   r3, r5          @ if(high>=m) high-=m;  // equivalent to high %= m.

        @sub    r1, #1          @ 4B encoding: sub.w to not set flags with immediate
        subs    r1, #1          @ len-- and set flags.  2B encoding
        @cmp    r4, #0          @ null-termination check. 2B encoding
        bne     adler32arm_golf2.byteloop2

@        udiv    r0, r2, r5            @ normal way to do one of the modulos
@        mls     r2, r5, r0, r2         @ r2 = low % m.  8B total for %

        PKHBT   r0, r2, r3, lsl #16     @ 4B   r0 = [ high%m <<16  |   low%m  ]
        @orr     r0, r0, r4, lsl #16    @ 4B
        @orr     r0, r0, r4             @ 4B
        @add     r0, r2, r3, lsl #16    @ 4B
        @add     r0, r0, r4             @ 2B
        pop     {r4, r5, r6, pc}        @ ARM can return by popping the return address (saved from lr) into pc.  Nifty
adler32arm_end_golf2:

test-adler32.cppएक ही परीक्षण के मामले हैं और main()मेरे x86-64 उत्तर के लिए, लेकिन इस तरह से शुरू होता है:

#include <stdint.h>
uint32_t adler32_simple(const uint8_t *B) {
  const uint32_t m=65521;

  uint32_t h=0, l=1;
  do {
    l += *B++;        // Borrowed from orlp's answer, as a simple reference implementation
    h += l;
    l %= m; h %= m;   // with non-deferred modulo if this is uncommented
  } while(*B);

  return h%m<<16|l%m;
}


#include <stdio.h>
//#include <zlib.h>
#include <string.h>
#include <assert.h>
#include <string>   // useful for the memset-style constructors that repeat a character n times


extern "C" {
    unsigned golfed_adler32_amd64(int /*dummy1*/, const char *buf, int /*dummy2*/, unsigned len);
    unsigned adler32arm_golf(const char *buf, unsigned len);
}
#ifdef __amd64__
#define golfed_adler32(buf, len)   golfed_adler32_amd64(1234, buf, 1234, len)
#elif  __arm__
#define golfed_adler32(buf, len)   adler32arm_golf(buf, len)
#else
#error "no architecture"
#endif

static void test_adler(const char *str)
{
    unsigned len = strlen(str);
//    unsigned zlib = zlib_adler(len, str);
    unsigned reference = adler32_simple((const uint8_t*)str);
    unsigned golfed = golfed_adler32(str, len);

    printf("%s: c:%u asm:%u\n", str, reference, golfed);
    assert(reference == golfed);
}

// main() to call test_adler() unchanged from my amd64 answer, except that the comments about length limits don't apply

3

x86 16bit मशीन कोड फ़ंक्शन: कस्टम कॉलिंग कन्वेंशन का उपयोग करके 32 बाइट्स

रजिस्टरों में आर्गन, और बीपी (और सपा) के अलावा अन्य रेज को संरक्षित नहीं करना।

16bit कोड में, हम dx:axरजिस्टर जोड़ी में एक 32 बिट मूल्य लौटाते हैं । इसका मतलब है कि हमें किसी भी निर्देश को विलय highऔर lowमें खर्च करने की आवश्यकता नहीं है eax। (यह 32 और 64 बिट कोड में भी बाइट्स को बचाएगा, लेकिन हम केवल 16bit कोड में कॉलर को इस काम को लोड करने को सही ठहरा सकते हैं।)

गीथूब (x86 16, 32, और 64 बिट, और एआरएम के लिए) पर टिप्पणी स्रोत और परीक्षण चालक

### const char *buf in SI,  uint16_t len in CX
## returns in dx:ax
## also clobbers bx and di.
00000100 <adler32_x16_v6>:
 100:   31 c0                   xor    ax,ax         # set up for lods
 102:   99                      cwd                  # dx= high=0
 103:   bf 01 00                mov    di,0x1        # di= low=0
 106:   bb f1 ff                mov    bx,0xfff1     # bx= m
00000109 <adler32_x16_v6.byteloop>:
 109:   ac                      lods
 10a:   01 c7                   add    di,ax         # low+=buf[i]. modulo-reduce on carry, or on low>=m
 10c:   72 04                   jc     112 <adler32_x16_v6.carry_low>
 10e:   39 df                   cmp    di,bx
 110:   72 02                   jb     114 <adler32_x16_v6.low_mod_m_done>
00000112 <adler32_x16_v6.carry_low>:
 112:   29 df                   sub    di,bx
00000114 <adler32_x16_v6.low_mod_m_done>:
 114:   01 fa                   add    dx,di         # high+=low
 116:   0f 92 d0                setb   al            # store the carry to set up a 32bit dividend.
 119:   92                      xchg   dx,ax
 11a:   f7 f3                   div    bx            # high (including carry) %= m, in dx.  ax=0 or 1 (so we're set for lods next iteration)                                                         
 11c:   e2 eb                   loop   109 <adler32_x16_v6.byteloop>
 11e:   97                      xchg   di,ax         # 
 11f:   c3                      ret    
00000120 <adler32_x16_v6_end>:

0x120 - 0x100 = 32 बाइट्स

32 बिट मोड के लिए एक ही कोड असेंबल करके परीक्षण किया जाता है, इसलिए मैं इसे C से संकलित (आवरण फ़ंक्शन के साथ) कह सकता हूं -m32। मेरे लिए, 16 बिट मोड कुछ दिलचस्प है, डॉस सिस्टम कॉल नहीं हैं। सभी निर्देशों में स्पष्ट संचालन होते हैं, सिवाय loopऔर lodsb, इसलिए 32 बिट मोड के लिए कोडांतरण ऑपरेंड-आकार के उपसर्गों का उपयोग करता है। एक ही निर्देश, विभिन्न एन्कोडिंग। लेकिन lodsb32 बिट मोड में उपयोग करेगा[esi] , इसलिए यह फॉर-टेस्टिंग संस्करण 32 बिट पॉइंटर्स के साथ काम करता है (क्योंकि हम कोई पता-गणित या पॉइंटर इंक्रीमेंट / तुलना नहीं करते हैं)।

कोई बेमेल नहीं। यदि कोई बेमेल है तो मेरा परीक्षण हार्स संदेश भेज देता है।

$ yasm -felf32 -Worphan-labels -gdwarf2 adler32-x86-16.asm -o adler32-x86-16+32.o &&
   g++ -DTEST_16BIT -m32 -std=gnu++11 -O1 -g -Wall -Wextra -o test-adler32-x16  adler32-x86-16+32.o  test-adler32.cpp -lz &&
   ./test-adler32-x16
Eagles are great! (len=17): zlib:0x36c405fe  c:0x36c405fe golfed:0x36c405fe
Programming Puzzles & Code Golf (len=31): zlib:0xbac00b2a  c:0xbac00b2a golfed:0xbac00b2a
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (len=32): zlib:0x040f0fc1  c:0x040f0fc1 golfed:0x040f0fc1
?????????????????????????????????????????????????? (len=1040): zlib:0x82000000  c:0x82000000 golfed:0x82000000
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (len=4096): zlib:0xb169e06a  c:0xb169e06a golfed:0xb169e06a
(0xFF repeating) (len=4096): zlib:0x8161f0e2  c:0x8161f0e2 golfed:0x8161f0e2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (len=5837): zlib:0x5d2a398c  c:0x5d2a398c golfed:0x5d2a398c
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (len=5838): zlib:0x97343a0a  c:0x97343a0a golfed:0x97343a0a
(0xFF repeating) (len=9999): zlib:0xcae9ea2c  c:0xcae9ea2c golfed:0xcae9ea2c
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (len=65535): zlib:0x33bc06e5  c:0x33bc06e5 golfed:0x33bc06e5

16bit रजिस्टरों के साथ, हम लूप के बाद मोडुलो कटौती को कम नहीं कर सकते। 16bit और अन्य ऑपरेंड-आकारों के बीच एक दिलचस्प अंतर है: m = 65521( 0xFFF1) आधे से अधिक 65536 है। mकैरी पर घटाना 2 * मी से नीचे का मान रखता है, भले ही high=0xFFF0 + 0xFFF0। लूप के बाद, एक तुलना-और-घटाना, एक के बजाय चाल करेगाdiv

मैं एक जोड़ के बाद एक रजिस्टर को कम करने के लिए मोडुलो-कम करने के लिए एक उपन्यास तकनीक के साथ आया था । के लिए इनपुट के ऊपरी आधे हिस्से को शून्य करने के बजाय , गैर-छंटनी किए गए परिणाम को पकड़े हुए 32 बिट लाभांश बनाने के लिए divउपयोग setc dlकरें ( dhयह पहले से ही शून्य है)। ( div32 बी / 16 बी => 16 बिट डिवीजन करता है।)

setcc(3 बाइट्स) 386 के साथ पेश किया गया था। 286 या इससे पहले इसे चलाने के लिए, सबसे अच्छा मैं अनजाइन्ड salcइंस्ट्रक्शन (कैरी से सेट एएल) का उपयोग करता हूं । यह एक-एक बाइट ऑपकोड है sbb al,al, इसलिए हम ऐसा करने से पहले salc/ (जिसे हमें किसी भी तरह की आवश्यकता है) का उपयोग कर सकते हैं । बिना , वहाँ एक 4B अनुक्रम है: / । हम 3 बी / का उपयोग नहीं कर सकते हैं , क्योंकि इसके बजाय इसका अनुकरण होगा ।neg alxchg ax, dxsalcsbb dx,dxneg dxsbb dx,dxinc dxsetncsetc


मैंने कैरी को संभालने के बजाय 32 बिट ऑपरेंड-साइज़ का उपयोग करने की कोशिश की , लेकिन यह केवल addनिर्देश नहीं हैं, जो एक ऑपरेंड-आकार के उपसर्ग की आवश्यकता होती है। स्थिरांक स्थापित करने के निर्देश और इतने पर भी ऑपरेंड-आकार के उपसर्गों की आवश्यकता होती है, इसलिए यह सबसे छोटा नहीं होने के कारण समाप्त हो गया।



2

पर्ल 5, 43 बाइट्स

42 बाइट्स, -aEइसके बजाय 1 के लिए-e

इनपुट दशमलव पूर्णांक के रूप में है, अंतरिक्ष-पृथक।

map$h+=$.+=$_,@F;say$.%65521+$h%65521*4**8

Sp3000 को मेरी टोपी की एक टिप , जिनसे मैंने इस उत्तर के लिए विचार लिया।

यह काम किस प्रकार करता है:

  1. क्योंकि -a, $. 1 से शुरू होता है और @Fयह इनपुट ऐरे है। $h0. $_से शुरू होता हैmap है एक सरणी के प्रत्येक तत्व के लिए एक प्लेसहोल्डर के रूप जाता है।
  2. map$h+=$.+=$_,@Fइसका अर्थ है कि @Fहम प्रत्येक तत्व के लिए उस तत्व को $.जोड़ते हैं और फिर जोड़ते $.हैं$h
  3. फिर हम परिणाम को अंकगणित $.%65521+$h%65521*4**8(यानी, ($. % 65521) + ( ($h % 65521) * (4**8) )और sayप्रिंट) करते हैं।

1

फैक्टर, 112 109 103 बाइट्स

अब , यह प्रश्न में एल्गोरिथ्म का शाब्दिक अनुवाद है ... अब जब मैंने वास्तव में इसे बनाया है, तो ठीक है।

[ [ sum 1 + ] [ [ dup length [1,b] reverse v. ] [ length ] bi + ] bi [ 65521 mod ] bi@ 16 shift bitor ]

Ungolfed:

: adler-32 ( seq -- n )
  [ sum 1 + ] 
  [ 
    [ dup length [1,b] reverse v. ] 
    [ length ] bi + 
  ] bi 
  [ 65521 mod ] bi@ 
  16 shift bitor 
  ;

संख्या या स्ट्रिंग के किसी भी क्रम की अपेक्षा करता है (बहुत अधिक अंतर नहीं, हालांकि वे तकनीकी रूप से समान नहीं हैं)।

मुझे नहीं पता कि यह 32-बिट शब्द-आकार के साथ संकलित फैक्टर के संस्करण पर दी गई सीमा के लिए कैसा प्रदर्शन करेगा, लेकिन मेरी 6 जीबी 64-बिट 2.2GHz मशीन पर:

IN: scratchpad 1040 63 <array>

--- Data stack:
{ 63 63 63 63 63 63 63 63 63 63 63 63 63 63 ~1026 more~ }
IN: scratchpad [ adler-32 ] time
Running time: 7.326900000000001e-05 seconds

--- Data stack:
2181038080
IN: scratchpad 10,000 63 <array> 

--- Data stack:
2181038080
{ 63 63 63 63 63 63 63 63 63 63 63 63 63 63 ~9986 more~ }
IN: scratchpad [ adler-32 ] time
Running time: 0.000531669 seconds


1

क्लोजर, 109 बाइट्स

@ मर्क एडलर के समाधान पर आधारित है ।

(fn f[s](->> s(reduce #(mapv + %(repeat %2)[0(first %)])[1 0])(map #(rem % 65521))(map *[1 65536])(apply +)))

Ungolfed

(fn f [s]
  (->> s
       (reduce #(mapv + % (repeat %2) [0 (first %)]) [1 0])
       (map #(rem % 65521))
       (map * [1 65536])
       (apply +)))

प्रयोग

=> (def f (fn f[s](->> s(reduce #(mapv + %(repeat %2)[0(first %)])[1 0])(map #(rem % 65521))(map *[1 65536])(apply +))))
=> (f [69 97 103 108 101 115 32 97 114 101 32 103 114 101 97 116 33])
918816254
=> (f [80 114 111 103 114 97 109 109 105 110 103 32 80 117 122 122 108 101 115 32 38 32 67 111 100 101 32 71 111 108 102])
3133147946
=> (f (repeat 32 126))
68095937
=> (f (repeat 1040 63))
2181038080
=> (f (repeat 4096 255))
2170679522

1

जावास्क्रिप्ट (130 वर्ण गोल्फ)

Ungolfed

function a(b)
{
    c=1
    for(i=0;i<b.length;i++)
    {
        c+=b[i]
    }
    d=c%65521
    f=""
    e=0
    k=""
    for(j=0;j<b.length;j++)
    {
        k+= "+"+b[j]
        f+= "(1"+k+")"
        e= ((eval(f)))
        if(j!=b.length-1){f+="+"}
    }
    g=e%65521
    h=d+65536*g
    console.log(h)
}

golfed

a=b=>{for(c=1,k=f="",y=b.length,i=0;i<y;i++)c+=x=b[i],f+="(1"+(k+="+"+x)+")",i<y-1&&(f+="+");return z=65521,c%z+65536*(eval(f)%z)}

डेवलपर्स कंसोल में पेस्ट करें और फिर इसे बाइट्स ईजी का एक सरणी दें:

[69, 97, 103, 108, 101, 115, 32, 97, 114, 101, 32, 103, 114, 101, 97, 116, 33]

और यह चेकसम को कंसोल पर लौटा देगा


1

टीएमपी, 55 बाइट्स

3a1.3b0.1;4+a>T8%a>xFFF14+b>a8%b>xFFF11~5<b>164|b>a2$b$

लुआ में कार्यान्वयन यहाँ पाया जा सकता है: http://preview.ccode.gq/projects/TMP.lua


1
प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है! क्या यह भाषा प्रोग्रामिंग भाषाओं की हमारी परिभाषा को संतुष्ट करती है ?
बिल्ली

@ मुझे विश्वास है कि यह करता है, लेकिन मुझे यकीन नहीं है कि यह वास्तव में "ट्यूपल" का समर्थन करता है?
brianush1

न ही BrainFuck करता है, इसलिए आप शायद ठीक हैं। यदि यह पूर्ण रूप से ट्यूरिंग कर रहा है, तो प्राइम नंबर पा सकते हैं और उन बेसिक चीजों को कर सकते हैं जो कोई अन्य भाषा कर सकती है (और यह कर सकती है), यह काम करेगा :) CSS अपने आप में एक प्रोग्रामिंग भाषा नहीं है और न ही HTML लेकिन CSS3 + HTML ट्यूरिंग-पूर्ण है और प्राइम्स पा सकते हैं।
बिल्ली

तो, CodeGolf में उपयोग करना ठीक है?
brianush1

मुझे ऐसा लगता है - मुझे पता है कि न तो टीएमपी और न ही लूआ, इसलिए इस कोड की व्याख्या से बहुत मदद मिलेगी (और यह एक शानदार जवाब होगा)। : D
बिल्ली

1

पायथन 3.5, 82 बाइट्स:

( -1 बाइट नील को धन्यवाद ! )

( गणितमंदन को धन्यवाद ! )

( -4 बाइट्स डेनिस के लिए धन्यवाद ! )

lambda w:((1+sum(w))%65521)+4**8*(sum(1+sum(w[:i+1])for i in range(len(w)))%65521)

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

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


(E+15)वास्तव में एक बाइट से अधिक लंबा है 65536
नील

@ नील टिप के लिए धन्यवाद। यह अब तय हो गया है।
आर। काप

@ Sp3000 तो? इससे कोई फर्क नहीं पड़ता कि वे कुछ बाइट्स जोड़ते हैं, लेकिन यह तथ्य कि वे कोई बाइट नहीं जोड़ते हैं, मेरे साथ ठीक है।
आर। काप

4**8से एक बाइट कम है 65536
मैथमैंडन

आप जनरेटर के चारों ओर ब्रैकेट को गिराकर 4 बाइट्स बचा सकते हैं और 0 से लेन (डब्ल्यू) तक पुनरावृत्त कर सकते हैं । एक और 6 बाइट्स ऑपरेटर पूर्वता का शोषण करके बचाया जा सकता है।
डेनिस

1

विखंडन , 324 बाइट्स

          /   M
       R_MZ  |S
      D ]    |S
 /?V?\} {}/  |S /    \
R{/A  Z$[/   |S/     {\
  } J{\      |S      ;_
 \^  /       |S   R'~++Y++~'L
 /    /      |S       }Y;
 \  \        ;^/
 /  /         +\+ R'~++A++~'L
 \  <Z________________/
    ;\X       //
              \Y/
               *

निष्पक्ष चेतावनी, जिस एकमात्र कार्यान्वयन पर मैंने यह परीक्षण किया है, वह F # के लिए भाषा का मेरा अपना पोर्ट है। यह गोल्फ नहीं है, मुख्य रूप से क्योंकि मुझे लंबे समय तक रन बनाने में आसानी होती है जबकि मेरा प्रमुख लगातार नीचे की ओर ठंडा होता है, इसलिए मैं वापस आकर इसे ट्विक कर सकता हूं।

यह कैसे काम करता है?

  • R'~++Y++~'Lब्लॉक एक 256 निरंतर और प्रक्षेपण फ़्यूज़ यह नीचे की ओर, इसे सीधे नीचे रिएक्टर की बड़े पैमाने पर गुणक की स्थापना।
  • R'~++A++~'Aब्लॉक के ऊपर रिएक्टर, की ओर फ़्यूज़ एक और 256 है और यह प्रक्षेपण जिनमें से दो बड़े पैमाने पर गुणकों में विखंडन कण65536 द्रव्यमान प्रत्येक, उन्हें शुरू करने बाएँ और दाएँ (जहां सही कण तुरंत टर्मिनेटर द्वारा नष्ट कर दिया जाता है)।
  • बायां कण एक और रिएक्टर से टकराता है और विखंडन से गुजरता है, जो समान द्रव्यमान के दो कणों में विभाजित होकर ऊपर और नीचे होता है।
  • ऊपर की ओर यात्रा करने वाली शक्ति दो कण एक शुद्ध-शून्य द्रव्यमान हेरफेर से गुजरती है, बाईं ओर प्रतिबिंबित होती है, फिर संलयन रिएक्टर के द्रव्यमान गुणक को सेट करती है। यह रिएक्टर होगा कि हम एच ब्लॉक को कैसे गुणा करेंगे।
  • नीचे की ओर यात्रा करने वाला कण बाईं ओर परिलक्षित होता है और लंबे समय तक द्रव्यमान को बहाता है, अंततः 65521(हमारे बड़े प्राइम) तक पहुंचता है ।
  • Zरन के अंत में घूर्णी दर्पण ( ) प्राइम को डुप्लिकेट करने के लिए कण का कारण बनता है, एक को वापस दाईं ओर भेज रहा है जहां यह अंततः विखंडन रिएक्टर के संग्रहीत द्रव्यमान को सेट करता है (^ )। यह है कि हम मापांक ऑपरेटर को H ब्लॉक में कैसे लागू करेंगे।
  • दूसरी प्रति वापस परिलक्षित होती है, जहाँ यह विखंडन रिएक्टर के लिए एक अनुरूप कार्य करता है ( <) हम L ब्लॉक के लिए उपयोग करेंगे।
  • अब जब हमारे स्थिरांक जगह में हैं, तो हम अपने इनपुट को पढ़ने और अपनी दो सूचियों को जेनरेट करने के लिए ऊपरी बाएँ में स्थित shenanigans में संलग्न हैं। ईमानदार होने के लिए, मैं भूल गया कि वे कैसे काम करते हैं, लेकिन खाली स्ट्रिंग के लिए मुझे एच ब्लॉक समन कण को ​​धीमा करना पड़ा, जो |S"शीतलन" को बताता है ।
  • \Y/ एल ब्लॉक को फ़्यूज़ करता है (जो बाएं चैनल के माध्यम से आता है) और एच ब्लॉक (जो सही चैनल के माध्यम से आता है), फिर उन्हें एक टर्मिनेटर में स्लैम करता है जो फ्यूज़ किए गए द्रव्यमान के लिए निकास कोड सेट करता है।

जब तक मैं कहीं गलती नहीं कर रहा हूं, यह आधिकारिक दुभाषिया ( लिंक ) के साथ काम नहीं करता है । मुझे आपका पोर्ट # F कहां मिल सकता है?
डेनिस

@ डेनिस मैं यह पता लगाने की कोशिश कर रहा हूं कि बग मेरे अंत पर है या नहीं, लेकिन मैं दुभाषिया को काम करने के लिए नहीं मिल सकता। मैं देखूंगा कि अगर मैं इसे काम कर पाता हूं तो जरूरत पड़ने पर अपना जवाब अपडेट कर सकता हूं।
एंड्रयू कॉन्स

@ डेनिस ऐसा प्रतीत होता है कि ऑनलाइन दुभाषिया एरर कोड एबॉर्ट्स को हैंडल नहीं करता है *, जो कि मैं आउटपुट वापस कर रहा हूं। मैं देखूंगा कि क्या मैं कल आउटपुट को सत्यापित करने के लिए एक और दुभाषिया खोज सकता हूं।
एंड्रयू कॉनसे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.